import message from '@/components/ui/message'; import { RAGFlowPagination, RAGFlowPaginationType, } from '@/components/ui/ragflow-pagination'; import { Spin } from '@/components/ui/spin'; import { useFetchNextChunkList, useSwitchChunk, } from '@/hooks/use-chunk-request'; import classNames from 'classnames'; import { useCallback, useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import ChunkCard from './components/chunk-card'; import CreatingModal from './components/chunk-creating-modal'; import ChunkResultBar from './components/chunk-result-bar'; import CheckboxSets from './components/chunk-result-bar/checkbox-sets'; import RerunButton from './components/rerun-button'; import { useChangeChunkTextMode, useDeleteChunkByIds, useHandleChunkCardClick, useUpdateChunk, } from './hooks'; import styles from './index.less'; const ChunkerContainer = () => { const [selectedChunkIds, setSelectedChunkIds] = useState([]); const [isChange, setIsChange] = useState(false); const { t } = useTranslation(); const { data: { documentInfo, data = [], total }, pagination, loading, searchString, handleInputChange, available, handleSetAvailable, } = useFetchNextChunkList(); const { handleChunkCardClick, selectedChunkId } = useHandleChunkCardClick(); const isPdf = documentInfo?.type === 'pdf'; const { chunkUpdatingLoading, onChunkUpdatingOk, showChunkUpdatingModal, hideChunkUpdatingModal, chunkId, chunkUpdatingVisible, documentId, } = useUpdateChunk(); const { removeChunk } = useDeleteChunkByIds(); const { changeChunkTextMode, textMode } = useChangeChunkTextMode(); const selectAllChunk = useCallback( (checked: boolean) => { setSelectedChunkIds(checked ? data.map((x) => x.chunk_id) : []); }, [data], ); const showSelectedChunkWarning = useCallback(() => { message.warning(t('message.pleaseSelectChunk')); }, [t]); const { switchChunk } = useSwitchChunk(); const [chunkList, setChunkList] = useState(data); useEffect(() => { setChunkList(data); }, [data]); const onPaginationChange: RAGFlowPaginationType['onChange'] = ( page, size, ) => { setSelectedChunkIds([]); pagination.onChange?.(page, size); }; const handleSwitchChunk = useCallback( async (available?: number, chunkIds?: string[]) => { let ids = chunkIds; if (!chunkIds) { ids = selectedChunkIds; if (selectedChunkIds.length === 0) { showSelectedChunkWarning(); return; } } const resCode: number = await switchChunk({ chunk_ids: ids, available_int: available, doc_id: documentId, }); if (ids?.length && resCode === 0) { chunkList.forEach((x: any) => { if (ids.indexOf(x['chunk_id']) > -1) { x['available_int'] = available; } }); setChunkList(chunkList); } }, [ switchChunk, documentId, selectedChunkIds, showSelectedChunkWarning, chunkList, ], ); const handleSingleCheckboxClick = useCallback( (chunkId: string, checked: boolean) => { setSelectedChunkIds((previousIds) => { const idx = previousIds.findIndex((x) => x === chunkId); const nextIds = [...previousIds]; if (checked && idx === -1) { nextIds.push(chunkId); } else if (!checked && idx !== -1) { nextIds.splice(idx, 1); } return nextIds; }); }, [], ); const handleRemoveChunk = useCallback(async () => { if (selectedChunkIds.length > 0) { const resCode: number = await removeChunk(selectedChunkIds, documentId); if (resCode === 0) { setSelectedChunkIds([]); } } else { showSelectedChunkWarning(); } }, [selectedChunkIds, documentId, removeChunk, showSelectedChunkWarning]); const handleChunkEditSave = (e: any) => { setIsChange(true); onChunkUpdatingOk(e); }; return ( <> {isChange && (
)}

{t('chunk.chunkResult')}

{t('chunk.chunkResultTip')}
{chunkList.map((item) => ( x === item.chunk_id)} handleCheckboxClick={handleSingleCheckboxClick} switchChunk={handleSwitchChunk} clickChunkCard={handleChunkCardClick} selected={item.chunk_id === selectedChunkId} textMode={textMode} > ))}
{ onPaginationChange(page, pageSize); }} >
{chunkUpdatingVisible && ( { handleChunkEditSave(e); }} parserId={documentInfo.parser_id} /> )} ); }; export { ChunkerContainer };