import { useCreateChunk, useDeleteChunk, useSelectChunkList, } from '@/hooks/chunk-hooks'; import { useSetModalState, useShowDeleteConfirm } from '@/hooks/common-hooks'; import { useGetKnowledgeSearchParams } from '@/hooks/route-hook'; import { IChunk } from '@/interfaces/database/knowledge'; import { buildChunkHighlights } from '@/utils/document-util'; import { useCallback, useMemo, useState } from 'react'; import { IHighlight } from 'react-pdf-highlighter'; import { ChunkTextMode } from './constant'; export const useHandleChunkCardClick = () => { const [selectedChunkId, setSelectedChunkId] = useState(''); const handleChunkCardClick = useCallback((chunkId: string) => { setSelectedChunkId(chunkId); }, []); return { handleChunkCardClick, selectedChunkId }; }; export const useGetSelectedChunk = (selectedChunkId: string) => { const data = useSelectChunkList(); return ( data?.data?.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 = useCallback((width: number, height: number) => { setSize((pre) => { if (pre.height !== height || pre.width !== width) { return { height, width }; } return pre; }); }, []); return { highlights, setWidthAndHeight }; }; // 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 }; }; export const useDeleteChunkByIds = (): { removeChunk: (chunkIds: string[], documentId: string) => Promise; } => { const { deleteChunk } = useDeleteChunk(); const showDeleteConfirm = useShowDeleteConfirm(); const removeChunk = useCallback( (chunkIds: string[], documentId: string) => () => { return deleteChunk({ chunkIds, doc_id: documentId }); }, [deleteChunk], ); const onRemoveChunk = useCallback( (chunkIds: string[], documentId: string): Promise => { return showDeleteConfirm({ onOk: removeChunk(chunkIds, documentId) }); }, [removeChunk, showDeleteConfirm], ); return { removeChunk: onRemoveChunk, }; }; export const useUpdateChunk = () => { const [chunkId, setChunkId] = useState(''); const { visible: chunkUpdatingVisible, hideModal: hideChunkUpdatingModal, showModal, } = useSetModalState(); const { createChunk, loading } = useCreateChunk(); const { documentId } = useGetKnowledgeSearchParams(); const onChunkUpdatingOk = useCallback( async (params: IChunk) => { const code = await createChunk({ ...params, doc_id: documentId, chunk_id: chunkId, }); if (code === 0) { hideChunkUpdatingModal(); } }, [createChunk, hideChunkUpdatingModal, chunkId, documentId], ); const handleShowChunkUpdatingModal = useCallback( async (id?: string) => { setChunkId(id); showModal(); }, [showModal], ); return { chunkUpdatingLoading: loading, onChunkUpdatingOk, chunkUpdatingVisible, hideChunkUpdatingModal, showChunkUpdatingModal: handleShowChunkUpdatingModal, chunkId, documentId, }; };