Skip to content

Commit a4bc036

Browse files
committed
Scroll sidebar when moving a column as well
1 parent abbe40c commit a4bc036

File tree

12 files changed

+80
-30
lines changed

12 files changed

+80
-30
lines changed

packages/components/src/components/cards/EventCards.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ export const EventCards = React.memo((props: EventCardsProps) => {
7575
getVisibleItemIndex,
7676
items: events,
7777
})
78-
const focusedColumnId = useFocusedColumn()
78+
const { focusedColumnId } = useFocusedColumn()
7979
const _hasSelectedItem = !!selectedItemId && column.id === focusedColumnId
8080
const selectedItem =
8181
_hasSelectedItem && events.find(event => event.id === selectedItemId)

packages/components/src/components/cards/IssueOrPullRequestCards.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ export const IssueOrPullRequestCards = React.memo(
8484
getVisibleItemIndex,
8585
items,
8686
})
87-
const focusedColumnId = useFocusedColumn()
87+
const { focusedColumnId } = useFocusedColumn()
8888
const _hasSelectedItem = !!selectedItemId && column.id === focusedColumnId
8989
const selectedItem =
9090
_hasSelectedItem && items.find(item => item.id === selectedItemId)

packages/components/src/components/cards/NotificationCards.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ export const NotificationCards = React.memo((props: NotificationCardsProps) => {
7575
getVisibleItemIndex,
7676
items: notifications,
7777
})
78-
const focusedColumnId = useFocusedColumn()
78+
const { focusedColumnId } = useFocusedColumn()
7979
const _hasSelectedItem = !!selectedItemId && column.id === focusedColumnId
8080
const selectedItem =
8181
_hasSelectedItem &&

packages/components/src/components/columns/ColumnOptions.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -711,8 +711,11 @@ export const ColumnOptions = React.memo((props: ColumnOptionsProps) => {
711711
}
712712
onPress={() =>
713713
moveColumn({
714+
animated: appViewMode === 'multi-column',
714715
columnId: column.id,
715716
columnIndex: columnIndex - 1,
717+
highlight: appViewMode === 'multi-column',
718+
scrollTo: true,
716719
})
717720
}
718721
/>
@@ -730,8 +733,11 @@ export const ColumnOptions = React.memo((props: ColumnOptionsProps) => {
730733
}
731734
onPress={() =>
732735
moveColumn({
736+
animated: appViewMode === 'multi-column',
733737
columnId: column.id,
734738
columnIndex: columnIndex + 1,
739+
highlight: appViewMode === 'multi-column',
740+
scrollTo: true,
735741
})
736742
}
737743
/>

packages/components/src/components/columns/ColumnSwitcher.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,13 @@ const styles = StyleSheet.create({
3939
export function ColumnSwitcher() {
4040
const columnIds = useReduxState(selectors.columnIdsSelector)
4141
const currentOpenedModal = useReduxState(selectors.currentOpenedModal)
42-
const focusedColumnId = useFocusedColumn() || columnIds[0]
42+
const { focusedColumnId: _focusedColumnId } = useFocusedColumn()
4343
const springAnimatedTheme = useCSSVariablesOrSpringAnimatedTheme()
4444
const { appViewMode } = useAppViewMode()
4545
const { sizename } = useAppLayout()
4646

47+
const focusedColumnId = _focusedColumnId || columnIds[0]
48+
4749
if (!(appViewMode === 'single-column' && shouldRenderFAB(sizename)))
4850
return null
4951
if (currentOpenedModal) return null

packages/components/src/components/columns/ColumnsRenderer.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ export function ColumnsRenderer() {
1818

1919
const { sizename } = useAppLayout()
2020
const { appViewMode } = useAppViewMode()
21-
const focusedColumnId = useFocusedColumn() || columnIds[0]
21+
const { focusedColumnId: _focusedColumnId } = useFocusedColumn()
22+
23+
const focusedColumnId = _focusedColumnId || columnIds[0]
2224

2325
if (appViewMode === 'single-column') {
2426
const shouldRenderFixedColumnOptions = sizename >= '4-x-large'

packages/components/src/components/context/ColumnFocusContext.tsx

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,36 @@ export interface ColumnFocusProviderProps {
99
children?: React.ReactNode
1010
}
1111

12-
export type ColumnFocusProviderState = string | null
12+
export interface ColumnFocusProviderState {
13+
focusedColumnId: string | null
14+
focusedColumnIndex: number
15+
}
1316

17+
const defaultValue: ColumnFocusProviderState = {
18+
focusedColumnId: null,
19+
focusedColumnIndex: -1,
20+
}
1421
export const ColumnFocusContext = React.createContext<ColumnFocusProviderState>(
15-
null,
22+
defaultValue,
1623
)
1724

1825
export function ColumnFocusProvider(props: ColumnFocusProviderProps) {
1926
const store = useReduxStore()
20-
const [columnId, setColumnId] = useState<ColumnFocusProviderState>(null)
27+
const [value, setValue] = useState<ColumnFocusProviderState>(defaultValue)
2128

2229
useEmitter(
2330
'FOCUS_ON_COLUMN',
2431
payload => {
25-
setColumnId(payload.columnId || null)
32+
const state = store.getState()
33+
const columnIds = selectors.columnIdsSelector(state)
34+
35+
const focusedColumnId = payload.columnId || null
36+
const focusedColumnIndex =
37+
columnIds && focusedColumnId
38+
? columnIds.findIndex(id => id === focusedColumnId)
39+
: -1
40+
41+
setValue({ focusedColumnId, focusedColumnIndex })
2642
},
2743
[],
2844
)
@@ -33,7 +49,9 @@ export function ColumnFocusProvider(props: ColumnFocusProviderProps) {
3349
const state = store.getState()
3450
const columnIds = selectors.columnIdsSelector(state)
3551
const focusedColumnIndex = columnIds
36-
? columnIds.findIndex(id => id === (columnId || columnIds[0]))
52+
? columnIds.findIndex(
53+
id => id === (value.focusedColumnId || columnIds[0]),
54+
)
3755
: -1
3856

3957
const previousColumnIndex = Math.max(
@@ -47,7 +65,7 @@ export function ColumnFocusProvider(props: ColumnFocusProviderProps) {
4765
columnIndex: previousColumnIndex,
4866
})
4967
},
50-
[columnId],
68+
[value.focusedColumnId],
5169
)
5270

5371
useEmitter(
@@ -56,7 +74,9 @@ export function ColumnFocusProvider(props: ColumnFocusProviderProps) {
5674
const state = store.getState()
5775
const columnIds = selectors.columnIdsSelector(state)
5876
const focusedColumnIndex = columnIds
59-
? columnIds.findIndex(id => id === (columnId || columnIds[0]))
77+
? columnIds.findIndex(
78+
id => id === (value.focusedColumnId || columnIds[0]),
79+
)
6080
: -1
6181

6282
const nextColumnIndex = Math.max(
@@ -70,27 +90,33 @@ export function ColumnFocusProvider(props: ColumnFocusProviderProps) {
7090
columnIndex: nextColumnIndex,
7191
})
7292
},
73-
[columnId],
93+
[value.focusedColumnId],
7494
)
7595

7696
useEmitter(
7797
'SCROLL_DOWN_COLUMN',
7898
payload => {
79-
setColumnId(payload.columnId || null)
99+
setValue({
100+
focusedColumnId: payload.columnId || null,
101+
focusedColumnIndex: payload.columnIndex,
102+
})
80103
},
81104
[],
82105
)
83106

84107
useEmitter(
85108
'SCROLL_UP_COLUMN',
86109
payload => {
87-
setColumnId(payload.columnId || null)
110+
setValue({
111+
focusedColumnId: payload.columnId || null,
112+
focusedColumnIndex: payload.columnIndex,
113+
})
88114
},
89115
[],
90116
)
91117

92118
return (
93-
<ColumnFocusContext.Provider value={columnId}>
119+
<ColumnFocusContext.Provider value={value}>
94120
{props.children}
95121
</ColumnFocusContext.Provider>
96122
)

packages/components/src/components/layout/Sidebar.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,11 @@ export const Sidebar = React.memo((props: SidebarProps) => {
7272
const closeAllModals = useReduxAction(actions.closeAllModals)
7373
const replaceModal = useReduxAction(actions.replaceModal)
7474

75-
const focusedColumnId = useFocusedColumn() || columnIds[0]
75+
const {
76+
focusedColumnId: _focusedColumnId,
77+
focusedColumnIndex,
78+
} = useFocusedColumn()
79+
const focusedColumnId = _focusedColumnId || columnIds[0]
7680

7781
useEffect(() => {
7882
if (!(flatListRef.current && focusedColumnId)) return
@@ -82,7 +86,7 @@ export const Sidebar = React.memo((props: SidebarProps) => {
8286
item: focusedColumnId,
8387
viewPosition: 0.5,
8488
})
85-
}, [focusedColumnId, flatListRef.current])
89+
}, [focusedColumnId, focusedColumnIndex, flatListRef.current])
8690

8791
const small = sizename === '1-small'
8892
const large = sizename >= '3-large'

packages/components/src/libs/emitter/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ export interface EmitterTypes {
2424
highlight?: boolean
2525
scrollTo?: boolean
2626
}
27-
SCROLL_DOWN_COLUMN: { columnId: string }
28-
SCROLL_UP_COLUMN: { columnId: string }
27+
SCROLL_DOWN_COLUMN: { columnId: string; columnIndex: number }
28+
SCROLL_UP_COLUMN: { columnId: string; columnIndex: number }
2929
}
3030

3131
const _emitter = new EventEmitter()

packages/components/src/redux/actions/columns.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
GitHubNotificationSubjectType,
1010
NotificationColumnFilters,
1111
} from '@devhub/core'
12+
import { EmitterTypes } from '../../libs/emitter'
1213
import { createAction } from '../helpers'
1314

1415
export function replaceColumnsAndSubscriptions(
@@ -42,7 +43,12 @@ export function deleteColumn(payload: {
4243
return createAction('DELETE_COLUMN', payload)
4344
}
4445

45-
export function moveColumn(payload: { columnId: string; columnIndex: number }) {
46+
export function moveColumn(
47+
payload: {
48+
columnId: string
49+
columnIndex: number
50+
} & EmitterTypes['FOCUS_ON_COLUMN'],
51+
) {
4652
return createAction('MOVE_COLUMN', payload)
4753
}
4854

0 commit comments

Comments
 (0)