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.

59 lines
1.7 KiB

1 year ago
1 year ago
1 year ago
  1. import { Popover, PopoverProps } from 'antd'
  2. import { FC, memo, useEffect } from 'react'
  3. import Display from './Display.tsx'
  4. import PickerPanel from './PickerPanel'
  5. import { ICON_RESET, PickerContextProvider, usePickerContext } from './context.tsx'
  6. import { IconUnit } from '@/components/icon/types.ts'
  7. interface PickerProps extends Partial<PopoverProps> {
  8. value?: string,
  9. onChange?: (value: string) => void,
  10. }
  11. const IconPicker: FC = memo((props: PickerProps) => {
  12. const { state, actions: { selectIcon, togglePanel } } = usePickerContext()
  13. const { value, onChange } = props
  14. useEffect(() => {
  15. if (onChange && state.icon) {
  16. if (state.icon === ICON_RESET) {
  17. return onChange('')
  18. }
  19. const icon = state.icon as IconUnit
  20. onChange(state.icon ? `${icon.type}:${icon.componentName}` : '')
  21. }
  22. }, [ state.icon ])
  23. useEffect(() => {
  24. if (value) {
  25. const [ type, componentName ] = value.split(':')
  26. selectIcon({ type, componentName } as any)
  27. } else {
  28. selectIcon(null as any)
  29. }
  30. }, [ value ])
  31. return (
  32. <Popover
  33. placement={'bottomLeft'}
  34. {...props}
  35. onOpenChange={(e) => {
  36. togglePanel(e)
  37. }}
  38. showArrow={false}
  39. open={state.open}
  40. trigger={'click'}
  41. content={<PickerPanel/>}
  42. >
  43. <Display/>
  44. </Popover>
  45. )
  46. })
  47. export default memo((props: PickerProps) => {
  48. return <PickerContextProvider value={{} as any}>
  49. <IconPicker {...props as any}/>
  50. </PickerContextProvider>
  51. })