result-item-external.tsx 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. 'use client'
  2. import type { FC } from 'react'
  3. import React from 'react'
  4. import { useTranslation } from 'react-i18next'
  5. import { useBoolean } from 'ahooks'
  6. import ResultItemMeta from './result-item-meta'
  7. import ResultItemFooter from './result-item-footer'
  8. import type { ExternalKnowledgeBaseHitTesting } from '@/models/datasets'
  9. import cn from '@/utils/classnames'
  10. import Modal from '@/app/components/base/modal'
  11. import { FileAppearanceTypeEnum } from '@/app/components/base/file-uploader/types'
  12. const i18nPrefix = 'datasetHitTesting'
  13. type Props = {
  14. payload: ExternalKnowledgeBaseHitTesting
  15. positionId: number
  16. }
  17. const ResultItemExternal: FC<Props> = ({ payload, positionId }) => {
  18. const { t } = useTranslation()
  19. const { content, title, score } = payload
  20. const [
  21. isShowDetailModal,
  22. { setTrue: showDetailModal, setFalse: hideDetailModal },
  23. ] = useBoolean(false)
  24. return (
  25. <div className={cn('pt-3 bg-chat-bubble-bg rounded-xl hover:shadow-lg cursor-pointer')} onClick={showDetailModal}>
  26. {/* Meta info */}
  27. <ResultItemMeta className='px-3' labelPrefix={'Chunk'} positionId={positionId} wordCount={content.length} score={score} />
  28. {/* Main */}
  29. <div className='mt-1 px-3'>
  30. <div className='line-clamp-2 body-md-regular break-all'>{content}</div>
  31. </div>
  32. {/* Foot */}
  33. <ResultItemFooter docType={FileAppearanceTypeEnum.custom} docTitle={title} showDetailModal={showDetailModal} />
  34. {isShowDetailModal && (
  35. <Modal
  36. title={t(`${i18nPrefix}.chunkDetail`)}
  37. className={'!min-w-[800px]'}
  38. closable
  39. onClose={hideDetailModal}
  40. isShow={isShowDetailModal}
  41. >
  42. <div className='mt-4 flex-1'>
  43. <ResultItemMeta labelPrefix={'Chunk'} positionId={positionId} wordCount={content.length} score={score} />
  44. <div className={cn('mt-2 body-md-regular text-text-secondary break-all', 'h-[min(539px,_80vh)] overflow-y-auto')}>
  45. {content}
  46. </div>
  47. </div>
  48. </Modal>
  49. )}
  50. </div>
  51. )
  52. }
  53. export default React.memo(ResultItemExternal)