login page using canvas library

This commit is contained in:
filipriec
2025-08-28 21:26:21 +02:00
parent 19a9bab8c2
commit f5f2f2cdef
2 changed files with 41 additions and 4 deletions

View File

@@ -279,6 +279,23 @@ impl EventHandler {
let key_code = key_event.code; let key_code = key_event.code;
let modifiers = key_event.modifiers; 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( if toggle_sidebar(
&mut app_state.ui, &mut app_state.ui,
config, config,

View File

@@ -69,6 +69,7 @@ pub async fn run_ui() -> Result<()> {
let mut auth_state = AuthState::default(); let mut auth_state = AuthState::default();
let mut login_state = LoginFormState::new(); let mut login_state = LoginFormState::new();
login_state.editor.set_keymap(config.build_canvas_keymap());
let mut register_state = RegisterState::default(); let mut register_state = RegisterState::default();
let mut intro_state = IntroState::default(); let mut intro_state = IntroState::default();
let mut admin_state = AdminState::default(); let mut admin_state = AdminState::default();
@@ -295,9 +296,19 @@ pub async fn run_ui() -> Result<()> {
match login_result_receiver.try_recv() { match login_result_receiver.try_recv() {
Ok(result) => { Ok(result) => {
if login::handle_login_result(result, &mut app_state, &mut auth_state, &mut login_state) { // Apply result to the active router Login page if present,
needs_redraw = true; // 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::Empty) => {}
Err(mpsc::error::TryRecvError::Disconnected) => { Err(mpsc::error::TryRecvError::Disconnected) => {
@@ -353,7 +364,16 @@ pub async fn run_ui() -> Result<()> {
router.navigate(Page::Intro(intro_state.clone())); router.navigate(Page::Intro(intro_state.clone()));
} }
AppView::Login => { AppView::Login => {
router.navigate(Page::Login(LoginFormState::new())) // Do not re-create the page every frame. If were 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::Register => router.navigate(Page::Register(register_state.clone())),
AppView::Admin => { AppView::Admin => {