use crate::log::error;
use leptos::task::spawn_local;
use leptos::{ev::SubmitEvent, prelude::*};
use serde::{Deserialize, Serialize};
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
extern "C" {
#[wasm_bindgen(js_namespace = ["window", "__TAURI__", "core"])]
async fn invoke(cmd: &str, args: JsValue) -> JsValue;
}
#[derive(Serialize, Deserialize)]
struct GreetArgs<'a> {
name: &'a str,
}
#[component]
pub fn Main() -> impl IntoView {
let (name, set_name) = signal(String::new());
let (greet_msg, set_greet_msg) = signal(String::new());
let update_name = move |ev| {
let v = event_target_value(&ev);
set_name.set(v);
};
let greet = move |ev: SubmitEvent| {
ev.prevent_default();
spawn_local(async move {
let name = name.get_untracked();
if name.is_empty() {
return;
}
match crate::rpc::get_username(name).await {
Ok(username) => set_greet_msg.set(username),
Err(err) => error!(err),
}
});
};
view! {
<main class="container">
<h1>"Welcome to Tauri + Leptos"</h1>
<div class="row">
<a href="https://tauri.app" target="_blank">
<img src="public/tauri.svg" class="logo tauri" alt="Tauri logo"/>
</a>
<a href="https://docs.rs/leptos/" target="_blank">
<img src="public/leptos.svg" class="logo leptos" alt="Leptos logo"/>
</a>
</div>
<p>"Click on the Tauri and Leptos logos to learn more."</p>
<form class="row" on:submit=greet>
<input
id="greet-input"
placeholder="Enter a name..."
on:input=update_name
/>
<button type="submit">"Greet"</button>
</form>
<p>{ move || greet_msg.get() }</p>
</main>
}
}