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), Constraint::Min(0), ])
.split(f.area());
screen.save_path_input.render(f, chunks[0], app_state.input_mode == InputMode::EditingSavePath);
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) }
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) }
_ => {
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(())
}