@@ -7,106 +7,10 @@ import * as React from "react";
7
7
import * as ReactDOM from "react-dom" ;
8
8
import { } from "react/experimental" ;
9
9
import type { } from "zod" ;
10
- import type {
11
- HookActionStatus ,
12
- HookCallbacks ,
13
- HookResult ,
14
- HookSafeActionFn ,
15
- HookSafeStateActionFn ,
16
- } from "./hooks.types" ;
10
+ import { getActionShorthandStatusObject , getActionStatus , useActionCallbacks } from "./hooks-utils" ;
11
+ import type { HookCallbacks , HookResult , HookSafeActionFn } from "./hooks.types" ;
17
12
import { isError } from "./utils" ;
18
13
19
- const getActionStatus = <
20
- ServerError ,
21
- S extends Schema | undefined ,
22
- const BAS extends readonly Schema [ ] ,
23
- CVE ,
24
- CBAVE ,
25
- Data ,
26
- > ( {
27
- isIdle,
28
- isExecuting,
29
- result,
30
- } : {
31
- isIdle : boolean ;
32
- isExecuting : boolean ;
33
- result : HookResult < ServerError , S , BAS , CVE , CBAVE , Data > ;
34
- } ) : HookActionStatus => {
35
- if ( isIdle ) {
36
- return "idle" ;
37
- } else if ( isExecuting ) {
38
- return "executing" ;
39
- } else if (
40
- typeof result . validationErrors !== "undefined" ||
41
- typeof result . bindArgsValidationErrors !== "undefined" ||
42
- typeof result . serverError !== "undefined" ||
43
- typeof result . fetchError !== "undefined"
44
- ) {
45
- return "hasErrored" ;
46
- } else {
47
- return "hasSucceeded" ;
48
- }
49
- } ;
50
-
51
- const getActionShorthandStatusObject = ( status : HookActionStatus ) => {
52
- return {
53
- isIdle : status === "idle" ,
54
- isExecuting : status === "executing" ,
55
- hasSucceeded : status === "hasSucceeded" ,
56
- hasErrored : status === "hasErrored" ,
57
- } ;
58
- } ;
59
-
60
- const useActionCallbacks = <
61
- ServerError ,
62
- S extends Schema | undefined ,
63
- const BAS extends readonly Schema [ ] ,
64
- CVE ,
65
- CBAVE ,
66
- Data ,
67
- > ( {
68
- result,
69
- input,
70
- status,
71
- cb,
72
- } : {
73
- result : HookResult < ServerError , S , BAS , CVE , CBAVE , Data > ;
74
- input : S extends Schema ? InferIn < S > : undefined ;
75
- status : HookActionStatus ;
76
- cb ?: HookCallbacks < ServerError , S , BAS , CVE , CBAVE , Data > ;
77
- } ) => {
78
- const onExecuteRef = React . useRef ( cb ?. onExecute ) ;
79
- const onSuccessRef = React . useRef ( cb ?. onSuccess ) ;
80
- const onErrorRef = React . useRef ( cb ?. onError ) ;
81
- const onSettledRef = React . useRef ( cb ?. onSettled ) ;
82
-
83
- // Execute the callback when the action status changes.
84
- React . useEffect ( ( ) => {
85
- const onExecute = onExecuteRef . current ;
86
- const onSuccess = onSuccessRef . current ;
87
- const onError = onErrorRef . current ;
88
- const onSettled = onSettledRef . current ;
89
-
90
- const executeCallbacks = async ( ) => {
91
- switch ( status ) {
92
- case "executing" :
93
- await Promise . resolve ( onExecute ?.( { input } ) ) ;
94
- break ;
95
- case "hasSucceeded" :
96
- await Promise . resolve ( onSuccess ?.( { data : result ?. data , input } ) ) ;
97
- await Promise . resolve ( onSettled ?.( { result, input } ) ) ;
98
- break ;
99
- case "hasErrored" :
100
- await Promise . resolve ( onError ?.( { error : result , input } ) ) ;
101
- await Promise . resolve ( onSettled ?.( { result, input } ) ) ;
102
- break ;
103
- }
104
- } ;
105
-
106
- executeCallbacks ( ) . catch ( console . error ) ;
107
- } , [ status , result , input ] ) ;
108
- } ;
109
-
110
14
// HOOKS
111
15
112
16
/**
@@ -345,71 +249,4 @@ export const useOptimisticAction = <
345
249
} ;
346
250
} ;
347
251
348
- /**
349
- * Use the stateful action from a Client Component via hook. Used for actions defined with [`stateAction`](https://next-safe-action.dev/docs/safe-action-client/instance-methods#action--stateaction).
350
- * @param safeActionFn The action function
351
- * @param utils Optional `initResult`, `permalink` and callbacks
352
- *
353
- * {@link https://next-safe-action.dev/docs/execution/hooks/usestateaction See docs for more information}
354
- */
355
- export const useStateAction = <
356
- ServerError ,
357
- S extends Schema | undefined ,
358
- const BAS extends readonly Schema [ ] ,
359
- CVE ,
360
- CBAVE ,
361
- Data ,
362
- > (
363
- safeActionFn : HookSafeStateActionFn < ServerError , S , BAS , CVE , CBAVE , Data > ,
364
- utils ?: {
365
- initResult ?: Awaited < ReturnType < typeof safeActionFn > > ;
366
- permalink ?: string ;
367
- } & HookCallbacks < ServerError , S , BAS , CVE , CBAVE , Data >
368
- ) => {
369
- const [ result , dispatcher , isExecuting ] = React . useActionState (
370
- safeActionFn ,
371
- utils ?. initResult ?? { } ,
372
- utils ?. permalink
373
- ) ;
374
- const [ isIdle , setIsIdle ] = React . useState ( true ) ;
375
- const [ clientInput , setClientInput ] = React . useState < S extends Schema ? InferIn < S > : void > ( ) ;
376
- const status = getActionStatus < ServerError , S , BAS , CVE , CBAVE , Data > ( {
377
- isExecuting,
378
- result : result ?? { } ,
379
- isIdle,
380
- } ) ;
381
-
382
- const execute = React . useCallback (
383
- ( input : S extends Schema ? InferIn < S > : void ) => {
384
- dispatcher ( input as S extends Schema ? InferIn < S > : undefined ) ;
385
-
386
- ReactDOM . flushSync ( ( ) => {
387
- setIsIdle ( false ) ;
388
- setClientInput ( input ) ;
389
- } ) ;
390
- } ,
391
- [ dispatcher ]
392
- ) ;
393
-
394
- useActionCallbacks ( {
395
- result : result ?? { } ,
396
- input : clientInput as S extends Schema ? InferIn < S > : undefined ,
397
- status,
398
- cb : {
399
- onExecute : utils ?. onExecute ,
400
- onSuccess : utils ?. onSuccess ,
401
- onError : utils ?. onError ,
402
- onSettled : utils ?. onSettled ,
403
- } ,
404
- } ) ;
405
-
406
- return {
407
- execute,
408
- input : clientInput ,
409
- result,
410
- status,
411
- ...getActionShorthandStatusObject ( status ) ,
412
- } ;
413
- } ;
414
-
415
252
export type * from "./hooks.types" ;
0 commit comments