130 lines
6.4 KiB
Rust
130 lines
6.4 KiB
Rust
// src/modes/general/dialog.rs
|
|
|
|
use crossterm::event::{Event, KeyCode};
|
|
use crate::config::binds::config::Config;
|
|
use crate::ui::handlers::context::DialogPurpose;
|
|
use crate::state::app::state::AppState;
|
|
use crate::state::app::buffer::{AppView, BufferState};
|
|
use crate::state::pages::auth::AuthState;
|
|
use crate::state::pages::auth::LoginState;
|
|
use crate::state::pages::auth::RegisterState;
|
|
use crate::modes::handlers::event::EventOutcome;
|
|
use crate::tui::functions::common::{login, register};
|
|
|
|
/// Handles key events specifically when a dialog is active.
|
|
/// Returns Some(Result<EventOutcome, Error>) if the event was handled (consumed),
|
|
/// otherwise returns None.
|
|
pub async fn handle_dialog_event(
|
|
event: &Event,
|
|
config: &Config,
|
|
app_state: &mut AppState,
|
|
auth_state: &mut AuthState,
|
|
login_state: &mut LoginState,
|
|
register_state: &mut RegisterState,
|
|
buffer_state: &mut BufferState,
|
|
) -> Option<Result<EventOutcome, Box<dyn std::error::Error>>> {
|
|
if let Event::Key(key) = event {
|
|
// Always allow Esc to dismiss
|
|
if key.code == KeyCode::Esc {
|
|
app_state.hide_dialog();
|
|
return Some(Ok(EventOutcome::Ok("Dialog dismissed".to_string())));
|
|
}
|
|
|
|
// Check general bindings for dialog actions
|
|
if let Some(action) = config.get_general_action(key.code, key.modifiers) {
|
|
match action {
|
|
"move_down" | "next_option" => {
|
|
let current_index = app_state.ui.dialog.dialog_active_button_index;
|
|
let num_buttons = app_state.ui.dialog.dialog_buttons.len();
|
|
if num_buttons > 0 && current_index < num_buttons - 1 {
|
|
app_state.ui.dialog.dialog_active_button_index += 1;
|
|
}
|
|
return Some(Ok(EventOutcome::Ok(String::new())));
|
|
}
|
|
"move_up" | "previous_option" => {
|
|
let current_index = app_state.ui.dialog.dialog_active_button_index;
|
|
if current_index > 0 {
|
|
app_state.ui.dialog.dialog_active_button_index -= 1;
|
|
}
|
|
return Some(Ok(EventOutcome::Ok(String::new())));
|
|
}
|
|
"select" => {
|
|
let selected_index = app_state.ui.dialog.dialog_active_button_index;
|
|
let purpose = match app_state.ui.dialog.purpose {
|
|
Some(p) => p,
|
|
None => {
|
|
app_state.hide_dialog();
|
|
return Some(Ok(EventOutcome::Ok("Internal Error: Dialog context lost".to_string())));
|
|
}
|
|
};
|
|
|
|
// Handle Dialog Actions Directly Here
|
|
match purpose {
|
|
DialogPurpose::LoginSuccess => {
|
|
match selected_index {
|
|
0 => { // "Menu" button selected
|
|
app_state.hide_dialog();
|
|
let message = login::back_to_main(login_state, app_state, buffer_state).await;
|
|
return Some(Ok(EventOutcome::Ok(message)));
|
|
}
|
|
1 => {
|
|
app_state.hide_dialog();
|
|
return Some(Ok(EventOutcome::Ok("Exiting dialog".to_string())));
|
|
}
|
|
_ => {
|
|
app_state.hide_dialog();
|
|
return Some(Ok(EventOutcome::Ok("Unknown dialog button selected".to_string())));
|
|
}
|
|
}
|
|
}
|
|
DialogPurpose::LoginFailed => {
|
|
match selected_index {
|
|
0 => { // "OK" button selected
|
|
app_state.hide_dialog();
|
|
return Some(Ok(EventOutcome::Ok("Login failed dialog dismissed".to_string())));
|
|
}
|
|
_ => {
|
|
app_state.hide_dialog();
|
|
return Some(Ok(EventOutcome::Ok("Unknown dialog button selected".to_string())));
|
|
}
|
|
}
|
|
}
|
|
DialogPurpose::RegisterSuccess => { // Add this arm
|
|
match selected_index {
|
|
0 => { // "OK" button for RegisterSuccess
|
|
app_state.hide_dialog();
|
|
// Go back to intro after successful registration dialog
|
|
let message = register::back_to_main(register_state, app_state).await;
|
|
return Some(Ok(EventOutcome::Ok(message)));
|
|
}
|
|
_ => { // Default for RegisterSuccess
|
|
app_state.hide_dialog();
|
|
return Some(Ok(EventOutcome::Ok("Unknown dialog button selected".to_string())));
|
|
}
|
|
}
|
|
}
|
|
DialogPurpose::RegisterFailed => { // Add this arm
|
|
match selected_index {
|
|
0 => { // "OK" button for RegisterFailed
|
|
app_state.hide_dialog(); // Just dismiss
|
|
return Some(Ok(EventOutcome::Ok("Register failed dialog dismissed".to_string())));
|
|
}
|
|
_ => { // Default for RegisterFailed
|
|
app_state.hide_dialog();
|
|
return Some(Ok(EventOutcome::Ok("Unknown dialog button selected".to_string())));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
_ => {} // Ignore other general actions when dialog is shown
|
|
}
|
|
}
|
|
// If it was a key event but not handled above, consume it
|
|
Some(Ok(EventOutcome::Ok(String::new())))
|
|
} else {
|
|
// If it wasn't a key event, consume it too while dialog is active
|
|
Some(Ok(EventOutcome::Ok(String::new())))
|
|
}
|
|
}
|