// src/ui/handlers/render.rs use crate::components::{ render_background, render_command_line, render_status_line, handlers::sidebar::{self, calculate_sidebar_layout}, form::form::render_form, admin::{admin_panel::AdminPanelState}, auth::{login::render_login, register::render_register}, }; use crate::config::colors::themes::Theme; use ratatui::layout::{Constraint, Direction, Layout}; use ratatui::Frame; use crate::state::pages::form::FormState; use crate::state::pages::auth::AuthState; use crate::state::pages::auth::LoginState; use crate::state::pages::auth::RegisterState; use crate::state::app::state::AppState; use crate::state::pages::admin::AdminState; pub fn render_ui( f: &mut Frame, form_state: &mut FormState, auth_state: &mut AuthState, login_state: &LoginState, register_state: &RegisterState, theme: &Theme, is_edit_mode: bool, total_count: u64, current_position: u64, current_dir: &str, command_input: &str, command_mode: bool, command_message: &str, app_state: &AppState, ) { render_background(f, f.area(), theme); let root = Layout::default() .direction(Direction::Vertical) .constraints([ Constraint::Min(1), Constraint::Length(1), Constraint::Length(1), ]) .split(f.area()); let main_content_area = root[0]; if app_state.ui.show_intro { app_state.ui.intro_state.render(f, main_content_area, theme); } else if app_state.ui.show_register { render_register( f, main_content_area, theme, register_state, app_state, register_state.current_field < 4 ); }else if app_state.ui.show_login { render_login( f, main_content_area, theme, login_state, app_state, login_state.current_field < 2 ); } else if app_state.ui.show_admin { // Create temporary AdminPanelState for rendering let mut admin_state = AdminPanelState::new( app_state.profile_tree.profiles .iter() .map(|p| p.name.clone()) .collect() ); // Set the selected item - FIXED if !admin_state.profiles.is_empty() { let selected_index = admin_state.get_selected_index() .unwrap_or(0) .min(admin_state.profiles.len() - 1); admin_state.list_state.select(Some(selected_index)); } admin_state.render( f, main_content_area, theme, &app_state.profile_tree, &app_state.selected_profile, ); } else if app_state.ui.show_form { let (sidebar_area, form_area) = calculate_sidebar_layout( app_state.ui.show_sidebar, main_content_area ); if let Some(sidebar_rect) = sidebar_area { sidebar::render_sidebar( f, sidebar_rect, theme, &app_state.profile_tree, &app_state.selected_profile ); } // This change makes the form stay stationary when toggling sidebar let available_width = form_area.width; let form_constraint = if available_width >= 80 { // Use main_content_area for centering when enough space Layout::default() .direction(Direction::Horizontal) .constraints([ Constraint::Min(0), Constraint::Length(80), Constraint::Min(0), ]) .split(main_content_area)[1] } else { // Use form_area (post sidebar) when limited space Layout::default() .direction(Direction::Horizontal) .constraints([ Constraint::Min(0), Constraint::Length(80.min(available_width)), Constraint::Min(0), ]) .split(form_area)[1] }; // Convert fields to &[&str] and values to &[&String] let fields: Vec<&str> = form_state.fields.iter().map(|s| s.as_str()).collect(); let values: Vec<&String> = form_state.values.iter().collect(); render_form( f, form_constraint, form_state, &fields, &form_state.current_field, &values, theme, is_edit_mode, total_count, current_position, ); } else{ } render_status_line(f, root[1], current_dir, theme, is_edit_mode); render_command_line(f, root[2], command_input, command_mode, theme, command_message); }