11import { $TRACK , createMemo , createSignal , JSX , onCleanup , getOwner } from "solid-js" ;
22import { isServer } from "solid-js/web" ;
33import { 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" ;
511import { mockBase } from "../utils.js" ;
612import { cacheKeyOp , hashKey , revalidate , query } from "./query.js" ;
713
@@ -47,7 +53,8 @@ export function useSubmission<T extends Array<any>, U, V>(
4753 { } ,
4854 {
4955 get ( _ , property ) {
50- if ( submissions . length === 0 && property === "clear" || property === "retry" ) return ( ( ) => { } ) ;
56+ if ( ( submissions . length === 0 && property === "clear" ) || property === "retry" )
57+ return ( ) => { } ;
5158 return submissions [ submissions . length - 1 ] ?. [ property as keyof Submission < T , U > ] ;
5259 }
5360 }
@@ -62,14 +69,14 @@ export function useAction<T extends Array<any>, U, V>(action: Action<T, U, V>) {
6269export function action < T extends Array < any > , U = void > (
6370 fn : ( ...args : T ) => Promise < U > ,
6471 name ?: string
65- ) : Action < T , U >
72+ ) : Action < T , U > ;
6673export function action < T extends Array < any > , U = void > (
6774 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 > ;
7077export function action < T extends Array < any > , U = void > (
7178 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 } = { }
7380) : Action < T , U > {
7481 function mutate ( this : { r : RouterContext ; f ?: HTMLFormElement } , ...variables : T ) {
7582 const router = this . r ;
@@ -84,7 +91,17 @@ export function action<T extends Array<any>, U = void>(
8491 function handler ( error ?: boolean ) {
8592 return async ( res : any ) => {
8693 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 ;
88105 if ( ! result ) return submission . clear ( ) ;
89106 setResult ( result ) ;
90107 if ( result . error && ! form ) throw result . error ;
@@ -106,7 +123,7 @@ export function action<T extends Array<any>, U = void>(
106123 return ! result ( ) ;
107124 } ,
108125 clear ( ) {
109- router . submissions [ 1 ] ( v => v . filter ( i => i . input !== variables ) ) ;
126+ router . submissions [ 1 ] ( v => v . filter ( i => i !== submission ) ) ;
110127 } ,
111128 retry ( ) {
112129 setResult ( undefined ) ;
0 commit comments