lisn.js
Version:
Simply handle user gestures and actions. Includes widgets.
1 lines • 11.2 kB
Source Map (JSON)
{"version":3,"file":"dom-events.cjs","names":["MH","_interopRequireWildcard","require","_settings","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","waitForElement","checkFn","timeout","newPromise","resolve","callFn","result","isNullish","setTimer","observer","disconnect","newMutationObserver","observe","getDocElement","childList","subtree","exports","waitForElementOrInteractive","isInteractive","then","res","waitForInteractive","readyState","getReadyState","INTERACTIVE","COMPLETE","getDoc","addEventListener","waitForComplete","waitForPageReady","pageIsReady","timer","dispatchReady","clearTimer","settings","pageLoadTimeout","isPageReady","hasDOM"],"sources":["../../../src/ts/utils/dom-events.ts"],"sourcesContent":["/**\n * @module Utils\n */\n\nimport * as MH from \"@lisn/globals/minification-helpers\";\n\nimport { settings } from \"@lisn/globals/settings\";\n\nimport { NonNullableReturnType } from \"@lisn/globals/types\";\n\n/**\n * Returns a Promise that is resolved when the given `checkFn` function returns\n * a value other than `null` or `undefined`.\n *\n * The Promise is resolved with `checkFn`'s return value.\n *\n * The function is called initially, and then every time there are changes to\n * the DOM children. Uses\n * {@link https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver | MutationObserver}.\n *\n * @param timeout If given, then if no such element is present after this many\n * milliseconds, the promise will resolve to `null`.\n *\n * @category DOM: Events\n */\nexport const waitForElement = <\n F extends () => unknown,\n T extends number | undefined = undefined,\n>(\n checkFn: F,\n timeout?: number,\n) =>\n MH.newPromise<\n T extends undefined\n ? NonNullableReturnType<F>\n : null | NonNullableReturnType<F>\n >((resolve) => {\n const callFn = () => {\n const result = checkFn();\n if (!MH.isNullish(result)) {\n resolve(result as NonNullableReturnType<F>);\n return true; // done\n }\n return false;\n };\n\n if (callFn()) {\n return; // resolved already\n }\n\n if (!MH.isNullish(timeout)) {\n MH.setTimer(() => {\n resolve(\n null as T extends undefined\n ? NonNullableReturnType<F>\n : null | NonNullableReturnType<F>,\n );\n observer.disconnect();\n }, timeout);\n }\n\n const observer = MH.newMutationObserver(() => {\n if (callFn()) {\n observer.disconnect();\n }\n });\n\n observer.observe(MH.getDocElement(), {\n childList: true,\n subtree: true,\n });\n });\n\n/**\n * Returns a Promise that is resolved when the given `checkFn` function returns\n * a value other than `null` or `undefined` or the\n * {@link https://developer.mozilla.org/en-US/docs/Web/API/Document/readyState | Document:readyState}\n * becomes \"interactive\".\n *\n * It always calls the given `checkFn` first before examining the `readyState`.\n *\n * If the `readyState` became interactive before the element was found, the\n * Promise resolves to `null`. Otherwise the Promise is resolved with `checkFn`'s\n * return value.\n *\n * The function is called initially, and then every time there are changes to\n * the DOM children. Uses\n * {@link https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver | MutationObserver}.\n *\n * @category DOM: Events\n */\nexport const waitForElementOrInteractive = <F extends () => unknown>(\n checkFn: F,\n) =>\n MH.newPromise<NonNullableReturnType<F> | null>((resolve) => {\n let isInteractive = false;\n // Check element first, then readyState. The callback to waitForElement is\n // run synchronously first time, so isInteractive will be false and checkFn\n // will run.\n waitForElement(() => isInteractive || checkFn()).then((res) => {\n if (!isInteractive) {\n resolve(res as NonNullableReturnType<F>);\n } // else already resolved to null\n });\n\n waitForInteractive().then(() => {\n isInteractive = true;\n resolve(null);\n });\n });\n\n/**\n * Returns a Promise that is resolved when the\n * {@link https://developer.mozilla.org/en-US/docs/Web/API/Document/readyState | Document:readyState}\n * is \"interactive\" (or if it's already \"interactive\" or \"complete\", the\n * Promise is fulfilled immediately).\n *\n * @category DOM: Events\n */\nexport const waitForInteractive = () =>\n MH.newPromise<void>((resolve) => {\n const readyState = MH.getReadyState();\n if (readyState === INTERACTIVE || readyState === COMPLETE) {\n resolve();\n return;\n }\n\n MH.getDoc().addEventListener(\"DOMContentLoaded\", () => resolve());\n });\n\n/**\n * Returns a Promise that is resolved when the\n * {@link https://developer.mozilla.org/en-US/docs/Web/API/Document/readyState | Document:readyState}\n * is \"complete\" (or if it's already \"complete\", the Promise is fulfilled\n * immediately).\n *\n * @category DOM: Events\n */\nexport const waitForComplete = () =>\n MH.newPromise<void>((resolve) => {\n if (MH.getReadyState() === COMPLETE) {\n resolve();\n return;\n }\n\n MH.getDoc().addEventListener(\"readystatechange\", () => {\n if (MH.getReadyState() === COMPLETE) {\n resolve();\n }\n });\n });\n\n/**\n * Returns a Promise that is resolved either when the\n * {@link https://developer.mozilla.org/en-US/docs/Web/API/Document/readyState | Document:readyState}\n * is \"complete\" or the `readyState` is \"interactive\" and at least\n * {@link settings.pageLoadTimeout} milliseconds have passed (if > 0) since it\n * became \"interactive\".\n *\n * @category DOM: Events\n */\nexport const waitForPageReady = () =>\n MH.newPromise<void>((resolve) => {\n if (pageIsReady) {\n resolve();\n return;\n }\n\n return waitForInteractive().then(() => {\n // Setup a listener for the complete state but wait at most\n // <pageLoadTimeout> (if specified)\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n const dispatchReady = () => {\n pageIsReady = true;\n if (timer) {\n MH.clearTimer(timer);\n timer = null;\n }\n resolve();\n };\n\n if (settings.pageLoadTimeout > 0) {\n timer = MH.setTimer(() => {\n dispatchReady();\n }, settings.pageLoadTimeout);\n }\n\n waitForComplete().then(dispatchReady);\n });\n });\n\n/**\n * Returns true if the page is \"ready\". See {@link waitForPageReady}.\n *\n * @category DOM: Events\n */\nexport const isPageReady = () => pageIsReady;\n\n// --------------------\n\nconst COMPLETE = \"complete\";\nconst INTERACTIVE = \"interactive\";\n\nlet pageIsReady = false;\n\nif (!MH.hasDOM()) {\n pageIsReady = true;\n} else {\n waitForPageReady(); // ensure pageIsReady is set even if waitForPageReady is not called\n}\n"],"mappings":"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","ignoreList":[]}