@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.
- package/LICENSE +201 -0
- package/README.md +71 -0
- package/cjs/hooks/index.d.ts +9 -0
- package/cjs/hooks/index.js +21 -0
- package/cjs/hooks/index.js.map +1 -0
- package/cjs/hooks/useAdvancedUserAgentData.d.ts +26 -0
- package/cjs/hooks/useAdvancedUserAgentData.js +62 -0
- package/cjs/hooks/useAdvancedUserAgentData.js.map +1 -0
- package/cjs/hooks/useAsyncEffect.d.ts +9 -0
- package/cjs/hooks/useAsyncEffect.js +30 -0
- package/cjs/hooks/useAsyncEffect.js.map +1 -0
- package/cjs/hooks/useAsyncMemo.d.ts +6 -0
- package/cjs/hooks/useAsyncMemo.js +8 -0
- package/cjs/hooks/useAsyncMemo.js.map +1 -0
- package/cjs/hooks/useAsyncState.d.ts +39 -0
- package/cjs/hooks/useAsyncState.js +99 -0
- package/cjs/hooks/useAsyncState.js.map +1 -0
- package/cjs/hooks/useAsyncTask.d.ts +9 -0
- package/cjs/hooks/useAsyncTask.js +52 -0
- package/cjs/hooks/useAsyncTask.js.map +1 -0
- package/cjs/hooks/useAsyncTasks.d.ts +11 -0
- package/cjs/hooks/useAsyncTasks.js +35 -0
- package/cjs/hooks/useAsyncTasks.js.map +1 -0
- package/cjs/hooks/usePatchState.d.ts +7 -0
- package/cjs/hooks/usePatchState.js +18 -0
- package/cjs/hooks/usePatchState.js.map +1 -0
- package/cjs/index.d.ts +1 -0
- package/cjs/index.js +5 -0
- package/cjs/index.js.map +1 -0
- package/cjs/utils/development/sentry.d.ts +5 -0
- package/cjs/utils/development/sentry.js +15 -0
- package/cjs/utils/development/sentry.js.map +1 -0
- package/cjs/utils/isAppleSilicon.d.ts +2 -0
- package/cjs/utils/isAppleSilicon.js +10 -0
- package/cjs/utils/isAppleSilicon.js.map +1 -0
- package/esm/hooks/index.d.ts +9 -0
- package/esm/hooks/index.js +9 -0
- package/esm/hooks/index.js.map +1 -0
- package/esm/hooks/useAdvancedUserAgentData.d.ts +26 -0
- package/esm/hooks/useAdvancedUserAgentData.js +57 -0
- package/esm/hooks/useAdvancedUserAgentData.js.map +1 -0
- package/esm/hooks/useAsyncEffect.d.ts +9 -0
- package/esm/hooks/useAsyncEffect.js +27 -0
- package/esm/hooks/useAsyncEffect.js.map +1 -0
- package/esm/hooks/useAsyncMemo.d.ts +6 -0
- package/esm/hooks/useAsyncMemo.js +4 -0
- package/esm/hooks/useAsyncMemo.js.map +1 -0
- package/esm/hooks/useAsyncState.d.ts +39 -0
- package/esm/hooks/useAsyncState.js +110 -0
- package/esm/hooks/useAsyncState.js.map +1 -0
- package/esm/hooks/useAsyncTask.d.ts +9 -0
- package/esm/hooks/useAsyncTask.js +49 -0
- package/esm/hooks/useAsyncTask.js.map +1 -0
- package/esm/hooks/useAsyncTasks.d.ts +11 -0
- package/esm/hooks/useAsyncTasks.js +32 -0
- package/esm/hooks/useAsyncTasks.js.map +1 -0
- package/esm/hooks/usePatchState.d.ts +7 -0
- package/esm/hooks/usePatchState.js +15 -0
- package/esm/hooks/usePatchState.js.map +1 -0
- package/esm/index.d.ts +1 -0
- package/esm/index.js +2 -0
- package/esm/index.js.map +1 -0
- package/esm/utils/development/sentry.d.ts +5 -0
- package/esm/utils/development/sentry.js +11 -0
- package/esm/utils/development/sentry.js.map +1 -0
- package/esm/utils/isAppleSilicon.d.ts +2 -0
- package/esm/utils/isAppleSilicon.js +6 -0
- package/esm/utils/isAppleSilicon.js.map +1 -0
- 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
package/cjs/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,kDAAuB"}
|
|
@@ -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,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 @@
|
|
|
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 };
|