@molecule/app-react 1.7.0 → 1.8.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/README.md +74 -17
- package/dist/hooks/useAuth.d.ts +15 -3
- package/dist/hooks/useAuth.d.ts.map +1 -1
- package/dist/hooks/useAuth.js +12 -0
- package/dist/hooks/useAuth.js.map +1 -1
- package/dist/hooks/useForm.d.ts +20 -7
- package/dist/hooks/useForm.d.ts.map +1 -1
- package/dist/hooks/useForm.js +46 -44
- package/dist/hooks/useForm.js.map +1 -1
- package/dist/hooks/useHttp.d.ts +24 -3
- package/dist/hooks/useHttp.d.ts.map +1 -1
- package/dist/hooks/useHttp.js +32 -9
- package/dist/hooks/useHttp.js.map +1 -1
- package/dist/hooks/useSignup.d.ts +9 -4
- package/dist/hooks/useSignup.d.ts.map +1 -1
- package/dist/hooks/useSignup.js.map +1 -1
- package/dist/types.d.ts +10 -3
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@ AUTO-GENERATED — DO NOT EDIT THIS FILE.
|
|
|
3
3
|
Generated by `mlcl sync-docs` from the package's src/index.ts JSDoc + mlcl/registry.json.
|
|
4
4
|
Edits here are overwritten on the next commit (molecule's pre-commit hook regenerates).
|
|
5
5
|
To change this document, edit the module-level JSDoc in src/index.ts.
|
|
6
|
-
Generated: 2026-10-
|
|
6
|
+
Generated: 2026-10-22T07:22:55.793Z
|
|
7
7
|
-->
|
|
8
8
|
|
|
9
9
|
# @molecule/app-react
|
|
@@ -121,7 +121,7 @@ Provides login/logout/register flows, token management, profile
|
|
|
121
121
|
updates, and auth state subscription.
|
|
122
122
|
|
|
123
123
|
```typescript
|
|
124
|
-
interface AuthClient<T = UserProfile, TRegister extends
|
|
124
|
+
interface AuthClient<T = UserProfile, TRegister extends RegisterExtraShape<TRegister> = Record<never, never>> {
|
|
125
125
|
/**
|
|
126
126
|
* Returns the current authentication state snapshot.
|
|
127
127
|
*
|
|
@@ -365,7 +365,13 @@ interface FormController<T extends Record<string, unknown> = Record<string, unkn
|
|
|
365
365
|
*/
|
|
366
366
|
validate(): Promise<boolean>
|
|
367
367
|
/**
|
|
368
|
-
* Resets the form
|
|
368
|
+
* Resets the form and clears errors, touched fields and submission state.
|
|
369
|
+
*
|
|
370
|
+
* With no argument it restores the current baseline — the initial
|
|
371
|
+
* `defaultValues`, or the values a previous `reset(values)` established.
|
|
372
|
+
* Passing `values` merges them over the current baseline and makes the
|
|
373
|
+
* result the new baseline, so a form reset to freshly loaded or saved data
|
|
374
|
+
* reads clean (`isDirty === false`).
|
|
369
375
|
*/
|
|
370
376
|
reset(values?: Partial<T>): void
|
|
371
377
|
/**
|
|
@@ -397,7 +403,8 @@ Form creation options.
|
|
|
397
403
|
```typescript
|
|
398
404
|
interface FormOptions<T extends Record<string, unknown>> {
|
|
399
405
|
/**
|
|
400
|
-
* Default values
|
|
406
|
+
* Default values, captured as the form's clean baseline when the controller
|
|
407
|
+
* is created. Mutating this object afterwards does not change the baseline.
|
|
401
408
|
*/
|
|
402
409
|
defaultValues?: Partial<T>
|
|
403
410
|
/**
|
|
@@ -765,12 +772,18 @@ interface UseDeviceResult {
|
|
|
765
772
|
|
|
766
773
|
Options for useForm hook.
|
|
767
774
|
|
|
775
|
+
Every `FormOptions` field is supported. `createForm` is only an override —
|
|
776
|
+
omit it and the hook creates the controller through the bonded forms
|
|
777
|
+
provider (`createForm` from `@molecule/app-forms`), which uses the built-in
|
|
778
|
+
native provider until the app bonds its own.
|
|
779
|
+
|
|
768
780
|
```typescript
|
|
769
781
|
interface UseFormOptions<T extends Record<string, unknown>> extends FormOptions<T> {
|
|
770
782
|
/**
|
|
771
|
-
*
|
|
783
|
+
* Explicit form factory for this one form. Defaults to the bonded forms
|
|
784
|
+
* provider; pass it only to pin a specific provider instance.
|
|
772
785
|
*/
|
|
773
|
-
createForm
|
|
786
|
+
createForm?: (options: FormOptions<T>) => FormController<T>
|
|
774
787
|
}
|
|
775
788
|
```
|
|
776
789
|
|
|
@@ -787,7 +800,10 @@ interface UseFormResult<T extends Record<string, unknown>> {
|
|
|
787
800
|
isSubmitting: boolean
|
|
788
801
|
|
|
789
802
|
// Field methods
|
|
790
|
-
register: (
|
|
803
|
+
register: (
|
|
804
|
+
name: keyof T,
|
|
805
|
+
options?: Omit<RegisterOptions, 'name'> & { name?: string },
|
|
806
|
+
) => FieldRegistration
|
|
791
807
|
getValue: <K extends keyof T>(name: K) => T[K]
|
|
792
808
|
setValue: <K extends keyof T>(name: K, value: T[K]) => void
|
|
793
809
|
getError: (name: keyof T) => string | undefined
|
|
@@ -819,6 +835,13 @@ Result of useHttp hook.
|
|
|
819
835
|
|
|
820
836
|
```typescript
|
|
821
837
|
interface UseHttpResult<T> extends UseHttpState<T> {
|
|
838
|
+
/**
|
|
839
|
+
* Runs the request and resolves with its data, or `null` on failure.
|
|
840
|
+
*
|
|
841
|
+
* This function is IDENTITY-STABLE for as long as `method`, `url` and the HTTP
|
|
842
|
+
* client do not change, so it is safe in a `useEffect` dependency array. Its
|
|
843
|
+
* request options are read when it is CALLED, from the latest committed render.
|
|
844
|
+
*/
|
|
822
845
|
execute: () => Promise<T | null>
|
|
823
846
|
reset: () => void
|
|
824
847
|
}
|
|
@@ -828,6 +851,11 @@ interface UseHttpResult<T> extends UseHttpState<T> {
|
|
|
828
851
|
|
|
829
852
|
Options for useHttp hook.
|
|
830
853
|
|
|
854
|
+
Every request option — headers, params, body `data`, `signal`, `onSuccess`,
|
|
855
|
+
`onError` — is read at the moment `execute` runs, not when the hook rendered,
|
|
856
|
+
so an inline object or callback needs no memoizing. Only `immediate` is read
|
|
857
|
+
on mount.
|
|
858
|
+
|
|
831
859
|
```typescript
|
|
832
860
|
interface UseHttpOptions<T> extends RequestConfig {
|
|
833
861
|
/**
|
|
@@ -964,11 +992,14 @@ interface UsePushOptions {
|
|
|
964
992
|
Return type for useSignup hook.
|
|
965
993
|
|
|
966
994
|
```typescript
|
|
967
|
-
interface UseSignupReturn<
|
|
995
|
+
interface UseSignupReturn<
|
|
996
|
+
T = unknown,
|
|
997
|
+
TRegister extends RegisterExtraShape<TRegister> = Record<never, never>,
|
|
998
|
+
> {
|
|
968
999
|
status: UsePromiseState<AuthResult<T>>['status']
|
|
969
1000
|
value: UsePromiseState<AuthResult<T>>['value']
|
|
970
1001
|
error: UsePromiseState<AuthResult<T>>['error']
|
|
971
|
-
signup: (data: RegisterData) => Promise<AuthResult<T>>
|
|
1002
|
+
signup: (data: RegisterData<TRegister>) => Promise<AuthResult<T>>
|
|
972
1003
|
reset: () => void
|
|
973
1004
|
}
|
|
974
1005
|
```
|
|
@@ -1264,7 +1295,10 @@ interface UseAuthOptions {
|
|
|
1264
1295
|
Hook result for useAuth.
|
|
1265
1296
|
|
|
1266
1297
|
```typescript
|
|
1267
|
-
interface UseAuthResult<
|
|
1298
|
+
interface UseAuthResult<
|
|
1299
|
+
T = unknown,
|
|
1300
|
+
TRegister extends RegisterExtraShape<TRegister> = Record<never, never>,
|
|
1301
|
+
> {
|
|
1268
1302
|
/**
|
|
1269
1303
|
* The session state as one value — render from this instead of combining
|
|
1270
1304
|
* `initialized`/`authenticated`/`loading`. A stored token AND user make it
|
|
@@ -1275,7 +1309,7 @@ interface UseAuthResult<T = unknown> {
|
|
|
1275
1309
|
state: AuthState<T>
|
|
1276
1310
|
login: AuthClient<T>['login']
|
|
1277
1311
|
logout: AuthClient<T>['logout']
|
|
1278
|
-
register: AuthClient<T>['register']
|
|
1312
|
+
register: AuthClient<T, TRegister>['register']
|
|
1279
1313
|
refresh: AuthClient<T>['refresh']
|
|
1280
1314
|
setUser: AuthClient<T>['setUser']
|
|
1281
1315
|
/**
|
|
@@ -1725,8 +1759,12 @@ function useAsyncState(initialState: T): [T, AsyncSetState<T>, AsyncExtendState<
|
|
|
1725
1759
|
|
|
1726
1760
|
Hook to access the auth client from context.
|
|
1727
1761
|
|
|
1762
|
+
Pass the same generics the client was created with —
|
|
1763
|
+
`useAuthClient<MyUser, { username: string }>()` — so `register()` accepts
|
|
1764
|
+
the app's own fields.
|
|
1765
|
+
|
|
1728
1766
|
```typescript
|
|
1729
|
-
function useAuthClient(): AuthClient<T,
|
|
1767
|
+
function useAuthClient(): AuthClient<T, TRegister>
|
|
1730
1768
|
```
|
|
1731
1769
|
|
|
1732
1770
|
**Returns:** The auth client from context
|
|
@@ -1749,8 +1787,14 @@ To create an account, use `const { register } = useAuth<MyUser>()` and
|
|
|
1749
1787
|
`await register({ email, password, name })`. Registration returns the auth
|
|
1750
1788
|
client's `AuthResult<MyUser>`; there is no separate `useRegister` hook.
|
|
1751
1789
|
|
|
1790
|
+
An app whose API takes its OWN registration fields passes the client's
|
|
1791
|
+
second generic here too — `useAuth<MyUser, { username: string }>()` — so
|
|
1792
|
+
`register({ email, password, username })` is typed exactly like the client
|
|
1793
|
+
call (and `requestBody` receives the same payload). Without it, `register`
|
|
1794
|
+
accepts only the base fields.
|
|
1795
|
+
|
|
1752
1796
|
```typescript
|
|
1753
|
-
function useAuth(options?: UseAuthOptions): UseAuthResult<T>
|
|
1797
|
+
function useAuth(options?: UseAuthOptions): UseAuthResult<T, TRegister>
|
|
1754
1798
|
```
|
|
1755
1799
|
|
|
1756
1800
|
- `options` — Hook options
|
|
@@ -1919,11 +1963,15 @@ function useEditor(): UseEditorResult
|
|
|
1919
1963
|
|
|
1920
1964
|
Hook for form state management.
|
|
1921
1965
|
|
|
1966
|
+
Creates its controller through the bonded forms provider, so a React app
|
|
1967
|
+
wires a form library once (`setProvider` from `@molecule/app-forms`) and
|
|
1968
|
+
every form picks it up. Passing `createForm` overrides that for one form.
|
|
1969
|
+
|
|
1922
1970
|
```typescript
|
|
1923
|
-
function useForm(options
|
|
1971
|
+
function useForm(options?: UseFormOptions<T>): UseFormResult<T>
|
|
1924
1972
|
```
|
|
1925
1973
|
|
|
1926
|
-
- `options` — Form options
|
|
1974
|
+
- `options` — Form options. `defaultValues`, `mode` and the form-level `validate` are forwarded to the provider; omit the options entirely for a form whose fields are registered with their own defaults.
|
|
1927
1975
|
|
|
1928
1976
|
**Returns:** Form state and methods
|
|
1929
1977
|
|
|
@@ -1967,6 +2015,15 @@ function useHttpClient(): HttpClient
|
|
|
1967
2015
|
|
|
1968
2016
|
Hook for making HTTP requests with state management.
|
|
1969
2017
|
|
|
2018
|
+
`execute` keeps one identity while `method`, `url` and the HTTP client stay the
|
|
2019
|
+
same — across the hook's own loading/data updates, parent rerenders, and inline
|
|
2020
|
+
options or callbacks — so `useEffect(() => { void execute() }, [execute])`
|
|
2021
|
+
runs once per request target instead of looping. The current headers, body,
|
|
2022
|
+
`signal` and callbacks are read when `execute` is called, so a later manual
|
|
2023
|
+
call always sends what the latest committed render passed. Changing `method`, `url` or
|
|
2024
|
+
the client does replace `execute` (it selects a different request) and
|
|
2025
|
+
re-runs such an effect.
|
|
2026
|
+
|
|
1970
2027
|
```typescript
|
|
1971
2028
|
function useHttp(
|
|
1972
2029
|
method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE',
|
|
@@ -1977,7 +2034,7 @@ function useHttp(
|
|
|
1977
2034
|
|
|
1978
2035
|
- `method` — HTTP method
|
|
1979
2036
|
- `url` — Request URL
|
|
1980
|
-
- `options` — Request options
|
|
2037
|
+
- `options` — Request options, read at call time
|
|
1981
2038
|
|
|
1982
2039
|
**Returns:** Request state and execute function
|
|
1983
2040
|
|
|
@@ -2291,7 +2348,7 @@ function useIsActive(path: string, exact?: boolean): boolean
|
|
|
2291
2348
|
Hook for user registration with async state tracking.
|
|
2292
2349
|
|
|
2293
2350
|
```typescript
|
|
2294
|
-
function useSignup(): UseSignupReturn<T>
|
|
2351
|
+
function useSignup(): UseSignupReturn<T, TRegister>
|
|
2295
2352
|
```
|
|
2296
2353
|
|
|
2297
2354
|
**Returns:** Signup state and action
|
package/dist/hooks/useAuth.d.ts
CHANGED
|
@@ -3,15 +3,19 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
|
-
import type { AuthClient } from '@molecule/app-auth';
|
|
6
|
+
import type { AuthClient, RegisterExtraShape } from '@molecule/app-auth';
|
|
7
7
|
import type { UseAuthOptions, UseAuthResult } from '../types.js';
|
|
8
8
|
/**
|
|
9
9
|
* Hook to access the auth client from context.
|
|
10
10
|
*
|
|
11
|
+
* Pass the same generics the client was created with —
|
|
12
|
+
* `useAuthClient<MyUser, { username: string }>()` — so `register()` accepts
|
|
13
|
+
* the app's own fields.
|
|
14
|
+
*
|
|
11
15
|
* @returns The auth client from context
|
|
12
16
|
* @throws {Error} Error if used outside of AuthProvider
|
|
13
17
|
*/
|
|
14
|
-
export declare function useAuthClient<T = unknown>(): AuthClient<T>;
|
|
18
|
+
export declare function useAuthClient<T = unknown, TRegister extends RegisterExtraShape<TRegister> = Record<never, never>>(): AuthClient<T, TRegister>;
|
|
15
19
|
/**
|
|
16
20
|
* Hook for authentication state and actions.
|
|
17
21
|
*
|
|
@@ -29,19 +33,27 @@ export declare function useAuthClient<T = unknown>(): AuthClient<T>;
|
|
|
29
33
|
* `await register({ email, password, name })`. Registration returns the auth
|
|
30
34
|
* client's `AuthResult<MyUser>`; there is no separate `useRegister` hook.
|
|
31
35
|
*
|
|
36
|
+
* An app whose API takes its OWN registration fields passes the client's
|
|
37
|
+
* second generic here too — `useAuth<MyUser, { username: string }>()` — so
|
|
38
|
+
* `register({ email, password, username })` is typed exactly like the client
|
|
39
|
+
* call (and `requestBody` receives the same payload). Without it, `register`
|
|
40
|
+
* accepts only the base fields.
|
|
41
|
+
*
|
|
32
42
|
* @param options - Hook options
|
|
33
43
|
* @returns Auth state and action methods
|
|
34
44
|
*
|
|
35
45
|
* @example
|
|
36
46
|
* ```tsx
|
|
37
47
|
* const { user, isAuthenticated, login, logout } = useAuth<{ id: string; name?: string }>()
|
|
48
|
+
* const { register } = useAuth<MyUser, { username: string }>()
|
|
49
|
+
* await register({ email, password, username }) // `username` is typed
|
|
38
50
|
*
|
|
39
51
|
* if (isAuthenticated) {
|
|
40
52
|
* return <div>Welcome, {user?.name}!</div>
|
|
41
53
|
* }
|
|
42
54
|
* ```
|
|
43
55
|
*/
|
|
44
|
-
export declare function useAuth<T = unknown>(options?: UseAuthOptions): UseAuthResult<T>;
|
|
56
|
+
export declare function useAuth<T = unknown, TRegister extends RegisterExtraShape<TRegister> = Record<never, never>>(options?: UseAuthOptions): UseAuthResult<T, TRegister>;
|
|
45
57
|
/**
|
|
46
58
|
* Hook to get just the authenticated user.
|
|
47
59
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../../src/hooks/useAuth.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EACV,UAAU,
|
|
1
|
+
{"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../../src/hooks/useAuth.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EACV,UAAU,EAKV,kBAAkB,EACnB,MAAM,oBAAoB,CAAA;AAI3B,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhE;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,CAAC,GAAG,OAAO,EACX,SAAS,SAAS,kBAAkB,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,KACnE,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,CAU5B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,OAAO,CACrB,CAAC,GAAG,OAAO,EACX,SAAS,SAAS,kBAAkB,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EACtE,OAAO,CAAC,EAAE,cAAc,GAAG,aAAa,CAAC,CAAC,EAAE,SAAS,CAAC,CA2EvD;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,CAAC,GAAG,OAAO,KAAK,CAAC,GAAG,IAAI,CAG/C;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAG5C"}
|
package/dist/hooks/useAuth.js
CHANGED
|
@@ -9,6 +9,10 @@ import { AuthContext } from '../contexts.js';
|
|
|
9
9
|
/**
|
|
10
10
|
* Hook to access the auth client from context.
|
|
11
11
|
*
|
|
12
|
+
* Pass the same generics the client was created with —
|
|
13
|
+
* `useAuthClient<MyUser, { username: string }>()` — so `register()` accepts
|
|
14
|
+
* the app's own fields.
|
|
15
|
+
*
|
|
12
16
|
* @returns The auth client from context
|
|
13
17
|
* @throws {Error} Error if used outside of AuthProvider
|
|
14
18
|
*/
|
|
@@ -38,12 +42,20 @@ export function useAuthClient() {
|
|
|
38
42
|
* `await register({ email, password, name })`. Registration returns the auth
|
|
39
43
|
* client's `AuthResult<MyUser>`; there is no separate `useRegister` hook.
|
|
40
44
|
*
|
|
45
|
+
* An app whose API takes its OWN registration fields passes the client's
|
|
46
|
+
* second generic here too — `useAuth<MyUser, { username: string }>()` — so
|
|
47
|
+
* `register({ email, password, username })` is typed exactly like the client
|
|
48
|
+
* call (and `requestBody` receives the same payload). Without it, `register`
|
|
49
|
+
* accepts only the base fields.
|
|
50
|
+
*
|
|
41
51
|
* @param options - Hook options
|
|
42
52
|
* @returns Auth state and action methods
|
|
43
53
|
*
|
|
44
54
|
* @example
|
|
45
55
|
* ```tsx
|
|
46
56
|
* const { user, isAuthenticated, login, logout } = useAuth<{ id: string; name?: string }>()
|
|
57
|
+
* const { register } = useAuth<MyUser, { username: string }>()
|
|
58
|
+
* await register({ email, password, username }) // `username` is typed
|
|
47
59
|
*
|
|
48
60
|
* if (isAuthenticated) {
|
|
49
61
|
* return <div>Welcome, {user?.name}!</div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAuth.js","sourceRoot":"","sources":["../../src/hooks/useAuth.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"useAuth.js","sourceRoot":"","sources":["../../src/hooks/useAuth.ts"],"names":[],"mappings":"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"}
|
package/dist/hooks/useForm.d.ts
CHANGED
|
@@ -6,12 +6,18 @@
|
|
|
6
6
|
import type { FieldRegistration, FieldState, FormController, FormOptions, FormState, RegisterOptions } from '@molecule/app-forms';
|
|
7
7
|
/**
|
|
8
8
|
* Options for useForm hook.
|
|
9
|
+
*
|
|
10
|
+
* Every `FormOptions` field is supported. `createForm` is only an override —
|
|
11
|
+
* omit it and the hook creates the controller through the bonded forms
|
|
12
|
+
* provider (`createForm` from `@molecule/app-forms`), which uses the built-in
|
|
13
|
+
* native provider until the app bonds its own.
|
|
9
14
|
*/
|
|
10
15
|
export interface UseFormOptions<T extends Record<string, unknown>> extends FormOptions<T> {
|
|
11
16
|
/**
|
|
12
|
-
*
|
|
17
|
+
* Explicit form factory for this one form. Defaults to the bonded forms
|
|
18
|
+
* provider; pass it only to pin a specific provider instance.
|
|
13
19
|
*/
|
|
14
|
-
createForm
|
|
20
|
+
createForm?: (options: FormOptions<T>) => FormController<T>;
|
|
15
21
|
}
|
|
16
22
|
/**
|
|
17
23
|
* Result of useForm hook.
|
|
@@ -21,7 +27,9 @@ export interface UseFormResult<T extends Record<string, unknown>> {
|
|
|
21
27
|
isValid: boolean;
|
|
22
28
|
isDirty: boolean;
|
|
23
29
|
isSubmitting: boolean;
|
|
24
|
-
register: (name: keyof T, options?: RegisterOptions
|
|
30
|
+
register: (name: keyof T, options?: Omit<RegisterOptions, 'name'> & {
|
|
31
|
+
name?: string;
|
|
32
|
+
}) => FieldRegistration;
|
|
25
33
|
getValue: <K extends keyof T>(name: K) => T[K];
|
|
26
34
|
setValue: <K extends keyof T>(name: K, value: T[K]) => void;
|
|
27
35
|
getError: (name: keyof T) => string | undefined;
|
|
@@ -34,16 +42,21 @@ export interface UseFormResult<T extends Record<string, unknown>> {
|
|
|
34
42
|
/**
|
|
35
43
|
* Hook for form state management.
|
|
36
44
|
*
|
|
37
|
-
*
|
|
45
|
+
* Creates its controller through the bonded forms provider, so a React app
|
|
46
|
+
* wires a form library once (`setProvider` from `@molecule/app-forms`) and
|
|
47
|
+
* every form picks it up. Passing `createForm` overrides that for one form.
|
|
48
|
+
*
|
|
49
|
+
* @param options - Form options. `defaultValues`, `mode` and the form-level
|
|
50
|
+
* `validate` are forwarded to the provider; omit the options entirely for a
|
|
51
|
+
* form whose fields are registered with their own defaults.
|
|
38
52
|
* @returns Form state and methods
|
|
39
53
|
*
|
|
40
54
|
* @example
|
|
41
55
|
* ```tsx
|
|
42
|
-
* import {
|
|
56
|
+
* import { useForm } from '@molecule/app-react'
|
|
43
57
|
*
|
|
44
58
|
* function LoginForm() {
|
|
45
59
|
* const { register, handleSubmit, formState, isSubmitting } = useForm({
|
|
46
|
-
* createForm,
|
|
47
60
|
* defaultValues: { email: '', password: '' },
|
|
48
61
|
* })
|
|
49
62
|
*
|
|
@@ -67,7 +80,7 @@ export interface UseFormResult<T extends Record<string, unknown>> {
|
|
|
67
80
|
* }
|
|
68
81
|
* ```
|
|
69
82
|
*/
|
|
70
|
-
export declare function useForm<T extends Record<string, unknown>>(options
|
|
83
|
+
export declare function useForm<T extends Record<string, unknown>>(options?: UseFormOptions<T>): UseFormResult<T>;
|
|
71
84
|
/**
|
|
72
85
|
* Hook to watch a specific field value.
|
|
73
86
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useForm.d.ts","sourceRoot":"","sources":["../../src/hooks/useForm.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EACV,iBAAiB,EACjB,UAAU,EACV,cAAc,EACd,WAAW,EACX,SAAS,EACT,eAAe,EAChB,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"useForm.d.ts","sourceRoot":"","sources":["../../src/hooks/useForm.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EACV,iBAAiB,EACjB,UAAU,EACV,cAAc,EACd,WAAW,EACX,SAAS,EACT,eAAe,EAChB,MAAM,qBAAqB,CAAA;AAmC5B;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAE,SAAQ,WAAW,CAAC,CAAC,CAAC;IACvF;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,cAAc,CAAC,CAAC,CAAC,CAAA;CAC5D;AAED;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAE9D,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,CAAA;IACvB,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,YAAY,EAAE,OAAO,CAAA;IAGrB,QAAQ,EAAE,CACR,IAAI,EAAE,MAAM,CAAC,EACb,OAAO,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,GAAG;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,KACxD,iBAAiB,CAAA;IACtB,QAAQ,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9C,QAAQ,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;IAC3D,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,MAAM,GAAG,SAAS,CAAA;IAC/C,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAA;IAC5D,WAAW,EAAE,MAAM,IAAI,CAAA;IAGvB,YAAY,EAAE,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAA;IAClG,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;IACpC,QAAQ,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;CACjC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,wBAAgB,OAAO,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvD,OAAO,GAAE,cAAc,CAAC,CAAC,CAAM,GAC9B,aAAa,CAAC,CAAC,CAAC,CAwElB;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,EAC3E,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,EACvB,IAAI,EAAE,CAAC,GACN,CAAC,CAAC,CAAC,CAAC,CAGN;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7D,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,EACvB,IAAI,EAAE,MAAM,CAAC,GACZ,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAGxB"}
|
package/dist/hooks/useForm.js
CHANGED
|
@@ -3,20 +3,54 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
|
-
import { useCallback, useRef, useSyncExternalStore } from 'react';
|
|
6
|
+
import { useCallback, useMemo, useRef, useSyncExternalStore } from 'react';
|
|
7
|
+
import { createForm as createBondedForm } from '@molecule/app-forms';
|
|
8
|
+
/**
|
|
9
|
+
* Adapt controller notifications to React's stable snapshot contract. Providers
|
|
10
|
+
* may return fresh objects from their getters; reads between notifications must
|
|
11
|
+
* still return the same snapshot to useSyncExternalStore.
|
|
12
|
+
*
|
|
13
|
+
* @param form - Controller that owns the subscription.
|
|
14
|
+
* @param read - Reads the form state or a selected field.
|
|
15
|
+
* @returns The current subscribed snapshot.
|
|
16
|
+
*/
|
|
17
|
+
function useFormSnapshot(form, read) {
|
|
18
|
+
const store = useMemo(() => {
|
|
19
|
+
let snapshot = read();
|
|
20
|
+
return {
|
|
21
|
+
getSnapshot: () => snapshot,
|
|
22
|
+
subscribe: (onChange) => {
|
|
23
|
+
const refresh = () => {
|
|
24
|
+
snapshot = read();
|
|
25
|
+
onChange();
|
|
26
|
+
};
|
|
27
|
+
const unsubscribe = form.subscribe(refresh);
|
|
28
|
+
// A controller can change after render but before React subscribes.
|
|
29
|
+
refresh();
|
|
30
|
+
return unsubscribe;
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}, [form, read]);
|
|
34
|
+
return useSyncExternalStore(store.subscribe, store.getSnapshot, store.getSnapshot);
|
|
35
|
+
}
|
|
7
36
|
/**
|
|
8
37
|
* Hook for form state management.
|
|
9
38
|
*
|
|
10
|
-
*
|
|
39
|
+
* Creates its controller through the bonded forms provider, so a React app
|
|
40
|
+
* wires a form library once (`setProvider` from `@molecule/app-forms`) and
|
|
41
|
+
* every form picks it up. Passing `createForm` overrides that for one form.
|
|
42
|
+
*
|
|
43
|
+
* @param options - Form options. `defaultValues`, `mode` and the form-level
|
|
44
|
+
* `validate` are forwarded to the provider; omit the options entirely for a
|
|
45
|
+
* form whose fields are registered with their own defaults.
|
|
11
46
|
* @returns Form state and methods
|
|
12
47
|
*
|
|
13
48
|
* @example
|
|
14
49
|
* ```tsx
|
|
15
|
-
* import {
|
|
50
|
+
* import { useForm } from '@molecule/app-react'
|
|
16
51
|
*
|
|
17
52
|
* function LoginForm() {
|
|
18
53
|
* const { register, handleSubmit, formState, isSubmitting } = useForm({
|
|
19
|
-
* createForm,
|
|
20
54
|
* defaultValues: { email: '', password: '' },
|
|
21
55
|
* })
|
|
22
56
|
*
|
|
@@ -40,26 +74,16 @@ import { useCallback, useRef, useSyncExternalStore } from 'react';
|
|
|
40
74
|
* }
|
|
41
75
|
* ```
|
|
42
76
|
*/
|
|
43
|
-
export function useForm(options) {
|
|
44
|
-
const { createForm, ...formOptions } = options;
|
|
77
|
+
export function useForm(options = {}) {
|
|
78
|
+
const { createForm = createBondedForm, ...formOptions } = options;
|
|
45
79
|
// Create form controller once
|
|
46
80
|
const formRef = useRef(null);
|
|
47
81
|
if (!formRef.current) {
|
|
48
82
|
formRef.current = createForm(formOptions);
|
|
49
83
|
}
|
|
50
84
|
const form = formRef.current;
|
|
51
|
-
|
|
52
|
-
const
|
|
53
|
-
const subscribe = useCallback((onChange) => {
|
|
54
|
-
// The form controller should have a subscribe method
|
|
55
|
-
// If not available, we'll use a polling approach
|
|
56
|
-
if ('subscribe' in form && typeof form.subscribe === 'function') {
|
|
57
|
-
return form.subscribe(onChange);
|
|
58
|
-
}
|
|
59
|
-
// Fallback: no-op unsubscribe (state won't auto-update)
|
|
60
|
-
return () => { };
|
|
61
|
-
}, [form]);
|
|
62
|
-
const formState = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
|
|
85
|
+
const readState = useCallback(() => form.getState(), [form]);
|
|
86
|
+
const formState = useFormSnapshot(form, readState);
|
|
63
87
|
// Memoized methods
|
|
64
88
|
const register = useCallback((name, registerOptions) => {
|
|
65
89
|
return form.register({ ...registerOptions, name: name });
|
|
@@ -109,14 +133,8 @@ export function useForm(options) {
|
|
|
109
133
|
* @returns Current field value
|
|
110
134
|
*/
|
|
111
135
|
export function useWatch(form, name) {
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
if ('subscribe' in form && typeof form.subscribe === 'function') {
|
|
115
|
-
return form.subscribe(onChange);
|
|
116
|
-
}
|
|
117
|
-
return () => { };
|
|
118
|
-
}, [form]);
|
|
119
|
-
return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
|
|
136
|
+
const readValue = useCallback(() => form.getValue(name), [form, name]);
|
|
137
|
+
return useFormSnapshot(form, readValue);
|
|
120
138
|
}
|
|
121
139
|
/**
|
|
122
140
|
* Hook to get field-level state.
|
|
@@ -126,23 +144,7 @@ export function useWatch(form, name) {
|
|
|
126
144
|
* @returns Field state (value, error, touched, dirty, valid)
|
|
127
145
|
*/
|
|
128
146
|
export function useFieldState(form, name) {
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
return {
|
|
132
|
-
value: state.values[name],
|
|
133
|
-
error: state.errors[name],
|
|
134
|
-
touched: state.touched[name] ?? false,
|
|
135
|
-
dirty: state.values[name] !== undefined,
|
|
136
|
-
valid: !state.errors[name],
|
|
137
|
-
validating: false,
|
|
138
|
-
};
|
|
139
|
-
}, [form, name]);
|
|
140
|
-
const subscribe = useCallback((onChange) => {
|
|
141
|
-
if ('subscribe' in form && typeof form.subscribe === 'function') {
|
|
142
|
-
return form.subscribe(onChange);
|
|
143
|
-
}
|
|
144
|
-
return () => { };
|
|
145
|
-
}, [form]);
|
|
146
|
-
return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
|
|
147
|
+
const readField = useCallback(() => form.getFieldState(name), [form, name]);
|
|
148
|
+
return useFormSnapshot(form, readField);
|
|
147
149
|
}
|
|
148
150
|
//# sourceMappingURL=useForm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useForm.js","sourceRoot":"","sources":["../../src/hooks/useForm.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"useForm.js","sourceRoot":"","sources":["../../src/hooks/useForm.ts"],"names":[],"mappings":"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"}
|
package/dist/hooks/useHttp.d.ts
CHANGED
|
@@ -23,11 +23,23 @@ export interface UseHttpState<T> {
|
|
|
23
23
|
* Result of useHttp hook.
|
|
24
24
|
*/
|
|
25
25
|
export interface UseHttpResult<T> extends UseHttpState<T> {
|
|
26
|
+
/**
|
|
27
|
+
* Runs the request and resolves with its data, or `null` on failure.
|
|
28
|
+
*
|
|
29
|
+
* This function is IDENTITY-STABLE for as long as `method`, `url` and the HTTP
|
|
30
|
+
* client do not change, so it is safe in a `useEffect` dependency array. Its
|
|
31
|
+
* request options are read when it is CALLED, from the latest committed render.
|
|
32
|
+
*/
|
|
26
33
|
execute: () => Promise<T | null>;
|
|
27
34
|
reset: () => void;
|
|
28
35
|
}
|
|
29
36
|
/**
|
|
30
37
|
* Options for useHttp hook.
|
|
38
|
+
*
|
|
39
|
+
* Every request option — headers, params, body `data`, `signal`, `onSuccess`,
|
|
40
|
+
* `onError` — is read at the moment `execute` runs, not when the hook rendered,
|
|
41
|
+
* so an inline object or callback needs no memoizing. Only `immediate` is read
|
|
42
|
+
* on mount.
|
|
31
43
|
*/
|
|
32
44
|
export interface UseHttpOptions<T> extends RequestConfig {
|
|
33
45
|
/**
|
|
@@ -46,9 +58,18 @@ export interface UseHttpOptions<T> extends RequestConfig {
|
|
|
46
58
|
/**
|
|
47
59
|
* Hook for making HTTP requests with state management.
|
|
48
60
|
*
|
|
61
|
+
* `execute` keeps one identity while `method`, `url` and the HTTP client stay the
|
|
62
|
+
* same — across the hook's own loading/data updates, parent rerenders, and inline
|
|
63
|
+
* options or callbacks — so `useEffect(() => { void execute() }, [execute])`
|
|
64
|
+
* runs once per request target instead of looping. The current headers, body,
|
|
65
|
+
* `signal` and callbacks are read when `execute` is called, so a later manual
|
|
66
|
+
* call always sends what the latest committed render passed. Changing `method`, `url` or
|
|
67
|
+
* the client does replace `execute` (it selects a different request) and
|
|
68
|
+
* re-runs such an effect.
|
|
69
|
+
*
|
|
49
70
|
* @param method - HTTP method
|
|
50
71
|
* @param url - Request URL
|
|
51
|
-
* @param options - Request options
|
|
72
|
+
* @param options - Request options, read at call time
|
|
52
73
|
* @returns Request state and execute function
|
|
53
74
|
*
|
|
54
75
|
* @example
|
|
@@ -56,8 +77,8 @@ export interface UseHttpOptions<T> extends RequestConfig {
|
|
|
56
77
|
* const { data, loading, error, execute } = useHttp<User[]>('GET', '/api/users')
|
|
57
78
|
*
|
|
58
79
|
* useEffect(() => {
|
|
59
|
-
* execute()
|
|
60
|
-
* }, [])
|
|
80
|
+
* void execute()
|
|
81
|
+
* }, [execute])
|
|
61
82
|
*
|
|
62
83
|
* if (loading) return <Spinner />
|
|
63
84
|
* if (error) return <Error message={error.message} />
|
|
@@ -1 +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
|
|
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;;;;;;OAMG;IACH,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;IAChC,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB;AAED;;;;;;;GAOG;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;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,CAqGlB;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"}
|
package/dist/hooks/useHttp.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
|
-
import { useCallback, useContext, useEffect, useRef, useState } from 'react';
|
|
6
|
+
import { useCallback, useContext, useEffect, useInsertionEffect, useRef, useState } from 'react';
|
|
7
7
|
import { t } from '@molecule/app-i18n';
|
|
8
8
|
import { HttpContext } from '../contexts.js';
|
|
9
9
|
/**
|
|
@@ -24,9 +24,18 @@ export function useHttpClient() {
|
|
|
24
24
|
/**
|
|
25
25
|
* Hook for making HTTP requests with state management.
|
|
26
26
|
*
|
|
27
|
+
* `execute` keeps one identity while `method`, `url` and the HTTP client stay the
|
|
28
|
+
* same — across the hook's own loading/data updates, parent rerenders, and inline
|
|
29
|
+
* options or callbacks — so `useEffect(() => { void execute() }, [execute])`
|
|
30
|
+
* runs once per request target instead of looping. The current headers, body,
|
|
31
|
+
* `signal` and callbacks are read when `execute` is called, so a later manual
|
|
32
|
+
* call always sends what the latest committed render passed. Changing `method`, `url` or
|
|
33
|
+
* the client does replace `execute` (it selects a different request) and
|
|
34
|
+
* re-runs such an effect.
|
|
35
|
+
*
|
|
27
36
|
* @param method - HTTP method
|
|
28
37
|
* @param url - Request URL
|
|
29
|
-
* @param options - Request options
|
|
38
|
+
* @param options - Request options, read at call time
|
|
30
39
|
* @returns Request state and execute function
|
|
31
40
|
*
|
|
32
41
|
* @example
|
|
@@ -34,8 +43,8 @@ export function useHttpClient() {
|
|
|
34
43
|
* const { data, loading, error, execute } = useHttp<User[]>('GET', '/api/users')
|
|
35
44
|
*
|
|
36
45
|
* useEffect(() => {
|
|
37
|
-
* execute()
|
|
38
|
-
* }, [])
|
|
46
|
+
* void execute()
|
|
47
|
+
* }, [execute])
|
|
39
48
|
*
|
|
40
49
|
* if (loading) return <Spinner />
|
|
41
50
|
* if (error) return <Error message={error.message} />
|
|
@@ -44,12 +53,12 @@ export function useHttpClient() {
|
|
|
44
53
|
*/
|
|
45
54
|
export function useHttp(method, url, options) {
|
|
46
55
|
const client = useHttpClient();
|
|
47
|
-
const
|
|
48
|
-
const [state, setState] = useState({
|
|
56
|
+
const immediate = options?.immediate ?? false;
|
|
57
|
+
const [state, setState] = useState(() => ({
|
|
49
58
|
data: null,
|
|
50
59
|
loading: immediate,
|
|
51
60
|
error: null,
|
|
52
|
-
});
|
|
61
|
+
}));
|
|
53
62
|
// Track mounted state to avoid state updates after unmount
|
|
54
63
|
const mountedRef = useRef(true);
|
|
55
64
|
useEffect(() => {
|
|
@@ -58,9 +67,20 @@ export function useHttp(method, url, options) {
|
|
|
58
67
|
mountedRef.current = false;
|
|
59
68
|
};
|
|
60
69
|
}, []);
|
|
70
|
+
// Publish options during commit, before consumers' layout effects. A render
|
|
71
|
+
// that suspends or is discarded must not change a mounted action's request.
|
|
72
|
+
// This only updates our own ref: no DOM access or state update is involved.
|
|
73
|
+
const optionsRef = useRef(options);
|
|
74
|
+
useInsertionEffect(() => {
|
|
75
|
+
optionsRef.current = options;
|
|
76
|
+
}, [options]);
|
|
61
77
|
const execute = useCallback(async () => {
|
|
62
78
|
if (!mountedRef.current)
|
|
63
79
|
return null;
|
|
80
|
+
// Deliberately NOT a dependency of this callback: options describe the
|
|
81
|
+
// request being sent, while method/url/client decide WHICH request execute
|
|
82
|
+
// performs. Reading them here keeps this action stable for effect deps.
|
|
83
|
+
const { immediate: _immediate, onSuccess, onError, ...requestConfig } = optionsRef.current ?? {};
|
|
64
84
|
setState((prev) => ({ ...prev, loading: true, error: null }));
|
|
65
85
|
try {
|
|
66
86
|
let response;
|
|
@@ -97,11 +117,14 @@ export function useHttp(method, url, options) {
|
|
|
97
117
|
}
|
|
98
118
|
return null;
|
|
99
119
|
}
|
|
100
|
-
}, [client, method, url
|
|
120
|
+
}, [client, method, url]);
|
|
101
121
|
const reset = useCallback(() => {
|
|
102
122
|
setState({ data: null, loading: false, error: null });
|
|
103
123
|
}, []);
|
|
104
|
-
// Execute immediately if requested
|
|
124
|
+
// Execute immediately if requested — mount only, as it has always been.
|
|
125
|
+
// `immediate` and `execute` are deliberately not dependencies: re-running this
|
|
126
|
+
// would turn a state update into a second request, which is the historical
|
|
127
|
+
// contract of this option (and every useGet(url, { immediate: true })'s).
|
|
105
128
|
useEffect(() => {
|
|
106
129
|
if (immediate) {
|
|
107
130
|
execute();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useHttp.js","sourceRoot":"","sources":["../../src/hooks/useHttp.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"useHttp.js","sourceRoot":"","sources":["../../src/hooks/useHttp.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,16 +3,21 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
|
-
import type { AuthResult, RegisterData } from '@molecule/app-auth';
|
|
6
|
+
import type { AuthResult, RegisterData, RegisterExtraShape } from '@molecule/app-auth';
|
|
7
7
|
import { type UsePromiseState } from './usePromise.js';
|
|
8
8
|
/**
|
|
9
9
|
* Return type for useSignup hook.
|
|
10
|
+
*
|
|
11
|
+
* @template T - The user profile the API returns.
|
|
12
|
+
* @template TRegister - The app's own registration fields (the second generic
|
|
13
|
+
* of `createJWTAuthClient<T, TRegister>`), so `signup()` is typed like the
|
|
14
|
+
* client's `register()`.
|
|
10
15
|
*/
|
|
11
|
-
export interface UseSignupReturn<T = unknown> {
|
|
16
|
+
export interface UseSignupReturn<T = unknown, TRegister extends RegisterExtraShape<TRegister> = Record<never, never>> {
|
|
12
17
|
status: UsePromiseState<AuthResult<T>>['status'];
|
|
13
18
|
value: UsePromiseState<AuthResult<T>>['value'];
|
|
14
19
|
error: UsePromiseState<AuthResult<T>>['error'];
|
|
15
|
-
signup: (data: RegisterData) => Promise<AuthResult<T>>;
|
|
20
|
+
signup: (data: RegisterData<TRegister>) => Promise<AuthResult<T>>;
|
|
16
21
|
reset: () => void;
|
|
17
22
|
}
|
|
18
23
|
/**
|
|
@@ -31,5 +36,5 @@ export interface UseSignupReturn<T = unknown> {
|
|
|
31
36
|
* )
|
|
32
37
|
* ```
|
|
33
38
|
*/
|
|
34
|
-
export declare function useSignup<T = unknown>(): UseSignupReturn<T>;
|
|
39
|
+
export declare function useSignup<T = unknown, TRegister extends RegisterExtraShape<TRegister> = Record<never, never>>(): UseSignupReturn<T, TRegister>;
|
|
35
40
|
//# sourceMappingURL=useSignup.d.ts.map
|
|
@@ -1 +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;
|
|
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,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAGtF,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAElE;;;;;;;GAOG;AACH,MAAM,WAAW,eAAe,CAC9B,CAAC,GAAG,OAAO,EACX,SAAS,SAAS,kBAAkB,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC;IAEtE,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,CAAC,SAAS,CAAC,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;IACjE,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,SAAS,CACvB,CAAC,GAAG,OAAO,EACX,SAAS,SAAS,kBAAkB,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,KACnE,eAAe,CAAC,CAAC,EAAE,SAAS,CAAC,CAcjC"}
|
|
@@ -1 +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;
|
|
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;AAqBlE;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,SAAS;IAIvB,MAAM,MAAM,GAAG,aAAa,EAAgB,CAAA;IAE5C,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,IAA6B,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IAElG,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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import type { ReactNode } from 'react';
|
|
7
7
|
import type { BackgroundTaskState, ChatAttachment, ChatMessage, ChatProvider, ChatStreamEvent } from '@molecule/app-ai-chat';
|
|
8
|
-
import type { AuthClient, AuthState } from '@molecule/app-auth';
|
|
8
|
+
import type { AuthClient, AuthState, RegisterExtraShape } from '@molecule/app-auth';
|
|
9
9
|
import type { DiffFile, EditorFile, EditorProvider, EditorTab, FixWithAIRequest } from '@molecule/app-code-editor';
|
|
10
10
|
import type { FormController, FormOptions } from '@molecule/app-forms';
|
|
11
11
|
import type { HttpClient } from '@molecule/app-http';
|
|
@@ -131,8 +131,15 @@ export interface UseAuthOptions {
|
|
|
131
131
|
}
|
|
132
132
|
/**
|
|
133
133
|
* Hook result for useAuth.
|
|
134
|
+
*
|
|
135
|
+
* @template T - The user profile the API returns (the same type passed to
|
|
136
|
+
* `createJWTAuthClient<T>` and `AuthClientConfig<T>`).
|
|
137
|
+
* @template TRegister - The app's own registration fields, at the top level of
|
|
138
|
+
* `register()` — the second generic of `createJWTAuthClient<T, TRegister>`,
|
|
139
|
+
* so `useAuth<T, TRegister>().register({ email, password, username })` is
|
|
140
|
+
* typed exactly like the client call.
|
|
134
141
|
*/
|
|
135
|
-
export interface UseAuthResult<T = unknown> {
|
|
142
|
+
export interface UseAuthResult<T = unknown, TRegister extends RegisterExtraShape<TRegister> = Record<never, never>> {
|
|
136
143
|
/**
|
|
137
144
|
* The session state as one value — render from this instead of combining
|
|
138
145
|
* `initialized`/`authenticated`/`loading`. A stored token AND user make it
|
|
@@ -143,7 +150,7 @@ export interface UseAuthResult<T = unknown> {
|
|
|
143
150
|
state: AuthState<T>;
|
|
144
151
|
login: AuthClient<T>['login'];
|
|
145
152
|
logout: AuthClient<T>['logout'];
|
|
146
|
-
register: AuthClient<T>['register'];
|
|
153
|
+
register: AuthClient<T, TRegister>['register'];
|
|
147
154
|
refresh: AuthClient<T>['refresh'];
|
|
148
155
|
setUser: AuthClient<T>['setUser'];
|
|
149
156
|
/**
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,OAAO,KAAK,EACV,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,YAAY,EACZ,eAAe,EAChB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@molecule/app-react",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.8.0",
|
|
4
4
|
"description": "React framework bindings for molecule.dev",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -58,8 +58,8 @@
|
|
|
58
58
|
}
|
|
59
59
|
},
|
|
60
60
|
"devDependencies": {
|
|
61
|
-
"@molecule/app-ai-models": "1.4.
|
|
62
|
-
"@molecule/app-bonds-default-react": "1.1.
|
|
61
|
+
"@molecule/app-ai-models": "1.4.1",
|
|
62
|
+
"@molecule/app-bonds-default-react": "1.1.5",
|
|
63
63
|
"@molecule/app-i18n": "1.0.3",
|
|
64
64
|
"@testing-library/dom": "10.4.1",
|
|
65
65
|
"@testing-library/react": "16.3.2",
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
"react": "19.2.8",
|
|
69
69
|
"react-dom": "19.2.8",
|
|
70
70
|
"typescript": "6.0.3",
|
|
71
|
-
"vitest": "4.1.
|
|
71
|
+
"vitest": "4.1.12"
|
|
72
72
|
},
|
|
73
73
|
"repository": {
|
|
74
74
|
"type": "git",
|