simpletide.rs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. pub fn main() {
  2. #[cfg(feature = "client")]
  3. wasm_bindgen_futures::spawn_local(async { client::app().await.unwrap() });
  4. #[cfg(feature = "server")]
  5. async_std::task::block_on(async { server::app().await.expect("") });
  6. }
  7. /// ===============================
  8. /// Common code (shared types)
  9. /// ===============================
  10. #[derive(PartialEq, strum::EnumIter, strum::Display, strum::AsRefStr, strum::EnumString)]
  11. pub enum SelectedStream {
  12. Football,
  13. Hockey,
  14. Socker,
  15. }
  16. /// Client-specific code
  17. #[cfg(feature = "client")]
  18. mod client {
  19. use super::*;
  20. use dioxus_core::prelude::*;
  21. use strum::IntoEnumIterator;
  22. pub async fn app() -> anyhow::Result<()> {
  23. Ok(dioxus_web::WebsysRenderer::start(APP).await)
  24. }
  25. static APP: FC<()> = |cx| {
  26. todo!()
  27. // let (selected_stream, set_stream) = use_state(cx, || SelectedStream::Football);
  28. // let opts = SelectedStream::iter().map(|name| rsx! { option { "{name}", value: "{name}" } });
  29. // cx.render(rsx! {
  30. // div {
  31. // h1 { "Tide basic CRUD app" }
  32. // h2 { "Chosen stream: {selected_stream}" }
  33. // select {
  34. // value: {selected_stream.as_ref()}
  35. // "{selected_stream}"
  36. // {opts}
  37. // }
  38. // }
  39. // })
  40. };
  41. }
  42. /// Server-specific code
  43. #[cfg(feature = "server")]
  44. mod server {
  45. use async_std::sync::RwLock;
  46. pub use log::info;
  47. use std::sync::Arc;
  48. use tide::Request;
  49. use tide_websockets::{Message, WebSocket, WebSocketConnection};
  50. use crate::SelectedStream;
  51. // type ServerRequest = Request<Arc<RwLock<()>>>;
  52. type ServerRequest = Request<()>;
  53. // type ServerRequest = Request<Arc<RwLock<ServerState>>>;
  54. static CLIENT_PATH: &'static str = "";
  55. pub async fn app() -> anyhow::Result<()> {
  56. let mut app = tide::new();
  57. app.at("")
  58. .serve_dir(format!("{}/pkg", CLIENT_PATH))
  59. .expect("Cannot serve directory");
  60. app.at("/updates").get(WebSocket::new(socket_handler));
  61. let addr = "0.0.0.0:9001";
  62. log::info!("Congrats! Server is up and running at http://{}", addr);
  63. app.listen(addr).await?;
  64. Ok(())
  65. }
  66. async fn socket_handler(
  67. request: ServerRequest,
  68. stream: WebSocketConnection,
  69. ) -> tide::Result<()> {
  70. // clone the receiver channel
  71. // subscribe to any updates
  72. // let receiver = request.state().read().await.receiver.clone();
  73. // while let Ok(evt) = receiver.recv().await {
  74. // let response_msg = serde_json::to_string(&evt)?;
  75. // stream.send_string(response_msg).await?;
  76. // }
  77. Ok(())
  78. }
  79. use dioxus_core::prelude::*;
  80. #[derive(PartialEq, Props)]
  81. struct SreamListProps {
  82. selected_stream: SelectedStream,
  83. }
  84. static STREAM_LIST: FC<SreamListProps> = |cx| {
  85. //
  86. let g = match cx.selected_stream {
  87. SelectedStream::Football => cx.render(rsx! {
  88. li {
  89. "watch football!"
  90. }
  91. }),
  92. SelectedStream::Hockey => cx.render(rsx! {
  93. li {
  94. "watch football!"
  95. }
  96. }),
  97. SelectedStream::Socker => cx.render(rsx! {
  98. li {
  99. "watch football!"
  100. }
  101. }),
  102. };
  103. cx.render(rsx! {
  104. div {
  105. }
  106. })
  107. };
  108. }