@fbltd/async
Version:
Miscellaneous async utils
26 lines (25 loc) • 866 B
JavaScript
import { memo, useEffect, useState } from "react";
import { observationState } from "../../observe.state.js";
import { usePromise } from "./utils.js";
export function Reactive(fn) {
return memo((props) => {
const [key, setKey] = useState(false);
const abortPromise = usePromise();
useEffect(() => abortPromise.resolve, []);
observationState.isObserved = true;
const jsx = fn(props);
const deps = observationState.getDeps();
observationState.isObserved = false;
if (deps.size) {
let prom = [abortPromise.promise];
deps.forEach(d => prom.push(d.next()));
Promise.race(prom)
.then(() => {
if (abortPromise.isFulfilled)
return;
setKey(!key);
});
}
return jsx;
});
}