Spaces:
Paused
Paused
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<string>(''); | |
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>(ChunkTextMode.Full); | |
const changeChunkTextMode = useCallback((mode: ChunkTextMode) => { | |
setTextMode(mode); | |
}, []); | |
return { textMode, changeChunkTextMode }; | |
}; | |
export const useDeleteChunkByIds = (): { | |
removeChunk: (chunkIds: string[], documentId: string) => Promise<number>; | |
} => { | |
const { deleteChunk } = useDeleteChunk(); | |
const showDeleteConfirm = useShowDeleteConfirm(); | |
const removeChunk = useCallback( | |
(chunkIds: string[], documentId: string) => () => { | |
return deleteChunk({ chunkIds, documentId }); | |
}, | |
[deleteChunk], | |
); | |
const onRemoveChunk = useCallback( | |
(chunkIds: string[], documentId: string): Promise<number> => { | |
return showDeleteConfirm({ onOk: removeChunk(chunkIds, documentId) }); | |
}, | |
[removeChunk, showDeleteConfirm], | |
); | |
return { | |
removeChunk: onRemoveChunk, | |
}; | |
}; | |
export const useUpdateChunk = () => { | |
const [chunkId, setChunkId] = useState<string | undefined>(''); | |
const { | |
visible: chunkUpdatingVisible, | |
hideModal: hideChunkUpdatingModal, | |
showModal, | |
} = useSetModalState(); | |
const { createChunk, loading } = useCreateChunk(); | |
const { documentId } = useGetKnowledgeSearchParams(); | |
const onChunkUpdatingOk = useCallback( | |
async ({ content, keywords }: { content: string; keywords: string }) => { | |
const retcode = await createChunk({ | |
content_with_weight: content, | |
doc_id: documentId, | |
chunk_id: chunkId, | |
important_kwd: keywords, // keywords | |
}); | |
if (retcode === 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, | |
}; | |
}; | |