@pdftron/webviewer-react-toolkit
Version:
A React component library for integrating with PDFTron WebViewer API.
70 lines (69 loc) • 2.56 kB
JavaScript
import { useEffect, useMemo, useRef, useState } from 'react';
import { MemoizedPromise } from '../data';
import GlobalQueue from '../work/GlobalQueue';
/**
* Will subscribe to a value from a file and return the value, as well as any
* async errors.
* @param file The file to subscribe to.
* @param getCurrentValue Function to extract the current value from the file.
* @param eventType The event type to subscribe. Won't subscribe if not given.
* @param throttle The timeout to throttle initial fetch of value. Default: 500ms.
*/
export function useFileSubscribe(file, getCurrentValue, eventType) {
var getValue = useRef(getCurrentValue);
var _a = useState(), error = _a[0], setError = _a[1];
var _b = useState(function () {
var currentValue = getValue.current(file);
if (currentValue instanceof MemoizedPromise)
return undefined;
return currentValue;
}), value = _b[0], setValue = _b[1];
useEffect(function () {
var cancelled = false;
var cancel;
var setMemoValue = function (val) {
try {
if (!cancelled)
setValue(val);
}
catch (error) {
if (!cancelled)
setError(error);
}
};
var subscribe = function () {
setError(undefined);
var val = getValue.current(file);
if (!(val instanceof MemoizedPromise)) {
// Non-memoized-promise, can set directly.
setValue(val);
return;
}
setValue(undefined);
if (val.done) {
val.get().then(setMemoValue);
}
else {
var r = GlobalQueue.process(function () { return val.get(); });
cancel = r[1];
r[0]
.then(function (result) {
setMemoValue(result);
})
.catch(function (e) {
setError(e);
});
}
};
subscribe();
var unsubscribe;
if (eventType)
unsubscribe = file.subscribe(eventType, subscribe);
return function () {
cancel === null || cancel === void 0 ? void 0 : cancel();
unsubscribe === null || unsubscribe === void 0 ? void 0 : unsubscribe();
cancelled = true;
};
}, [eventType, file]);
return useMemo(function () { return [value, error, setValue]; }, [error, value]);
}