diff options
Diffstat (limited to 'web')
| -rw-r--r-- | web/CHANGELOG.md | 2 | ||||
| -rw-r--r-- | web/src/lib.rs | 42 | 
2 files changed, 31 insertions, 13 deletions
| diff --git a/web/CHANGELOG.md b/web/CHANGELOG.md index 49ddf5a3..0bdb9c37 100644 --- a/web/CHANGELOG.md +++ b/web/CHANGELOG.md @@ -5,6 +5,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).  ## [Unreleased] +### Fixed +- Render not being scheduled after `Command` futures finishing.  ## [0.1.0] - 2019-11-25  ### Added diff --git a/web/src/lib.rs b/web/src/lib.rs index 8239ffc9..782bcf93 100644 --- a/web/src/lib.rs +++ b/web/src/lib.rs @@ -138,19 +138,9 @@ pub trait Application {          Self: 'static + Sized,      {          let (app, command) = Self::new(); -        let mut instance = Instance::new(app); -        instance.spawn(command); - -        let window = web_sys::window().unwrap(); - -        let document = window.document().unwrap(); -        document.set_title(&instance.title); - -        let body = document.body().unwrap(); -        let vdom = dodrio::Vdom::new(&body, instance); - -        vdom.forget(); +        let instance = Instance::new(app); +        instance.run(command);      }  } @@ -158,6 +148,7 @@ pub trait Application {  struct Instance<Message> {      title: String,      ui: Rc<RefCell<Box<dyn Application<Message = Message>>>>, +    vdom: Rc<RefCell<Option<dodrio::VdomWeak>>>,  }  impl<Message> Instance<Message> @@ -168,6 +159,7 @@ where          Self {              title: ui.title(),              ui: Rc::new(RefCell::new(Box::new(ui))), +            vdom: Rc::new(RefCell::new(None)),          }      } @@ -192,11 +184,35 @@ where          for future in command.futures() {              let mut instance = self.clone(); -            let future = future.map(move |message| instance.update(message)); + +            let future = future.map(move |message| { +                instance.update(message); + +                if let Some(ref vdom) = *instance.vdom.borrow() { +                    vdom.schedule_render(); +                } +            });              wasm_bindgen_futures::spawn_local(future);          }      } + +    fn run(mut self, command: Command<Message>) { +        let window = web_sys::window().unwrap(); + +        let document = window.document().unwrap(); +        document.set_title(&self.title); + +        let body = document.body().unwrap(); + +        let weak = self.vdom.clone(); +        self.spawn(command); + +        let vdom = dodrio::Vdom::new(&body, self); +        *weak.borrow_mut() = Some(vdom.weak()); + +        vdom.forget(); +    }  }  impl<Message> dodrio::Render for Instance<Message> | 
