compose.rs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. //! This example shows how to create a popup window and send data back to the parent window.
  2. use dioxus::prelude::*;
  3. use dioxus_desktop::use_window;
  4. use futures_util::StreamExt;
  5. fn main() {
  6. dioxus_desktop::launch(app);
  7. }
  8. fn app(cx: Scope) -> Element {
  9. let window = use_window(cx);
  10. let emails_sent = use_ref(cx, Vec::new);
  11. let tx = use_coroutine(cx, |mut rx: UnboundedReceiver<String>| {
  12. to_owned![emails_sent];
  13. async move {
  14. while let Some(message) = rx.next().await {
  15. emails_sent.write().push(message);
  16. }
  17. }
  18. })
  19. .unwrap();
  20. cx.render(rsx! {
  21. div {
  22. h1 { "This is your email" }
  23. button {
  24. onclick: move |_| {
  25. let dom = VirtualDom::new_with_props(compose, ComposeProps { app_tx: tx.clone() });
  26. window.new_window(dom, Default::default());
  27. },
  28. "Click to compose a new email"
  29. }
  30. ul {
  31. emails_sent.read().iter().map(|message| cx.render(rsx! {
  32. li {
  33. h3 { "email" }
  34. span {"{message}"}
  35. }
  36. }))
  37. }
  38. }
  39. })
  40. }
  41. struct ComposeProps {
  42. app_tx: Coroutine<String>,
  43. }
  44. fn compose(cx: Scope<ComposeProps>) -> Element {
  45. let user_input = use_state(cx, String::new);
  46. let window = use_window(cx);
  47. cx.render(rsx! {
  48. div {
  49. h1 { "Compose a new email" }
  50. button {
  51. onclick: move |_| {
  52. cx.props.app_tx.send(user_input.get().clone());
  53. window.close();
  54. },
  55. "Click to send"
  56. }
  57. input {
  58. oninput: move |e| {
  59. user_input.set(e.value.clone());
  60. },
  61. value: "{user_input}"
  62. }
  63. }
  64. })
  65. }