diff --git a/frontend/src/popup.rs b/frontend/src/popup.rs index 7ad1edd..0ca1419 100644 --- a/frontend/src/popup.rs +++ b/frontend/src/popup.rs @@ -1,13 +1,15 @@ use crate::bridge::invoke; -use leptos::{html::Input, prelude::*}; -use wasm_bindgen::{prelude::Closure, JsCast}; +use leptos::{ev::keydown, html::Input, prelude::*}; +use wasm_bindgen::{prelude::Closure, JsCast, JsValue}; +use wasm_bindgen_futures::spawn_local; #[component] pub fn Popup() -> impl IntoView { + // Prompt signals and and action let prompt_input_ref = NodeRef::::new(); let (prompt_text, set_prompt_text) = signal(String::new()); let (prompt_result, set_prompt_result) = signal(String::new()); - + // Action that calls the promp daemon let prompt_action = Action::new_local(|prompt: &String| { let prompt = prompt.clone(); async move { @@ -20,13 +22,13 @@ pub fn Popup() -> impl IntoView { result } }); - + // Update the model response div with the prompt result Effect::new(move |_| { if let Some(result) = prompt_action.value().get() { set_prompt_result.set(result) } }); - + // Clear the propt text-input when the window loses focus (and is hidden) Effect::new(move |_| { let Some(input_el) = prompt_input_ref.get() else { return; @@ -42,6 +44,14 @@ pub fn Popup() -> impl IntoView { handle_focus.forget(); }); + // Hide the popup when ESC is pressed + let _ = window_event_listener(keydown, move |ev| { + if ev.key() == "Escape" { + spawn_local(async move { + let _ = invoke("toggle_popup", JsValue::UNDEFINED).await; + }); + } + }); view! {