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}