|
import { Authorization } from '@/constants/authorization'; |
|
import { getAuthorization } from '@/utils/authorization-util'; |
|
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.code !== 0) { |
|
setError(data.message); |
|
} |
|
return ret; |
|
}, [api]); |
|
|
|
useEffect(() => { |
|
fetchDocument(); |
|
}, [fetchDocument]); |
|
|
|
return { fetchDocument, error }; |
|
}; |
|
|
|
export const useFetchDocument = () => { |
|
const fetchDocument = useCallback(async (api: string) => { |
|
const ret = await axios.get(api, { |
|
headers: { |
|
[Authorization]: getAuthorization(), |
|
}, |
|
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 [error, setError] = useState<string>(); |
|
const { fetchDocument } = useFetchDocument(); |
|
const containerRef = useRef<HTMLDivElement>(null); |
|
|
|
const fetchDocumentAsync = useCallback(async () => { |
|
try { |
|
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); |
|
}); |
|
} catch (error: any) { |
|
setError(error.toString()); |
|
} |
|
}, [filePath, fetchDocument]); |
|
|
|
useEffect(() => { |
|
fetchDocumentAsync(); |
|
}, [fetchDocumentAsync]); |
|
|
|
return { succeed, containerRef, error }; |
|
}; |
|
|