handle focus on tag buttons

This commit is contained in:
Eric Bailey
2023-10-19 16:16:03 -04:00
parent 911a5a5638
commit 72bb3ccfac
2 changed files with 40 additions and 1 deletions
+24
View File
@@ -5,6 +5,7 @@ import {
FontAwesomeIconStyle, FontAwesomeIconStyle,
} from '@fortawesome/react-native-fontawesome' } from '@fortawesome/react-native-fontawesome'
import {isWeb} from 'platform/detection'
import {usePalette} from 'lib/hooks/usePalette' import {usePalette} from 'lib/hooks/usePalette'
import {Text, CustomTextProps} from 'view/com/util/text/Text' import {Text, CustomTextProps} from 'view/com/util/text/Text'
import {TextLink} from 'view/com/util/Link' import {TextLink} from 'view/com/util/Link'
@@ -85,13 +86,16 @@ export function TagButton({
value, value,
icon = 'x', icon = 'x',
onClick, onClick,
removeTag,
}: { }: {
value: string value: string
icon?: React.ComponentProps<typeof FontAwesomeIcon>['icon'] icon?: React.ComponentProps<typeof FontAwesomeIcon>['icon']
onClick?: (tag: string) => void onClick?: (tag: string) => void
removeTag?: (tag: string) => void
}) { }) {
const pal = usePalette('default') const pal = usePalette('default')
const [hovered, setHovered] = React.useState(false) const [hovered, setHovered] = React.useState(false)
const [focused, setFocused] = React.useState(false)
const hoverIn = React.useCallback(() => { const hoverIn = React.useCallback(() => {
setHovered(true) setHovered(true)
@@ -101,12 +105,32 @@ export function TagButton({
setHovered(false) setHovered(false)
}, [setHovered]) }, [setHovered])
React.useEffect(() => {
if (!isWeb) return
function listener(e: KeyboardEvent) {
if (e.key === 'Backspace') {
if (focused) {
removeTag?.(value)
}
}
}
document.addEventListener('keydown', listener)
return () => {
document.removeEventListener('keydown', listener)
}
}, [value, focused, removeTag])
return ( return (
<Pressable <Pressable
accessibilityRole="button" accessibilityRole="button"
onPress={() => onClick?.(value)} onPress={() => onClick?.(value)}
onPointerEnter={hoverIn} onPointerEnter={hoverIn}
onPointerLeave={hoverOut} onPointerLeave={hoverOut}
onFocus={() => setFocused(true)}
onBlur={() => setFocused(false)}
style={state => [ style={state => [
pal.viewLight, pal.viewLight,
styles.tagButton, styles.tagButton,
+16 -1
View File
@@ -14,6 +14,7 @@ import {
} from '@fortawesome/react-native-fontawesome' } from '@fortawesome/react-native-fontawesome'
import {Pin} from 'pind' import {Pin} from 'pind'
import {isWeb} from 'platform/detection'
import {TagsAutocompleteModel} from 'state/models/ui/tags-autocomplete' import {TagsAutocompleteModel} from 'state/models/ui/tags-autocomplete'
import {usePalette} from 'lib/hooks/usePalette' import {usePalette} from 'lib/hooks/usePalette'
import {TagButton} from 'view/com/Tag' import {TagButton} from 'view/com/Tag'
@@ -132,6 +133,14 @@ export function TagInput({
} else if (key === 'ArrowDown') { } else if (key === 'ArrowDown') {
e.preventDefault() e.preventDefault()
setSelectedItemIndex((selectedItemIndex + 1) % dropdownItems.length) setSelectedItemIndex((selectedItemIndex + 1) % dropdownItems.length)
} else if (
isWeb &&
key === 'Tab' &&
// @ts-ignore web only
!e.nativeEvent.shiftKey
) {
e.preventDefault()
onSubmitEditing()
} }
} }
}, },
@@ -145,6 +154,7 @@ export function TagInput({
setSelectedItemIndex, setSelectedItemIndex,
addTags, addTags,
addTagAndReset, addTagAndReset,
onSubmitEditing,
], ],
) )
@@ -244,7 +254,12 @@ export function TagInput({
)} )}
{tags.map(tag => ( {tags.map(tag => (
<TagButton key={tag} value={tag} onClick={removeTag} /> <TagButton
key={tag}
value={tag}
onClick={removeTag}
removeTag={removeTag}
/>
))} ))}
{tags.length >= max ? null : ( {tags.length >= max ? null : (