import jsPreviewExcel from '@js-preview/excel'; import axios from 'axios'; import mammoth from 'mammoth'; import { useCallback, useEffect, useRef, useState } from 'react'; export const useCatchError = (api: string) => { const [error, setError] = useState(''); const fetchDocument = useCallback(async () => { const ret = await axios.get(api); const { data } = ret; if (!(data instanceof ArrayBuffer) && data.retcode !== 0) { setError(data.retmsg); } return ret; }, [api]); useEffect(() => { fetchDocument(); }, [fetchDocument]); return { fetchDocument, error }; }; export const useFetchDocument = () => { const fetchDocument = useCallback(async (api: string) => { const ret = await axios.get(api, { responseType: 'arraybuffer' }); return ret; }, []); return { fetchDocument }; }; export const useFetchExcel = (filePath: string) => { const [status, setStatus] = useState(true); const { fetchDocument } = useFetchDocument(); const containerRef = useRef(null); const { error } = useCatchError(filePath); const fetchDocumentAsync = useCallback(async () => { let myExcelPreviewer; if (containerRef.current) { myExcelPreviewer = jsPreviewExcel.init(containerRef.current); } const jsonFile = await fetchDocument(filePath); myExcelPreviewer ?.preview(jsonFile.data) .then(() => { console.log('succeed'); setStatus(true); }) .catch((e) => { console.warn('failed', e); myExcelPreviewer.destroy(); setStatus(false); }); }, [filePath, fetchDocument]); useEffect(() => { fetchDocumentAsync(); }, [fetchDocumentAsync]); return { status, containerRef, error }; }; export const useFetchDocx = (filePath: string) => { const [succeed, setSucceed] = useState(true); const { fetchDocument } = useFetchDocument(); const containerRef = useRef(null); const { error } = useCatchError(filePath); const fetchDocumentAsync = useCallback(async () => { const jsonFile = await fetchDocument(filePath); mammoth .convertToHtml( { arrayBuffer: jsonFile.data }, { includeDefaultStyleMap: true }, ) .then((result) => { setSucceed(true); const docEl = document.createElement('div'); docEl.className = 'document-container'; docEl.innerHTML = result.value; const container = containerRef.current; if (container) { container.innerHTML = docEl.outerHTML; } }) .catch(() => { setSucceed(false); }); }, [filePath, fetchDocument]); useEffect(() => { fetchDocumentAsync(); }, [fetchDocumentAsync]); return { succeed, containerRef, error }; };