import { type FC, useMemo, useState } from 'react' import { RiArrowDownSLine, RiArrowRightSLine } from '@remixicon/react' import { useTranslation } from 'react-i18next' import { EditSlice } from '../../../formatted-text/flavours/edit-slice' import { useDocumentContext } from '../index' import { FormattedText } from '../../../formatted-text/formatted' import Empty from './common/empty' import FullDocListSkeleton from './skeleton/full-doc-list-skeleton' import { useSegmentListContext } from './index' import type { ChildChunkDetail } from '@/models/datasets' import Input from '@/app/components/base/input' import classNames from '@/utils/classnames' import Divider from '@/app/components/base/divider' import { formatNumber } from '@/utils/format' type IChildSegmentCardProps = { childChunks: ChildChunkDetail[] parentChunkId: string handleInputChange?: (value: string) => void handleAddNewChildChunk?: (parentChunkId: string) => void enabled: boolean onDelete?: (segId: string, childChunkId: string) => Promise onClickSlice?: (childChunk: ChildChunkDetail) => void total?: number inputValue?: string onClearFilter?: () => void isLoading?: boolean focused?: boolean } const ChildSegmentList: FC = ({ childChunks, parentChunkId, handleInputChange, handleAddNewChildChunk, enabled, onDelete, onClickSlice, total, inputValue, onClearFilter, isLoading, focused = false, }) => { const { t } = useTranslation() const parentMode = useDocumentContext(s => s.parentMode) const currChildChunk = useSegmentListContext(s => s.currChildChunk) const [collapsed, setCollapsed] = useState(true) const toggleCollapse = () => { setCollapsed(!collapsed) } const isParagraphMode = useMemo(() => { return parentMode === 'paragraph' }, [parentMode]) const isFullDocMode = useMemo(() => { return parentMode === 'full-doc' }, [parentMode]) const contentOpacity = useMemo(() => { return (enabled || focused) ? '' : 'opacity-50 group-hover/card:opacity-100' }, [enabled, focused]) const totalText = useMemo(() => { const isSearch = inputValue !== '' && isFullDocMode if (!isSearch) { const text = isFullDocMode ? !total ? '--' : formatNumber(total) : formatNumber(childChunks.length) const count = isFullDocMode ? text === '--' ? 0 : total : childChunks.length return `${text} ${t('datasetDocuments.segment.childChunks', { count })}` } else { const text = !total ? '--' : formatNumber(total) const count = text === '--' ? 0 : total return `${count} ${t('datasetDocuments.segment.searchResults', { count })}` } // eslint-disable-next-line react-hooks/exhaustive-deps }, [isFullDocMode, total, childChunks.length, inputValue]) return (
{isFullDocMode ? : null}
{ event.stopPropagation() toggleCollapse() }} > { isParagraphMode ? collapsed ? ( ) : () : null } {totalText} ·
{isFullDocMode ? handleInputChange?.(e.target.value)} onClear={() => handleInputChange?.('')} /> : null}
{isLoading ? : null} {((isFullDocMode && !isLoading) || !collapsed) ?
{isParagraphMode && (
)} {childChunks.length > 0 ? {childChunks.map((childChunk) => { const edited = childChunk.updated_at !== childChunk.created_at const focused = currChildChunk?.childChunkInfo?.id === childChunk.id return onDelete?.(childChunk.segment_id, childChunk.id)} labelClassName={focused ? 'bg-state-accent-solid text-text-primary-on-surface' : ''} labelInnerClassName={'text-[10px] font-semibold align-bottom leading-6'} contentClassName={classNames('!leading-6', focused ? 'bg-state-accent-hover-alt text-text-primary' : '')} showDivider={false} onClick={(e) => { e.stopPropagation() onClickSlice?.(childChunk) }} offsetOptions={({ rects }) => { return { mainAxis: isFullDocMode ? -rects.floating.width : 12 - rects.floating.width, crossAxis: (20 - rects.floating.height) / 2, } }} /> })} : inputValue !== '' ?
: null }
: null}
) } export default ChildSegmentList