UNPKG

@manzano/use-is-active

Version:
120 lines (115 loc) 3.92 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/index.ts var src_exports = {}; __export(src_exports, { ActivityOptionsProvider: () => ActivityOptionsProvider, useIsActive: () => useIsActive }); module.exports = __toCommonJS(src_exports); // src/use-is-active.ts var import_react2 = require("react"); // src/ActivityOptionsContext.tsx var import_react = require("react"); var import_jsx_runtime = require("react/jsx-runtime"); var defaultActivityOptions = { delayBeforeActivation: 800, minActiveDuration: 1e3 }; var ActivityOptionsContext = (0, import_react.createContext)(defaultActivityOptions); function ActivityOptionsProvider({ delayBeforeActivation = defaultActivityOptions.delayBeforeActivation, minActiveDuration = defaultActivityOptions.minActiveDuration, children }) { const activityOptions = (0, import_react.useMemo)( () => ({ delayBeforeActivation, minActiveDuration }), [delayBeforeActivation, minActiveDuration] ); return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ActivityOptionsContext.Provider, { value: activityOptions, children }); } function useActivityOptions() { return (0, import_react.useContext)(ActivityOptionsContext); } // src/use-is-active.ts function useIsActive(isReallyActive) { const activityOptions = useActivityOptions(); const activityOptionsRef = (0, import_react2.useRef)(activityOptions); const [activity, setActivity] = (0, import_react2.useState)(() => ({ status: isReallyActive ? "delay_before_activation" : "inactive" })); const { status } = activity; const isActive = status === "forced_active" || status === "active"; switch (status) { case "inactive": if (isReallyActive) { setActivity({ status: "delay_before_activation" }); } break; case "forced_active": if (isReallyActive !== activity.isReallyActive) { setActivity({ status: "forced_active", isReallyActive }); } break; case "active": case "delay_before_activation": if (!isReallyActive) { setActivity({ status: "inactive" }); } break; default: break; } (0, import_react2.useEffect)(() => { activityOptionsRef.current = activityOptions; }); (0, import_react2.useEffect)(() => { const scheduleNextStatus = (timeoutKey, nextActivity) => { const { [timeoutKey]: timeout } = activityOptionsRef.current; const timeoutId = window.setTimeout(() => { setActivity(nextActivity); }, timeout); return () => { window.clearTimeout(timeoutId); }; }; switch (status) { case "delay_before_activation": return scheduleNextStatus("delayBeforeActivation", { status: "forced_active", isReallyActive: true }); case "forced_active": return scheduleNextStatus("minActiveDuration", (prevState) => ({ status: prevState.isReallyActive ? "active" : "inactive" })); default: return; } }, [status]); return isActive; } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { ActivityOptionsProvider, useIsActive });