hydrogen-sanity
Version:
Sanity.io toolkit for Hydrogen
47 lines (44 loc) • 1.55 kB
JavaScript
import { useState, startTransition, useEffect, useCallback } from 'react';
import { useRevalidator } from 'react-router';
import { useEffectEvent } from 'use-effect-event';
function useRefresh() {
const revalidator = useRevalidator();
const [revalidatorPromise, setRevalidatorPromise] = useState(null);
const [revalidatorLoading, setRevalidatorLoading] = useState(false);
const handleRevalidatorState = useEffectEvent(() => {
if (revalidatorPromise && revalidator.state === "loading") {
startTransition(() => setRevalidatorLoading(true));
} else if (revalidatorPromise && revalidatorLoading && revalidator.state === "idle") {
revalidatorPromise();
startTransition(() => {
setRevalidatorPromise(null);
setRevalidatorLoading(false);
});
}
});
useEffect(() => {
handleRevalidatorState();
}, [revalidator.state]);
const createRefreshHandler = useCallback(
(customRefresh) => {
return (payload) => {
function refreshDefault() {
if (payload.source === "mutation" && payload.livePreviewEnabled) {
return false;
}
return new Promise((resolve) => {
revalidator.revalidate();
setRevalidatorPromise(() => resolve);
});
}
return customRefresh ? customRefresh(payload, refreshDefault, revalidator) : refreshDefault();
};
},
[revalidator]
);
return {
refreshHandler: createRefreshHandler
};
}
export { useRefresh };
//# sourceMappingURL=refresh.js.map