1
1
import { $TRACK , createMemo , createSignal , JSX , onCleanup , getOwner } from "solid-js" ;
2
2
import { isServer } from "solid-js/web" ;
3
3
import { useRouter } from "../routing.js" ;
4
- import type { RouterContext , Submission , SubmissionStub , Navigator , NarrowResponse } from "../types.js" ;
4
+ import type {
5
+ RouterContext ,
6
+ Submission ,
7
+ SubmissionStub ,
8
+ Navigator ,
9
+ NarrowResponse
10
+ } from "../types.js" ;
5
11
import { mockBase } from "../utils.js" ;
6
12
import { cacheKeyOp , hashKey , revalidate , query } from "./query.js" ;
7
13
@@ -47,7 +53,8 @@ export function useSubmission<T extends Array<any>, U, V>(
47
53
{ } ,
48
54
{
49
55
get ( _ , property ) {
50
- if ( submissions . length === 0 && property === "clear" || property === "retry" ) return ( ( ) => { } ) ;
56
+ if ( ( submissions . length === 0 && property === "clear" ) || property === "retry" )
57
+ return ( ) => { } ;
51
58
return submissions [ submissions . length - 1 ] ?. [ property as keyof Submission < T , U > ] ;
52
59
}
53
60
}
@@ -62,14 +69,14 @@ export function useAction<T extends Array<any>, U, V>(action: Action<T, U, V>) {
62
69
export function action < T extends Array < any > , U = void > (
63
70
fn : ( ...args : T ) => Promise < U > ,
64
71
name ?: string
65
- ) : Action < T , U >
72
+ ) : Action < T , U > ;
66
73
export function action < T extends Array < any > , U = void > (
67
74
fn : ( ...args : T ) => Promise < U > ,
68
- options ?: { name ?: string ; onComplete ?: ( s : Submission < T , U > ) => void }
69
- ) : Action < T , U >
75
+ options ?: { name ?: string ; onComplete ?: ( s : Submission < T , U > ) => boolean }
76
+ ) : Action < T , U > ;
70
77
export function action < T extends Array < any > , U = void > (
71
78
fn : ( ...args : T ) => Promise < U > ,
72
- options : string | { name ?: string ; onComplete ?: ( s : Submission < T , U > ) => void } = { }
79
+ options : string | { name ?: string ; onComplete ?: ( s : Submission < T , U > ) => boolean } = { }
73
80
) : Action < T , U > {
74
81
function mutate ( this : { r : RouterContext ; f ?: HTMLFormElement } , ...variables : T ) {
75
82
const router = this . r ;
@@ -84,7 +91,17 @@ export function action<T extends Array<any>, U = void>(
84
91
function handler ( error ?: boolean ) {
85
92
return async ( res : any ) => {
86
93
const result = await handleResponse ( res , error , router . navigatorFactory ( ) ) ;
87
- o . onComplete && o . onComplete ( submission ) ;
94
+ let retry = null ;
95
+ ! o . onComplete ?.( {
96
+ ...submission ,
97
+ result : result ?. data ,
98
+ error : result ?. error ,
99
+ pending : false ,
100
+ retry ( ) {
101
+ return retry = submission . retry ( ) ;
102
+ }
103
+ } ) ;
104
+ if ( retry ) return retry ;
88
105
if ( ! result ) return submission . clear ( ) ;
89
106
setResult ( result ) ;
90
107
if ( result . error && ! form ) throw result . error ;
@@ -106,7 +123,7 @@ export function action<T extends Array<any>, U = void>(
106
123
return ! result ( ) ;
107
124
} ,
108
125
clear ( ) {
109
- router . submissions [ 1 ] ( v => v . filter ( i => i . input !== variables ) ) ;
126
+ router . submissions [ 1 ] ( v => v . filter ( i => i !== submission ) ) ;
110
127
} ,
111
128
retry ( ) {
112
129
setResult ( undefined ) ;
0 commit comments