t_web/
view.rs

1use crate::log::error;
2use leptos::task::spawn_local;
3use leptos::{ev::SubmitEvent, prelude::*};
4use serde::{Deserialize, Serialize};
5use wasm_bindgen::prelude::*;
6
7#[wasm_bindgen]
8extern "C" {
9    #[wasm_bindgen(js_namespace = ["window", "__TAURI__", "core"])]
10    async fn invoke(cmd: &str, args: JsValue) -> JsValue;
11}
12
13#[derive(Serialize, Deserialize)]
14struct GreetArgs<'a> {
15    name: &'a str,
16}
17
18#[component]
19pub fn Main() -> impl IntoView {
20    let (name, set_name) = signal(String::new());
21    let (greet_msg, set_greet_msg) = signal(String::new());
22
23    let update_name = move |ev| {
24        let v = event_target_value(&ev);
25        set_name.set(v);
26    };
27
28    let greet = move |ev: SubmitEvent| {
29        ev.prevent_default();
30        spawn_local(async move {
31            let name = name.get_untracked();
32            if name.is_empty() {
33                return;
34            }
35
36            match crate::rpc::get_username(name).await {
37                Ok(username) => set_greet_msg.set(username),
38                Err(err) => error!(err),
39            }
40        });
41    };
42
43    view! {
44        <main class="container">
45            <h1>"Welcome to Tauri + Leptos"</h1>
46
47            <div class="row">
48                <a href="https://tauri.app" target="_blank">
49                    <img src="public/tauri.svg" class="logo tauri" alt="Tauri logo"/>
50                </a>
51                <a href="https://docs.rs/leptos/" target="_blank">
52                    <img src="public/leptos.svg" class="logo leptos" alt="Leptos logo"/>
53                </a>
54            </div>
55            <p>"Click on the Tauri and Leptos logos to learn more."</p>
56
57            <form class="row" on:submit=greet>
58                <input
59                    id="greet-input"
60                    placeholder="Enter a name..."
61                    on:input=update_name
62                />
63                <button type="submit">"Greet"</button>
64            </form>
65            <p>{ move || greet_msg.get() }</p>
66        </main>
67    }
68}