import { useOneNamespaceEffectsLoading } from '@/hooks/storeHooks'; import { IChunk, IKnowledgeFile } from '@/interfaces/database/knowledge'; import { buildChunkHighlights } from '@/utils/documentUtils'; import { useCallback, useMemo, useState } from 'react'; import { IHighlight } from 'react-pdf-highlighter'; import { useSelector } from 'umi'; import { ChunkTextMode } from './constant'; export const useSelectDocumentInfo = () => { const documentInfo: IKnowledgeFile = useSelector( (state: any) => state.chunkModel.documentInfo, ); return documentInfo; }; export const useSelectChunkList = () => { const chunkList: IChunk[] = useSelector( (state: any) => state.chunkModel.data, ); return chunkList; }; export const useHandleChunkCardClick = () => { const [selectedChunkId, setSelectedChunkId] = useState(''); const handleChunkCardClick = useCallback((chunkId: string) => { setSelectedChunkId(chunkId); }, []); return { handleChunkCardClick, selectedChunkId }; }; export const useGetSelectedChunk = (selectedChunkId: string) => { const chunkList: IChunk[] = useSelectChunkList(); return ( chunkList.find((x) => x.chunk_id === selectedChunkId) ?? ({} as IChunk) ); }; export const useGetChunkHighlights = (selectedChunkId: string) => { const [size, setSize] = useState({ width: 849, height: 1200 }); const selectedChunk: IChunk = useGetSelectedChunk(selectedChunkId); const highlights: IHighlight[] = useMemo(() => { return buildChunkHighlights(selectedChunk, size); }, [selectedChunk, size]); const setWidthAndHeight = (width: number, height: number) => { setSize((pre) => { if (pre.height !== height || pre.width !== width) { return { height, width }; } return pre; }); }; return { highlights, setWidthAndHeight }; }; export const useSelectChunkListLoading = () => { return useOneNamespaceEffectsLoading('chunkModel', [ 'create_hunk', 'chunk_list', 'switch_chunk', ]); }; // Switch chunk text to be fully displayed or ellipse export const useChangeChunkTextMode = () => { const [textMode, setTextMode] = useState(ChunkTextMode.Full); const changeChunkTextMode = useCallback((mode: ChunkTextMode) => { setTextMode(mode); }, []); return { textMode, changeChunkTextMode }; };