Spaces:
Paused
Paused
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 }; | |
}; | |