Skip to content

Commit 25d594a

Browse files
committed
chore(ui): improve keyboard support
1 parent b345cd1 commit 25d594a

File tree

11 files changed

+40
-33
lines changed

11 files changed

+40
-33
lines changed

ui/src/articles/components/ArticlesPageMenu.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -131,32 +131,32 @@ export const ArticlesPageMenu = (props: Props) => {
131131
{!!req.category && (
132132
<li>
133133
<DropDownMenuItem label='View'>
134-
<ToggleView value={req.starred ? 'starred' : req.status ?? 'inbox'} onChange={handleChangeView} keys="shift+h" />
134+
<ToggleView value={req.starred ? 'starred' : req.status ?? 'inbox'} onChange={handleChangeView} kbs="shift+h" />
135135
</DropDownMenuItem>
136136
</li>
137137
)}
138138
<li>
139139
<DropDownMenuItem label='Display as'>
140-
<ToggleDisplayMode value={getDisplayPreference().mode} onChange={(mode) => setDisplayPreference({mode})} keys="shift+d" />
140+
<ToggleDisplayMode value={getDisplayPreference().mode} onChange={(mode) => setDisplayPreference({mode})} kbs="shift+d" />
141141
</DropDownMenuItem>
142142
</li>
143143
{variant === 'starred' && (
144144
<li>
145145
<DropDownMenuItem label='Sort by'>
146-
<ToggleSortBy value={getDisplayPreference().by} onChange={handleChangeSortBy} keys="shift+b" />
146+
<ToggleSortBy value={getDisplayPreference().by} onChange={handleChangeSortBy} kbs="shift+b" />
147147
</DropDownMenuItem>
148148
</li>
149149
)}
150150
<li>
151151
<DropDownMenuItem label='Order '>
152-
<ToggleSortOrder value={getDisplayPreference().order} onChange={handleChangeSortOrder} keys="shift+o" />
152+
<ToggleSortOrder value={getDisplayPreference().order} onChange={handleChangeSortOrder} kbs="shift+o" />
153153
</DropDownMenuItem>
154154
</li>
155155
{req.status === 'inbox' && (
156156
<li>
157157
<LinkIcon onClick={showMarkAllAsReadDialog} icon="done_all">
158158
<span>Mark all as read</span>
159-
<Kbd keys="shift+m" onKeypress={showMarkAllAsReadDialog} />
159+
<Kbd keys="shift+del" onKeypress={showMarkAllAsReadDialog} />
160160
</LinkIcon>
161161
</li>
162162
)}

ui/src/articles/components/MarkAsButton.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,12 @@ const variants: VariantsType = {
2929
inbox: {
3030
title: 'Put back to the inbox',
3131
icon: 'undo',
32-
kbs: 'm',
32+
kbs: 'ins',
3333
},
3434
read: {
3535
title: 'Mark as read',
3636
icon: 'done',
37-
kbs: 'm',
37+
kbs: 'del',
3838
},
3939
to_read: {
4040
title: 'Read it later',

ui/src/articles/components/ToggleDisplayMode.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { DisplayMode } from '../../contexts'
55
interface Props {
66
value: DisplayMode
77
onChange: (value: DisplayMode) => void
8-
keys: string
8+
kbs: string
99
}
1010

1111
const values: {
@@ -27,9 +27,9 @@ const values: {
2727

2828
const toggle = (value: DisplayMode) => value === 'grid' ? 'list' : 'grid'
2929

30-
export const ToggleDisplayMode = ({value, onChange, keys}: Props) => (
30+
export const ToggleDisplayMode = ({value, onChange, kbs}: Props) => (
3131
<>
3232
<ToggleMenuItem name='display-mode' value={value} onChange={onChange} values={values} />
33-
<Kbd keys={keys} onKeypress={() => onChange(toggle(value))} />
33+
<Kbd keys={kbs} onKeypress={() => onChange(toggle(value))} />
3434
</>
3535
)

ui/src/articles/components/ToggleSortBy.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { SortBy } from '../models'
55
interface Props {
66
value: SortBy
77
onChange: (by: SortBy) => void
8-
keys: string
8+
kbs: string
99
}
1010

1111
const values: {
@@ -27,9 +27,9 @@ const values: {
2727

2828
const toggle = (value: SortBy) => value === 'key' ? 'stars' : 'key'
2929

30-
export const ToggleSortBy = ({value, onChange, keys}: Props) => (
30+
export const ToggleSortBy = ({value, onChange, kbs}: Props) => (
3131
<>
3232
<ToggleMenuItem name='sort-by' value={value} onChange={onChange} values={values} />
33-
<Kbd keys={keys} onKeypress={() => onChange(toggle(value))} />
33+
<Kbd keys={kbs} onKeypress={() => onChange(toggle(value))} />
3434
</>
3535
)

ui/src/articles/components/ToggleSortOrder.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { SortOrder } from '../models'
55
interface Props {
66
value: SortOrder
77
onChange: (order: SortOrder) => void
8-
keys: string
8+
kbs: string
99
}
1010

1111
const values: {
@@ -27,9 +27,9 @@ const values: {
2727

2828
const toggle = (value: SortOrder) => value === 'asc' ? 'desc' : 'asc'
2929

30-
export const ToggleSortOrder = ({value, onChange, keys}: Props) => (
30+
export const ToggleSortOrder = ({value, onChange, kbs}: Props) => (
3131
<>
3232
<ToggleMenuItem name='sort-order' value={value} onChange={onChange} values={values} />
33-
<Kbd keys={keys} onKeypress={() => onChange(toggle(value))} />
33+
<Kbd keys={kbs} onKeypress={() => onChange(toggle(value))} />
3434
</>
3535
)

ui/src/articles/components/ToggleView.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ type ViewMode = ArticleStatus | 'starred'
77
interface Props {
88
value: ViewMode
99
onChange: (value: ViewMode) => void
10-
keys: string
10+
kbs: string
1111
}
1212

1313
const values: {
@@ -42,9 +42,9 @@ const toggle = (value: ViewMode) => value === 'inbox' ? 'to_read'
4242
: value === 'read' ? 'starred'
4343
: 'inbox'
4444

45-
export const ToggleView = ({value, onChange, keys}: Props) => (
45+
export const ToggleView = ({value, onChange, kbs}: Props) => (
4646
<>
4747
<ToggleMenuItem name='view-mode' value={value} onChange={onChange} values={values} />
48-
<Kbd keys={keys} onKeypress={() => onChange(toggle(value))} />
48+
<Kbd keys={kbs} onKeypress={() => onChange(toggle(value))} />
4949
</>
5050
)

ui/src/articles/components/context-menu/ArticleContextMenu.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export const ArticleContextMenu = (props: Props) => {
2020
const isOnline = !props.article.isOffline
2121

2222
return (
23-
<DrawerMenu title={title}>
23+
<DrawerMenu title={title} kbs={props.keyboard ? 'm' : ''}>
2424
<ul>
2525
{props.showEditModal && (
2626
<li>

ui/src/components/DrawerMenu.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,23 @@ import React, { createRef, CSSProperties, FC, PropsWithChildren, useCallback, us
22
import Drawer from 'react-bottom-drawer'
33

44
import { ButtonIcon } from '.'
5+
import { useKeyboard } from '../hooks'
56

67
interface Props extends PropsWithChildren {
78
style?: CSSProperties
89
title?: string
910
icon?: string
11+
kbs?: string
1012
}
1113

1214
export const DrawerMenu: FC<Props> = (props) => {
13-
const { children, icon = 'more_vert', ...attrs } = props
15+
const { children, icon = 'more_vert', kbs, ...attrs } = props
1416
const [isVisible, setIsVisible] = useState(false)
1517
const ref = createRef<HTMLDivElement>()
1618

19+
const toggle = React.useCallback(() => {
20+
setIsVisible(!isVisible)
21+
}, [isVisible])
1722
const onClose = React.useCallback(() => {
1823
setIsVisible(false)
1924
}, [])
@@ -33,6 +38,9 @@ export const DrawerMenu: FC<Props> = (props) => {
3338
}
3439
}, [handleClickOutside])
3540

41+
useKeyboard(kbs, toggle, !!kbs)
42+
attrs.title += kbs ? ` [${kbs}]` : ''
43+
3644
return (
3745
<>
3846
<ButtonIcon icon={icon} {...attrs} onClick={handleClickMenu} />

ui/src/components/DropDownMenu.tsx

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,6 @@ export const DropDownMenu: FC<Props> = (props) => {
4444
const $el = e.target
4545
if (!($el instanceof Element)) return
4646
if (ref.current && !ref.current.contains($el)) {
47-
/*
48-
const isButton = $el.parentElement && $el.parentElement.tagName === 'BUTTON'
49-
const $details = $el.closest('details')
50-
if (!isButton || $details !== ref.current) {
51-
ref.current.removeAttribute('open')
52-
}
53-
*/
5447
ref.current.removeAttribute('open')
5548
}
5649
},
@@ -70,7 +63,7 @@ export const DropDownMenu: FC<Props> = (props) => {
7063
document.removeEventListener('click', handleClickOutside, { capture: true })
7164
}
7265
}, [handleClickOutside])
73-
66+
7467
return (
7568
<details ref={ref} className={styles.menu}>
7669
<summary>

ui/src/components/Shortcuts.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export const Shortcuts = () => (
1717
Toggle sort by (if starred)<kbd>shift+b</kbd>
1818
</li>
1919
<li>
20-
Mark all as read (if category or main list)<kbd>shift+m</kbd>
20+
Mark all as read (if category or main list)<kbd>shift+del</kbd>
2121
</li>
2222
<li>
2323
Toggle history list (if category)<kbd>shift+h</kbd>
@@ -46,7 +46,10 @@ export const Shortcuts = () => (
4646
<h1>Article</h1>
4747
<ul>
4848
<li>
49-
Toggle read status<kbd>m</kbd>
49+
Mark article as read<kbd>del</kbd>
50+
</li>
51+
<li>
52+
Mark article as unread<kbd>ins</kbd>
5053
</li>
5154
<li>
5255
Read article later<kbd>r</kbd>
@@ -66,6 +69,9 @@ export const Shortcuts = () => (
6669
<li>
6770
Save to default archive service<kbd>shift+s</kbd>
6871
</li>
72+
<li>
73+
Open article menu<kbd>m</kbd>
74+
</li>
6975
<li>
7076
Back to list<kbd>backspace</kbd>
7177
</li>

0 commit comments

Comments
 (0)