| 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<HTMLDivElement>(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<HTMLDivElement>(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 }; | |
| }; | |