UNPKG

@pdftron/webviewer-react-toolkit

Version:

A React component library for integrating with PDFTron WebViewer API.

70 lines (69 loc) 2.56 kB
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]); }