Spaces:
Configuration error
Configuration error
import React, { useRef } from 'react' | |
import { | |
CheckIcon, | |
ChevronDownIcon, | |
ChevronUpIcon, | |
} from '@heroicons/react/24/outline' | |
import * as Select from '@radix-ui/react-select' | |
type SelectorChevronDirection = 'up' | 'down' | |
interface Props { | |
width?: number | |
value: string | |
options: string[] | |
chevronDirection?: SelectorChevronDirection | |
autoFocusAfterClose?: boolean | |
onChange: (value: string) => void | |
disabled?: boolean | |
} | |
const Selector = (props: Props) => { | |
const { | |
width, | |
value, | |
chevronDirection, | |
options, | |
autoFocusAfterClose, | |
onChange, | |
disabled, | |
} = props | |
const contentRef = useRef<HTMLButtonElement>(null) | |
const onOpenChange = (open: boolean) => { | |
if (!open) { | |
if (!autoFocusAfterClose) { | |
// 如果使用 Select.Content 的 onCloseAutoFocus 来取消 focus(防止空格继续打开这个 select) | |
// 会导致其它快捷键失效,原因未知 | |
window.setTimeout(() => { | |
contentRef?.current?.blur() | |
}, 100) | |
} | |
} | |
} | |
return ( | |
<Select.Root | |
value={value} | |
onValueChange={onChange} | |
onOpenChange={onOpenChange} | |
> | |
<Select.Trigger | |
className="select-trigger" | |
style={{ width }} | |
ref={contentRef} | |
onKeyDown={e => e.preventDefault()} | |
disabled={disabled} | |
> | |
<Select.Value /> | |
<Select.Icon> | |
{chevronDirection === 'up' ? <ChevronUpIcon /> : <ChevronDownIcon />} | |
</Select.Icon> | |
</Select.Trigger> | |
<Select.Content className="select-content"> | |
<Select.Viewport className="select-viewport"> | |
{options.map(val => ( | |
<Select.Item value={val} className="select-item" key={val}> | |
<Select.ItemText>{val}</Select.ItemText> | |
<Select.ItemIndicator className="select-item-indicator"> | |
<CheckIcon /> | |
</Select.ItemIndicator> | |
</Select.Item> | |
))} | |
</Select.Viewport> | |
</Select.Content> | |
</Select.Root> | |
) | |
} | |
const selectorDefaultProps = { | |
chevronDirection: 'down', | |
autoFocusAfterClose: true, | |
disabled: false, | |
} | |
Selector.defaultProps = selectorDefaultProps | |
export default Selector | |