@chalkbooks/react-doc-viewer
Version:
File viewer for React.
92 lines (91 loc) • 4.11 kB
JavaScript
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
import { useContext, useEffect } from "react";
import { DocViewerContext } from "../store/DocViewerProvider";
import { setDocumentLoading, updateCurrentDocument, } from "../store/actions";
import { defaultFileLoader, } from "../utils/fileLoaders";
import { useRendererSelector } from "./useRendererSelector";
/**
* Custom Hook for loading the current document into context
*/
export var useDocumentLoader = function () {
var _a = useContext(DocViewerContext), state = _a.state, dispatch = _a.dispatch;
var currentFileNo = state.currentFileNo, currentDocument = state.currentDocument, prefetchMethod = state.prefetchMethod;
var CurrentRenderer = useRendererSelector().CurrentRenderer;
var documentURI = (currentDocument === null || currentDocument === void 0 ? void 0 : currentDocument.uri) || "";
useEffect(function () {
if (!currentDocument)
return;
if (currentDocument.fileType !== undefined)
return;
var controller = new AbortController();
var signal = controller.signal;
fetch(documentURI, {
method: prefetchMethod || documentURI.startsWith("blob:") ? "GET" : "HEAD",
signal: signal,
headers: state === null || state === void 0 ? void 0 : state.requestHeaders,
}).then(function (response) {
var contentTypeRaw = response.headers.get("content-type");
var contentTypes = (contentTypeRaw === null || contentTypeRaw === void 0 ? void 0 : contentTypeRaw.split(";")) || [];
var contentType = contentTypes.length ? contentTypes[0] : undefined;
dispatch(updateCurrentDocument(__assign(__assign({}, currentDocument), { fileType: contentType || undefined })));
}).catch(function (error) {
if ((error === null || error === void 0 ? void 0 : error.name) !== 'AbortError') {
throw error;
}
});
return function () {
controller.abort();
};
},
// eslint-disable-next-line react-hooks/exhaustive-deps
[currentFileNo, documentURI, currentDocument]);
useEffect(function () {
var _a;
if (!currentDocument || CurrentRenderer === undefined)
return;
var controller = new AbortController();
var signal = controller.signal;
var fileLoaderComplete = function (fileReader) {
if (!currentDocument || !fileReader) {
dispatch(setDocumentLoading(false));
return;
}
var updatedDocument = __assign({}, currentDocument);
if (fileReader.result !== null) {
updatedDocument.fileData = fileReader.result;
}
dispatch(updateCurrentDocument(updatedDocument));
dispatch(setDocumentLoading(false));
};
var loaderFunctionProps = {
documentURI: documentURI,
signal: signal,
fileLoaderComplete: fileLoaderComplete,
headers: state === null || state === void 0 ? void 0 : state.requestHeaders,
};
if (CurrentRenderer === null) {
dispatch(setDocumentLoading(false));
}
else if (CurrentRenderer.fileLoader !== undefined) {
(_a = CurrentRenderer.fileLoader) === null || _a === void 0 ? void 0 : _a.call(CurrentRenderer, loaderFunctionProps);
}
else {
defaultFileLoader(loaderFunctionProps);
}
return function () {
controller.abort();
};
/* eslint-disable react-hooks/exhaustive-deps */
}, [CurrentRenderer, currentFileNo]);
return { state: state, dispatch: dispatch, CurrentRenderer: CurrentRenderer };
};