oldlib.rs 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. use dioxus::virtual_dom::VirtualDom;
  2. pub use dioxus_core as dioxus;
  3. use dioxus_core::{events::EventTrigger, prelude::FC};
  4. pub struct IosRenderer {
  5. internal_dom: VirtualDom,
  6. }
  7. impl IosRenderer {
  8. pub async fn run(&mut self) -> dioxus_core::error::Result<()> {
  9. let (sender, mut receiver) = async_channel::unbounded::<EventTrigger>();
  10. // let body_element = prepare_websys_dom();
  11. let mut patch_machine = interpreter::PatchMachine::new(body_element.clone(), move |ev| {
  12. log::debug!("Event trigger! {:#?}", ev);
  13. let mut c = sender.clone();
  14. // wasm_bindgen_futures::spawn_local(async move {
  15. // c.send(ev).await.unwrap();
  16. // });
  17. });
  18. let root_node = body_element.first_child().unwrap();
  19. patch_machine.stack.push(root_node.clone());
  20. // todo: initialize the event registry properly on the root
  21. let edits = self.internal_dom.rebuild()?;
  22. log::debug!("Received edits: {:#?}", edits);
  23. edits.iter().for_each(|edit| {
  24. log::debug!("patching with {:?}", edit);
  25. patch_machine.handle_edit(edit);
  26. });
  27. patch_machine.reset();
  28. let root_node = body_element.first_child().unwrap();
  29. patch_machine.stack.push(root_node.clone());
  30. // log::debug!("patch stack size {:?}", patch_machine.stack);
  31. // Event loop waits for the receiver to finish up
  32. // TODO! Connect the sender to the virtual dom's suspense system
  33. // Suspense is basically an external event that can force renders to specific nodes
  34. while let Ok(event) = receiver.recv().await {
  35. log::debug!("Stack before entrance {:#?}", patch_machine.stack.top());
  36. // log::debug!("patch stack size before {:#?}", patch_machine.stack);
  37. // patch_machine.reset();
  38. // patch_machine.stack.push(root_node.clone());
  39. let edits = self.internal_dom.progress_with_event(event)?;
  40. log::debug!("Received edits: {:#?}", edits);
  41. for edit in &edits {
  42. log::debug!("edit stream {:?}", edit);
  43. // log::debug!("Stream stack {:#?}", patch_machine.stack.top());
  44. patch_machine.handle_edit(edit);
  45. }
  46. // log::debug!("patch stack size after {:#?}", patch_machine.stack);
  47. patch_machine.reset();
  48. // our root node reference gets invalidated
  49. // not sure why
  50. // for now, just select the first child again.
  51. // eventually, we'll just make our own root element instead of using body
  52. // or just use body directly IDEK
  53. let root_node = body_element.first_child().unwrap();
  54. patch_machine.stack.push(root_node.clone());
  55. }
  56. Ok(()) // should actually never return from this, should be an error, rustc just cant see it
  57. }
  58. }