// src/pages/login/event.rs use anyhow::Result; use crossterm::event::{Event, KeyCode, KeyModifiers}; use canvas::{keymap::KeyEventOutcome, AppMode as CanvasMode}; use crate::{ state::app::state::AppState, pages::login::LoginFormState, modes::handlers::event::EventOutcome, }; use canvas::DataProvider; /// Handles all Login page-specific events pub fn handle_login_event( event: Event, app_state: &mut AppState, login_page: &mut LoginFormState, ) -> Result { if let Event::Key(key_event) = event { let key_code = key_event.code; let modifiers = key_event.modifiers; // From buttons (outside) back into the canvas (ReadOnly) with Up/k from the left-most button if login_page.focus_outside_canvas && login_page.focused_button_index == 0 && matches!(key_code, KeyCode::Up | KeyCode::Char('k')) && modifiers.is_empty() { login_page.focus_outside_canvas = false; login_page.editor.set_mode(CanvasMode::ReadOnly); return Ok(EventOutcome::Ok(String::new())); } // Focus handoff: inside canvas → buttons if !login_page.focus_outside_canvas { let last_idx = login_page.editor.data_provider().field_count().saturating_sub(1); let at_last = login_page.editor.current_field() >= last_idx; if login_page.editor.mode() == CanvasMode::ReadOnly && at_last && matches!( (key_code, modifiers), (KeyCode::Char('j'), KeyModifiers::NONE) | (KeyCode::Down, _) ) { login_page.focus_outside_canvas = true; login_page.focused_button_index = 0; login_page.editor.set_mode(CanvasMode::ReadOnly); return Ok(EventOutcome::Ok("Focus moved to buttons".into())); } } // Forward to canvas if focus is inside if !login_page.focus_outside_canvas { match login_page.handle_key_event(key_event) { KeyEventOutcome::Consumed(Some(msg)) => { return Ok(EventOutcome::Ok(msg)); } KeyEventOutcome::Consumed(None) => { return Ok(EventOutcome::Ok("Login input updated".into())); } KeyEventOutcome::Pending => { return Ok(EventOutcome::Ok("Waiting for next key...".into())); } KeyEventOutcome::NotMatched => { // fall through to button handling } } } } Ok(EventOutcome::Ok(String::new())) }