one
Version:
One is a React framework for web, iOS, and Android apps.
1 lines • 8.47 kB
Source Map (JSON)
{"version":3,"file":"useBlocker.js","names":[],"sources":["esm/useBlocker.js"],"sourcesContent":["import * as React from \"react\";\n\nlet currentLocation = typeof window !== \"undefined\" ? window.location.pathname + window.location.search : \"\";\nlet isProceeding = false;\nlet pendingNavigation = null;\nconst blockerCallbacks = /* @__PURE__ */ new Map();\nlet listenersSetup = false;\nfunction setupListeners() {\n\tif (listenersSetup || typeof window === \"undefined\") return;\n\tlistenersSetup = true;\n\tcurrentLocation = window.location.pathname + window.location.search;\n\twindow.addEventListener(\"popstate\", () => {\n\t\tif (isProceeding) return;\n\t\tconst nextLocation = window.location.pathname + window.location.search;\n\t\tfor (const [, callbacks] of blockerCallbacks) if (callbacks.shouldBlock()) {\n\t\t\tpendingNavigation = {\n\t\t\t\tpreviousLocation: currentLocation,\n\t\t\t\tnextLocation,\n\t\t\t\thistoryAction: \"pop\"\n\t\t\t};\n\t\t\twindow.history.go(1);\n\t\t\tcallbacks.onBlock(pendingNavigation);\n\t\t\treturn;\n\t\t}\n\t\tcurrentLocation = nextLocation;\n\t});\n\tconst originalPushState = window.history.pushState.bind(window.history);\n\tconst originalReplaceState = window.history.replaceState.bind(window.history);\n\twindow.history.pushState = function(state, title, url) {\n\t\tif (isProceeding || !url) return originalPushState(state, title, url);\n\t\tconst nextLocation = typeof url === \"string\" ? url : url.toString();\n\t\tfor (const [, callbacks] of blockerCallbacks) if (callbacks.shouldBlock()) {\n\t\t\tpendingNavigation = {\n\t\t\t\tpreviousLocation: currentLocation,\n\t\t\t\tnextLocation,\n\t\t\t\thistoryAction: \"push\"\n\t\t\t};\n\t\t\tcallbacks.onBlock(pendingNavigation);\n\t\t\treturn;\n\t\t}\n\t\tcurrentLocation = nextLocation;\n\t\treturn originalPushState(state, title, url);\n\t};\n\twindow.history.replaceState = function(state, title, url) {\n\t\tif (isProceeding || !url) return originalReplaceState(state, title, url);\n\t\tconst nextLocation = typeof url === \"string\" ? url : url.toString();\n\t\tfor (const [, callbacks] of blockerCallbacks) if (callbacks.shouldBlock()) {\n\t\t\tpendingNavigation = {\n\t\t\t\tpreviousLocation: currentLocation,\n\t\t\t\tnextLocation,\n\t\t\t\thistoryAction: \"replace\"\n\t\t\t};\n\t\t\tcallbacks.onBlock(pendingNavigation);\n\t\t\treturn;\n\t\t}\n\t\tcurrentLocation = nextLocation;\n\t\treturn originalReplaceState(state, title, url);\n\t};\n\twindow.addEventListener(\"beforeunload\", (event) => {\n\t\tfor (const [, callbacks] of blockerCallbacks) if (callbacks.shouldBlock()) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.returnValue = \"\";\n\t\t\treturn;\n\t\t}\n\t});\n}\nfunction useBlocker(shouldBlock) {\n\tconst [state, setState] = React.useState(\"unblocked\");\n\tconst [blockedLocation, setBlockedLocation] = React.useState(null);\n\tconst idRef = React.useRef(null);\n\tconst shouldBlockRef = React.useRef(shouldBlock);\n\tshouldBlockRef.current = shouldBlock;\n\tReact.useEffect(() => {\n\t\tif (typeof window === \"undefined\") return;\n\t\tsetupListeners();\n\t\tconst id = /* @__PURE__ */ Symbol(\"blocker\");\n\t\tidRef.current = id;\n\t\tblockerCallbacks.set(id, {\n\t\t\tshouldBlock: () => {\n\t\t\t\tconst block = shouldBlockRef.current;\n\t\t\t\tif (typeof block === \"function\") return block({\n\t\t\t\t\tcurrentLocation,\n\t\t\t\t\tnextLocation: pendingNavigation?.nextLocation || \"\",\n\t\t\t\t\thistoryAction: pendingNavigation?.historyAction || \"push\"\n\t\t\t\t});\n\t\t\t\treturn block;\n\t\t\t},\n\t\t\tonBlock: (pending) => {\n\t\t\t\tsetBlockedLocation(pending.nextLocation);\n\t\t\t\tsetState(\"blocked\");\n\t\t\t},\n\t\t\tonProceed: () => {\n\t\t\t\tsetState(\"proceeding\");\n\t\t\t},\n\t\t\tonReset: () => {\n\t\t\t\tsetState(\"unblocked\");\n\t\t\t\tsetBlockedLocation(null);\n\t\t\t}\n\t\t});\n\t\treturn () => {\n\t\t\tblockerCallbacks.delete(id);\n\t\t};\n\t}, []);\n\tconst reset = React.useCallback(() => {\n\t\tpendingNavigation = null;\n\t\tsetBlockedLocation(null);\n\t\tsetState(\"unblocked\");\n\t}, []);\n\tconst proceed = React.useCallback(() => {\n\t\tif (!pendingNavigation) return;\n\t\tsetState(\"proceeding\");\n\t\tisProceeding = true;\n\t\tconst pending = pendingNavigation;\n\t\tpendingNavigation = null;\n\t\trequestAnimationFrame(() => {\n\t\t\tif (pending.historyAction === \"pop\") window.history.back();\n\t\t\telse if (pending.historyAction === \"push\") window.history.pushState(null, \"\", pending.nextLocation);\n\t\t\telse window.history.replaceState(null, \"\", pending.nextLocation);\n\t\t\tcurrentLocation = pending.nextLocation;\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tisProceeding = false;\n\t\t\t\tsetBlockedLocation(null);\n\t\t\t\tsetState(\"unblocked\");\n\t\t\t});\n\t\t});\n\t}, []);\n\tif (state === \"unblocked\") return { state: \"unblocked\" };\n\tif (state === \"proceeding\") return {\n\t\tstate: \"proceeding\",\n\t\tlocation: blockedLocation\n\t};\n\treturn {\n\t\tstate: \"blocked\",\n\t\treset,\n\t\tproceed,\n\t\tlocation: blockedLocation\n\t};\n}\nfunction checkBlocker(nextLocation, historyAction = \"push\") {\n\tif (typeof window === \"undefined\") return false;\n\tif (isProceeding) return false;\n\tfor (const [, callbacks] of blockerCallbacks) if (callbacks.shouldBlock()) {\n\t\tpendingNavigation = {\n\t\t\tpreviousLocation: currentLocation,\n\t\t\tnextLocation,\n\t\t\thistoryAction\n\t\t};\n\t\tcallbacks.onBlock(pendingNavigation);\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nexport { checkBlocker, useBlocker };"],"mappings":"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"}