use crate::i18n::{t, Locale}; use dioxus::prelude::*; use dioxus_free_icons::icons::fa_solid_icons::{FaCopy, FaPenToSquare, FaShareNodes}; /// Action bar displayed above the chat input with copy, share, and edit buttons. /// /// Only visible when there is at least one message in the conversation. /// /// # Arguments /// /// * `on_copy` - Copies the last assistant response to the clipboard /// * `on_share` - Copies the full conversation as text to the clipboard /// * `on_edit` - Places the last user message back in the input for editing /// * `has_messages` - Whether any messages exist (hides the bar when empty) /// * `has_assistant_message` - Whether an assistant message exists (disables copy if not) /// * `has_user_message` - Whether a user message exists (disables edit if not) #[component] pub fn ChatActionBar( on_copy: EventHandler<()>, on_share: EventHandler<()>, on_edit: EventHandler<()>, has_messages: bool, has_assistant_message: bool, has_user_message: bool, ) -> Element { let locale = use_context::>(); let l = *locale.read(); if !has_messages { return rsx! {}; } rsx! { div { class: "chat-action-bar", button { class: "chat-action-btn", disabled: !has_assistant_message, title: "{t(l, \"chat.copy_response\")}", onclick: move |_| on_copy.call(()), dioxus_free_icons::Icon { icon: FaCopy, width: 14, height: 14, } span { class: "chat-action-label", "{t(l, \"common.copy\")}" } } button { class: "chat-action-btn", title: "{t(l, \"chat.copy_conversation\")}", onclick: move |_| on_share.call(()), dioxus_free_icons::Icon { icon: FaShareNodes, width: 14, height: 14, } span { class: "chat-action-label", "{t(l, \"common.share\")}" } } button { class: "chat-action-btn", disabled: !has_user_message, title: "{t(l, \"chat.edit_last\")}", onclick: move |_| on_edit.call(()), dioxus_free_icons::Icon { icon: FaPenToSquare, width: 14, height: 14, } span { class: "chat-action-label", "{t(l, \"common.edit\")}" } } } } }