~/hooky

hooky/command/src/app.rs -rw-r--r-- 2.92 kB
89bc4b52 — Arthur Melton init command 2 years ago

            
89bc4b52 Arthur Melton
335dec98 Arthur Melton
89bc4b52 Arthur Melton
335dec98 Arthur Melton
89bc4b52 Arthur Melton
335dec98 Arthur Melton
dfc58611 Arthur Melton
335dec98 Arthur Melton
dfc58611 Arthur Melton
335dec98 Arthur Melton
dfc58611 Arthur Melton
335dec98 Arthur Melton
dfc58611 Arthur Melton
335dec98 Arthur Melton
89bc4b52 Arthur Melton
dfc58611 Arthur Melton
89bc4b52 Arthur Melton
61266a51 Arthur Melton
89bc4b52 Arthur Melton
335dec98 Arthur Melton
dfc58611 Arthur Melton
b90df7a0 Arthur Melton
dfc58611 Arthur Melton
b90df7a0 Arthur Melton
dfc58611 Arthur Melton
335dec98 Arthur Melton
dfc58611 Arthur Melton
335dec98 Arthur Melton
89bc4b52 Arthur Melton
89bc4b52 Arthur Melton
c1f59a62 Arthur Melton
dfc58611 Arthur Melton
c1f59a62 Arthur Melton
ccd18781 Arthur Melton
c1f59a62 Arthur Melton
89bc4b52 Arthur Melton
ccd18781 Arthur Melton
89bc4b52 Arthur Melton
dfc58611 Arthur Melton
335dec98 Arthur Melton
dfc58611 Arthur Melton
335dec98 Arthur Melton
c1f59a62 Arthur Melton
dfc58611 Arthur Melton
335dec98 Arthur Melton
dfc58611 Arthur Melton
335dec98 Arthur Melton
b90df7a0 Arthur Melton
335dec98 Arthur Melton
89bc4b52 Arthur Melton
335dec98 Arthur Melton
89bc4b52 Arthur Melton
c1f59a62 Arthur Melton
89bc4b52 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>
    }
}