lk-inside 0.3.1

A terminal user interface (TUI) application for interactive data analysis.
Documentation
use ratatui::{
    prelude::*,
    widgets::{Block, Borders, Paragraph},
};
use crate::{AppState, AppScreen, InputMode, Workspace};
use crate::ui::components::input_widget::InputWidget;
use crossterm::event::KeyCode;
use std::path::PathBuf;
use anyhow::Result;

pub struct SaveScreen {
    pub save_path_input: InputWidget,
}

impl SaveScreen {
    pub fn new() -> Self {
        Self {
            save_path_input: InputWidget::new("Save File Path (e.g., 'workspace.json')".to_string()),
        }
    }
}

pub fn render_save_screen(f: &mut Frame, screen: &SaveScreen, app_state: &AppState) {
    let chunks = Layout::default()
        .direction(Direction::Vertical)
        .constraints([
            Constraint::Length(3), // Input box
            Constraint::Min(0),    // Message area
        ])
        .split(f.area());

    screen.save_path_input.render(f, chunks[0], app_state.input_mode == InputMode::EditingSavePath); // MODIFIED

    let message_block = Block::default()
        .borders(Borders::ALL)
        .title("Save Status");
    let message_paragraph = Paragraph::new(app_state.status_message.clone())
        .block(message_block);
    f.render_widget(message_paragraph, chunks[1]);
}

pub fn handle_input(key: KeyCode, app_state: &mut AppState) -> Option<AppScreen> {
    let screen = &mut app_state.save_screen;
    match app_state.input_mode {
        InputMode::EditingSavePath => match key {
            KeyCode::Enter => {
                let path_str = screen.save_path_input.get_input();
                let path = PathBuf::from(&path_str);

                match save_workspace_state(&app_state.workspace, &path) {
                    Ok(_) => {
                        app_state.status_message = format!("Workspace saved successfully to {}", path_str);
                        app_state.input_mode = InputMode::Normal;
                        screen.save_path_input.reset();
                        Some(AppScreen::StartMenu) // Or wherever you want to go after saving
                    }
                    Err(e) => {
                        app_state.status_message = format!("Error saving workspace: {}", e);
                        app_state.input_mode = InputMode::Normal;
                        screen.save_path_input.reset();
                        Some(AppScreen::Error)
                    }
                }
            }
            KeyCode::Esc => {
                app_state.input_mode = InputMode::Normal;
                app_state.status_message = "Save cancelled.".to_string();
                screen.save_path_input.reset();
                Some(AppScreen::StartMenu) // Or wherever you want to go after cancelling
            }
            _ => {
                screen.save_path_input.handle_key(key);
                None
            }
        },
        _ => None,
    }
}

pub fn save_workspace_state(workspace: &Workspace, path: &PathBuf) -> Result<()> {
    let serialized = serde_json::to_string_pretty(workspace)?;
    std::fs::write(path, serialized)?;
    Ok(())
}