@conorroberts/utils 0.0.85 → 0.0.86
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/react.d.mts +17 -1
- package/dist/react.mjs +26 -1
- package/dist/react.mjs.map +1 -1
- package/package.json +1 -1
package/dist/react.d.mts
CHANGED
|
@@ -61,6 +61,22 @@ declare const useLocalOnce: (condition: unknown, callback: () => void) => void;
|
|
|
61
61
|
* ```
|
|
62
62
|
*/
|
|
63
63
|
declare const useOnMount: (callback: React.EffectCallback) => void;
|
|
64
|
+
/**
|
|
65
|
+
* Calls the given async callback when the component mounts.
|
|
66
|
+
* Uses useStableCallback internally to ensure the latest version is called.
|
|
67
|
+
* Unlike useOnMount, this does not support cleanup functions.
|
|
68
|
+
*
|
|
69
|
+
* @param callback - The async function to run when the component mounts.
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```tsx
|
|
73
|
+
* useAsyncOnMount(async () => {
|
|
74
|
+
* const data = await fetchData();
|
|
75
|
+
* console.log("Data loaded:", data);
|
|
76
|
+
* });
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
declare const useAsyncOnMount: (callback: () => Promise<void>) => void;
|
|
64
80
|
//#endregion
|
|
65
81
|
//#region src/react/useOnUnmount.d.ts
|
|
66
82
|
/**
|
|
@@ -69,5 +85,5 @@ declare const useOnMount: (callback: React.EffectCallback) => void;
|
|
|
69
85
|
*/
|
|
70
86
|
declare const useOnUnmount: (callback: () => void) => void;
|
|
71
87
|
//#endregion
|
|
72
|
-
export { useLocalOnce, useOnMount, useOnUnmount, useOnce, useStableCallback };
|
|
88
|
+
export { useAsyncOnMount, useLocalOnce, useOnMount, useOnUnmount, useOnce, useStableCallback };
|
|
73
89
|
//# sourceMappingURL=react.d.mts.map
|
package/dist/react.mjs
CHANGED
|
@@ -96,6 +96,31 @@ const useOnMount = (callback) => {
|
|
|
96
96
|
}
|
|
97
97
|
}, [stableCallback]);
|
|
98
98
|
};
|
|
99
|
+
/**
|
|
100
|
+
* Calls the given async callback when the component mounts.
|
|
101
|
+
* Uses useStableCallback internally to ensure the latest version is called.
|
|
102
|
+
* Unlike useOnMount, this does not support cleanup functions.
|
|
103
|
+
*
|
|
104
|
+
* @param callback - The async function to run when the component mounts.
|
|
105
|
+
*
|
|
106
|
+
* @example
|
|
107
|
+
* ```tsx
|
|
108
|
+
* useAsyncOnMount(async () => {
|
|
109
|
+
* const data = await fetchData();
|
|
110
|
+
* console.log("Data loaded:", data);
|
|
111
|
+
* });
|
|
112
|
+
* ```
|
|
113
|
+
*/
|
|
114
|
+
const useAsyncOnMount = (callback) => {
|
|
115
|
+
const stableCallback = useStableCallback(callback);
|
|
116
|
+
const isRun = useRef(false);
|
|
117
|
+
useEffect(() => {
|
|
118
|
+
if (!isRun.current) {
|
|
119
|
+
isRun.current = true;
|
|
120
|
+
stableCallback();
|
|
121
|
+
}
|
|
122
|
+
}, [stableCallback]);
|
|
123
|
+
};
|
|
99
124
|
|
|
100
125
|
//#endregion
|
|
101
126
|
//#region src/react/useOnUnmount.ts
|
|
@@ -113,5 +138,5 @@ const useOnUnmount = (callback) => {
|
|
|
113
138
|
};
|
|
114
139
|
|
|
115
140
|
//#endregion
|
|
116
|
-
export { useLocalOnce, useOnMount, useOnUnmount, useOnce, useStableCallback };
|
|
141
|
+
export { useAsyncOnMount, useLocalOnce, useOnMount, useOnUnmount, useOnce, useStableCallback };
|
|
117
142
|
//# sourceMappingURL=react.mjs.map
|
package/dist/react.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react.mjs","names":[],"sources":["../src/react/useStableCallback.ts","../src/react/useOnce.ts","../src/react/useLocalOnce.ts","../src/react/useOnMount.ts","../src/react/useOnUnmount.ts"],"sourcesContent":["// oxlint-disable no-explicit-any\r\n\r\nimport { useCallback, useRef } from \"react\";\r\n\r\ntype AnyFunction = (...args: any[]) => any;\r\ntype AnyArgs = any[];\r\n\r\n/**\r\n * Creates a stable callback that always calls the latest version of the function.\r\n * Useful for callbacks that need to be used in dependency arrays but should always\r\n * execute the most recent version of the callback.\r\n */\r\nexport const useStableCallback = <T extends AnyFunction>(callback: T): T => {\r\n const callbackRef = useRef(callback);\r\n\r\n // Update the ref on every render\r\n callbackRef.current = callback;\r\n\r\n return useCallback((...args: AnyArgs) => {\r\n return callbackRef.current(...args);\r\n }, []) as T;\r\n};\r\n","import { useEffect, useRef } from \"react\";\r\nimport { useStableCallback } from \"./useStableCallback\";\r\n\r\n/**\r\n * Runs a callback only once when a condition becomes truthy.\r\n * The callback is stabilized internally to always reference the latest version.\r\n *\r\n * @param condition - When truthy (evaluated via Boolean()), the callback will be executed (only once).\r\n * @param callback - The function to run once when the condition is met.\r\n *\r\n * @example\r\n * ```tsx\r\n * const isReady = true;\r\n * useOnce(isReady, () => {\r\n * console.log(\"Ready!\");\r\n * });\r\n * ```\r\n */\r\nexport const useOnce = (condition: unknown, callback: () => void): void => {\r\n const hasRunRef = useRef(false);\r\n const stableCallback = useStableCallback(callback);\r\n\r\n useEffect(() => {\r\n if (Boolean(condition) && !hasRunRef.current) {\r\n hasRunRef.current = true;\r\n stableCallback();\r\n }\r\n }, [condition, stableCallback]);\r\n};\r\n","import { useRef } from \"react\";\r\nimport { useStableCallback } from \"./useStableCallback\";\r\n\r\n/**\r\n * Runs a callback only once when a condition becomes truthy, executing synchronously\r\n * during render. The callback is stabilized internally to always reference the latest version.\r\n *\r\n * Unlike `useOnce`, this runs at the top level of the hook (not in useEffect),\r\n * making it suitable for state updates that need to happen synchronously during render.\r\n *\r\n * @param condition - When truthy (evaluated via Boolean()), the callback will be executed (only once).\r\n * @param callback - The function to run once when the condition is met.\r\n *\r\n * @example\r\n * ```tsx\r\n * const user: User | null = getUser();\r\n * useLocalOnce(user, () => {\r\n * setState(user.name);\r\n * });\r\n * ```\r\n */\r\nexport const useLocalOnce = (condition: unknown, callback: () => void): void => {\r\n const hasRunRef = useRef(false);\r\n const stableCallback = useStableCallback(callback);\r\n\r\n if (Boolean(condition) && !hasRunRef.current) {\r\n hasRunRef.current = true;\r\n stableCallback();\r\n }\r\n};\r\n","import { useEffect, useRef } from \"react\";\nimport { useStableCallback } from \"./useStableCallback\";\n\n/**\n * Calls the given callback when the component mounts.\n * Uses useStableCallback internally to ensure the latest version is called.\n *\n * @param callback - The function to run when the component mounts.\n *\n * @example\n * ```tsx\n * useOnMount(() => {\n * console.log(\"Component mounted!\");\n * });\n * ```\n */\nexport const useOnMount = (callback: React.EffectCallback): void => {\n const stableCallback = useStableCallback(callback);\n const isRun = useRef(false);\n\n useEffect(() => {\n if (!isRun.current) {\n isRun.current = true;\n return stableCallback();\n }\n }, [stableCallback]);\n};\n","import { useEffect } from \"react\";\r\nimport { useStableCallback } from \"./useStableCallback\";\r\n\r\n/**\r\n * Calls the given callback when the component unmounts.\r\n * Uses useStableCallback internally to ensure the latest version is called.\r\n */\r\nexport const useOnUnmount = (callback: () => void): void => {\r\n const stableCallback = useStableCallback(callback);\r\n\r\n useEffect(() => {\r\n return () => {\r\n stableCallback();\r\n };\r\n }, [stableCallback]);\r\n};\r\n"],"mappings":";;;;;;;;AAYA,MAAa,qBAA4C,aAAmB;CAC1E,MAAM,cAAc,OAAO,SAAS;AAGpC,aAAY,UAAU;AAEtB,QAAO,aAAa,GAAG,SAAkB;AACvC,SAAO,YAAY,QAAQ,GAAG,KAAK;IAClC,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;ACFR,MAAa,WAAW,WAAoB,aAA+B;CACzE,MAAM,YAAY,OAAO,MAAM;CAC/B,MAAM,iBAAiB,kBAAkB,SAAS;AAElD,iBAAgB;AACd,MAAI,QAAQ,UAAU,IAAI,CAAC,UAAU,SAAS;AAC5C,aAAU,UAAU;AACpB,mBAAgB;;IAEjB,CAAC,WAAW,eAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;ACNjC,MAAa,gBAAgB,WAAoB,aAA+B;CAC9E,MAAM,YAAY,OAAO,MAAM;CAC/B,MAAM,iBAAiB,kBAAkB,SAAS;AAElD,KAAI,QAAQ,UAAU,IAAI,CAAC,UAAU,SAAS;AAC5C,YAAU,UAAU;AACpB,kBAAgB;;;;;;;;;;;;;;;;;;;ACXpB,MAAa,cAAc,aAAyC;CAClE,MAAM,iBAAiB,kBAAkB,SAAS;CAClD,MAAM,QAAQ,OAAO,MAAM;AAE3B,iBAAgB;AACd,MAAI,CAAC,MAAM,SAAS;AAClB,SAAM,UAAU;AAChB,UAAO,gBAAgB;;IAExB,CAAC,eAAe,CAAC;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"react.mjs","names":[],"sources":["../src/react/useStableCallback.ts","../src/react/useOnce.ts","../src/react/useLocalOnce.ts","../src/react/useOnMount.ts","../src/react/useOnUnmount.ts"],"sourcesContent":["// oxlint-disable no-explicit-any\r\n\r\nimport { useCallback, useRef } from \"react\";\r\n\r\ntype AnyFunction = (...args: any[]) => any;\r\ntype AnyArgs = any[];\r\n\r\n/**\r\n * Creates a stable callback that always calls the latest version of the function.\r\n * Useful for callbacks that need to be used in dependency arrays but should always\r\n * execute the most recent version of the callback.\r\n */\r\nexport const useStableCallback = <T extends AnyFunction>(callback: T): T => {\r\n const callbackRef = useRef(callback);\r\n\r\n // Update the ref on every render\r\n callbackRef.current = callback;\r\n\r\n return useCallback((...args: AnyArgs) => {\r\n return callbackRef.current(...args);\r\n }, []) as T;\r\n};\r\n","import { useEffect, useRef } from \"react\";\r\nimport { useStableCallback } from \"./useStableCallback\";\r\n\r\n/**\r\n * Runs a callback only once when a condition becomes truthy.\r\n * The callback is stabilized internally to always reference the latest version.\r\n *\r\n * @param condition - When truthy (evaluated via Boolean()), the callback will be executed (only once).\r\n * @param callback - The function to run once when the condition is met.\r\n *\r\n * @example\r\n * ```tsx\r\n * const isReady = true;\r\n * useOnce(isReady, () => {\r\n * console.log(\"Ready!\");\r\n * });\r\n * ```\r\n */\r\nexport const useOnce = (condition: unknown, callback: () => void): void => {\r\n const hasRunRef = useRef(false);\r\n const stableCallback = useStableCallback(callback);\r\n\r\n useEffect(() => {\r\n if (Boolean(condition) && !hasRunRef.current) {\r\n hasRunRef.current = true;\r\n stableCallback();\r\n }\r\n }, [condition, stableCallback]);\r\n};\r\n","import { useRef } from \"react\";\r\nimport { useStableCallback } from \"./useStableCallback\";\r\n\r\n/**\r\n * Runs a callback only once when a condition becomes truthy, executing synchronously\r\n * during render. The callback is stabilized internally to always reference the latest version.\r\n *\r\n * Unlike `useOnce`, this runs at the top level of the hook (not in useEffect),\r\n * making it suitable for state updates that need to happen synchronously during render.\r\n *\r\n * @param condition - When truthy (evaluated via Boolean()), the callback will be executed (only once).\r\n * @param callback - The function to run once when the condition is met.\r\n *\r\n * @example\r\n * ```tsx\r\n * const user: User | null = getUser();\r\n * useLocalOnce(user, () => {\r\n * setState(user.name);\r\n * });\r\n * ```\r\n */\r\nexport const useLocalOnce = (condition: unknown, callback: () => void): void => {\r\n const hasRunRef = useRef(false);\r\n const stableCallback = useStableCallback(callback);\r\n\r\n if (Boolean(condition) && !hasRunRef.current) {\r\n hasRunRef.current = true;\r\n stableCallback();\r\n }\r\n};\r\n","import { useEffect, useRef } from \"react\";\nimport { useStableCallback } from \"./useStableCallback\";\n\n/**\n * Calls the given callback when the component mounts.\n * Uses useStableCallback internally to ensure the latest version is called.\n *\n * @param callback - The function to run when the component mounts.\n *\n * @example\n * ```tsx\n * useOnMount(() => {\n * console.log(\"Component mounted!\");\n * });\n * ```\n */\nexport const useOnMount = (callback: React.EffectCallback): void => {\n const stableCallback = useStableCallback(callback);\n const isRun = useRef(false);\n\n useEffect(() => {\n if (!isRun.current) {\n isRun.current = true;\n return stableCallback();\n }\n }, [stableCallback]);\n};\n\n/**\n * Calls the given async callback when the component mounts.\n * Uses useStableCallback internally to ensure the latest version is called.\n * Unlike useOnMount, this does not support cleanup functions.\n *\n * @param callback - The async function to run when the component mounts.\n *\n * @example\n * ```tsx\n * useAsyncOnMount(async () => {\n * const data = await fetchData();\n * console.log(\"Data loaded:\", data);\n * });\n * ```\n */\nexport const useAsyncOnMount = (callback: () => Promise<void>): void => {\n const stableCallback = useStableCallback(callback);\n const isRun = useRef(false);\n\n useEffect(() => {\n if (!isRun.current) {\n isRun.current = true;\n stableCallback();\n }\n }, [stableCallback]);\n};\n","import { useEffect } from \"react\";\r\nimport { useStableCallback } from \"./useStableCallback\";\r\n\r\n/**\r\n * Calls the given callback when the component unmounts.\r\n * Uses useStableCallback internally to ensure the latest version is called.\r\n */\r\nexport const useOnUnmount = (callback: () => void): void => {\r\n const stableCallback = useStableCallback(callback);\r\n\r\n useEffect(() => {\r\n return () => {\r\n stableCallback();\r\n };\r\n }, [stableCallback]);\r\n};\r\n"],"mappings":";;;;;;;;AAYA,MAAa,qBAA4C,aAAmB;CAC1E,MAAM,cAAc,OAAO,SAAS;AAGpC,aAAY,UAAU;AAEtB,QAAO,aAAa,GAAG,SAAkB;AACvC,SAAO,YAAY,QAAQ,GAAG,KAAK;IAClC,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;ACFR,MAAa,WAAW,WAAoB,aAA+B;CACzE,MAAM,YAAY,OAAO,MAAM;CAC/B,MAAM,iBAAiB,kBAAkB,SAAS;AAElD,iBAAgB;AACd,MAAI,QAAQ,UAAU,IAAI,CAAC,UAAU,SAAS;AAC5C,aAAU,UAAU;AACpB,mBAAgB;;IAEjB,CAAC,WAAW,eAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;ACNjC,MAAa,gBAAgB,WAAoB,aAA+B;CAC9E,MAAM,YAAY,OAAO,MAAM;CAC/B,MAAM,iBAAiB,kBAAkB,SAAS;AAElD,KAAI,QAAQ,UAAU,IAAI,CAAC,UAAU,SAAS;AAC5C,YAAU,UAAU;AACpB,kBAAgB;;;;;;;;;;;;;;;;;;;ACXpB,MAAa,cAAc,aAAyC;CAClE,MAAM,iBAAiB,kBAAkB,SAAS;CAClD,MAAM,QAAQ,OAAO,MAAM;AAE3B,iBAAgB;AACd,MAAI,CAAC,MAAM,SAAS;AAClB,SAAM,UAAU;AAChB,UAAO,gBAAgB;;IAExB,CAAC,eAAe,CAAC;;;;;;;;;;;;;;;;;AAkBtB,MAAa,mBAAmB,aAAwC;CACtE,MAAM,iBAAiB,kBAAkB,SAAS;CAClD,MAAM,QAAQ,OAAO,MAAM;AAE3B,iBAAgB;AACd,MAAI,CAAC,MAAM,SAAS;AAClB,SAAM,UAAU;AAChB,mBAAgB;;IAEjB,CAAC,eAAe,CAAC;;;;;;;;;AC7CtB,MAAa,gBAAgB,aAA+B;CAC1D,MAAM,iBAAiB,kBAAkB,SAAS;AAElD,iBAAgB;AACd,eAAa;AACX,mBAAgB;;IAEjB,CAAC,eAAe,CAAC"}
|