select-metadata-modal.tsx 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. 'use client'
  2. import type { FC } from 'react'
  3. import React, { useCallback, useState } from 'react'
  4. import type { Props as CreateContentProps } from './create-content'
  5. import CreateContent from './create-content'
  6. import SelectMetadata from './select-metadata'
  7. import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger } from '../../../base/portal-to-follow-elem'
  8. import type { MetadataItem } from '../types'
  9. import type { Placement } from '@floating-ui/react'
  10. import { useDatasetMetaData } from '@/service/knowledge/use-metadata'
  11. type Props = {
  12. datasetId: string
  13. popupPlacement?: Placement
  14. popupOffset?: { mainAxis: number, crossAxis: number }
  15. onSelect: (data: MetadataItem) => void
  16. onSave: (data: MetadataItem) => void
  17. trigger: React.ReactNode
  18. onManage: () => void
  19. } & CreateContentProps
  20. enum Step {
  21. select = 'select',
  22. create = 'create',
  23. }
  24. const SelectMetadataModal: FC<Props> = ({
  25. datasetId,
  26. popupPlacement = 'left-start',
  27. popupOffset = { mainAxis: -38, crossAxis: 4 },
  28. trigger,
  29. onSelect,
  30. onSave,
  31. onManage,
  32. }) => {
  33. const { data: datasetMetaData } = useDatasetMetaData(datasetId)
  34. const [open, setOpen] = useState(false)
  35. const [step, setStep] = useState(Step.select)
  36. const handleSave = useCallback(async (data: MetadataItem) => {
  37. await onSave(data)
  38. setStep(Step.select)
  39. }, [onSave])
  40. return (
  41. <PortalToFollowElem
  42. open={open}
  43. onOpenChange={setOpen}
  44. placement={popupPlacement}
  45. offset={popupOffset}
  46. >
  47. <PortalToFollowElemTrigger
  48. onClick={() => setOpen(!open)}
  49. className='block'
  50. >
  51. {trigger}
  52. </PortalToFollowElemTrigger>
  53. <PortalToFollowElemContent className='z-[1000]'>
  54. {step === Step.select ? (
  55. <SelectMetadata
  56. onSelect={(data) => {
  57. onSelect(data)
  58. setOpen(false)
  59. }}
  60. list={datasetMetaData?.doc_metadata || []}
  61. onNew={() => setStep(Step.create)}
  62. onManage={onManage}
  63. />
  64. ) : (
  65. <CreateContent
  66. onSave={handleSave}
  67. hasBack
  68. onBack={() => setStep(Step.select)}
  69. />
  70. )}
  71. </PortalToFollowElemContent>
  72. </PortalToFollowElem >
  73. )
  74. }
  75. export default React.memo(SelectMetadataModal)