@molecule/app-react 1.0.0
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 +115 -0
- package/README.md +2645 -0
- package/dist/agent-identity.d.ts +40 -0
- package/dist/agent-identity.d.ts.map +1 -0
- package/dist/agent-identity.js +31 -0
- package/dist/agent-identity.js.map +1 -0
- package/dist/contexts.d.ts +69 -0
- package/dist/contexts.d.ts.map +1 -0
- package/dist/contexts.js +70 -0
- package/dist/contexts.js.map +1 -0
- package/dist/hooks/index.d.ts +32 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +32 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/useAIModels.d.ts +48 -0
- package/dist/hooks/useAIModels.d.ts.map +1 -0
- package/dist/hooks/useAIModels.js +145 -0
- package/dist/hooks/useAIModels.js.map +1 -0
- package/dist/hooks/useAsyncState.d.ts +41 -0
- package/dist/hooks/useAsyncState.d.ts.map +1 -0
- package/dist/hooks/useAsyncState.js +77 -0
- package/dist/hooks/useAsyncState.js.map +1 -0
- package/dist/hooks/useAuth.d.ts +43 -0
- package/dist/hooks/useAuth.d.ts.map +1 -0
- package/dist/hooks/useAuth.js +106 -0
- package/dist/hooks/useAuth.js.map +1 -0
- package/dist/hooks/useCapacitorApp.d.ts +35 -0
- package/dist/hooks/useCapacitorApp.d.ts.map +1 -0
- package/dist/hooks/useCapacitorApp.js +61 -0
- package/dist/hooks/useCapacitorApp.js.map +1 -0
- package/dist/hooks/useChangePassword.d.ts +34 -0
- package/dist/hooks/useChangePassword.d.ts.map +1 -0
- package/dist/hooks/useChangePassword.js +37 -0
- package/dist/hooks/useChangePassword.js.map +1 -0
- package/dist/hooks/useChat.d.ts +30 -0
- package/dist/hooks/useChat.d.ts.map +1 -0
- package/dist/hooks/useChat.js +1510 -0
- package/dist/hooks/useChat.js.map +1 -0
- package/dist/hooks/useDevice.d.ts +39 -0
- package/dist/hooks/useDevice.d.ts.map +1 -0
- package/dist/hooks/useDevice.js +41 -0
- package/dist/hooks/useDevice.js.map +1 -0
- package/dist/hooks/useEditor.d.ts +20 -0
- package/dist/hooks/useEditor.d.ts.map +1 -0
- package/dist/hooks/useEditor.js +98 -0
- package/dist/hooks/useEditor.js.map +1 -0
- package/dist/hooks/useForm.d.ts +87 -0
- package/dist/hooks/useForm.d.ts.map +1 -0
- package/dist/hooks/useForm.js +148 -0
- package/dist/hooks/useForm.js.map +1 -0
- package/dist/hooks/useHttp.d.ts +103 -0
- package/dist/hooks/useHttp.d.ts.map +1 -0
- package/dist/hooks/useHttp.js +161 -0
- package/dist/hooks/useHttp.js.map +1 -0
- package/dist/hooks/useLogger.d.ts +68 -0
- package/dist/hooks/useLogger.d.ts.map +1 -0
- package/dist/hooks/useLogger.js +95 -0
- package/dist/hooks/useLogger.js.map +1 -0
- package/dist/hooks/useLogin.d.ts +35 -0
- package/dist/hooks/useLogin.d.ts.map +1 -0
- package/dist/hooks/useLogin.js +37 -0
- package/dist/hooks/useLogin.js.map +1 -0
- package/dist/hooks/useOAuth.d.ts +83 -0
- package/dist/hooks/useOAuth.d.ts.map +1 -0
- package/dist/hooks/useOAuth.js +348 -0
- package/dist/hooks/useOAuth.js.map +1 -0
- package/dist/hooks/usePasswordReset.d.ts +43 -0
- package/dist/hooks/usePasswordReset.d.ts.map +1 -0
- package/dist/hooks/usePasswordReset.js +50 -0
- package/dist/hooks/usePasswordReset.js.map +1 -0
- package/dist/hooks/usePlatform.d.ts +38 -0
- package/dist/hooks/usePlatform.d.ts.map +1 -0
- package/dist/hooks/usePlatform.js +40 -0
- package/dist/hooks/usePlatform.js.map +1 -0
- package/dist/hooks/usePreview.d.ts +20 -0
- package/dist/hooks/usePreview.d.ts.map +1 -0
- package/dist/hooks/usePreview.js +62 -0
- package/dist/hooks/usePreview.js.map +1 -0
- package/dist/hooks/usePromise.d.ts +39 -0
- package/dist/hooks/usePromise.d.ts.map +1 -0
- package/dist/hooks/usePromise.js +92 -0
- package/dist/hooks/usePromise.js.map +1 -0
- package/dist/hooks/usePush.d.ts +50 -0
- package/dist/hooks/usePush.d.ts.map +1 -0
- package/dist/hooks/usePush.js +89 -0
- package/dist/hooks/usePush.js.map +1 -0
- package/dist/hooks/useRouter.d.ts +65 -0
- package/dist/hooks/useRouter.d.ts.map +1 -0
- package/dist/hooks/useRouter.js +120 -0
- package/dist/hooks/useRouter.js.map +1 -0
- package/dist/hooks/useSignup.d.ts +35 -0
- package/dist/hooks/useSignup.d.ts.map +1 -0
- package/dist/hooks/useSignup.js +37 -0
- package/dist/hooks/useSignup.js.map +1 -0
- package/dist/hooks/useStorage.d.ts +72 -0
- package/dist/hooks/useStorage.d.ts.map +1 -0
- package/dist/hooks/useStorage.js +144 -0
- package/dist/hooks/useStorage.js.map +1 -0
- package/dist/hooks/useStore.d.ts +51 -0
- package/dist/hooks/useStore.d.ts.map +1 -0
- package/dist/hooks/useStore.js +86 -0
- package/dist/hooks/useStore.js.map +1 -0
- package/dist/hooks/useTheme.d.ts +50 -0
- package/dist/hooks/useTheme.d.ts.map +1 -0
- package/dist/hooks/useTheme.js +135 -0
- package/dist/hooks/useTheme.js.map +1 -0
- package/dist/hooks/useTranslation.d.ts +69 -0
- package/dist/hooks/useTranslation.d.ts.map +1 -0
- package/dist/hooks/useTranslation.js +131 -0
- package/dist/hooks/useTranslation.js.map +1 -0
- package/dist/hooks/useVersion.d.ts +41 -0
- package/dist/hooks/useVersion.d.ts.map +1 -0
- package/dist/hooks/useVersion.js +73 -0
- package/dist/hooks/useVersion.js.map +1 -0
- package/dist/hooks/useWorkspace.d.ts +18 -0
- package/dist/hooks/useWorkspace.d.ts.map +1 -0
- package/dist/hooks/useWorkspace.js +67 -0
- package/dist/hooks/useWorkspace.js.map +1 -0
- package/dist/index.d.ts +80 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +80 -0
- package/dist/index.js.map +1 -0
- package/dist/providers.d.ts +189 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/providers.js +248 -0
- package/dist/providers.js.map +1 -0
- package/dist/types.d.ts +381 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React hook for tracking async function state.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import type { PromiseStatus } from '@molecule/app-utilities';
|
|
7
|
+
/**
|
|
8
|
+
* Extended promise state with actions.
|
|
9
|
+
*/
|
|
10
|
+
export interface UsePromiseState<T> {
|
|
11
|
+
status: PromiseStatus;
|
|
12
|
+
value: T | null;
|
|
13
|
+
error: Error | null;
|
|
14
|
+
cancel: (message?: string) => void;
|
|
15
|
+
reset: () => void;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Hook that wraps an async function with state tracking.
|
|
19
|
+
*
|
|
20
|
+
* @param asyncFn - The async function to wrap
|
|
21
|
+
* @returns Tuple of [state, wrappedFunction]
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```tsx
|
|
25
|
+
* const [state, fetchUser] = usePromise((id: string) => api.getUser(id))
|
|
26
|
+
*
|
|
27
|
+
* return (
|
|
28
|
+
* <div>
|
|
29
|
+
* <button onClick={() => fetchUser('123')} disabled={state.status === 'pending'}>
|
|
30
|
+
* {state.status === 'pending' ? 'Loading...' : 'Fetch User'}
|
|
31
|
+
* </button>
|
|
32
|
+
* {state.value && <div>{state.value.name}</div>}
|
|
33
|
+
* {state.error && <div>Error: {state.error.message}</div>}
|
|
34
|
+
* </div>
|
|
35
|
+
* )
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export declare const usePromise: <T extends (...args: any[]) => Promise<any>>(asyncFn: T) => [UsePromiseState<Awaited<ReturnType<T>>>, (...args: Parameters<T>) => Promise<Awaited<ReturnType<T>>>];
|
|
39
|
+
//# sourceMappingURL=usePromise.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePromise.d.ts","sourceRoot":"","sources":["../../src/hooks/usePromise.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAE5D;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,MAAM,EAAE,aAAa,CAAA;IACrB,KAAK,EAAE,CAAC,GAAG,IAAI,CAAA;IACf,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;IACnB,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,UAAU,GAAI,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,EACnE,SAAS,CAAC,KACT,CACD,eAAe,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EACvC,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CA+F5D,CAAA"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React hook for tracking async function state.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
7
|
+
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
8
|
+
/**
|
|
9
|
+
* Hook that wraps an async function with state tracking.
|
|
10
|
+
*
|
|
11
|
+
* @param asyncFn - The async function to wrap
|
|
12
|
+
* @returns Tuple of [state, wrappedFunction]
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```tsx
|
|
16
|
+
* const [state, fetchUser] = usePromise((id: string) => api.getUser(id))
|
|
17
|
+
*
|
|
18
|
+
* return (
|
|
19
|
+
* <div>
|
|
20
|
+
* <button onClick={() => fetchUser('123')} disabled={state.status === 'pending'}>
|
|
21
|
+
* {state.status === 'pending' ? 'Loading...' : 'Fetch User'}
|
|
22
|
+
* </button>
|
|
23
|
+
* {state.value && <div>{state.value.name}</div>}
|
|
24
|
+
* {state.error && <div>Error: {state.error.message}</div>}
|
|
25
|
+
* </div>
|
|
26
|
+
* )
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export const usePromise = (asyncFn) => {
|
|
30
|
+
const [status, setStatus] = useState('idle');
|
|
31
|
+
const [value, setValue] = useState(null);
|
|
32
|
+
const [error, setError] = useState(null);
|
|
33
|
+
const isUnmounted = useRef(false);
|
|
34
|
+
const callIdRef = useRef(0);
|
|
35
|
+
const cancelledRef = useRef(false);
|
|
36
|
+
useEffect(() => {
|
|
37
|
+
isUnmounted.current = false;
|
|
38
|
+
return () => {
|
|
39
|
+
isUnmounted.current = true;
|
|
40
|
+
};
|
|
41
|
+
}, []);
|
|
42
|
+
const cancel = useMemo(() => (message) => {
|
|
43
|
+
cancelledRef.current = true;
|
|
44
|
+
callIdRef.current += 1;
|
|
45
|
+
if (!isUnmounted.current) {
|
|
46
|
+
setStatus('rejected');
|
|
47
|
+
setError(message ? new Error(message) : null);
|
|
48
|
+
}
|
|
49
|
+
}, []);
|
|
50
|
+
const reset = useMemo(() => () => {
|
|
51
|
+
cancelledRef.current = false;
|
|
52
|
+
if (!isUnmounted.current) {
|
|
53
|
+
setStatus('idle');
|
|
54
|
+
setValue(null);
|
|
55
|
+
setError(null);
|
|
56
|
+
}
|
|
57
|
+
}, []);
|
|
58
|
+
const callAsyncFn = useMemo(() => (...args) => {
|
|
59
|
+
cancelledRef.current = false;
|
|
60
|
+
callIdRef.current += 1;
|
|
61
|
+
const thisCallId = callIdRef.current;
|
|
62
|
+
if (!isUnmounted.current) {
|
|
63
|
+
setStatus('pending');
|
|
64
|
+
setError(null);
|
|
65
|
+
}
|
|
66
|
+
const promise = asyncFn(...args);
|
|
67
|
+
return promise.then((resolved) => {
|
|
68
|
+
if (thisCallId === callIdRef.current && !isUnmounted.current) {
|
|
69
|
+
setStatus('resolved');
|
|
70
|
+
setValue(resolved);
|
|
71
|
+
setError(null);
|
|
72
|
+
}
|
|
73
|
+
return resolved;
|
|
74
|
+
}, (err) => {
|
|
75
|
+
const rejection = err instanceof Error ? err : new Error(String(err));
|
|
76
|
+
if (thisCallId === callIdRef.current && !isUnmounted.current) {
|
|
77
|
+
setStatus('rejected');
|
|
78
|
+
setError(rejection);
|
|
79
|
+
}
|
|
80
|
+
throw rejection;
|
|
81
|
+
});
|
|
82
|
+
}, [asyncFn]);
|
|
83
|
+
const state = useMemo(() => ({
|
|
84
|
+
status,
|
|
85
|
+
value,
|
|
86
|
+
error,
|
|
87
|
+
cancel,
|
|
88
|
+
reset,
|
|
89
|
+
}), [status, value, error, cancel, reset]);
|
|
90
|
+
return [state, callAsyncFn];
|
|
91
|
+
};
|
|
92
|
+
//# sourceMappingURL=usePromise.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePromise.js","sourceRoot":"","sources":["../../src/hooks/usePromise.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React hook for push notifications.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import type { NotificationActionListener, NotificationReceivedListener, PermissionStatus, PushRegisterOptions, PushToken, TokenChangeListener } from '@molecule/app-push';
|
|
7
|
+
/**
|
|
8
|
+
* Hook return type.
|
|
9
|
+
*/
|
|
10
|
+
export interface UsePushResult {
|
|
11
|
+
permission: PermissionStatus | null;
|
|
12
|
+
token: PushToken | null;
|
|
13
|
+
checkPermission: () => Promise<PermissionStatus>;
|
|
14
|
+
requestPermission: () => Promise<PermissionStatus>;
|
|
15
|
+
register: (options?: PushRegisterOptions) => Promise<PushToken>;
|
|
16
|
+
unregister: () => Promise<void>;
|
|
17
|
+
onNotificationReceived: (listener: NotificationReceivedListener) => () => void;
|
|
18
|
+
onNotificationAction: (listener: NotificationActionListener) => () => void;
|
|
19
|
+
onTokenChange: (listener: TokenChangeListener) => () => void;
|
|
20
|
+
setBadge: (count: number) => Promise<void>;
|
|
21
|
+
clearBadge: () => Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Options for the usePush hook (e.g. check permission on mount).
|
|
25
|
+
*/
|
|
26
|
+
export interface UsePushOptions {
|
|
27
|
+
/**
|
|
28
|
+
* Whether to check permission status on mount.
|
|
29
|
+
*/
|
|
30
|
+
checkOnMount?: boolean;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Hook for push notification state and actions.
|
|
34
|
+
*
|
|
35
|
+
* Uses module-level `getProvider()` — push is a singleton, not context-provided.
|
|
36
|
+
*
|
|
37
|
+
* @param options - Hook options
|
|
38
|
+
* @returns Push notification state and action methods
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```tsx
|
|
42
|
+
* const { permission, token, requestPermission, register } = usePush({ checkOnMount: true })
|
|
43
|
+
*
|
|
44
|
+
* if (permission === 'default') {
|
|
45
|
+
* return <button onClick={requestPermission}>Enable Notifications</button>
|
|
46
|
+
* }
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export declare function usePush(options?: UsePushOptions): UsePushResult;
|
|
50
|
+
//# sourceMappingURL=usePush.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePush.d.ts","sourceRoot":"","sources":["../../src/hooks/usePush.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EACV,0BAA0B,EAC1B,4BAA4B,EAC5B,gBAAgB,EAEhB,mBAAmB,EACnB,SAAS,EACT,mBAAmB,EACpB,MAAM,oBAAoB,CAAA;AAG3B;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAA;IACnC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAA;IACvB,eAAe,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAA;IAChD,iBAAiB,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAA;IAClD,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,mBAAmB,KAAK,OAAO,CAAC,SAAS,CAAC,CAAA;IAC/D,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/B,sBAAsB,EAAE,CAAC,QAAQ,EAAE,4BAA4B,KAAK,MAAM,IAAI,CAAA;IAC9E,oBAAoB,EAAE,CAAC,QAAQ,EAAE,0BAA0B,KAAK,MAAM,IAAI,CAAA;IAC1E,aAAa,EAAE,CAAC,QAAQ,EAAE,mBAAmB,KAAK,MAAM,IAAI,CAAA;IAC5D,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1C,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,OAAO,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,aAAa,CA0E/D"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React hook for push notifications.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
7
|
+
import { getProvider } from '@molecule/app-push';
|
|
8
|
+
/**
|
|
9
|
+
* Hook for push notification state and actions.
|
|
10
|
+
*
|
|
11
|
+
* Uses module-level `getProvider()` — push is a singleton, not context-provided.
|
|
12
|
+
*
|
|
13
|
+
* @param options - Hook options
|
|
14
|
+
* @returns Push notification state and action methods
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```tsx
|
|
18
|
+
* const { permission, token, requestPermission, register } = usePush({ checkOnMount: true })
|
|
19
|
+
*
|
|
20
|
+
* if (permission === 'default') {
|
|
21
|
+
* return <button onClick={requestPermission}>Enable Notifications</button>
|
|
22
|
+
* }
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export function usePush(options) {
|
|
26
|
+
const { checkOnMount = false } = options ?? {};
|
|
27
|
+
const providerRef = useRef(getProvider());
|
|
28
|
+
const [permission, setPermission] = useState(null);
|
|
29
|
+
const [token, setToken] = useState(null);
|
|
30
|
+
// Check permission on mount if requested
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
if (checkOnMount) {
|
|
33
|
+
providerRef.current
|
|
34
|
+
.checkPermission()
|
|
35
|
+
.then(setPermission)
|
|
36
|
+
.catch(() => {
|
|
37
|
+
// Silently fail
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}, [checkOnMount]);
|
|
41
|
+
const checkPermission = useCallback(async () => {
|
|
42
|
+
const status = await providerRef.current.checkPermission();
|
|
43
|
+
setPermission(status);
|
|
44
|
+
return status;
|
|
45
|
+
}, []);
|
|
46
|
+
const requestPermission = useCallback(async () => {
|
|
47
|
+
const status = await providerRef.current.requestPermission();
|
|
48
|
+
setPermission(status);
|
|
49
|
+
return status;
|
|
50
|
+
}, []);
|
|
51
|
+
const register = useCallback(async (options) => {
|
|
52
|
+
const pushToken = await providerRef.current.register(options);
|
|
53
|
+
setToken(pushToken);
|
|
54
|
+
return pushToken;
|
|
55
|
+
}, []);
|
|
56
|
+
const unregister = useCallback(async () => {
|
|
57
|
+
await providerRef.current.unregister();
|
|
58
|
+
setToken(null);
|
|
59
|
+
}, []);
|
|
60
|
+
const onNotificationReceived = useCallback((listener) => {
|
|
61
|
+
return providerRef.current.onNotificationReceived(listener);
|
|
62
|
+
}, []);
|
|
63
|
+
const onNotificationAction = useCallback((listener) => {
|
|
64
|
+
return providerRef.current.onNotificationAction(listener);
|
|
65
|
+
}, []);
|
|
66
|
+
const onTokenChange = useCallback((listener) => {
|
|
67
|
+
return providerRef.current.onTokenChange(listener);
|
|
68
|
+
}, []);
|
|
69
|
+
const setBadge = useCallback(async (count) => {
|
|
70
|
+
await providerRef.current.setBadge(count);
|
|
71
|
+
}, []);
|
|
72
|
+
const clearBadge = useCallback(async () => {
|
|
73
|
+
await providerRef.current.clearBadge();
|
|
74
|
+
}, []);
|
|
75
|
+
return {
|
|
76
|
+
permission,
|
|
77
|
+
token,
|
|
78
|
+
checkPermission,
|
|
79
|
+
requestPermission,
|
|
80
|
+
register,
|
|
81
|
+
unregister,
|
|
82
|
+
onNotificationReceived,
|
|
83
|
+
onNotificationAction,
|
|
84
|
+
onTokenChange,
|
|
85
|
+
setBadge,
|
|
86
|
+
clearBadge,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=usePush.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePush.js","sourceRoot":"","sources":["../../src/hooks/usePush.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React hook for routing.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import type { NavigateOptions, QueryParams, RouteLocation, RouteParams, Router } from '@molecule/app-routing';
|
|
7
|
+
import type { UseRouterResult } from '../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Hook to access the router from context.
|
|
10
|
+
*
|
|
11
|
+
* @returns The router from context
|
|
12
|
+
* @throws {Error} Error if used outside of RouterProvider
|
|
13
|
+
*/
|
|
14
|
+
export declare function useRouterInstance(): Router;
|
|
15
|
+
/**
|
|
16
|
+
* Hook for routing state and actions.
|
|
17
|
+
*
|
|
18
|
+
* @returns Router state and navigation methods
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```tsx
|
|
22
|
+
* const { location, params, navigate, back } = useRouter()
|
|
23
|
+
*
|
|
24
|
+
* return (
|
|
25
|
+
* <div>
|
|
26
|
+
* <p>Current path: {location.pathname}</p>
|
|
27
|
+
* <button onClick={() => navigate('/home')}>Go Home</button>
|
|
28
|
+
* </div>
|
|
29
|
+
* )
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export declare function useRouter(): UseRouterResult;
|
|
33
|
+
/**
|
|
34
|
+
* Hook to get the current location.
|
|
35
|
+
*
|
|
36
|
+
* @returns The current route location
|
|
37
|
+
*/
|
|
38
|
+
export declare function useLocation(): RouteLocation;
|
|
39
|
+
/**
|
|
40
|
+
* Hook to get route parameters.
|
|
41
|
+
*
|
|
42
|
+
* @returns The current route parameters
|
|
43
|
+
*/
|
|
44
|
+
export declare function useParams<T extends Record<string, string> = RouteParams>(): T;
|
|
45
|
+
/**
|
|
46
|
+
* Hook to get query parameters.
|
|
47
|
+
*
|
|
48
|
+
* @returns The current query parameters
|
|
49
|
+
*/
|
|
50
|
+
export declare function useQuery<T extends QueryParams = QueryParams>(): T;
|
|
51
|
+
/**
|
|
52
|
+
* Hook to get the navigate function.
|
|
53
|
+
*
|
|
54
|
+
* @returns The navigate function
|
|
55
|
+
*/
|
|
56
|
+
export declare function useNavigate(): (path: string, options?: NavigateOptions) => void;
|
|
57
|
+
/**
|
|
58
|
+
* Hook to check if a path is active.
|
|
59
|
+
*
|
|
60
|
+
* @param path - The path to check
|
|
61
|
+
* @param exact - Whether to match exactly (default: false)
|
|
62
|
+
* @returns Whether the path is active
|
|
63
|
+
*/
|
|
64
|
+
export declare function useIsActive(path: string, exact?: boolean): boolean;
|
|
65
|
+
//# sourceMappingURL=useRouter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRouter.d.ts","sourceRoot":"","sources":["../../src/hooks/useRouter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EACX,aAAa,EACb,WAAW,EACX,MAAM,EACP,MAAM,uBAAuB,CAAA;AAG9B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAElD;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAU1C;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,SAAS,IAAI,eAAe,CA8C3C;AAED;;;;GAIG;AACH,wBAAgB,WAAW,IAAI,aAAa,CAG3C;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,WAAW,KAAK,CAAC,CAG7E;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,KAAK,CAAC,CAGjE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,KAAK,IAAI,CAM/E;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,OAAO,CAQhE"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React hook for routing.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { useCallback, useContext, useEffect, useState, useSyncExternalStore } from 'react';
|
|
7
|
+
import { t } from '@molecule/app-i18n';
|
|
8
|
+
import { RouterContext } from '../contexts.js';
|
|
9
|
+
/**
|
|
10
|
+
* Hook to access the router from context.
|
|
11
|
+
*
|
|
12
|
+
* @returns The router from context
|
|
13
|
+
* @throws {Error} Error if used outside of RouterProvider
|
|
14
|
+
*/
|
|
15
|
+
export function useRouterInstance() {
|
|
16
|
+
const router = useContext(RouterContext);
|
|
17
|
+
if (!router) {
|
|
18
|
+
throw new Error(t('react.error.useRouterOutsideProvider', undefined, {
|
|
19
|
+
defaultValue: 'useRouterInstance must be used within a RouterProvider',
|
|
20
|
+
}));
|
|
21
|
+
}
|
|
22
|
+
return router;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Hook for routing state and actions.
|
|
26
|
+
*
|
|
27
|
+
* @returns Router state and navigation methods
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```tsx
|
|
31
|
+
* const { location, params, navigate, back } = useRouter()
|
|
32
|
+
*
|
|
33
|
+
* return (
|
|
34
|
+
* <div>
|
|
35
|
+
* <p>Current path: {location.pathname}</p>
|
|
36
|
+
* <button onClick={() => navigate('/home')}>Go Home</button>
|
|
37
|
+
* </div>
|
|
38
|
+
* )
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export function useRouter() {
|
|
42
|
+
const router = useRouterInstance();
|
|
43
|
+
const [location, setLocation] = useState(() => router.getLocation());
|
|
44
|
+
const [params, setParams] = useState(() => router.getParams());
|
|
45
|
+
const [query, setQuery] = useState(() => router.getQuery());
|
|
46
|
+
useEffect(() => {
|
|
47
|
+
const unsubscribe = router.subscribe(() => {
|
|
48
|
+
setLocation(router.getLocation());
|
|
49
|
+
setParams(router.getParams());
|
|
50
|
+
setQuery(router.getQuery());
|
|
51
|
+
});
|
|
52
|
+
return unsubscribe;
|
|
53
|
+
}, [router]);
|
|
54
|
+
// Memoized action wrappers
|
|
55
|
+
const navigate = useCallback((path, options) => router.navigate(path, options), [router]);
|
|
56
|
+
const navigateTo = useCallback((name, params, query, options) => router.navigateTo(name, params, query, options), [router]);
|
|
57
|
+
const back = useCallback(() => router.back(), [router]);
|
|
58
|
+
const forward = useCallback(() => router.forward(), [router]);
|
|
59
|
+
const isActive = useCallback((path, exact) => router.isActive(path, exact), [router]);
|
|
60
|
+
return {
|
|
61
|
+
location,
|
|
62
|
+
params,
|
|
63
|
+
query,
|
|
64
|
+
navigate,
|
|
65
|
+
navigateTo,
|
|
66
|
+
back,
|
|
67
|
+
forward,
|
|
68
|
+
isActive,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Hook to get the current location.
|
|
73
|
+
*
|
|
74
|
+
* @returns The current route location
|
|
75
|
+
*/
|
|
76
|
+
export function useLocation() {
|
|
77
|
+
const { location } = useRouter();
|
|
78
|
+
return location;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Hook to get route parameters.
|
|
82
|
+
*
|
|
83
|
+
* @returns The current route parameters
|
|
84
|
+
*/
|
|
85
|
+
export function useParams() {
|
|
86
|
+
const { params } = useRouter();
|
|
87
|
+
return params;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Hook to get query parameters.
|
|
91
|
+
*
|
|
92
|
+
* @returns The current query parameters
|
|
93
|
+
*/
|
|
94
|
+
export function useQuery() {
|
|
95
|
+
const { query } = useRouter();
|
|
96
|
+
return query;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Hook to get the navigate function.
|
|
100
|
+
*
|
|
101
|
+
* @returns The navigate function
|
|
102
|
+
*/
|
|
103
|
+
export function useNavigate() {
|
|
104
|
+
const router = useRouterInstance();
|
|
105
|
+
return useCallback((path, options) => router.navigate(path, options), [router]);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Hook to check if a path is active.
|
|
109
|
+
*
|
|
110
|
+
* @param path - The path to check
|
|
111
|
+
* @param exact - Whether to match exactly (default: false)
|
|
112
|
+
* @returns Whether the path is active
|
|
113
|
+
*/
|
|
114
|
+
export function useIsActive(path, exact = false) {
|
|
115
|
+
const router = useRouterInstance();
|
|
116
|
+
const getSnapshot = useCallback(() => router.isActive(path, exact), [router, path, exact]);
|
|
117
|
+
const subscribe = useCallback((onChange) => router.subscribe(onChange), [router]);
|
|
118
|
+
return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=useRouter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRouter.js","sourceRoot":"","sources":["../../src/hooks/useRouter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React hook for registration with async state tracking.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import type { AuthResult, RegisterData } from '@molecule/app-auth';
|
|
7
|
+
import { type UsePromiseState } from './usePromise.js';
|
|
8
|
+
/**
|
|
9
|
+
* Return type for useSignup hook.
|
|
10
|
+
*/
|
|
11
|
+
export interface UseSignupReturn<T = unknown> {
|
|
12
|
+
status: UsePromiseState<AuthResult<T>>['status'];
|
|
13
|
+
value: UsePromiseState<AuthResult<T>>['value'];
|
|
14
|
+
error: UsePromiseState<AuthResult<T>>['error'];
|
|
15
|
+
signup: (data: RegisterData) => Promise<AuthResult<T>>;
|
|
16
|
+
reset: () => void;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Hook for user registration with async state tracking.
|
|
20
|
+
*
|
|
21
|
+
* @returns Signup state and action
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```tsx
|
|
25
|
+
* const { status, error, signup } = useSignup()
|
|
26
|
+
*
|
|
27
|
+
* return (
|
|
28
|
+
* <button onClick={() => signup({ email, password, name })} disabled={status === 'pending'}>
|
|
29
|
+
* {status === 'pending' ? 'Creating account...' : 'Sign Up'}
|
|
30
|
+
* </button>
|
|
31
|
+
* )
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare function useSignup<T = unknown>(): UseSignupReturn<T>;
|
|
35
|
+
//# sourceMappingURL=useSignup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSignup.d.ts","sourceRoot":"","sources":["../../src/hooks/useSignup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAGlE,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAElE;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,OAAO;IAC1C,MAAM,EAAE,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;IAChD,KAAK,EAAE,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;IAC9C,KAAK,EAAE,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;IAC9C,MAAM,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;IACtD,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,SAAS,CAAC,CAAC,GAAG,OAAO,KAAK,eAAe,CAAC,CAAC,CAAC,CAc3D"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React hook for registration with async state tracking.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { useCallback } from 'react';
|
|
7
|
+
import { useAuthClient } from './useAuth.js';
|
|
8
|
+
import { usePromise } from './usePromise.js';
|
|
9
|
+
/**
|
|
10
|
+
* Hook for user registration with async state tracking.
|
|
11
|
+
*
|
|
12
|
+
* @returns Signup state and action
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```tsx
|
|
16
|
+
* const { status, error, signup } = useSignup()
|
|
17
|
+
*
|
|
18
|
+
* return (
|
|
19
|
+
* <button onClick={() => signup({ email, password, name })} disabled={status === 'pending'}>
|
|
20
|
+
* {status === 'pending' ? 'Creating account...' : 'Sign Up'}
|
|
21
|
+
* </button>
|
|
22
|
+
* )
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export function useSignup() {
|
|
26
|
+
const client = useAuthClient();
|
|
27
|
+
const registerFn = useCallback((data) => client.register(data), [client]);
|
|
28
|
+
const [state, call] = usePromise(registerFn);
|
|
29
|
+
return {
|
|
30
|
+
status: state.status,
|
|
31
|
+
value: state.value,
|
|
32
|
+
error: state.error,
|
|
33
|
+
signup: call,
|
|
34
|
+
reset: state.reset,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=useSignup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSignup.js","sourceRoot":"","sources":["../../src/hooks/useSignup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AAInC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAwB,MAAM,iBAAiB,CAAA;AAalE;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,SAAS;IACvB,MAAM,MAAM,GAAG,aAAa,EAAK,CAAA;IAEjC,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,IAAkB,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IAEvF,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,UAAU,CAAC,UAAU,CAAC,CAAA;IAE5C,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,KAAK,CAAC,KAAK;KACnB,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React hook for storage.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import type { StorageProvider } from '@molecule/app-storage';
|
|
7
|
+
/**
|
|
8
|
+
* Hook to access the storage provider from context.
|
|
9
|
+
*
|
|
10
|
+
* @returns The storage provider from context
|
|
11
|
+
* @throws {Error} Error if used outside of StorageProvider
|
|
12
|
+
*/
|
|
13
|
+
export declare function useStorageProvider(): StorageProvider;
|
|
14
|
+
/**
|
|
15
|
+
* Options for useStorageValue hook.
|
|
16
|
+
*/
|
|
17
|
+
export interface UseStorageValueOptions<T> {
|
|
18
|
+
/**
|
|
19
|
+
* Default value if key doesn't exist.
|
|
20
|
+
*/
|
|
21
|
+
defaultValue?: T;
|
|
22
|
+
/**
|
|
23
|
+
* Whether to sync across tabs/windows (if supported by storage provider).
|
|
24
|
+
*/
|
|
25
|
+
sync?: boolean;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Result of useStorageValue hook.
|
|
29
|
+
*/
|
|
30
|
+
export interface UseStorageValueResult<T> {
|
|
31
|
+
value: T | undefined;
|
|
32
|
+
setValue: (value: T) => Promise<void>;
|
|
33
|
+
removeValue: () => Promise<void>;
|
|
34
|
+
loading: boolean;
|
|
35
|
+
error: Error | null;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Hook to manage a single storage value with React state sync.
|
|
39
|
+
*
|
|
40
|
+
* @param key - Storage key
|
|
41
|
+
* @param options - Hook options
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```tsx
|
|
45
|
+
* const { value: theme, setValue: setTheme, loading } = useStorageValue<string>('theme', {
|
|
46
|
+
* defaultValue: 'light'
|
|
47
|
+
* })
|
|
48
|
+
*
|
|
49
|
+
* if (loading) return <Spinner />
|
|
50
|
+
* return (
|
|
51
|
+
* <select value={theme} onChange={(e) => setTheme(e.target.value)}>
|
|
52
|
+
* <option value="light">Light</option>
|
|
53
|
+
* <option value="dark">Dark</option>
|
|
54
|
+
* </select>
|
|
55
|
+
* )
|
|
56
|
+
* ```
|
|
57
|
+
* @returns Storage value state (value, loading, error) and mutators (setValue, removeValue).
|
|
58
|
+
*/
|
|
59
|
+
export declare function useStorageValue<T>(key: string, options?: UseStorageValueOptions<T>): UseStorageValueResult<T>;
|
|
60
|
+
/**
|
|
61
|
+
* Hook for simple storage operations without React state sync.
|
|
62
|
+
*
|
|
63
|
+
* @returns Storage operation methods
|
|
64
|
+
*/
|
|
65
|
+
export declare function useStorage(): {
|
|
66
|
+
get: <T>(key: string) => Promise<T | null>;
|
|
67
|
+
set: <T>(key: string, value: T) => Promise<void>;
|
|
68
|
+
remove: (key: string) => Promise<void>;
|
|
69
|
+
clear: () => Promise<void>;
|
|
70
|
+
keys: () => Promise<string[]>;
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=useStorage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStorage.d.ts","sourceRoot":"","sources":["../../src/hooks/useStorage.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAI5D;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,eAAe,CAUpD;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB,CAAC,CAAC;IACvC;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,CAAA;IAChB;;OAEG;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACtC,KAAK,EAAE,CAAC,GAAG,SAAS,CAAA;IACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACrC,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAC/B,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,sBAAsB,CAAC,CAAC,CAAC,GAClC,qBAAqB,CAAC,CAAC,CAAC,CAsF1B;AAED;;;;GAIG;AACH,wBAAgB,UAAU,IAAI;IAC5B,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;IAC1C,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAChD,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACtC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1B,IAAI,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;CAC9B,CAoBA"}
|