@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.
Files changed (131) hide show
  1. package/LICENSE +115 -0
  2. package/README.md +2645 -0
  3. package/dist/agent-identity.d.ts +40 -0
  4. package/dist/agent-identity.d.ts.map +1 -0
  5. package/dist/agent-identity.js +31 -0
  6. package/dist/agent-identity.js.map +1 -0
  7. package/dist/contexts.d.ts +69 -0
  8. package/dist/contexts.d.ts.map +1 -0
  9. package/dist/contexts.js +70 -0
  10. package/dist/contexts.js.map +1 -0
  11. package/dist/hooks/index.d.ts +32 -0
  12. package/dist/hooks/index.d.ts.map +1 -0
  13. package/dist/hooks/index.js +32 -0
  14. package/dist/hooks/index.js.map +1 -0
  15. package/dist/hooks/useAIModels.d.ts +48 -0
  16. package/dist/hooks/useAIModels.d.ts.map +1 -0
  17. package/dist/hooks/useAIModels.js +145 -0
  18. package/dist/hooks/useAIModels.js.map +1 -0
  19. package/dist/hooks/useAsyncState.d.ts +41 -0
  20. package/dist/hooks/useAsyncState.d.ts.map +1 -0
  21. package/dist/hooks/useAsyncState.js +77 -0
  22. package/dist/hooks/useAsyncState.js.map +1 -0
  23. package/dist/hooks/useAuth.d.ts +43 -0
  24. package/dist/hooks/useAuth.d.ts.map +1 -0
  25. package/dist/hooks/useAuth.js +106 -0
  26. package/dist/hooks/useAuth.js.map +1 -0
  27. package/dist/hooks/useCapacitorApp.d.ts +35 -0
  28. package/dist/hooks/useCapacitorApp.d.ts.map +1 -0
  29. package/dist/hooks/useCapacitorApp.js +61 -0
  30. package/dist/hooks/useCapacitorApp.js.map +1 -0
  31. package/dist/hooks/useChangePassword.d.ts +34 -0
  32. package/dist/hooks/useChangePassword.d.ts.map +1 -0
  33. package/dist/hooks/useChangePassword.js +37 -0
  34. package/dist/hooks/useChangePassword.js.map +1 -0
  35. package/dist/hooks/useChat.d.ts +30 -0
  36. package/dist/hooks/useChat.d.ts.map +1 -0
  37. package/dist/hooks/useChat.js +1510 -0
  38. package/dist/hooks/useChat.js.map +1 -0
  39. package/dist/hooks/useDevice.d.ts +39 -0
  40. package/dist/hooks/useDevice.d.ts.map +1 -0
  41. package/dist/hooks/useDevice.js +41 -0
  42. package/dist/hooks/useDevice.js.map +1 -0
  43. package/dist/hooks/useEditor.d.ts +20 -0
  44. package/dist/hooks/useEditor.d.ts.map +1 -0
  45. package/dist/hooks/useEditor.js +98 -0
  46. package/dist/hooks/useEditor.js.map +1 -0
  47. package/dist/hooks/useForm.d.ts +87 -0
  48. package/dist/hooks/useForm.d.ts.map +1 -0
  49. package/dist/hooks/useForm.js +148 -0
  50. package/dist/hooks/useForm.js.map +1 -0
  51. package/dist/hooks/useHttp.d.ts +103 -0
  52. package/dist/hooks/useHttp.d.ts.map +1 -0
  53. package/dist/hooks/useHttp.js +161 -0
  54. package/dist/hooks/useHttp.js.map +1 -0
  55. package/dist/hooks/useLogger.d.ts +68 -0
  56. package/dist/hooks/useLogger.d.ts.map +1 -0
  57. package/dist/hooks/useLogger.js +95 -0
  58. package/dist/hooks/useLogger.js.map +1 -0
  59. package/dist/hooks/useLogin.d.ts +35 -0
  60. package/dist/hooks/useLogin.d.ts.map +1 -0
  61. package/dist/hooks/useLogin.js +37 -0
  62. package/dist/hooks/useLogin.js.map +1 -0
  63. package/dist/hooks/useOAuth.d.ts +83 -0
  64. package/dist/hooks/useOAuth.d.ts.map +1 -0
  65. package/dist/hooks/useOAuth.js +348 -0
  66. package/dist/hooks/useOAuth.js.map +1 -0
  67. package/dist/hooks/usePasswordReset.d.ts +43 -0
  68. package/dist/hooks/usePasswordReset.d.ts.map +1 -0
  69. package/dist/hooks/usePasswordReset.js +50 -0
  70. package/dist/hooks/usePasswordReset.js.map +1 -0
  71. package/dist/hooks/usePlatform.d.ts +38 -0
  72. package/dist/hooks/usePlatform.d.ts.map +1 -0
  73. package/dist/hooks/usePlatform.js +40 -0
  74. package/dist/hooks/usePlatform.js.map +1 -0
  75. package/dist/hooks/usePreview.d.ts +20 -0
  76. package/dist/hooks/usePreview.d.ts.map +1 -0
  77. package/dist/hooks/usePreview.js +62 -0
  78. package/dist/hooks/usePreview.js.map +1 -0
  79. package/dist/hooks/usePromise.d.ts +39 -0
  80. package/dist/hooks/usePromise.d.ts.map +1 -0
  81. package/dist/hooks/usePromise.js +92 -0
  82. package/dist/hooks/usePromise.js.map +1 -0
  83. package/dist/hooks/usePush.d.ts +50 -0
  84. package/dist/hooks/usePush.d.ts.map +1 -0
  85. package/dist/hooks/usePush.js +89 -0
  86. package/dist/hooks/usePush.js.map +1 -0
  87. package/dist/hooks/useRouter.d.ts +65 -0
  88. package/dist/hooks/useRouter.d.ts.map +1 -0
  89. package/dist/hooks/useRouter.js +120 -0
  90. package/dist/hooks/useRouter.js.map +1 -0
  91. package/dist/hooks/useSignup.d.ts +35 -0
  92. package/dist/hooks/useSignup.d.ts.map +1 -0
  93. package/dist/hooks/useSignup.js +37 -0
  94. package/dist/hooks/useSignup.js.map +1 -0
  95. package/dist/hooks/useStorage.d.ts +72 -0
  96. package/dist/hooks/useStorage.d.ts.map +1 -0
  97. package/dist/hooks/useStorage.js +144 -0
  98. package/dist/hooks/useStorage.js.map +1 -0
  99. package/dist/hooks/useStore.d.ts +51 -0
  100. package/dist/hooks/useStore.d.ts.map +1 -0
  101. package/dist/hooks/useStore.js +86 -0
  102. package/dist/hooks/useStore.js.map +1 -0
  103. package/dist/hooks/useTheme.d.ts +50 -0
  104. package/dist/hooks/useTheme.d.ts.map +1 -0
  105. package/dist/hooks/useTheme.js +135 -0
  106. package/dist/hooks/useTheme.js.map +1 -0
  107. package/dist/hooks/useTranslation.d.ts +69 -0
  108. package/dist/hooks/useTranslation.d.ts.map +1 -0
  109. package/dist/hooks/useTranslation.js +131 -0
  110. package/dist/hooks/useTranslation.js.map +1 -0
  111. package/dist/hooks/useVersion.d.ts +41 -0
  112. package/dist/hooks/useVersion.d.ts.map +1 -0
  113. package/dist/hooks/useVersion.js +73 -0
  114. package/dist/hooks/useVersion.js.map +1 -0
  115. package/dist/hooks/useWorkspace.d.ts +18 -0
  116. package/dist/hooks/useWorkspace.d.ts.map +1 -0
  117. package/dist/hooks/useWorkspace.js +67 -0
  118. package/dist/hooks/useWorkspace.js.map +1 -0
  119. package/dist/index.d.ts +80 -0
  120. package/dist/index.d.ts.map +1 -0
  121. package/dist/index.js +80 -0
  122. package/dist/index.js.map +1 -0
  123. package/dist/providers.d.ts +189 -0
  124. package/dist/providers.d.ts.map +1 -0
  125. package/dist/providers.js +248 -0
  126. package/dist/providers.js.map +1 -0
  127. package/dist/types.d.ts +381 -0
  128. package/dist/types.d.ts.map +1 -0
  129. package/dist/types.js +7 -0
  130. package/dist/types.js.map +1 -0
  131. 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"}