feat: adds dropdown component control props

This commit is contained in:
jongomez 2023-09-27 14:48:22 +01:00 committed by Jon
parent a7bfa14d9d
commit e4f3567cec

View File

@ -32,6 +32,8 @@ export type DropdownProps = CommonProps &
value?: string | string[] value?: string | string[]
onChange?: (value: string | string[]) => void onChange?: (value: string | string[]) => void
variant?: 'outlined' | 'outlined-bottom' variant?: 'outlined' | 'outlined-bottom'
isOpen?: boolean
onToggle?: (open: boolean) => void
} }
export const Dropdown: React.FC<DropdownProps> & { export const Dropdown: React.FC<DropdownProps> & {
@ -43,33 +45,43 @@ export const Dropdown: React.FC<DropdownProps> & {
disabled = false, disabled = false,
supportingText, supportingText,
triggerLabel, triggerLabel,
value = [], value = [],
onChange, onChange,
options = [], options = [],
multi = false, multi = false,
variant = 'outlined', variant = 'outlined',
isOpen,
onToggle,
...props ...props
}) => { }) => {
const commonProps = useCommonProps(props) const commonProps = useCommonProps(props)
const containerRef = useRef<HTMLDivElement>(null) const containerRef = useRef<HTMLDivElement>(null)
const [open, setOpen] = useState(false) const isControlled = isOpen !== undefined
const [openState, setOpenState] = useState(false)
const open = isControlled ? isOpen : openState
const { select, isSelected, selected } = useSelect(options, value, { const { select, isSelected, selected } = useSelect(options, value, {
multi, multi,
onChange, onChange,
onDone: () => { onDone: () => {
setOpen(false) setOpenState(false)
}, },
}) })
const onTrigger = () => { const onTrigger = () => {
!disabled && setOpen((value) => !value) if (disabled) return
if (isControlled) {
onToggle && onToggle(!open)
} else {
setOpenState(!open)
}
} }
useEffect(() => { useEffect(() => {
if (disabled && open) setOpen(false) if (disabled && open && !isControlled) setOpenState(false)
}, [open, disabled]) }, [open, disabled, isControlled])
const buttonId = props?.id ?? (props.id || 'dropdown') + '-input' const buttonId = props?.id ?? (props.id || 'dropdown') + '-input'
@ -149,7 +161,13 @@ export const Dropdown: React.FC<DropdownProps> & {
<DropdownMenu <DropdownMenu
handleRef={containerRef} handleRef={containerRef}
open={open} open={open}
onClose={() => setOpen(false)} onClose={() => {
if (isControlled) {
onToggle && onToggle(false)
} else {
setOpenState(false)
}
}}
size={size} size={size}
genericFontFamily={props.genericFontFamily} genericFontFamily={props.genericFontFamily}
> >