salvo.rs 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. use dioxus::prelude::*;
  2. use dioxus_liveview::LiveViewPool;
  3. use salvo::affix;
  4. use salvo::prelude::*;
  5. use std::net::SocketAddr;
  6. use std::sync::Arc;
  7. fn app() -> Element {
  8. let mut num = use_signal(|| 0);
  9. rsx! {
  10. div {
  11. "hello salvo! {num}"
  12. button { onclick: move |_| num += 1, "Increment" }
  13. }
  14. }
  15. }
  16. #[tokio::main]
  17. async fn main() {
  18. pretty_env_logger::init();
  19. let addr = "127.0.0.1:3030";
  20. let acceptor = TcpListener::new(addr).bind().await;
  21. let view = LiveViewPool::new();
  22. let router = Router::new()
  23. .hoop(affix::inject(Arc::new(view)))
  24. .get(index)
  25. .push(Router::with_path("ws").get(connect));
  26. println!("Listening on http://{}", addr);
  27. Server::new(acceptor).serve(router).await;
  28. }
  29. #[handler]
  30. fn index(res: &mut Response) {
  31. let addr: SocketAddr = ([127, 0, 0, 1], 3030).into();
  32. res.render(Text::Html(format!(
  33. r#"
  34. <!DOCTYPE html>
  35. <html>
  36. <head> <title>Dioxus LiveView with Salvo</title> </head>
  37. <body> <div id="main"></div> </body>
  38. {glue}
  39. </html>
  40. "#,
  41. glue = dioxus_liveview::interpreter_glue(&format!("ws://{addr}/ws"))
  42. )));
  43. }
  44. #[handler]
  45. async fn connect(
  46. req: &mut Request,
  47. depot: &mut Depot,
  48. res: &mut Response,
  49. ) -> Result<(), StatusError> {
  50. let view = depot.obtain::<Arc<LiveViewPool>>().unwrap().clone();
  51. WebSocketUpgrade::new()
  52. .upgrade(req, res, |ws| async move {
  53. _ = view.launch(dioxus_liveview::salvo_socket(ws), app).await;
  54. })
  55. .await
  56. }