@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,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React hook for HTTP requests.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import type { HttpClient, RequestConfig } from '@molecule/app-http';
|
|
7
|
+
/**
|
|
8
|
+
* Hook to access the HTTP client from context.
|
|
9
|
+
*
|
|
10
|
+
* @returns The HTTP client from context
|
|
11
|
+
* @throws {Error} Error if used outside of HttpProvider
|
|
12
|
+
*/
|
|
13
|
+
export declare function useHttpClient(): HttpClient;
|
|
14
|
+
/**
|
|
15
|
+
* State for async HTTP operations.
|
|
16
|
+
*/
|
|
17
|
+
export interface UseHttpState<T> {
|
|
18
|
+
data: T | null;
|
|
19
|
+
loading: boolean;
|
|
20
|
+
error: Error | null;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Result of useHttp hook.
|
|
24
|
+
*/
|
|
25
|
+
export interface UseHttpResult<T> extends UseHttpState<T> {
|
|
26
|
+
execute: () => Promise<T | null>;
|
|
27
|
+
reset: () => void;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Options for useHttp hook.
|
|
31
|
+
*/
|
|
32
|
+
export interface UseHttpOptions<T> extends RequestConfig {
|
|
33
|
+
/**
|
|
34
|
+
* Whether to execute the request immediately on mount.
|
|
35
|
+
*/
|
|
36
|
+
immediate?: boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Callback when request succeeds.
|
|
39
|
+
*/
|
|
40
|
+
onSuccess?: (data: T) => void;
|
|
41
|
+
/**
|
|
42
|
+
* Callback when request fails.
|
|
43
|
+
*/
|
|
44
|
+
onError?: (error: Error) => void;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Hook for making HTTP requests with state management.
|
|
48
|
+
*
|
|
49
|
+
* @param method - HTTP method
|
|
50
|
+
* @param url - Request URL
|
|
51
|
+
* @param options - Request options
|
|
52
|
+
* @returns Request state and execute function
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```tsx
|
|
56
|
+
* const { data, loading, error, execute } = useHttp<User[]>('GET', '/api/users')
|
|
57
|
+
*
|
|
58
|
+
* useEffect(() => {
|
|
59
|
+
* execute()
|
|
60
|
+
* }, [])
|
|
61
|
+
*
|
|
62
|
+
* if (loading) return <Spinner />
|
|
63
|
+
* if (error) return <Error message={error.message} />
|
|
64
|
+
* return <UserList users={data} />
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
export declare function useHttp<T>(method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE', url: string, options?: UseHttpOptions<T>): UseHttpResult<T>;
|
|
68
|
+
/**
|
|
69
|
+
* Hook for GET requests.
|
|
70
|
+
* @param url - Request URL to fetch from.
|
|
71
|
+
* @param options - HTTP request options including callbacks and request config.
|
|
72
|
+
* @returns Request state (data, loading, error) and controls (execute, reset).
|
|
73
|
+
*/
|
|
74
|
+
export declare function useGet<T>(url: string, options?: UseHttpOptions<T>): UseHttpResult<T>;
|
|
75
|
+
/**
|
|
76
|
+
* Hook for POST requests.
|
|
77
|
+
* @param url - Request URL to post to.
|
|
78
|
+
* @param options - HTTP request options including body data and callbacks.
|
|
79
|
+
* @returns Request state (data, loading, error) and controls (execute, reset).
|
|
80
|
+
*/
|
|
81
|
+
export declare function usePost<T>(url: string, options?: UseHttpOptions<T>): UseHttpResult<T>;
|
|
82
|
+
/**
|
|
83
|
+
* Hook for PUT requests.
|
|
84
|
+
* @param url - Request URL to send the PUT request to.
|
|
85
|
+
* @param options - HTTP request options including body data and callbacks.
|
|
86
|
+
* @returns Request state (data, loading, error) and controls (execute, reset).
|
|
87
|
+
*/
|
|
88
|
+
export declare function usePut<T>(url: string, options?: UseHttpOptions<T>): UseHttpResult<T>;
|
|
89
|
+
/**
|
|
90
|
+
* Hook for PATCH requests.
|
|
91
|
+
* @param url - Request URL to send the PATCH request to.
|
|
92
|
+
* @param options - HTTP request options including partial body data and callbacks.
|
|
93
|
+
* @returns Request state (data, loading, error) and controls (execute, reset).
|
|
94
|
+
*/
|
|
95
|
+
export declare function usePatch<T>(url: string, options?: UseHttpOptions<T>): UseHttpResult<T>;
|
|
96
|
+
/**
|
|
97
|
+
* Hook for DELETE requests.
|
|
98
|
+
* @param url - Request URL of the resource to delete.
|
|
99
|
+
* @param options - HTTP request options including callbacks.
|
|
100
|
+
* @returns Request state (data, loading, error) and controls (execute, reset).
|
|
101
|
+
*/
|
|
102
|
+
export declare function useDelete<T>(url: string, options?: UseHttpOptions<T>): UseHttpResult<T>;
|
|
103
|
+
//# sourceMappingURL=useHttp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useHttp.d.ts","sourceRoot":"","sources":["../../src/hooks/useHttp.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAgB,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAKjF;;;;;GAKG;AACH,wBAAgB,aAAa,IAAI,UAAU,CAU1C;AAED;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,IAAI,EAAE,CAAC,GAAG,IAAI,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,CAAE,SAAQ,YAAY,CAAC,CAAC,CAAC;IACvD,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;IAChC,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC,CAAE,SAAQ,aAAa;IACtD;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAA;IAC7B;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;CACjC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,OAAO,CAAC,CAAC,EACvB,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,EACnD,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,GAC1B,aAAa,CAAC,CAAC,CAAC,CAqFlB;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAEpF;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAErF;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAEpF;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAEtF;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAEvF"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React hook for HTTP requests.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { useCallback, useContext, useEffect, useRef, useState } from 'react';
|
|
7
|
+
import { t } from '@molecule/app-i18n';
|
|
8
|
+
import { HttpContext } from '../contexts.js';
|
|
9
|
+
/**
|
|
10
|
+
* Hook to access the HTTP client from context.
|
|
11
|
+
*
|
|
12
|
+
* @returns The HTTP client from context
|
|
13
|
+
* @throws {Error} Error if used outside of HttpProvider
|
|
14
|
+
*/
|
|
15
|
+
export function useHttpClient() {
|
|
16
|
+
const client = useContext(HttpContext);
|
|
17
|
+
if (!client) {
|
|
18
|
+
throw new Error(t('react.error.useHttpOutsideProvider', undefined, {
|
|
19
|
+
defaultValue: 'useHttpClient must be used within an HttpProvider',
|
|
20
|
+
}));
|
|
21
|
+
}
|
|
22
|
+
return client;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Hook for making HTTP requests with state management.
|
|
26
|
+
*
|
|
27
|
+
* @param method - HTTP method
|
|
28
|
+
* @param url - Request URL
|
|
29
|
+
* @param options - Request options
|
|
30
|
+
* @returns Request state and execute function
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```tsx
|
|
34
|
+
* const { data, loading, error, execute } = useHttp<User[]>('GET', '/api/users')
|
|
35
|
+
*
|
|
36
|
+
* useEffect(() => {
|
|
37
|
+
* execute()
|
|
38
|
+
* }, [])
|
|
39
|
+
*
|
|
40
|
+
* if (loading) return <Spinner />
|
|
41
|
+
* if (error) return <Error message={error.message} />
|
|
42
|
+
* return <UserList users={data} />
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export function useHttp(method, url, options) {
|
|
46
|
+
const client = useHttpClient();
|
|
47
|
+
const { immediate = false, onSuccess, onError, ...requestConfig } = options ?? {};
|
|
48
|
+
const [state, setState] = useState({
|
|
49
|
+
data: null,
|
|
50
|
+
loading: immediate,
|
|
51
|
+
error: null,
|
|
52
|
+
});
|
|
53
|
+
// Track mounted state to avoid state updates after unmount
|
|
54
|
+
const mountedRef = useRef(true);
|
|
55
|
+
useEffect(() => {
|
|
56
|
+
mountedRef.current = true;
|
|
57
|
+
return () => {
|
|
58
|
+
mountedRef.current = false;
|
|
59
|
+
};
|
|
60
|
+
}, []);
|
|
61
|
+
const execute = useCallback(async () => {
|
|
62
|
+
if (!mountedRef.current)
|
|
63
|
+
return null;
|
|
64
|
+
setState((prev) => ({ ...prev, loading: true, error: null }));
|
|
65
|
+
try {
|
|
66
|
+
let response;
|
|
67
|
+
switch (method) {
|
|
68
|
+
case 'GET':
|
|
69
|
+
response = await client.get(url, requestConfig);
|
|
70
|
+
break;
|
|
71
|
+
case 'POST':
|
|
72
|
+
response = await client.post(url, requestConfig.data, requestConfig);
|
|
73
|
+
break;
|
|
74
|
+
case 'PUT':
|
|
75
|
+
response = await client.put(url, requestConfig.data, requestConfig);
|
|
76
|
+
break;
|
|
77
|
+
case 'PATCH':
|
|
78
|
+
response = await client.patch(url, requestConfig.data, requestConfig);
|
|
79
|
+
break;
|
|
80
|
+
case 'DELETE':
|
|
81
|
+
response = await client.delete(url, requestConfig);
|
|
82
|
+
break;
|
|
83
|
+
default:
|
|
84
|
+
throw new Error(t('react.error.unsupportedMethod', { method }, { defaultValue: `Unsupported method: ${method}` }));
|
|
85
|
+
}
|
|
86
|
+
if (mountedRef.current) {
|
|
87
|
+
setState({ data: response.data, loading: false, error: null });
|
|
88
|
+
onSuccess?.(response.data);
|
|
89
|
+
}
|
|
90
|
+
return response.data;
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
94
|
+
if (mountedRef.current) {
|
|
95
|
+
setState({ data: null, loading: false, error: err });
|
|
96
|
+
onError?.(err);
|
|
97
|
+
}
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
}, [client, method, url, requestConfig, onSuccess, onError]);
|
|
101
|
+
const reset = useCallback(() => {
|
|
102
|
+
setState({ data: null, loading: false, error: null });
|
|
103
|
+
}, []);
|
|
104
|
+
// Execute immediately if requested
|
|
105
|
+
useEffect(() => {
|
|
106
|
+
if (immediate) {
|
|
107
|
+
execute();
|
|
108
|
+
}
|
|
109
|
+
}, []);
|
|
110
|
+
return {
|
|
111
|
+
...state,
|
|
112
|
+
execute,
|
|
113
|
+
reset,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Hook for GET requests.
|
|
118
|
+
* @param url - Request URL to fetch from.
|
|
119
|
+
* @param options - HTTP request options including callbacks and request config.
|
|
120
|
+
* @returns Request state (data, loading, error) and controls (execute, reset).
|
|
121
|
+
*/
|
|
122
|
+
export function useGet(url, options) {
|
|
123
|
+
return useHttp('GET', url, options);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Hook for POST requests.
|
|
127
|
+
* @param url - Request URL to post to.
|
|
128
|
+
* @param options - HTTP request options including body data and callbacks.
|
|
129
|
+
* @returns Request state (data, loading, error) and controls (execute, reset).
|
|
130
|
+
*/
|
|
131
|
+
export function usePost(url, options) {
|
|
132
|
+
return useHttp('POST', url, options);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Hook for PUT requests.
|
|
136
|
+
* @param url - Request URL to send the PUT request to.
|
|
137
|
+
* @param options - HTTP request options including body data and callbacks.
|
|
138
|
+
* @returns Request state (data, loading, error) and controls (execute, reset).
|
|
139
|
+
*/
|
|
140
|
+
export function usePut(url, options) {
|
|
141
|
+
return useHttp('PUT', url, options);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Hook for PATCH requests.
|
|
145
|
+
* @param url - Request URL to send the PATCH request to.
|
|
146
|
+
* @param options - HTTP request options including partial body data and callbacks.
|
|
147
|
+
* @returns Request state (data, loading, error) and controls (execute, reset).
|
|
148
|
+
*/
|
|
149
|
+
export function usePatch(url, options) {
|
|
150
|
+
return useHttp('PATCH', url, options);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Hook for DELETE requests.
|
|
154
|
+
* @param url - Request URL of the resource to delete.
|
|
155
|
+
* @param options - HTTP request options including callbacks.
|
|
156
|
+
* @returns Request state (data, loading, error) and controls (execute, reset).
|
|
157
|
+
*/
|
|
158
|
+
export function useDelete(url, options) {
|
|
159
|
+
return useHttp('DELETE', url, options);
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=useHttp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useHttp.js","sourceRoot":"","sources":["../../src/hooks/useHttp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React hook for logging.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import type { Logger, LoggerConfig, LoggerProvider } from '@molecule/app-logger';
|
|
7
|
+
/**
|
|
8
|
+
* Hook to access the logger provider from context.
|
|
9
|
+
*
|
|
10
|
+
* @returns The logger provider from context
|
|
11
|
+
* @throws {Error} Error if used outside of LoggerProvider
|
|
12
|
+
*/
|
|
13
|
+
export declare function useLoggerProvider(): LoggerProvider;
|
|
14
|
+
/**
|
|
15
|
+
* Hook to get a logger instance.
|
|
16
|
+
*
|
|
17
|
+
* @param name - Logger name (usually component or module name)
|
|
18
|
+
* @param config - Optional logger configuration
|
|
19
|
+
* @returns Logger instance
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```tsx
|
|
23
|
+
* function UserProfile() {
|
|
24
|
+
* const logger = useLogger('UserProfile')
|
|
25
|
+
*
|
|
26
|
+
* useEffect(() => {
|
|
27
|
+
* logger.info('Component mounted')
|
|
28
|
+
* return () => logger.info('Component unmounting')
|
|
29
|
+
* }, [])
|
|
30
|
+
*
|
|
31
|
+
* const handleError = (error: Error) => {
|
|
32
|
+
* logger.error('Failed to load user', error)
|
|
33
|
+
* }
|
|
34
|
+
*
|
|
35
|
+
* return <div>...</div>
|
|
36
|
+
* }
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export declare function useLogger(name: string, config?: Partial<LoggerConfig>): Logger;
|
|
40
|
+
/**
|
|
41
|
+
* Hook to get the root logger.
|
|
42
|
+
*
|
|
43
|
+
* @returns Root logger instance
|
|
44
|
+
*/
|
|
45
|
+
export declare function useRootLogger(): Logger;
|
|
46
|
+
/**
|
|
47
|
+
* Hook to create a child logger with additional context.
|
|
48
|
+
*
|
|
49
|
+
* @param parentName - Parent logger name
|
|
50
|
+
* @param context - Additional context to include in logs
|
|
51
|
+
* @returns Child logger instance
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```tsx
|
|
55
|
+
* function UserList() {
|
|
56
|
+
* const logger = useChildLogger('UserList', { component: 'UserList' })
|
|
57
|
+
*
|
|
58
|
+
* const handleUserClick = (userId: string) => {
|
|
59
|
+
* // Logs will include { component: 'UserList', userId }
|
|
60
|
+
* logger.withContext({ userId }).info('User clicked')
|
|
61
|
+
* }
|
|
62
|
+
*
|
|
63
|
+
* return <div>...</div>
|
|
64
|
+
* }
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
export declare function useChildLogger(parentName: string, context: Record<string, unknown>): Logger;
|
|
68
|
+
//# sourceMappingURL=useLogger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLogger.d.ts","sourceRoot":"","sources":["../../src/hooks/useLogger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAIhF;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,CAUlD;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,MAAM,CAS9E;AAED;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAGtC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAO3F"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React hook for logging.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { useContext, useMemo } from 'react';
|
|
7
|
+
import { t } from '@molecule/app-i18n';
|
|
8
|
+
import { LoggerContext } from '../contexts.js';
|
|
9
|
+
/**
|
|
10
|
+
* Hook to access the logger provider from context.
|
|
11
|
+
*
|
|
12
|
+
* @returns The logger provider from context
|
|
13
|
+
* @throws {Error} Error if used outside of LoggerProvider
|
|
14
|
+
*/
|
|
15
|
+
export function useLoggerProvider() {
|
|
16
|
+
const provider = useContext(LoggerContext);
|
|
17
|
+
if (!provider) {
|
|
18
|
+
throw new Error(t('react.error.useLoggerOutsideProvider', undefined, {
|
|
19
|
+
defaultValue: 'useLoggerProvider must be used within a LoggerProvider',
|
|
20
|
+
}));
|
|
21
|
+
}
|
|
22
|
+
return provider;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Hook to get a logger instance.
|
|
26
|
+
*
|
|
27
|
+
* @param name - Logger name (usually component or module name)
|
|
28
|
+
* @param config - Optional logger configuration
|
|
29
|
+
* @returns Logger instance
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```tsx
|
|
33
|
+
* function UserProfile() {
|
|
34
|
+
* const logger = useLogger('UserProfile')
|
|
35
|
+
*
|
|
36
|
+
* useEffect(() => {
|
|
37
|
+
* logger.info('Component mounted')
|
|
38
|
+
* return () => logger.info('Component unmounting')
|
|
39
|
+
* }, [])
|
|
40
|
+
*
|
|
41
|
+
* const handleError = (error: Error) => {
|
|
42
|
+
* logger.error('Failed to load user', error)
|
|
43
|
+
* }
|
|
44
|
+
*
|
|
45
|
+
* return <div>...</div>
|
|
46
|
+
* }
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export function useLogger(name, config) {
|
|
50
|
+
const provider = useLoggerProvider();
|
|
51
|
+
return useMemo(() => {
|
|
52
|
+
if (config) {
|
|
53
|
+
return provider.createLogger({ name, ...config });
|
|
54
|
+
}
|
|
55
|
+
return provider.getLogger(name);
|
|
56
|
+
}, [provider, name, config]);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Hook to get the root logger.
|
|
60
|
+
*
|
|
61
|
+
* @returns Root logger instance
|
|
62
|
+
*/
|
|
63
|
+
export function useRootLogger() {
|
|
64
|
+
const provider = useLoggerProvider();
|
|
65
|
+
return useMemo(() => provider.getLogger(), [provider]);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Hook to create a child logger with additional context.
|
|
69
|
+
*
|
|
70
|
+
* @param parentName - Parent logger name
|
|
71
|
+
* @param context - Additional context to include in logs
|
|
72
|
+
* @returns Child logger instance
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* ```tsx
|
|
76
|
+
* function UserList() {
|
|
77
|
+
* const logger = useChildLogger('UserList', { component: 'UserList' })
|
|
78
|
+
*
|
|
79
|
+
* const handleUserClick = (userId: string) => {
|
|
80
|
+
* // Logs will include { component: 'UserList', userId }
|
|
81
|
+
* logger.withContext({ userId }).info('User clicked')
|
|
82
|
+
* }
|
|
83
|
+
*
|
|
84
|
+
* return <div>...</div>
|
|
85
|
+
* }
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
export function useChildLogger(parentName, context) {
|
|
89
|
+
const provider = useLoggerProvider();
|
|
90
|
+
return useMemo(() => {
|
|
91
|
+
const parent = provider.getLogger(parentName);
|
|
92
|
+
return parent.withContext(context);
|
|
93
|
+
}, [provider, parentName, context]);
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=useLogger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLogger.js","sourceRoot":"","sources":["../../src/hooks/useLogger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAE3C,OAAO,EAAE,CAAC,EAAE,MAAM,oBAAoB,CAAA;AAGtC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAE9C;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,QAAQ,GAAG,UAAU,CAAC,aAAa,CAAC,CAAA;IAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,CAAC,CAAC,sCAAsC,EAAE,SAAS,EAAE;YACnD,YAAY,EAAE,wDAAwD;SACvE,CAAC,CACH,CAAA;IACH,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,MAA8B;IACpE,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAA;IAEpC,OAAO,OAAO,CAAC,GAAG,EAAE;QAClB,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,QAAQ,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA;QACnD,CAAC;QACD,OAAO,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;IACjC,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;AAC9B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAA;IACpC,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAA;AACxD,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,cAAc,CAAC,UAAkB,EAAE,OAAgC;IACjF,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAA;IAEpC,OAAO,OAAO,CAAC,GAAG,EAAE;QAClB,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;QAC7C,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;IACpC,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAA;AACrC,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React hook for login with async state tracking.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import type { AuthResult, LoginCredentials } from '@molecule/app-auth';
|
|
7
|
+
import { type UsePromiseState } from './usePromise.js';
|
|
8
|
+
/**
|
|
9
|
+
* Return type for useLogin hook.
|
|
10
|
+
*/
|
|
11
|
+
export interface UseLoginReturn<T = unknown> {
|
|
12
|
+
status: UsePromiseState<AuthResult<T>>['status'];
|
|
13
|
+
value: UsePromiseState<AuthResult<T>>['value'];
|
|
14
|
+
error: UsePromiseState<AuthResult<T>>['error'];
|
|
15
|
+
login: (credentials: LoginCredentials) => Promise<AuthResult<T>>;
|
|
16
|
+
reset: () => void;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Hook for login with async state tracking.
|
|
20
|
+
*
|
|
21
|
+
* @returns Login state and action
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```tsx
|
|
25
|
+
* const { status, error, login } = useLogin()
|
|
26
|
+
*
|
|
27
|
+
* return (
|
|
28
|
+
* <button onClick={() => login({ email, password })} disabled={status === 'pending'}>
|
|
29
|
+
* {status === 'pending' ? 'Logging in...' : 'Login'}
|
|
30
|
+
* </button>
|
|
31
|
+
* )
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare function useLogin<T = unknown>(): UseLoginReturn<T>;
|
|
35
|
+
//# sourceMappingURL=useLogin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLogin.d.ts","sourceRoot":"","sources":["../../src/hooks/useLogin.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAGtE,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAElE;;GAEG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC,GAAG,OAAO;IACzC,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,KAAK,EAAE,CAAC,WAAW,EAAE,gBAAgB,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;IAChE,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,QAAQ,CAAC,CAAC,GAAG,OAAO,KAAK,cAAc,CAAC,CAAC,CAAC,CAiBzD"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React hook for login 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 login with async state tracking.
|
|
11
|
+
*
|
|
12
|
+
* @returns Login state and action
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```tsx
|
|
16
|
+
* const { status, error, login } = useLogin()
|
|
17
|
+
*
|
|
18
|
+
* return (
|
|
19
|
+
* <button onClick={() => login({ email, password })} disabled={status === 'pending'}>
|
|
20
|
+
* {status === 'pending' ? 'Logging in...' : 'Login'}
|
|
21
|
+
* </button>
|
|
22
|
+
* )
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export function useLogin() {
|
|
26
|
+
const client = useAuthClient();
|
|
27
|
+
const loginFn = useCallback((credentials) => client.login(credentials), [client]);
|
|
28
|
+
const [state, call] = usePromise(loginFn);
|
|
29
|
+
return {
|
|
30
|
+
status: state.status,
|
|
31
|
+
value: state.value,
|
|
32
|
+
error: state.error,
|
|
33
|
+
login: call,
|
|
34
|
+
reset: state.reset,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=useLogin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLogin.js","sourceRoot":"","sources":["../../src/hooks/useLogin.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,QAAQ;IACtB,MAAM,MAAM,GAAG,aAAa,EAAK,CAAA;IAEjC,MAAM,OAAO,GAAG,WAAW,CACzB,CAAC,WAA6B,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,EAC5D,CAAC,MAAM,CAAC,CACT,CAAA;IAED,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;IAEzC,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,KAAK,CAAC,KAAK;KACnB,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React hook for OAuth authentication.
|
|
3
|
+
*
|
|
4
|
+
* Supports two initiation modes that share ONE callback path:
|
|
5
|
+
* - {@link UseOAuthReturn.redirect} — full-page redirect (the default; unchanged).
|
|
6
|
+
* - {@link UseOAuthReturn.loginViaPopup} — opens the provider in a popup so the
|
|
7
|
+
* opener page never navigates (used by in-app auth modals). On completion the
|
|
8
|
+
* popup relays the result to the opener via a STRICTLY-validated `postMessage`
|
|
9
|
+
* and closes itself; the opener establishes the session in place.
|
|
10
|
+
*
|
|
11
|
+
* Security model for the popup relay (see inline notes at each gate):
|
|
12
|
+
* - The popup posts ONLY to its own origin (`targetOrigin = location.origin`),
|
|
13
|
+
* never `'*'`, so the bearer token can never be delivered to another origin.
|
|
14
|
+
* - The opener accepts a result ONLY when ALL hold: `event.origin === location.origin`,
|
|
15
|
+
* `event.source === thePopupWindowWeOpened`, and `event.data.type` matches our
|
|
16
|
+
* private message type. Anything else is ignored — a forged cross-origin (or
|
|
17
|
+
* wrong-window) message cannot inject a session.
|
|
18
|
+
* - The popup-relay path is gated on `window.name === OAUTH_POPUP_WINDOW_NAME`
|
|
19
|
+
* AND `window.opener`, so an ordinary full-page callback is completely
|
|
20
|
+
* unaffected (it still establishes the session inline as before).
|
|
21
|
+
* - The opener tears down its listener + timers on result, on user-close, and on
|
|
22
|
+
* a hard timeout, so no stale handler lingers.
|
|
23
|
+
*
|
|
24
|
+
* @module
|
|
25
|
+
*/
|
|
26
|
+
/**
|
|
27
|
+
* Return type for useOAuth hook.
|
|
28
|
+
*/
|
|
29
|
+
export interface UseOAuthReturn {
|
|
30
|
+
providers: string[];
|
|
31
|
+
getOAuthUrl: (provider: string) => string;
|
|
32
|
+
/** Full-page redirect to the provider (default). The opener page navigates away. */
|
|
33
|
+
redirect: (provider: string) => void;
|
|
34
|
+
/**
|
|
35
|
+
* Open the provider in a popup so the opener page does NOT navigate. On success
|
|
36
|
+
* the session is established in the opener in place and `config.onSuccess` fires;
|
|
37
|
+
* on failure `config.onError` fires. Falls back to a full-page {@link redirect}
|
|
38
|
+
* when the popup is blocked.
|
|
39
|
+
*/
|
|
40
|
+
loginViaPopup: (provider: string) => void;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Hook for OAuth authentication.
|
|
44
|
+
*
|
|
45
|
+
* Reads OAuth configuration from the provided config and provides
|
|
46
|
+
* helpers to build OAuth URLs and start a login (full-page or popup).
|
|
47
|
+
* Automatically handles OAuth callbacks by detecting `code` and `state`
|
|
48
|
+
* URL parameters and exchanging them for a session — and, when the callback is
|
|
49
|
+
* running inside a popup we opened, relaying the result to the opener instead.
|
|
50
|
+
*
|
|
51
|
+
* @param config - Optional OAuth configuration override.
|
|
52
|
+
* @param config.baseURL - Base URL for the API server (e.g. "https://api.example.com").
|
|
53
|
+
* @param config.oauthProviders - List of supported OAuth provider names (e.g. ["google", "github"]).
|
|
54
|
+
* @param config.oauthEndpoint - Path prefix for OAuth routes (defaults to "/oauth").
|
|
55
|
+
* @param config.loginEndpoint - Path for the OAuth login POST endpoint (defaults to "/users/log-in/oauth").
|
|
56
|
+
* @param config.onSuccess - Callback after successful OAuth login.
|
|
57
|
+
* @param config.onError - Callback on OAuth login failure.
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```tsx
|
|
61
|
+
* const { providers, redirect, loginViaPopup } = useOAuth()
|
|
62
|
+
*
|
|
63
|
+
* return (
|
|
64
|
+
* <div>
|
|
65
|
+
* {providers.map(provider => (
|
|
66
|
+
* <button key={provider} onClick={() => loginViaPopup(provider)}>
|
|
67
|
+
* Login with {provider}
|
|
68
|
+
* </button>
|
|
69
|
+
* ))}
|
|
70
|
+
* </div>
|
|
71
|
+
* )
|
|
72
|
+
* ```
|
|
73
|
+
* @returns OAuth helpers: providers, getOAuthUrl, redirect, and loginViaPopup.
|
|
74
|
+
*/
|
|
75
|
+
export declare function useOAuth(config?: {
|
|
76
|
+
baseURL?: string;
|
|
77
|
+
oauthProviders?: string[];
|
|
78
|
+
oauthEndpoint?: string;
|
|
79
|
+
loginEndpoint?: string;
|
|
80
|
+
onSuccess?: () => void;
|
|
81
|
+
onError?: (error: string) => void;
|
|
82
|
+
}): UseOAuthReturn;
|
|
83
|
+
//# sourceMappingURL=useOAuth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useOAuth.d.ts","sourceRoot":"","sources":["../../src/hooks/useOAuth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAiCH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAA;IACzC,oFAAoF;IACpF,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC;;;;;OAKG;IACH,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;CAC1C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,QAAQ,CAAC,MAAM,CAAC,EAAE;IAChC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CAClC,GAAG,cAAc,CA2SjB"}
|