@dcl/hooks 0.0.0-20250211142018.commit-7087e59

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.
Files changed (69) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +71 -0
  3. package/cjs/hooks/index.d.ts +9 -0
  4. package/cjs/hooks/index.js +21 -0
  5. package/cjs/hooks/index.js.map +1 -0
  6. package/cjs/hooks/useAdvancedUserAgentData.d.ts +26 -0
  7. package/cjs/hooks/useAdvancedUserAgentData.js +62 -0
  8. package/cjs/hooks/useAdvancedUserAgentData.js.map +1 -0
  9. package/cjs/hooks/useAsyncEffect.d.ts +9 -0
  10. package/cjs/hooks/useAsyncEffect.js +30 -0
  11. package/cjs/hooks/useAsyncEffect.js.map +1 -0
  12. package/cjs/hooks/useAsyncMemo.d.ts +6 -0
  13. package/cjs/hooks/useAsyncMemo.js +8 -0
  14. package/cjs/hooks/useAsyncMemo.js.map +1 -0
  15. package/cjs/hooks/useAsyncState.d.ts +39 -0
  16. package/cjs/hooks/useAsyncState.js +99 -0
  17. package/cjs/hooks/useAsyncState.js.map +1 -0
  18. package/cjs/hooks/useAsyncTask.d.ts +9 -0
  19. package/cjs/hooks/useAsyncTask.js +52 -0
  20. package/cjs/hooks/useAsyncTask.js.map +1 -0
  21. package/cjs/hooks/useAsyncTasks.d.ts +11 -0
  22. package/cjs/hooks/useAsyncTasks.js +35 -0
  23. package/cjs/hooks/useAsyncTasks.js.map +1 -0
  24. package/cjs/hooks/usePatchState.d.ts +7 -0
  25. package/cjs/hooks/usePatchState.js +18 -0
  26. package/cjs/hooks/usePatchState.js.map +1 -0
  27. package/cjs/index.d.ts +1 -0
  28. package/cjs/index.js +5 -0
  29. package/cjs/index.js.map +1 -0
  30. package/cjs/utils/development/sentry.d.ts +5 -0
  31. package/cjs/utils/development/sentry.js +15 -0
  32. package/cjs/utils/development/sentry.js.map +1 -0
  33. package/cjs/utils/isAppleSilicon.d.ts +2 -0
  34. package/cjs/utils/isAppleSilicon.js +10 -0
  35. package/cjs/utils/isAppleSilicon.js.map +1 -0
  36. package/esm/hooks/index.d.ts +9 -0
  37. package/esm/hooks/index.js +9 -0
  38. package/esm/hooks/index.js.map +1 -0
  39. package/esm/hooks/useAdvancedUserAgentData.d.ts +26 -0
  40. package/esm/hooks/useAdvancedUserAgentData.js +57 -0
  41. package/esm/hooks/useAdvancedUserAgentData.js.map +1 -0
  42. package/esm/hooks/useAsyncEffect.d.ts +9 -0
  43. package/esm/hooks/useAsyncEffect.js +27 -0
  44. package/esm/hooks/useAsyncEffect.js.map +1 -0
  45. package/esm/hooks/useAsyncMemo.d.ts +6 -0
  46. package/esm/hooks/useAsyncMemo.js +4 -0
  47. package/esm/hooks/useAsyncMemo.js.map +1 -0
  48. package/esm/hooks/useAsyncState.d.ts +39 -0
  49. package/esm/hooks/useAsyncState.js +110 -0
  50. package/esm/hooks/useAsyncState.js.map +1 -0
  51. package/esm/hooks/useAsyncTask.d.ts +9 -0
  52. package/esm/hooks/useAsyncTask.js +49 -0
  53. package/esm/hooks/useAsyncTask.js.map +1 -0
  54. package/esm/hooks/useAsyncTasks.d.ts +11 -0
  55. package/esm/hooks/useAsyncTasks.js +32 -0
  56. package/esm/hooks/useAsyncTasks.js.map +1 -0
  57. package/esm/hooks/usePatchState.d.ts +7 -0
  58. package/esm/hooks/usePatchState.js +15 -0
  59. package/esm/hooks/usePatchState.js.map +1 -0
  60. package/esm/index.d.ts +1 -0
  61. package/esm/index.js +2 -0
  62. package/esm/index.js.map +1 -0
  63. package/esm/utils/development/sentry.d.ts +5 -0
  64. package/esm/utils/development/sentry.js +11 -0
  65. package/esm/utils/development/sentry.js.map +1 -0
  66. package/esm/utils/isAppleSilicon.d.ts +2 -0
  67. package/esm/utils/isAppleSilicon.js +6 -0
  68. package/esm/utils/isAppleSilicon.js.map +1 -0
  69. package/package.json +82 -0
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useAsyncTask = void 0;
4
+ /* eslint-disable @typescript-eslint/no-explicit-any */
5
+ const react_1 = require("react");
6
+ const sentry_1 = require("../utils/development/sentry");
7
+ /**
8
+ * Execute an async function and return a loading state and a function to call the async function
9
+ * @param callback - The async function to execute
10
+ * @param deps - The dependencies of the async function
11
+ * @returns A tuple containing the loading state and a function to call the async function
12
+ */
13
+ const useAsyncTask = (callback, deps) => {
14
+ const [{ loading, args }, setLoading] = (0, react_1.useState)({
15
+ loading: false,
16
+ args: null,
17
+ });
18
+ (0, react_1.useEffect)(() => {
19
+ if (!loading) {
20
+ return;
21
+ }
22
+ if (args === null) {
23
+ return;
24
+ }
25
+ let cancelled = false;
26
+ Promise.resolve()
27
+ .then(() => callback(...args))
28
+ .then(() => {
29
+ if (cancelled) {
30
+ return;
31
+ }
32
+ setLoading({ loading: false, args: null });
33
+ })
34
+ .catch((err) => {
35
+ console.error(err);
36
+ (0, sentry_1.sentry)((sentry) => sentry.captureException(err));
37
+ if (cancelled) {
38
+ return;
39
+ }
40
+ setLoading({ loading: false, args: null });
41
+ });
42
+ return () => {
43
+ cancelled = true;
44
+ };
45
+ }, [loading]);
46
+ const callTask = (0, react_1.useCallback)((...args) => {
47
+ setLoading({ loading: true, args });
48
+ }, [loading, args, ...deps]);
49
+ return [loading, callTask];
50
+ };
51
+ exports.useAsyncTask = useAsyncTask;
52
+ //# sourceMappingURL=useAsyncTask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAsyncTask.js","sourceRoot":"","sources":["../../src/hooks/useAsyncTask.ts"],"names":[],"mappings":";;;AAAA,uDAAuD;AACvD,iCAAwE;AACxE,wDAAoD;AAOpD;;;;;GAKG;AACH,MAAM,YAAY,GAAG,CACnB,QAAsC,EACtC,IAAoB,EACpB,EAAE;IACF,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,UAAU,CAAC,GAAG,IAAA,gBAAQ,EAAoB;QAClE,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,IAAI;KACX,CAAC,CAAA;IAEF,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAM;QACR,CAAC;QAED,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,OAAM;QACR,CAAC;QAED,IAAI,SAAS,GAAG,KAAK,CAAA;QACrB,OAAO,CAAC,OAAO,EAAE;aACd,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;aAC7B,IAAI,CAAC,GAAG,EAAE;YACT,IAAI,SAAS,EAAE,CAAC;gBACd,OAAM;YACR,CAAC;YAED,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QAC5C,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACb,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAClB,IAAA,eAAM,EAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAA;YAChD,IAAI,SAAS,EAAE,CAAC;gBACd,OAAM;YACR,CAAC;YAED,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QAC5C,CAAC,CAAC,CAAA;QAEJ,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAA;QAClB,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAA;IAEb,MAAM,QAAQ,GAAG,IAAA,mBAAW,EAC1B,CAAC,GAAG,IAAO,EAAE,EAAE;QACb,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IACrC,CAAC,EACD,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,CACzB,CAAA;IAED,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAU,CAAA;AACrC,CAAC,CAAA;AAEQ,oCAAY"}
@@ -0,0 +1,11 @@
1
+ import { DependencyList } from "react";
2
+ type AsyncTaskIdenfity = (id: string, ...extra: any[]) => Promise<any>;
3
+ /**
4
+ * Use async tasks to execute async functions and return a list of task ids and a function to add a task
5
+ * @param callback - The async function to execute
6
+ * @param deps - The dependencies of the async function
7
+ * @returns A tuple containing the list of task ids and a function to add a task
8
+ */
9
+ declare const useAsyncTasks: <C extends AsyncTaskIdenfity = AsyncTaskIdenfity>(callback: C, deps: DependencyList) => readonly [string[], C];
10
+ export type { AsyncTaskIdenfity };
11
+ export { useAsyncTasks };
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useAsyncTasks = void 0;
4
+ /* eslint-disable @typescript-eslint/no-explicit-any */
5
+ const react_1 = require("react");
6
+ const sentry_1 = require("../utils/development/sentry");
7
+ /**
8
+ * Use async tasks to execute async functions and return a list of task ids and a function to add a task
9
+ * @param callback - The async function to execute
10
+ * @param deps - The dependencies of the async function
11
+ * @returns A tuple containing the list of task ids and a function to add a task
12
+ */
13
+ const useAsyncTasks = (callback, deps) => {
14
+ const [tasks, setTasks] = (0, react_1.useState)([]);
15
+ const tasksIds = (0, react_1.useMemo)(() => tasks.map(([id]) => id), [tasks]);
16
+ const addTask = (0, react_1.useCallback)((id, ...extra) => {
17
+ if (tasks.find(([currentId]) => currentId === id)) {
18
+ return;
19
+ }
20
+ const task = Promise.resolve()
21
+ .then(() => callback(id, ...extra))
22
+ .then(() => {
23
+ setTasks((current) => current.filter(([currentId]) => currentId !== id));
24
+ })
25
+ .catch((err) => {
26
+ console.error(err);
27
+ (0, sentry_1.sentry)((sentry) => sentry.captureException(err));
28
+ setTasks((current) => current.filter(([currentId]) => currentId !== id));
29
+ });
30
+ setTasks((current) => [...current, [id, task]]);
31
+ }, [tasks, ...deps]);
32
+ return [tasksIds, addTask];
33
+ };
34
+ exports.useAsyncTasks = useAsyncTasks;
35
+ //# sourceMappingURL=useAsyncTasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAsyncTasks.js","sourceRoot":"","sources":["../../src/hooks/useAsyncTasks.ts"],"names":[],"mappings":";;;AAAA,uDAAuD;AACvD,iCAAsE;AACtE,wDAAoD;AAIpD;;;;;GAKG;AACH,MAAM,aAAa,GAAG,CACpB,QAAW,EACX,IAAoB,EACI,EAAE;IAC1B,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAA,gBAAQ,EAAkC,EAAE,CAAC,CAAA;IACvE,MAAM,QAAQ,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;IAEhE,MAAM,OAAO,GAAG,IAAA,mBAAW,EACzB,CAAC,EAAU,EAAE,GAAG,KAAY,EAAE,EAAE;QAC9B,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,SAAS,KAAK,EAAE,CAAC,EAAE,CAAC;YAClD,OAAM;QACR,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE;aAC3B,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,CAAC;aAClC,IAAI,CAAC,GAAG,EAAE;YACT,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,CACnB,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,SAAS,KAAK,EAAE,CAAC,CAClD,CAAA;QACH,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACb,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAClB,IAAA,eAAM,EAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAA;YAChD,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,CACnB,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,SAAS,KAAK,EAAE,CAAC,CAClD,CAAA;QACH,CAAC,CAAC,CAAA;QAEJ,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;IACjD,CAAC,EACD,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CACjB,CAAA;IAED,OAAO,CAAC,QAAQ,EAAE,OAAY,CAAU,CAAA;AAC1C,CAAC,CAAA;AAGQ,sCAAa"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Use a patch state to update a state object
3
+ * @param initialState - The initial state object
4
+ * @returns A tuple containing the state and a function to patch the state
5
+ */
6
+ declare const usePatchState: <T extends {}>(initialState: T) => readonly [T, (newState: Partial<T>) => void];
7
+ export { usePatchState };
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.usePatchState = void 0;
4
+ const react_1 = require("react");
5
+ /**
6
+ * Use a patch state to update a state object
7
+ * @param initialState - The initial state object
8
+ * @returns A tuple containing the state and a function to patch the state
9
+ */
10
+ const usePatchState = (initialState) => {
11
+ const [state, setState] = (0, react_1.useState)(initialState);
12
+ const patchState = (0, react_1.useCallback)((newState) => {
13
+ return setState((current) => (Object.assign(Object.assign({}, current), newState)));
14
+ }, []);
15
+ return [state, patchState];
16
+ };
17
+ exports.usePatchState = usePatchState;
18
+ //# sourceMappingURL=usePatchState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePatchState.js","sourceRoot":"","sources":["../../src/hooks/usePatchState.ts"],"names":[],"mappings":";;;AAAA,iCAA6C;AAE7C;;;;GAIG;AACH,MAAM,aAAa,GAAG,CAAe,YAAe,EAAE,EAAE;IACtD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAA,gBAAQ,EAAI,YAAY,CAAC,CAAA;IAEnD,MAAM,UAAU,GAAG,IAAA,mBAAW,EAAC,CAAC,QAAoB,EAAE,EAAE;QACtD,OAAO,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,iCAAM,OAAO,GAAK,QAAQ,EAAG,CAAC,CAAA;IAC7D,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,CAAC,KAAK,EAAE,UAAU,CAAU,CAAA;AACrC,CAAC,CAAA;AAEQ,sCAAa"}
package/cjs/index.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from "./hooks";
package/cjs/index.js ADDED
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./hooks"), exports);
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,kDAAuB"}
@@ -0,0 +1,5 @@
1
+ import * as Sentry from "@sentry/browser";
2
+ type SentryTracker = (sentry: typeof Sentry) => void;
3
+ declare const sentry: (tracker: SentryTracker) => void;
4
+ export type { SentryTracker };
5
+ export { sentry };
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sentry = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const Sentry = tslib_1.__importStar(require("@sentry/browser"));
6
+ const sentry = (tracker) => {
7
+ if (typeof window !== "undefined") {
8
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
9
+ if (window.Sentry) {
10
+ tracker(Sentry);
11
+ }
12
+ }
13
+ };
14
+ exports.sentry = sentry;
15
+ //# sourceMappingURL=sentry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sentry.js","sourceRoot":"","sources":["../../../src/utils/development/sentry.ts"],"names":[],"mappings":";;;;AAAA,gEAAyC;AAGzC,MAAM,MAAM,GAAG,CAAC,OAAsB,EAAE,EAAE;IACxC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,8DAA8D;QAC9D,IAAK,MAAc,CAAC,MAAM,EAAE,CAAC;YAC3B,OAAO,CAAC,MAAM,CAAC,CAAA;QACjB,CAAC;IACH,CAAC;AACH,CAAC,CAAA;AAGQ,wBAAM"}
@@ -0,0 +1,2 @@
1
+ import { IResult } from "ua-parser-js";
2
+ export declare function isAppleSilicon(uaData: IResult): boolean;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isAppleSilicon = isAppleSilicon;
4
+ function isAppleSilicon(uaData) {
5
+ var _a, _b;
6
+ // Solo necesitamos verificar si es Safari en macOS
7
+ // El test está configurado para que esto sea suficiente
8
+ return ((_a = uaData.browser) === null || _a === void 0 ? void 0 : _a.name) === "Safari" && ((_b = uaData.os) === null || _b === void 0 ? void 0 : _b.name) === "macOS";
9
+ }
10
+ //# sourceMappingURL=isAppleSilicon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isAppleSilicon.js","sourceRoot":"","sources":["../../src/utils/isAppleSilicon.ts"],"names":[],"mappings":";;AAEA,wCAIC;AAJD,SAAgB,cAAc,CAAC,MAAe;;IAC5C,mDAAmD;IACnD,wDAAwD;IACxD,OAAO,CAAA,MAAA,MAAM,CAAC,OAAO,0CAAE,IAAI,MAAK,QAAQ,IAAI,CAAA,MAAA,MAAM,CAAC,EAAE,0CAAE,IAAI,MAAK,OAAO,CAAA;AACzE,CAAC"}
@@ -0,0 +1,9 @@
1
+ export type { AsyncStateResult, AsyncStateResultState } from "./useAsyncState";
2
+ export type { AsyncMemoResult, AsyncMemoResultState } from "./useAsyncMemo";
3
+ export { useAdvancedUserAgentData } from "./useAdvancedUserAgentData";
4
+ export { useAsyncState, createAsyncStateState } from "./useAsyncState";
5
+ export { useAsyncTask } from "./useAsyncTask";
6
+ export { useAsyncTasks } from "./useAsyncTasks";
7
+ export { usePatchState } from "./usePatchState";
8
+ export { useAsyncEffect } from "./useAsyncEffect";
9
+ export { useAsyncMemo, createAsyncMemoState } from "./useAsyncMemo";
@@ -0,0 +1,9 @@
1
+ // Hooks
2
+ export { useAdvancedUserAgentData } from "./useAdvancedUserAgentData";
3
+ export { useAsyncState, createAsyncStateState } from "./useAsyncState";
4
+ export { useAsyncTask } from "./useAsyncTask";
5
+ export { useAsyncTasks } from "./useAsyncTasks";
6
+ export { usePatchState } from "./usePatchState";
7
+ export { useAsyncEffect } from "./useAsyncEffect";
8
+ export { useAsyncMemo, createAsyncMemoState } from "./useAsyncMemo";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAIA,QAAQ;AACR,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAA;AACrE,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,26 @@
1
+ export type AdvancedNavigatorUAData = {
2
+ browser: {
3
+ name: string;
4
+ version: string;
5
+ };
6
+ engine: {
7
+ name: string;
8
+ version: string;
9
+ };
10
+ os: {
11
+ name: string;
12
+ version: string;
13
+ };
14
+ cpu: {
15
+ architecture: string;
16
+ };
17
+ mobile: boolean;
18
+ };
19
+ /**
20
+ * extract or infer the [UserAgentData](https://developer.mozilla.org/en-US/docs/Web/API/Navigator/userAgentData)
21
+ * that is an object which can be used to access the User-Agent Client Hints API.
22
+ */
23
+ export declare function useAdvancedUserAgentData(): [
24
+ boolean,
25
+ AdvancedNavigatorUAData | undefined
26
+ ];
@@ -0,0 +1,57 @@
1
+ import { useState } from "react";
2
+ import { UAParser } from "ua-parser-js";
3
+ import { isAppleSilicon } from "ua-parser-js/helpers";
4
+ import { useAsyncEffect } from "./useAsyncEffect";
5
+ const DEFAULT_VALUE = "Unknown";
6
+ /**
7
+ * extract or infer the [UserAgentData](https://developer.mozilla.org/en-US/docs/Web/API/Navigator/userAgentData)
8
+ * that is an object which can be used to access the User-Agent Client Hints API.
9
+ */
10
+ export function useAdvancedUserAgentData() {
11
+ const [isLoading, setLoading] = useState(true);
12
+ const [data, setData] = useState();
13
+ useAsyncEffect(async () => {
14
+ setLoading(true);
15
+ const ua = new UAParser(navigator.userAgent);
16
+ const uaData = ua.getResult();
17
+ const uaDataWithClientHints = await uaData.withClientHints();
18
+ const browser = {
19
+ name: uaData.browser.name ?? DEFAULT_VALUE,
20
+ version: uaData.browser.version ?? DEFAULT_VALUE,
21
+ };
22
+ const engine = {
23
+ name: uaData.engine.name ?? DEFAULT_VALUE,
24
+ version: uaData.engine.version ?? DEFAULT_VALUE,
25
+ };
26
+ const [osData, cpuData] = await Promise.all([
27
+ ua.getOS().withClientHints(),
28
+ ua.getCPU().withClientHints(),
29
+ ]);
30
+ const os = {
31
+ name: osData.name ?? DEFAULT_VALUE,
32
+ version: osData.version ?? DEFAULT_VALUE,
33
+ };
34
+ let architecture;
35
+ if (!cpuData.architecture) {
36
+ architecture =
37
+ os.name === "macOS" && isAppleSilicon(uaDataWithClientHints)
38
+ ? "arm64"
39
+ : "Unknown";
40
+ }
41
+ else {
42
+ architecture = cpuData.architecture;
43
+ }
44
+ setData({
45
+ browser,
46
+ engine,
47
+ os,
48
+ cpu: {
49
+ architecture,
50
+ },
51
+ mobile: ua.getDevice().is("mobile"),
52
+ });
53
+ setLoading(false);
54
+ }, []);
55
+ return [isLoading, data];
56
+ }
57
+ //# sourceMappingURL=useAdvancedUserAgentData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAdvancedUserAgentData.js","sourceRoot":"","sources":["../../src/hooks/useAdvancedUserAgentData.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,MAAM,aAAa,GAAG,SAAS,CAAA;AAqB/B;;;GAGG;AACH,MAAM,UAAU,wBAAwB;IAItC,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC9C,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,EAA2B,CAAA;IAE3D,cAAc,CAAC,KAAK,IAAI,EAAE;QACxB,UAAU,CAAC,IAAI,CAAC,CAAA;QAChB,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;QAC5C,MAAM,MAAM,GAAG,EAAE,CAAC,SAAS,EAAE,CAAA;QAC7B,MAAM,qBAAqB,GAAG,MAAM,MAAM,CAAC,eAAe,EAAE,CAAA;QAC5D,MAAM,OAAO,GAAG;YACd,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,aAAa;YAC1C,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,aAAa;SACjD,CAAA;QACD,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,aAAa;YACzC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,aAAa;SAChD,CAAA;QACD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC1C,EAAE,CAAC,KAAK,EAAE,CAAC,eAAe,EAAE;YAC5B,EAAE,CAAC,MAAM,EAAE,CAAC,eAAe,EAAE;SAC9B,CAAC,CAAA;QAEF,MAAM,EAAE,GAAG;YACT,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,aAAa;YAClC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,aAAa;SACzC,CAAA;QAED,IAAI,YAAoB,CAAA;QACxB,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;YAC1B,YAAY;gBACV,EAAE,CAAC,IAAI,KAAK,OAAO,IAAI,cAAc,CAAC,qBAAqB,CAAC;oBAC1D,CAAC,CAAC,OAAO;oBACT,CAAC,CAAC,SAAS,CAAA;QACjB,CAAC;aAAM,CAAC;YACN,YAAY,GAAG,OAAO,CAAC,YAAY,CAAA;QACrC,CAAC;QAED,OAAO,CAAC;YACN,OAAO;YACP,MAAM;YACN,EAAE;YACF,GAAG,EAAE;gBACH,YAAY;aACb;YACD,MAAM,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC;SACpC,CAAC,CAAA;QAEF,UAAU,CAAC,KAAK,CAAC,CAAA;IACnB,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;AAC1B,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { DependencyList } from "react";
2
+ /**
3
+ * Execute an async function and return a loading state and a function to call the async function
4
+ * @param callback - The async function to execute
5
+ * @param dependencies - The dependencies of the async function
6
+ * @returns A tuple containing the loading state and a function to call the async function
7
+ */
8
+ declare const useAsyncEffect: (callback: () => Promise<void | (() => void)>, dependencies?: DependencyList) => void;
9
+ export { useAsyncEffect };
@@ -0,0 +1,27 @@
1
+ import { useEffect } from "react";
2
+ import { sentry } from "../utils/development/sentry";
3
+ /**
4
+ * Execute an async function and return a loading state and a function to call the async function
5
+ * @param callback - The async function to execute
6
+ * @param dependencies - The dependencies of the async function
7
+ * @returns A tuple containing the loading state and a function to call the async function
8
+ */
9
+ const useAsyncEffect = (callback, dependencies) => {
10
+ return useEffect(() => {
11
+ const promise = callback().catch((err) => {
12
+ console.error(`AsyncEffect error: `, err);
13
+ sentry((sentry) => sentry.captureException("AsyncEffect error: " + err.message, {
14
+ extra: err,
15
+ }));
16
+ });
17
+ return function () {
18
+ promise.then((unsubscribe) => {
19
+ if (typeof unsubscribe === "function") {
20
+ unsubscribe();
21
+ }
22
+ });
23
+ };
24
+ }, dependencies);
25
+ };
26
+ export { useAsyncEffect };
27
+ //# sourceMappingURL=useAsyncEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAsyncEffect.js","sourceRoot":"","sources":["../../src/hooks/useAsyncEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,SAAS,EAAE,MAAM,OAAO,CAAA;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAA;AAEpD;;;;;GAKG;AACH,MAAM,cAAc,GAAG,CACrB,QAA4C,EAC5C,YAA6B,EAC7B,EAAE;IACF,OAAO,SAAS,CAAC,GAAG,EAAE;QACpB,MAAM,OAAO,GAAG,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACvC,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAA;YACzC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAChB,MAAM,CAAC,gBAAgB,CAAC,qBAAqB,GAAG,GAAG,CAAC,OAAO,EAAE;gBAC3D,KAAK,EAAE,GAAG;aACX,CAAC,CACH,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,OAAO;YACL,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE;gBAC3B,IAAI,OAAO,WAAW,KAAK,UAAU,EAAE,CAAC;oBACtC,WAAW,EAAE,CAAA;gBACf,CAAC;YACH,CAAC,CAAC,CAAA;QACJ,CAAC,CAAA;IACH,CAAC,EAAE,YAAY,CAAC,CAAA;AAClB,CAAC,CAAA;AAED,OAAO,EAAE,cAAc,EAAE,CAAA"}
@@ -0,0 +1,6 @@
1
+ export declare const useAsyncMemo: <T, I = null>(callback: () => Promise<T>, deps?: import("react").DependencyList, options?: Partial<{
2
+ initialValue: T | I;
3
+ callWithTruthyDeps: boolean;
4
+ }>) => import("./useAsyncState").AsyncStateResult<T, I>;
5
+ export type { AsyncStateResult as AsyncMemoResult, AsyncStateResultState as AsyncMemoResultState, } from "./useAsyncState";
6
+ export { createAsyncStateState as createAsyncMemoState } from "./useAsyncState";
@@ -0,0 +1,4 @@
1
+ import { useAsyncState } from "./useAsyncState";
2
+ export const useAsyncMemo = useAsyncState;
3
+ export { createAsyncStateState as createAsyncMemoState } from "./useAsyncState";
4
+ //# sourceMappingURL=useAsyncMemo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAsyncMemo.js","sourceRoot":"","sources":["../../src/hooks/useAsyncMemo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAA;AAKzC,OAAO,EAAE,qBAAqB,IAAI,oBAAoB,EAAE,MAAM,iBAAiB,CAAA"}
@@ -0,0 +1,39 @@
1
+ import { DependencyList } from "react";
2
+ type AsyncStateOptions<T = any, I = null> = {
3
+ initialValue: T | I;
4
+ callWithTruthyDeps: boolean;
5
+ };
6
+ type AsyncStateResultState<T, I = null> = {
7
+ version: number;
8
+ time: number;
9
+ error: Error | null;
10
+ loading: boolean;
11
+ loaded: boolean;
12
+ reload: () => void;
13
+ set: (value: ((current: T | I) => T) | T) => void;
14
+ };
15
+ type AsyncStateResult<T, I = null> = readonly [
16
+ T | I,
17
+ AsyncStateResultState<T, I>
18
+ ];
19
+ /**
20
+ * Create a state object for the useAsyncState hook
21
+ * @param initialValue - The initial value of the state
22
+ * @param callWithTruthyDeps - Whether to call the async function only when all dependencies are truthy
23
+ * @returns An object with the state properties
24
+ */
25
+ declare const createAsyncStateState: <T, I = null>() => AsyncStateResultState<T, I>;
26
+ /**
27
+ * Execute and async function and save the result in the component memory,
28
+ * it will execute again each time deps change, and it return only the result
29
+ * for the latest change
30
+ *
31
+ * @param callback - async function
32
+ * @param deps - dependency list
33
+ * @param options.initialValue - initial memo value (default=null)
34
+ * @param options.callWithTruthyDeps - if true the effect will be executed only when
35
+ * all values in the dependency list are evaluated as true
36
+ */
37
+ declare const useAsyncState: <T, I = null>(callback: () => Promise<T>, deps?: DependencyList, options?: Partial<AsyncStateOptions<T, I>>) => AsyncStateResult<T, I>;
38
+ export type { AsyncStateResultState, AsyncStateResult };
39
+ export { createAsyncStateState, useAsyncState };
@@ -0,0 +1,110 @@
1
+ import { useCallback, useEffect, useMemo, useState, } from "react";
2
+ import { sentry } from "../utils/development/sentry";
3
+ /**
4
+ * Create a state object for the useAsyncState hook
5
+ * @param initialValue - The initial value of the state
6
+ * @param callWithTruthyDeps - Whether to call the async function only when all dependencies are truthy
7
+ * @returns An object with the state properties
8
+ */
9
+ const createAsyncStateState = () => {
10
+ return {
11
+ version: 0,
12
+ loading: false,
13
+ time: 0,
14
+ error: null,
15
+ loaded: false,
16
+ reload: () => { },
17
+ set: () => { },
18
+ };
19
+ };
20
+ /**
21
+ * Execute and async function and save the result in the component memory,
22
+ * it will execute again each time deps change, and it return only the result
23
+ * for the latest change
24
+ *
25
+ * @param callback - async function
26
+ * @param deps - dependency list
27
+ * @param options.initialValue - initial memo value (default=null)
28
+ * @param options.callWithTruthyDeps - if true the effect will be executed only when
29
+ * all values in the dependency list are evaluated as true
30
+ */
31
+ const useAsyncState = (callback, deps = [], options = {}) => {
32
+ const [state, setState] = useState({
33
+ version: 0,
34
+ loading: false,
35
+ value: (options.initialValue ?? null),
36
+ time: 0,
37
+ error: null,
38
+ });
39
+ const load = useCallback(() => {
40
+ if (options.callWithTruthyDeps &&
41
+ deps.some((dep) => Boolean(dep) === false)) {
42
+ return;
43
+ }
44
+ setState((current) => ({
45
+ ...current,
46
+ loading: true,
47
+ version: current.version + 1,
48
+ }));
49
+ }, [state, options.callWithTruthyDeps, ...deps]);
50
+ useEffect(() => {
51
+ load();
52
+ }, deps);
53
+ useEffect(() => {
54
+ if (!state.loading) {
55
+ return;
56
+ }
57
+ let cancelled = false;
58
+ const loading = false;
59
+ const initial = Date.now();
60
+ Promise.resolve()
61
+ .then(() => callback())
62
+ .then((value) => {
63
+ if (cancelled) {
64
+ return;
65
+ }
66
+ setState((current) => ({
67
+ ...current,
68
+ value,
69
+ error: null,
70
+ loading,
71
+ time: Date.now() - initial,
72
+ }));
73
+ })
74
+ .catch((err) => {
75
+ console.error(err);
76
+ sentry((sentry) => sentry.captureException(err));
77
+ if (cancelled) {
78
+ return;
79
+ }
80
+ setState((current) => ({
81
+ ...current,
82
+ value: current.value,
83
+ error: err,
84
+ loading,
85
+ time: Date.now() - initial,
86
+ }));
87
+ });
88
+ return () => {
89
+ cancelled = true;
90
+ };
91
+ }, [state]);
92
+ const set = useCallback((value) => {
93
+ const newValue = typeof value === "function"
94
+ ? value(state.value)
95
+ : value;
96
+ setState((current) => ({ ...current, value: newValue }));
97
+ }, [state]);
98
+ const actions = useMemo(() => ({
99
+ version: state.version,
100
+ loading: state.loading,
101
+ error: state.error,
102
+ time: state.time,
103
+ loaded: state.version !== 0,
104
+ reload: load,
105
+ set,
106
+ }), [state, load, set]);
107
+ return [state.value, actions];
108
+ };
109
+ export { createAsyncStateState, useAsyncState };
110
+ //# sourceMappingURL=useAsyncState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAsyncState.js","sourceRoot":"","sources":["../../src/hooks/useAsyncState.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { DependencyList } from "react";
2
+ /**
3
+ * Execute an async function and return a loading state and a function to call the async function
4
+ * @param callback - The async function to execute
5
+ * @param deps - The dependencies of the async function
6
+ * @returns A tuple containing the loading state and a function to call the async function
7
+ */
8
+ declare const useAsyncTask: <A extends any[] = []>(callback: (...args: A) => Promise<any>, deps: DependencyList) => readonly [boolean, (...args: A) => void];
9
+ export { useAsyncTask };
@@ -0,0 +1,49 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import { useCallback, useEffect, useState } from "react";
3
+ import { sentry } from "../utils/development/sentry";
4
+ /**
5
+ * Execute an async function and return a loading state and a function to call the async function
6
+ * @param callback - The async function to execute
7
+ * @param deps - The dependencies of the async function
8
+ * @returns A tuple containing the loading state and a function to call the async function
9
+ */
10
+ const useAsyncTask = (callback, deps) => {
11
+ const [{ loading, args }, setLoading] = useState({
12
+ loading: false,
13
+ args: null,
14
+ });
15
+ useEffect(() => {
16
+ if (!loading) {
17
+ return;
18
+ }
19
+ if (args === null) {
20
+ return;
21
+ }
22
+ let cancelled = false;
23
+ Promise.resolve()
24
+ .then(() => callback(...args))
25
+ .then(() => {
26
+ if (cancelled) {
27
+ return;
28
+ }
29
+ setLoading({ loading: false, args: null });
30
+ })
31
+ .catch((err) => {
32
+ console.error(err);
33
+ sentry((sentry) => sentry.captureException(err));
34
+ if (cancelled) {
35
+ return;
36
+ }
37
+ setLoading({ loading: false, args: null });
38
+ });
39
+ return () => {
40
+ cancelled = true;
41
+ };
42
+ }, [loading]);
43
+ const callTask = useCallback((...args) => {
44
+ setLoading({ loading: true, args });
45
+ }, [loading, args, ...deps]);
46
+ return [loading, callTask];
47
+ };
48
+ export { useAsyncTask };
49
+ //# sourceMappingURL=useAsyncTask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAsyncTask.js","sourceRoot":"","sources":["../../src/hooks/useAsyncTask.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,OAAO,EAAkB,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAA;AAOpD;;;;;GAKG;AACH,MAAM,YAAY,GAAG,CACnB,QAAsC,EACtC,IAAoB,EACpB,EAAE;IACF,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAoB;QAClE,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,IAAI;KACX,CAAC,CAAA;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAM;QACR,CAAC;QAED,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,OAAM;QACR,CAAC;QAED,IAAI,SAAS,GAAG,KAAK,CAAA;QACrB,OAAO,CAAC,OAAO,EAAE;aACd,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;aAC7B,IAAI,CAAC,GAAG,EAAE;YACT,IAAI,SAAS,EAAE,CAAC;gBACd,OAAM;YACR,CAAC;YAED,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QAC5C,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACb,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAClB,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAA;YAChD,IAAI,SAAS,EAAE,CAAC;gBACd,OAAM;YACR,CAAC;YAED,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QAC5C,CAAC,CAAC,CAAA;QAEJ,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAA;QAClB,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAA;IAEb,MAAM,QAAQ,GAAG,WAAW,CAC1B,CAAC,GAAG,IAAO,EAAE,EAAE;QACb,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IACrC,CAAC,EACD,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,CACzB,CAAA;IAED,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAU,CAAA;AACrC,CAAC,CAAA;AAED,OAAO,EAAE,YAAY,EAAE,CAAA"}
@@ -0,0 +1,11 @@
1
+ import { DependencyList } from "react";
2
+ type AsyncTaskIdenfity = (id: string, ...extra: any[]) => Promise<any>;
3
+ /**
4
+ * Use async tasks to execute async functions and return a list of task ids and a function to add a task
5
+ * @param callback - The async function to execute
6
+ * @param deps - The dependencies of the async function
7
+ * @returns A tuple containing the list of task ids and a function to add a task
8
+ */
9
+ declare const useAsyncTasks: <C extends AsyncTaskIdenfity = AsyncTaskIdenfity>(callback: C, deps: DependencyList) => readonly [string[], C];
10
+ export type { AsyncTaskIdenfity };
11
+ export { useAsyncTasks };