89bc4b52 Arthur Melton335dec98 Arthur Melton89bc4b52 Arthur Melton335dec98 Arthur Melton89bc4b52 Arthur Melton335dec98 Arthur Meltondfc58611 Arthur Melton335dec98 Arthur Meltondfc58611 Arthur Melton335dec98 Arthur Meltondfc58611 Arthur Melton335dec98 Arthur Meltondfc58611 Arthur Melton335dec98 Arthur Melton89bc4b52 Arthur Meltondfc58611 Arthur Melton89bc4b52 Arthur Melton61266a51 Arthur Melton89bc4b52 Arthur Melton335dec98 Arthur Meltondfc58611 Arthur Meltonb90df7a0 Arthur Meltondfc58611 Arthur Meltonb90df7a0 Arthur Meltondfc58611 Arthur Melton335dec98 Arthur Meltondfc58611 Arthur Melton335dec98 Arthur Melton89bc4b52 Arthur Melton89bc4b52 Arthur Meltonc1f59a62 Arthur Meltondfc58611 Arthur Meltonc1f59a62 Arthur Meltonccd18781 Arthur Meltonc1f59a62 Arthur Melton89bc4b52 Arthur Meltonccd18781 Arthur Melton89bc4b52 Arthur Meltondfc58611 Arthur Melton335dec98 Arthur Meltondfc58611 Arthur Melton335dec98 Arthur Meltonc1f59a62 Arthur Meltondfc58611 Arthur Melton335dec98 Arthur Meltondfc58611 Arthur Melton335dec98 Arthur Meltonb90df7a0 Arthur Melton335dec98 Arthur Melton89bc4b52 Arthur Melton335dec98 Arthur Melton89bc4b52 Arthur Meltonc1f59a62 Arthur Melton89bc4b52 Arthur Melton
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
use serde::{Deserialize, Serialize};
use serde_wasm_bindgen::to_value;
use wasm_bindgen::prelude::*;
use wasm_bindgen_futures::spawn_local;
use yew::prelude::*;
#[wasm_bindgen]
extern "C" {
#[wasm_bindgen(js_namespace = ["window", "__TAURI__", "tauri"])]
async fn invoke(cmd: &str, args: JsValue) -> JsValue;
#[wasm_bindgen(js_namespace = console)]
fn log(s: &str);
}
#[derive(Serialize, Deserialize)]
struct GreetArgs<'a> {
name: &'a str,
}
#[function_component(App)]
pub fn app() -> Html {
let greet_input_ref = use_node_ref();
let name = use_state(|| String::new());
let greet_msg = use_state(|| String::new());
{
let greet_msg = greet_msg.clone();
let name = name.clone();
let name2 = name.clone();
use_effect_with_deps(
move |_| {
spawn_local(async move {
if name.is_empty() {
return;
}
// Learn more about Tauri commands at https://tauri.app/v1/guides/features/command
let new_msg = invoke(
"greet",
to_value(&GreetArgs { name: &*name }).unwrap(),
)
.await;
log(&new_msg.as_string().unwrap());
greet_msg.set(new_msg.as_string().unwrap());
});
|| {}
},
name2,
);
}
let greet = {
let name = name.clone();
let greet_input_ref = greet_input_ref.clone();
Callback::from(move |_| {
name.set(greet_input_ref.cast::<web_sys::HtmlInputElement>().unwrap().value());
})
};
html! {
<main class="container">
<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://yew.rs" target="_blank">
<img src="public/yew.png" class="logo yew" alt="Yew logo"/>
</a>
</div>
<p>{"Click on the Tauri and Yew logos to learn more."}</p>
<p>
{"Recommended IDE setup: "}
<a href="https://code.visualstudio.com/" target="_blank">{"VS Code"}</a>
{" + "}
<a href="https://github.com/tauri-apps/tauri-vscode" target="_blank">{"Tauri"}</a>
{" + "}
<a href="https://github.com/rust-lang/rust-analyzer" target="_blank">{"rust-analyzer"}</a>
</p>
<div class="row">
<input id="greet-input" ref={greet_input_ref} placeholder="Enter a name..." />
<button type="button" onclick={greet}>{"Greet"}</button>
</div>
<p><b>{ &*greet_msg }</b></p>
</main>
}
}