hot_reload.rs 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. use dioxus_core::SchedulerMsg;
  2. use dioxus_core::SetTemplateMsg;
  3. use dioxus_core::VirtualDom;
  4. use wasm_bindgen::closure::Closure;
  5. use wasm_bindgen::JsCast;
  6. use web_sys::{MessageEvent, WebSocket};
  7. pub(crate) fn init(dom: &VirtualDom) {
  8. let window = web_sys::window().unwrap();
  9. let protocol = if window.location().protocol().unwrap() == "https:" {
  10. "wss:"
  11. } else {
  12. "ws:"
  13. };
  14. let url = format!(
  15. "{protocol}//{}/_dioxus/hot_reload",
  16. window.location().host().unwrap()
  17. );
  18. let ws = WebSocket::new(&url).unwrap();
  19. let mut channel = dom.get_scheduler_channel();
  20. // change the rsx when new data is received
  21. let cl = Closure::wrap(Box::new(move |e: MessageEvent| {
  22. if let Ok(text) = e.data().dyn_into::<js_sys::JsString>() {
  23. let msg: SetTemplateMsg = serde_json::from_str(&format!("{text}")).unwrap();
  24. channel
  25. .start_send(SchedulerMsg::SetTemplate(Box::new(msg)))
  26. .unwrap();
  27. }
  28. }) as Box<dyn FnMut(MessageEvent)>);
  29. ws.set_onmessage(Some(cl.as_ref().unchecked_ref()));
  30. cl.forget();
  31. }