node.tsx 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import { type FC, useEffect, useState } from 'react'
  2. import React from 'react'
  3. import type { KnowledgeRetrievalNodeType } from './types'
  4. import { Folder } from '@/app/components/base/icons/src/vender/solid/files'
  5. import type { NodeProps } from '@/app/components/workflow/types'
  6. import type { DataSet } from '@/models/datasets'
  7. import { useDatasetsDetailStore } from '../../datasets-detail-store/store'
  8. const Node: FC<NodeProps<KnowledgeRetrievalNodeType>> = ({
  9. data,
  10. }) => {
  11. const [selectedDatasets, setSelectedDatasets] = useState<DataSet[]>([])
  12. const datasetsDetail = useDatasetsDetailStore(s => s.datasetsDetail)
  13. useEffect(() => {
  14. if (data.dataset_ids?.length > 0) {
  15. const dataSetsWithDetail = data.dataset_ids.reduce<DataSet[]>((acc, id) => {
  16. if (datasetsDetail[id])
  17. acc.push(datasetsDetail[id])
  18. return acc
  19. }, [])
  20. setSelectedDatasets(dataSetsWithDetail)
  21. }
  22. else {
  23. setSelectedDatasets([])
  24. }
  25. }, [data.dataset_ids, datasetsDetail])
  26. if (!selectedDatasets.length)
  27. return null
  28. return (
  29. <div className='mb-1 px-3 py-1'>
  30. <div className='space-y-0.5'>
  31. {selectedDatasets.map(({ id, name }) => (
  32. <div key={id} className='flex h-[26px] items-center rounded-md bg-workflow-block-parma-bg px-1 text-xs font-normal text-gray-700'>
  33. <div className='mr-1 shrink-0 rounded-md border-[0.5px] border-[#E0EAFF] bg-[#F5F8FF] p-1'>
  34. <Folder className='h-3 w-3 text-[#444CE7]' />
  35. </div>
  36. <div className='system-xs-regular w-0 grow truncate text-text-secondary'>
  37. {name}
  38. </div>
  39. </div>
  40. ))}
  41. </div>
  42. </div>
  43. )
  44. }
  45. export default React.memo(Node)