Close popup with esc

This commit is contained in:
2026-02-07 20:10:22 +02:00
parent dfa3f2dd75
commit 71d957882c

View File

@@ -1,13 +1,15 @@
use crate::bridge::invoke; use crate::bridge::invoke;
use leptos::{html::Input, prelude::*}; use leptos::{ev::keydown, html::Input, prelude::*};
use wasm_bindgen::{prelude::Closure, JsCast}; use wasm_bindgen::{prelude::Closure, JsCast, JsValue};
use wasm_bindgen_futures::spawn_local;
#[component] #[component]
pub fn Popup() -> impl IntoView { pub fn Popup() -> impl IntoView {
// Prompt signals and and action
let prompt_input_ref = NodeRef::<Input>::new(); let prompt_input_ref = NodeRef::<Input>::new();
let (prompt_text, set_prompt_text) = signal(String::new()); let (prompt_text, set_prompt_text) = signal(String::new());
let (prompt_result, set_prompt_result) = 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_action = Action::new_local(|prompt: &String| {
let prompt = prompt.clone(); let prompt = prompt.clone();
async move { async move {
@@ -20,13 +22,13 @@ pub fn Popup() -> impl IntoView {
result result
} }
}); });
// Update the model response div with the prompt result
Effect::new(move |_| { Effect::new(move |_| {
if let Some(result) = prompt_action.value().get() { if let Some(result) = prompt_action.value().get() {
set_prompt_result.set(result) set_prompt_result.set(result)
} }
}); });
// Clear the propt text-input when the window loses focus (and is hidden)
Effect::new(move |_| { Effect::new(move |_| {
let Some(input_el) = prompt_input_ref.get() else { let Some(input_el) = prompt_input_ref.get() else {
return; return;
@@ -42,6 +44,14 @@ pub fn Popup() -> impl IntoView {
handle_focus.forget(); 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! { view! {
<main class="window-shell rounded-container"> <main class="window-shell rounded-container">