Files
komp_ac/client/src/pages/intro/logic.rs

74 lines
2.6 KiB
Rust

// src/pages/intro/logic.rs
use crate::state::app::state::AppState;
use crate::buffer::state::{AppView, BufferState};
/// Handles intro screen selection by updating view history and managing focus state.
/// 0: Continue (restores last form or default)
/// 1: Admin view
/// 2: Login view
/// 3: Register view (with focus reset)
pub fn handle_intro_selection(
app_state: &mut AppState,
buffer_state: &mut BufferState,
index: usize,
) {
match index {
// Continue: go to the most recent existing Form tab, or open a sensible default
0 => {
// 1) Try to switch to an already open Form buffer (most recent)
if let Some(existing_path) = buffer_state
.history
.iter()
.rev()
.find_map(|view| {
if let AppView::Form(p) = view {
Some(p.clone())
} else {
None
}
})
{
buffer_state.update_history(AppView::Form(existing_path));
return;
}
// 2) Otherwise pick a fallback path
let fallback_path = if let (Some(profile), Some(table)) = (
app_state.current_view_profile_name.clone(),
app_state.current_view_table_name.clone(),
) {
Some(format!("{}/{}", profile, table))
} else if let Some(any_key) = app_state.form_editor.keys().next().cloned() {
// Use any existing editor key if available
Some(any_key)
} else {
// Otherwise pick the first available table from the profile tree
let mut found: Option<String> = None;
for prof in &app_state.profile_tree.profiles {
if let Some(tbl) = prof.tables.first() {
found = Some(format!("{}/{}", prof.name, tbl.name));
break;
}
}
found
};
if let Some(path) = fallback_path {
buffer_state.update_history(AppView::Form(path));
} else {
// No sensible default; stay on Intro
}
}
1 => {
buffer_state.update_history(AppView::Admin);
}
2 => {
buffer_state.update_history(AppView::Login);
}
3 => {
buffer_state.update_history(AppView::Register);
}
_ => return,
}
}