dataset-item.tsx 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. 'use client'
  2. import type { FC } from 'react'
  3. import React, { useCallback } from 'react'
  4. import { useBoolean } from 'ahooks'
  5. import {
  6. RiDeleteBinLine,
  7. RiEditLine,
  8. } from '@remixicon/react'
  9. import type { DataSet } from '@/models/datasets'
  10. import { DataSourceType } from '@/models/datasets'
  11. import FileIcon from '@/app/components/base/file-icon'
  12. import { Folder } from '@/app/components/base/icons/src/vender/solid/files'
  13. import SettingsModal from '@/app/components/app/configuration/dataset-config/settings-modal'
  14. import Drawer from '@/app/components/base/drawer'
  15. import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
  16. import Badge from '@/app/components/base/badge'
  17. import { useKnowledge } from '@/hooks/use-knowledge'
  18. type Props = {
  19. payload: DataSet
  20. onRemove: () => void
  21. onChange: (dataSet: DataSet) => void
  22. readonly?: boolean
  23. }
  24. const DatasetItem: FC<Props> = ({
  25. payload,
  26. onRemove,
  27. onChange,
  28. readonly,
  29. }) => {
  30. const media = useBreakpoints()
  31. const isMobile = media === MediaType.mobile
  32. const { formatIndexingTechniqueAndMethod } = useKnowledge()
  33. const [isShowSettingsModal, {
  34. setTrue: showSettingsModal,
  35. setFalse: hideSettingsModal,
  36. }] = useBoolean(false)
  37. const handleSave = useCallback((newDataset: DataSet) => {
  38. onChange(newDataset)
  39. hideSettingsModal()
  40. }, [hideSettingsModal, onChange])
  41. return (
  42. <div className='flex items-center h-10 justify-between rounded-xl px-2 bg-white border border-gray-200 cursor-pointer group/dataset-item'>
  43. <div className='w-0 grow flex items-center space-x-1.5'>
  44. {
  45. payload.data_source_type === DataSourceType.NOTION
  46. ? (
  47. <div className='shrink-0 flex items-center justify-center w-6 h-6 rounded-md border-[0.5px] border-[#EAECF5]'>
  48. <FileIcon type='notion' className='w-4 h-4' />
  49. </div>
  50. )
  51. : <div className='shrink-0 flex items-center justify-center w-6 h-6 bg-[#F5F8FF] rounded-md border-[0.5px] border-[#E0EAFF]'>
  52. <Folder className='w-4 h-4 text-[#444CE7]' />
  53. </div>
  54. }
  55. <div className='w-0 grow text-[13px] font-normal text-gray-800 truncate'>{payload.name}</div>
  56. </div>
  57. {!readonly && (
  58. <div className='hidden group-hover/dataset-item:flex shrink-0 ml-2 items-center space-x-1'>
  59. <div
  60. className='flex items-center justify-center w-6 h-6 hover:bg-black/5 rounded-md cursor-pointer'
  61. onClick={showSettingsModal}
  62. >
  63. <RiEditLine className='w-4 h-4 text-gray-500' />
  64. </div>
  65. <div
  66. className='flex items-center justify-center w-6 h-6 hover:bg-black/5 rounded-md cursor-pointer'
  67. onClick={onRemove}
  68. >
  69. <RiDeleteBinLine className='w-4 h-4 text-gray-500' />
  70. </div>
  71. </div>
  72. )}
  73. <Badge
  74. className='group-hover/dataset-item:hidden shrink-0'
  75. text={formatIndexingTechniqueAndMethod(payload.indexing_technique, payload.retrieval_model_dict?.search_method)}
  76. />
  77. {isShowSettingsModal && (
  78. <Drawer isOpen={isShowSettingsModal} onClose={hideSettingsModal} footer={null} mask={isMobile} panelClassname='mt-16 mx-2 sm:mr-2 mb-3 !p-0 !max-w-[640px] rounded-xl'>
  79. <SettingsModal
  80. currentDataset={payload}
  81. onCancel={hideSettingsModal}
  82. onSave={handleSave}
  83. />
  84. </Drawer>
  85. )}
  86. </div>
  87. )
  88. }
  89. export default React.memo(DatasetItem)