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.

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import { type FC, useEffect, useState } from 'react'
  2. import React from 'react'
  3. import type { KnowledgeRetrievalNodeType } from './types'
  4. import type { NodeProps } from '@/app/components/workflow/types'
  5. import type { DataSet } from '@/models/datasets'
  6. import { useDatasetsDetailStore } from '../../datasets-detail-store/store'
  7. import AppIcon from '@/app/components/base/app-icon'
  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, icon_info }) => (
  32. <div key={id} className='flex h-[26px] items-center gap-x-1 rounded-md bg-workflow-block-parma-bg px-1'>
  33. <AppIcon
  34. size='xs'
  35. iconType={icon_info.icon_type}
  36. icon={icon_info.icon}
  37. background={icon_info.icon_type === 'image' ? undefined : icon_info.icon_background}
  38. imageUrl={icon_info.icon_type === 'image' ? icon_info.icon_url : undefined}
  39. className='shrink-0'
  40. />
  41. <div className='system-xs-regular w-0 grow truncate text-text-secondary'>
  42. {name}
  43. </div>
  44. </div>
  45. ))}
  46. </div>
  47. </div>
  48. )
  49. }
  50. export default React.memo(Node)