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.

index.tsx 1.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import { useMemo } from 'react'
  2. import cn from '@/utils/classnames'
  3. import type { ChunkInfo, GeneralChunks, ParentChildChunk, ParentChildChunks, QAChunk, QAChunks } from './types'
  4. import { ChunkingMode, type ParentMode } from '@/models/datasets'
  5. import ChunkCard from './chunk-card'
  6. type ChunkCardListProps = {
  7. chunkType: ChunkingMode
  8. parentMode?: ParentMode
  9. chunkInfo: ChunkInfo
  10. className?: string
  11. }
  12. export const ChunkCardList = (props: ChunkCardListProps) => {
  13. const { chunkType, parentMode, chunkInfo, className } = props
  14. const chunkList = useMemo(() => {
  15. if (chunkType === ChunkingMode.text)
  16. return chunkInfo as GeneralChunks
  17. if (chunkType === ChunkingMode.parentChild)
  18. return (chunkInfo as ParentChildChunks).parent_child_chunks
  19. return (chunkInfo as QAChunks).qa_chunks
  20. }, [chunkInfo])
  21. const getWordCount = (seg: string | ParentChildChunk | QAChunk) => {
  22. if (chunkType === ChunkingMode.parentChild)
  23. return (seg as ParentChildChunk).parent_content.length
  24. if (chunkType === ChunkingMode.text)
  25. return (seg as string).length
  26. return (seg as QAChunk).question.length + (seg as QAChunk).answer.length
  27. }
  28. return (
  29. <div className={cn('flex w-full flex-col gap-y-1', className)}>
  30. {chunkList.map((seg, index: number) => {
  31. const wordCount = getWordCount(seg)
  32. return (
  33. <ChunkCard
  34. key={`${chunkType}-${index}`}
  35. chunkType={chunkType}
  36. parentMode={parentMode}
  37. content={chunkType === ChunkingMode.parentChild ? (seg as ParentChildChunk).child_contents : (seg as string | QAChunk)}
  38. wordCount={wordCount}
  39. positionId={index + 1}
  40. />
  41. )
  42. })}
  43. </div>
  44. )
  45. }