You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

60 lines
1.7 KiB

import { Popover, PopoverProps } from 'antd'
import { FC, memo, useEffect } from 'react'
import Display from './Display.tsx'
import PickerPanel from './PickerPanel'
import { ICON_RESET, PickerContextProvider, usePickerContext } from './context.tsx'
import { IconUnit } from '@/components/icon/types.ts'
interface PickerProps extends Partial<PopoverProps> {
value?: string,
onChange?: (value: string) => void,
}
const IconPicker: FC = memo((props: PickerProps) => {
const { state, actions: { selectIcon, togglePanel } } = usePickerContext()
const { value, onChange } = props
useEffect(() => {
if (onChange && state.icon) {
if (state.icon === ICON_RESET) {
return onChange('')
}
const icon = state.icon as IconUnit
onChange(state.icon ? `${icon.type}:${icon.componentName}` : '')
}
}, [ state.icon ])
useEffect(() => {
if (value) {
const [ type, componentName ] = value.split(':')
selectIcon({ type, componentName } as any)
} else {
selectIcon(null as any)
}
}, [ value ])
return (
<Popover
placement={'bottomLeft'}
{...props}
onOpenChange={(e) => {
togglePanel(e)
}}
showArrow={false}
open={state.open}
trigger={'click'}
content={<PickerPanel/>}
>
<Display/>
</Popover>
)
})
export default memo((props: PickerProps) => {
return <PickerContextProvider value={{} as any}>
<IconPicker {...props as any}/>
</PickerContextProvider>
})