@@ -5,26 +5,26 @@ import type { RouterContext, Submission, SubmissionStub, Navigator, NarrowRespon
5
5
import { mockBase } from "../utils.js" ;
6
6
import { cacheKeyOp , hashKey , revalidate , cache } from "./cache.js" ;
7
7
8
- export type Action < T extends Array < any > , U > = ( T extends [ FormData ] | [ ]
8
+ export type Action < T extends Array < any > , U , V = T > = ( T extends [ FormData ] | [ ]
9
9
? JSX . SerializableAttributeValue
10
10
: unknown ) &
11
11
( ( ...vars : T ) => Promise < NarrowResponse < U > > ) & {
12
12
url : string ;
13
13
with < A extends any [ ] , B extends any [ ] > (
14
14
this : ( this : any , ...args : [ ...A , ...B ] ) => Promise < NarrowResponse < U > > ,
15
15
...args : A
16
- ) : Action < B , U > ;
16
+ ) : Action < B , U , V > ;
17
17
} ;
18
18
19
19
export const actions = /* #__PURE__ */ new Map < string , Action < any , any > > ( ) ;
20
20
21
- export function useSubmissions < T extends Array < any > , U > (
22
- fn : Action < T , U > ,
23
- filter ?: ( arg : T ) => boolean
21
+ export function useSubmissions < T extends Array < any > , U , V > (
22
+ fn : Action < T , U , V > ,
23
+ filter ?: ( input : V ) => boolean
24
24
) : Submission < T , NarrowResponse < U > > [ ] & { pending : boolean } {
25
25
const router = useRouter ( ) ;
26
26
const subs = createMemo ( ( ) =>
27
- router . submissions [ 0 ] ( ) . filter ( s => s . url === fn . toString ( ) && ( ! filter || filter ( s . input ) ) )
27
+ router . submissions [ 0 ] ( ) . filter ( s => s . url === ( fn as any ) . base && ( ! filter || filter ( s . input ) ) )
28
28
) ;
29
29
return new Proxy < Submission < any , any > [ ] & { pending : boolean } > ( [ ] as any , {
30
30
get ( _ , property ) {
@@ -38,9 +38,9 @@ export function useSubmissions<T extends Array<any>, U>(
38
38
} ) ;
39
39
}
40
40
41
- export function useSubmission < T extends Array < any > , U > (
42
- fn : Action < T , U > ,
43
- filter ?: ( arg : T ) => boolean
41
+ export function useSubmission < T extends Array < any > , U , V > (
42
+ fn : Action < T , U , V > ,
43
+ filter ?: ( input : V ) => boolean
44
44
) : Submission < T , NarrowResponse < U > > | SubmissionStub {
45
45
const submissions = useSubmissions ( fn , filter ) ;
46
46
return new Proxy (
@@ -54,15 +54,15 @@ export function useSubmission<T extends Array<any>, U>(
54
54
) as Submission < T , NarrowResponse < U > > ;
55
55
}
56
56
57
- export function useAction < T extends Array < any > , U > ( action : Action < T , U > ) {
57
+ export function useAction < T extends Array < any > , U , V > ( action : Action < T , U , V > ) {
58
58
const r = useRouter ( ) ;
59
- return ( ...args : Parameters < Action < T , U > > ) => action . apply ( { r } , args ) ;
59
+ return ( ...args : Parameters < Action < T , U , V > > ) => action . apply ( { r } , args ) ;
60
60
}
61
61
62
62
export function action < T extends Array < any > , U = void > (
63
63
fn : ( ...args : T ) => Promise < U > ,
64
64
name ?: string
65
- ) : Action < T , U > {
65
+ ) : Action < T , U , T > {
66
66
function mutate ( this : { r : RouterContext ; f ?: HTMLFormElement } , ...variables : T ) {
67
67
const router = this . r ;
68
68
const form = this . f ;
@@ -113,10 +113,11 @@ export function action<T extends Array<any>, U = void>(
113
113
( fn as any ) . url ||
114
114
( name && `https://action/${ name } ` ) ||
115
115
( ! isServer ? `https://action/${ hashString ( fn . toString ( ) ) } ` : "" ) ;
116
+ mutate . base = url ;
116
117
return toAction ( mutate , url ) ;
117
118
}
118
119
119
- function toAction < T extends Array < any > , U > ( fn : Function , url : string ) : Action < T , U > {
120
+ function toAction < T extends Array < any > , U , V = T > ( fn : Function , url : string ) : Action < T , U , V > {
120
121
fn . toString = ( ) => {
121
122
if ( ! url ) throw new Error ( "Client Actions need explicit names if server rendered" ) ;
122
123
return url ;
@@ -128,19 +129,20 @@ function toAction<T extends Array<any>, U>(fn: Function, url: string): Action<T,
128
129
const newFn = function ( this : RouterContext , ...passedArgs : B ) : U {
129
130
return fn . call ( this , ...args , ...passedArgs ) ;
130
131
} ;
132
+ newFn . base = ( fn as any ) . base ;
131
133
const uri = new URL ( url , mockBase ) ;
132
134
uri . searchParams . set ( "args" , hashKey ( args ) ) ;
133
- return toAction < B , U > (
135
+ return toAction < B , U , V > (
134
136
newFn as any ,
135
137
( uri . origin === "https://action" ? uri . origin : "" ) + uri . pathname + uri . search
136
138
) ;
137
139
} ;
138
140
( fn as any ) . url = url ;
139
141
if ( ! isServer ) {
140
- actions . set ( url , fn as Action < T , U > ) ;
142
+ actions . set ( url , fn as Action < T , U , V > ) ;
141
143
getOwner ( ) && onCleanup ( ( ) => actions . delete ( url ) ) ;
142
144
}
143
- return fn as Action < T , U > ;
145
+ return fn as Action < T , U , V > ;
144
146
}
145
147
146
148
const hashString = ( s : string ) =>
0 commit comments