From b7f9ac043d9542f5fedad5b9ad126d8cde91f8f1 Mon Sep 17 00:00:00 2001 From: Jarno Date: Wed, 25 Feb 2026 20:19:09 +0200 Subject: [PATCH] feat: added confirm dialog for new chat --- frontend/src-tauri/src/main.rs | 2 + frontend/src/components.rs | 26 ++++++++++++ frontend/src/popup.rs | 13 +++++- frontend/styles-input.css | 4 ++ frontend/styles.css | 74 ++++++++++++++++++++++++++++++++++ 5 files changed, 117 insertions(+), 2 deletions(-) diff --git a/frontend/src-tauri/src/main.rs b/frontend/src-tauri/src/main.rs index 9fa132d..0341f0a 100644 --- a/frontend/src-tauri/src/main.rs +++ b/frontend/src-tauri/src/main.rs @@ -16,6 +16,7 @@ pub struct AppConfig { pub struct AppState { grpc_client: Mutex>, config: Mutex, + current_chat_id: Mutex, } #[tokio::main] @@ -27,6 +28,7 @@ async fn main() { .manage(AppState { grpc_client: Mutex::new(client), config: Mutex::new(AppConfig { dark_mode: true }), + current_chat_id: Mutex::new(-1), }) .plugin(tauri_plugin_global_shortcut::Builder::new().build()) .invoke_handler(tauri::generate_handler![ diff --git a/frontend/src/components.rs b/frontend/src/components.rs index 16a0d4c..e452938 100644 --- a/frontend/src/components.rs +++ b/frontend/src/components.rs @@ -99,3 +99,29 @@ pub fn DarkModeToggle() -> impl IntoView { } } + +const DIALOG_BUTTON: &str = "primary-button p-3 m-3"; + +#[component] +pub fn ConfirmDialog( + is_open: ReadSignal, + on_confirm: Callback<()>, + on_cancel: Callback<()>, + title: String, + message: String, +) -> impl IntoView { + view! { + +
+
+

{ title.clone() }

+

{ message.clone() }

+
+ + +
+
+
+
+ } +} diff --git a/frontend/src/popup.rs b/frontend/src/popup.rs index cdd9b40..4929986 100644 --- a/frontend/src/popup.rs +++ b/frontend/src/popup.rs @@ -1,6 +1,6 @@ use crate::{ bridge::{invoke, invoke_typed}, - components::{DaemonProvider, DarkModeToggle, ThemeProvider}, + components::{ConfirmDialog, DaemonProvider, DarkModeToggle, ThemeProvider}, }; use feshared::{ chatmessage::{Message, MessageHistory, TauriCommand}, @@ -93,7 +93,15 @@ pub fn Popup() -> impl IntoView { } }); + let (show_new_chat_confirm, set_new_chat_confirm) = signal(false); + view! { +
impl IntoView { + dark:hover:bg-slate-600" + on:click=move |_| set_new_chat_confirm.set(true)>+
diff --git a/frontend/styles-input.css b/frontend/styles-input.css index 86e32bd..750b974 100644 --- a/frontend/styles-input.css +++ b/frontend/styles-input.css @@ -14,6 +14,10 @@ .msg-user { @apply self-end bg-slate-200 dark:bg-zinc-800; } + + .primary-button { + @apply bg-blue-300 dark:bg-gray-800 rounded-lg p-3; + } } body { diff --git a/frontend/styles.css b/frontend/styles.css index 139d803..298bde3 100644 --- a/frontend/styles.css +++ b/frontend/styles.css @@ -579,6 +579,9 @@ .sticky { position: sticky; } + .inset-0 { + inset: calc(var(--spacing) * 0); + } .right-0 { right: calc(var(--spacing) * 0); } @@ -672,6 +675,9 @@ .m-0 { margin: calc(var(--spacing) * 0); } + .m-3 { + margin: calc(var(--spacing) * 3); + } .-mx-1 { margin-inline: calc(var(--spacing) * -1); } @@ -693,6 +699,9 @@ .mt-8 { margin-top: calc(var(--spacing) * 8); } + .mb-2 { + margin-bottom: calc(var(--spacing) * 2); + } .mb-8 { margin-bottom: calc(var(--spacing) * 8); } @@ -774,6 +783,10 @@ .field-sizing-fixed { field-sizing: fixed; } + .size-3 { + width: calc(var(--spacing) * 3); + height: calc(var(--spacing) * 3); + } .size-3\.5 { width: calc(var(--spacing) * 3.5); height: calc(var(--spacing) * 3.5); @@ -1280,6 +1293,9 @@ .justify-items-stretch { justify-items: stretch; } + .gap-1 { + gap: calc(var(--spacing) * 1); + } .gap-1\.5 { gap: calc(var(--spacing) * 1.5); } @@ -1559,6 +1575,9 @@ .bg-\[\#fbf0df\] { background-color: #fbf0df; } + .bg-blue-300 { + background-color: var(--color-blue-300); + } .bg-green-600 { background-color: var(--color-green-600); } @@ -1574,6 +1593,12 @@ .bg-white { background-color: var(--color-white); } + .bg-white\/30 { + background-color: color-mix(in srgb, #fff 30%, transparent); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--color-white) 30%, transparent); + } + } .bg-yellow-600 { background-color: var(--color-yellow-600); } @@ -2025,6 +2050,10 @@ font-size: var(--text-base); line-height: var(--tw-leading, var(--text-base--line-height)); } + .text-lg { + font-size: var(--text-lg); + line-height: var(--tw-leading, var(--text-lg--line-height)); + } .text-sm { font-size: var(--text-sm); line-height: var(--tw-leading, var(--text-sm--line-height)); @@ -2805,11 +2834,48 @@ line-height: var(--tw-leading, var(--text-sm--line-height)); } } + .dark\:bg-black\/10 { + &:where(.dark, .dark *) { + background-color: color-mix(in srgb, #000 10%, transparent); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--color-black) 10%, transparent); + } + } + } + .dark\:bg-black\/30 { + &:where(.dark, .dark *) { + background-color: color-mix(in srgb, #000 30%, transparent); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--color-black) 30%, transparent); + } + } + } + .dark\:bg-gray-800 { + &:where(.dark, .dark *) { + background-color: var(--color-gray-800); + } + } .dark\:bg-slate-800 { &:where(.dark, .dark *) { background-color: var(--color-slate-800); } } + .dark\:bg-white\/10 { + &:where(.dark, .dark *) { + background-color: color-mix(in srgb, #fff 10%, transparent); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--color-white) 10%, transparent); + } + } + } + .dark\:bg-white\/50 { + &:where(.dark, .dark *) { + background-color: color-mix(in srgb, #fff 50%, transparent); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--color-white) 50%, transparent); + } + } + } .dark\:bg-zinc-900 { &:where(.dark, .dark *) { background-color: var(--color-zinc-900); @@ -2923,6 +2989,14 @@ background-color: var(--color-zinc-800); } } + .primary-button { + border-radius: var(--radius-lg); + background-color: var(--color-blue-300); + padding: calc(var(--spacing) * 3); + &:where(.dark, .dark *) { + background-color: var(--color-gray-800); + } + } } body { background-color: transparent !important;