diff --git a/src/ui/key_handler/enter_handlers.rs b/src/ui/key_handler/enter_handlers.rs index 4e2bfe2..776c0d0 100644 --- a/src/ui/key_handler/enter_handlers.rs +++ b/src/ui/key_handler/enter_handlers.rs @@ -2,8 +2,8 @@ use crate::models::{Order, ORDER_HISTORY_BULK_DELETE_STATUSES}; use crate::shared::permissions::SolverPermission; use crate::ui::admin_state::AddSolverState; use crate::ui::helpers::{ - build_active_order_chat_list, save_order_chat_message, selected_filtered_book_order, - selected_filtered_dispute, selected_pending_dispute, + build_active_order_chat_list, save_order_chat_message, save_user_dispute_chat_message, + selected_filtered_book_order, selected_filtered_dispute, selected_pending_dispute, }; use crate::ui::key_handler::chat_helpers::{ build_order_action_view_state, handle_enter_finalize_popup, message_counter, diff --git a/src/ui/key_handler/navigation.rs b/src/ui/key_handler/navigation.rs index 4c20459..93b6177 100644 --- a/src/ui/key_handler/navigation.rs +++ b/src/ui/key_handler/navigation.rs @@ -1,6 +1,6 @@ use crate::ui::helpers::{ - active_order_chat_list_len, move_book_order_selection, move_dispute_selection, - move_pending_dispute_selection, + active_order_chat_list_len, active_order_chat_list_snapshot, move_book_order_selection, + move_dispute_selection, move_pending_dispute_selection, }; use crate::ui::orders::strip_new_order_messages_and_clamp_selected; use crate::ui::{ @@ -522,6 +522,27 @@ pub fn handle_tab_navigation(code: KeyCode, app: &mut AppState) { // Reset scroll/selection when switching parties (will be set in render) app.admin_chat_selected_message_idx = None; app.admin_chat_scroll_tracker = None; + } else if matches!(app.active_tab, Tab::User(UserTab::MyTrades)) { + let rows = active_order_chat_list_snapshot(app); + let solver_available = rows + .get(app.selected_order_chat_idx) + .is_some_and(|row| row.solver_pubkey.is_some()) + || rows.get(app.selected_order_chat_idx).is_some_and(|row| { + uuid::Uuid::parse_str(&row.order_id) + .ok() + .and_then(|id| app.order_chat_static.get(&id)) + .and_then(|header| header.solver_pubkey.as_ref()) + .is_some() + }); + if solver_available { + app.active_user_chat_channel = match app.active_user_chat_channel { + UserChatChannel::Peer => UserChatChannel::Solver, + UserChatChannel::Solver => UserChatChannel::Peer, + }; + app.order_chat_input.clear(); + app.order_chat_selected_message_idx = None; + app.order_chat_scroll_tracker = None; + } } else if let Tab::Admin(AdminTab::Observer) = app.active_tab { app.observer_input_focus = app.observer_input_focus.toggle(); } else if let UiMode::UserMode(UserMode::CreatingOrder(ref mut form)) = app.mode { @@ -537,6 +558,8 @@ pub fn handle_tab_navigation(code: KeyCode, app: &mut AppState) { // Reset scroll/selection when switching parties (will be set in render) app.admin_chat_selected_message_idx = None; app.admin_chat_scroll_tracker = None; + } else if matches!(app.active_tab, Tab::User(UserTab::MyTrades)) { + handle_tab_navigation(KeyCode::Tab, app); } else if let Tab::Admin(AdminTab::Observer) = app.active_tab { app.observer_input_focus = app.observer_input_focus.toggle(); } else if let UiMode::UserMode(UserMode::CreatingOrder(ref mut form)) = app.mode { diff --git a/src/ui/mod.rs b/src/ui/mod.rs index f428d90..9389f69 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -47,7 +47,7 @@ pub use state::{ InvoiceNotificationActionSelection, KeyInputState, LnAddressVerifyResult, MessageNotification, MessageViewState, MostroInfoFetchResult, ObserverInputField, OperationResult, OrderChatLastSeen, OrderChatStaticHeader, OrderChatUpdate, OrderMessage, RatingOrderState, Tab, - TakeOrderState, ThreeState, UiMode, UserChatSender, UserOrderChatMessage, UserRole, UserTab, - ViewingMessageButtonSelection, + TakeOrderState, ThreeState, UiMode, UserChatChannel, UserChatSender, UserOrderChatMessage, + UserRole, UserTab, ViewingMessageButtonSelection, }; pub use user_state::UserMode; diff --git a/src/ui/tabs/order_in_progress_tab.rs b/src/ui/tabs/order_in_progress_tab.rs index 0a644ac..49ee642 100644 --- a/src/ui/tabs/order_in_progress_tab.rs +++ b/src/ui/tabs/order_in_progress_tab.rs @@ -14,7 +14,7 @@ use crate::ui::constants::{ FOOTER_MYTRADES_SELECT_ORDER, FOOTER_MYTRADES_SHIFT_C_CANCEL, FOOTER_MYTRADES_SHIFT_D_DISPUTE, FOOTER_MYTRADES_SHIFT_F_FIAT_SENT, FOOTER_MYTRADES_SHIFT_I_DISABLE, FOOTER_MYTRADES_SHIFT_I_ENABLE, FOOTER_MYTRADES_SHIFT_K_KCONV, FOOTER_MYTRADES_SHIFT_R_RELEASE, - FOOTER_MYTRADES_SHIFT_V_RATE, FOOTER_SENDING_ATTACHMENT, HELP_KEY, + FOOTER_MYTRADES_SHIFT_V_RATE, FOOTER_MYTRADES_TAB_CHAT, FOOTER_SENDING_ATTACHMENT, HELP_KEY, }; use crate::ui::helpers::{ active_order_chat_list_snapshot, count_order_attachments, format_local_timestamp,