72 lines
2.7 KiB
Rust
72 lines
2.7 KiB
Rust
// 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<EventOutcome> {
|
|
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()))
|
|
}
|