1
- use crate :: { use_navigate, use_resolved_path, ToHref } ;
1
+ use crate :: { use_navigate, use_resolved_path, ToHref , Url } ;
2
2
use leptos:: * ;
3
3
use std:: { error:: Error , rc:: Rc } ;
4
4
use wasm_bindgen:: { JsCast , UnwrapThrowExt } ;
5
5
use wasm_bindgen_futures:: JsFuture ;
6
+ use web_sys:: RequestRedirect ;
6
7
7
8
type OnFormData = Rc < dyn Fn ( & web_sys:: FormData ) > ;
8
9
type OnResponse = Rc < dyn Fn ( & web_sys:: Response ) > ;
@@ -90,12 +91,13 @@ where
90
91
let res = gloo_net:: http:: Request :: post ( & action)
91
92
. header ( "Accept" , "application/json" )
92
93
. header ( "Content-Type" , & enctype)
94
+ . redirect ( RequestRedirect :: Follow )
93
95
. body ( params)
94
96
. send ( )
95
97
. await ;
96
98
match res {
97
99
Err ( e) => {
98
- log :: error!( "<Form/> error while POSTing: {e:#?}" ) ;
100
+ error ! ( "<Form/> error while POSTing: {e:#?}" ) ;
99
101
if let Some ( error) = error {
100
102
error. set ( Some ( Box :: new ( e) ) ) ;
101
103
}
@@ -110,15 +112,22 @@ where
110
112
if let Some ( on_response) = on_response. clone ( ) {
111
113
on_response ( resp. as_raw ( ) ) ;
112
114
}
113
-
114
- if resp. status ( ) == 303 {
115
- if let Some ( redirect_url) =
116
- resp. headers ( ) . get ( "Location" )
117
- {
118
- _ = navigate (
119
- & redirect_url,
120
- Default :: default ( ) ,
121
- ) ;
115
+ // Check all the logical 3xx responses that might
116
+ // get returned from a server function
117
+ if resp. redirected ( ) {
118
+ let resp_url = & resp. url ( ) ;
119
+ match Url :: try_from ( resp_url. as_str ( ) ) {
120
+ Ok ( url) => {
121
+ request_animation_frame ( move || {
122
+ if let Err ( e) = navigate (
123
+ & url. pathname ,
124
+ Default :: default ( ) ,
125
+ ) {
126
+ warn ! ( "{}" , e) ;
127
+ }
128
+ } ) ;
129
+ }
130
+ Err ( e) => warn ! ( "{}" , e) ,
122
131
}
123
132
}
124
133
}
@@ -207,7 +216,7 @@ where
207
216
input. set ( Some ( data) ) ;
208
217
action. set_pending ( true ) ;
209
218
}
210
- Err ( e) => log :: error!( "{e}" ) ,
219
+ Err ( e) => error ! ( "{e}" ) ,
211
220
}
212
221
} ) ;
213
222
@@ -225,15 +234,19 @@ where
225
234
. as_string ( )
226
235
. expect ( "couldn't get String from JsString" ) ,
227
236
) {
228
- Ok ( res) => value. set ( Some ( Ok ( res) ) ) ,
229
- Err ( e) => value. set ( Some ( Err (
230
- ServerFnError :: Deserialization ( e. to_string ( ) ) ,
231
- ) ) ) ,
237
+ Ok ( res) => {
238
+ value. try_set ( Some ( Ok ( res) ) ) ;
239
+ }
240
+ Err ( e) => {
241
+ value. try_set ( Some ( Err (
242
+ ServerFnError :: Deserialization ( e. to_string ( ) ) ,
243
+ ) ) ) ;
244
+ }
232
245
}
233
246
}
234
- Err ( e) => log :: error!( "{e:?}" ) ,
247
+ Err ( e) => error ! ( "{e:?}" ) ,
235
248
} ;
236
- input. set ( None ) ;
249
+ input. try_set ( None ) ;
237
250
action. set_pending ( false ) ;
238
251
} ) ;
239
252
} ) ;
@@ -293,7 +306,7 @@ where
293
306
let form_data = web_sys:: FormData :: new_with_form ( & form) . unwrap_throw ( ) ;
294
307
let data = action_input_from_form_data ( & form_data) ;
295
308
match data {
296
- Err ( e) => log :: error!( "{e}" ) ,
309
+ Err ( e) => error ! ( "{e}" ) ,
297
310
Ok ( input) => {
298
311
ev. prevent_default ( ) ;
299
312
multi_action. dispatch ( input) ;
0 commit comments