浏览代码

call `routing_callback` during init

Adrian Wannenmacher 2 年之前
父节点
当前提交
911e878d83
共有 1 个文件被更改,包括 27 次插入3 次删除
  1. 27 3
      packages/router-core/src/service.rs

+ 27 - 3
packages/router-core/src/service.rs

@@ -169,6 +169,16 @@ where
     pub fn init(&mut self) {
         *self.sync_state_write_lock() = self
             .update_routing()
+            .left_and_then(|state| {
+                if let Some(cb) = &self.routing_callback {
+                    if let Some(nt) = cb(&state) {
+                        self.replace(nt);
+                        return self.update_routing();
+                    }
+                }
+
+                Either::Left(state)
+            })
             .map_right(|err| self.handle_navigation_failure(&self.sync_state_read_lock(), err))
             .either_into();
     }
@@ -226,7 +236,16 @@ where
     pub async fn run(&mut self) {
         // init (unlike function with same name this is async)
         {
-            *self.state.write().await = match self.update_routing() {
+            *self.state.write().await = match self.update_routing().left_and_then(|state| {
+                if let Some(cb) = &self.routing_callback {
+                    if let Some(nt) = cb(&state) {
+                        self.replace(nt);
+                        return self.update_routing();
+                    }
+                }
+
+                Either::Left(state)
+            }) {
                 Either::Left(state) => state,
                 Either::Right(err) => {
                     self.handle_navigation_failure(&*self.state.read().await, err)
@@ -925,12 +944,17 @@ mod tests {
             ContentAtom("redirect limit"),
         );
 
-        s.init();
         assert!(paths.lock().unwrap().is_empty());
 
+        s.init();
+        assert_eq!(*paths.lock().unwrap(), vec![String::from("/fixed")]);
+
         c.unbounded_send(RouterMessage::Update).unwrap();
         s.run_current();
-        assert_eq!(*paths.lock().unwrap(), vec![String::from("/fixed")]);
+        assert_eq!(
+            *paths.lock().unwrap(),
+            vec![String::from("/fixed"), String::from("/%F0%9F%8E%BA")]
+        );
 
         let state = s.state.try_read().unwrap();
         assert_eq!(state.content, vec![ContentAtom("🎺")])