diff --git a/client/src/modes/handlers/event.rs b/client/src/modes/handlers/event.rs index 2d34ed8..8555472 100644 --- a/client/src/modes/handlers/event.rs +++ b/client/src/modes/handlers/event.rs @@ -279,6 +279,23 @@ impl EventHandler { let key_code = key_event.code; let modifiers = key_event.modifiers; + if let Page::Login(login_page) = &mut router.current { + match login_page.handle_key_event(key_event) { + KeyEventOutcome::Consumed(Some(msg)) => { + self.command_message = msg; + return Ok(EventOutcome::Ok("Login input updated".to_string())); + } + KeyEventOutcome::Consumed(None) => { + return Ok(EventOutcome::Ok("Login input updated".to_string())); + } + KeyEventOutcome::Pending => { + return Ok(EventOutcome::Ok("Waiting for next key...".to_string())); + } + KeyEventOutcome::NotMatched => { + // fall through to other handlers (buttons, etc.) + } + } + } if toggle_sidebar( &mut app_state.ui, config, diff --git a/client/src/ui/handlers/ui.rs b/client/src/ui/handlers/ui.rs index e9800a0..32175b5 100644 --- a/client/src/ui/handlers/ui.rs +++ b/client/src/ui/handlers/ui.rs @@ -69,6 +69,7 @@ pub async fn run_ui() -> Result<()> { let mut auth_state = AuthState::default(); let mut login_state = LoginFormState::new(); + login_state.editor.set_keymap(config.build_canvas_keymap()); let mut register_state = RegisterState::default(); let mut intro_state = IntroState::default(); let mut admin_state = AdminState::default(); @@ -295,9 +296,19 @@ pub async fn run_ui() -> Result<()> { match login_result_receiver.try_recv() { Ok(result) => { - if login::handle_login_result(result, &mut app_state, &mut auth_state, &mut login_state) { - needs_redraw = true; - } + // Apply result to the active router Login page if present, + // otherwise update the local copy. + let updated = if let Page::Login(page) = &mut router.current { + login::handle_login_result( + result, + &mut app_state, + &mut auth_state, + page, + ) + } else { + login::handle_login_result(result, &mut app_state, &mut auth_state, &mut login_state) + }; + if updated { needs_redraw = true; } } Err(mpsc::error::TryRecvError::Empty) => {} Err(mpsc::error::TryRecvError::Disconnected) => { @@ -353,7 +364,16 @@ pub async fn run_ui() -> Result<()> { router.navigate(Page::Intro(intro_state.clone())); } AppView::Login => { - router.navigate(Page::Login(LoginFormState::new())) + // Do not re-create the page every frame. If we’re already on Login, + // keep it. If we just switched into Login, create it once and + // inject the keymap. + if let Page::Login(_) = &router.current { + // Already on login page; keep existing state + } else { + let mut page = LoginFormState::new(); + page.editor.set_keymap(config.build_canvas_keymap()); + router.navigate(Page::Login(page)); + } } AppView::Register => router.navigate(Page::Register(register_state.clone())), AppView::Admin => {