1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- //! This example shows how to create a popup window and send data back to the parent window.
- use std::rc::Rc;
- use dioxus::prelude::*;
- use futures_util::StreamExt;
- fn main() {
- dioxus_desktop::launch(app);
- }
- fn app() -> Element {
- let emails_sent = use_signal(|| Vec::new() as Vec<String>);
- // Wait for responses to the compose channel, and then push them to the emails_sent signal.
- let handle = use_coroutine(|mut rx: UnboundedReceiver<String>| async move {
- while let Some(message) = rx.next().await {
- emails_sent.write().push(message);
- }
- });
- let open_compose_window = move |evt: MouseEvent| {
- let tx = handle.tx();
- dioxus_desktop::window().new_window(
- VirtualDom::new_with_props(compose, Rc::new(move |s| tx.unbounded_send(s))),
- Default::default(),
- );
- };
- rsx! {
- h1 { "This is your email" }
- button { onclick: open_compose_window, "Click to compose a new email" }
- ul {
- for message in emails_sent.read().iter() {
- li {
- h3 { "email" }
- span { "{message}" }
- }
- }
- }
- }
- }
- fn compose(send: Rc<dyn Fn(String)>) -> Element {
- let user_input = use_signal(String::new);
- rsx! {
- div {
- h1 { "Compose a new email" }
- button {
- onclick: move |_| {
- send(user_input.get().clone());
- dioxus_desktop::window().close();
- },
- "Click to send"
- }
- input { oninput: move |e| user_input.set(e.value()), value: "{user_input}" }
- }
- }
- }
|