clin-rs 0.8.12

Encrypted terminal note-taking app inspired by Obsidian
use std::io::Stdout;
use std::path::PathBuf;
use std::time::Duration;

use anyhow::Result;
use crossterm::event::{self, Event};
use ratatui::Terminal;
use ratatui::backend::CrosstermBackend;

use crate::app_theme::AppThemeColors;
use crate::backup::input::{self, InputResult};
use crate::backup::render;
use crate::backup::state::BackupState;
use crate::config::ClinConfig;
use crate::keybinds::{BackupAction, Keybinds};

pub enum BackupResult {
    Back,
}

pub fn run_backup_view(
    terminal: &mut Terminal<CrosstermBackend<Stdout>>,
    vault_path: PathBuf,
    config: &ClinConfig,
    keybinds: &Keybinds,
    app_theme: &AppThemeColors,
) -> Result<BackupResult> {
    let mut state = BackupState::new(vault_path, &config.backup, app_theme.clone());
    state.footer_hint = format!(
        "{}: commit · {}: push · {}: refresh · {}: settings · {}: ←",
        keybinds.backup_keys_display(BackupAction::EnterCommit),
        keybinds.backup_keys_display(BackupAction::Push),
        keybinds.backup_keys_display(BackupAction::Refresh),
        keybinds.backup_keys_display(BackupAction::OpenSettings),
        keybinds.backup_keys_display(BackupAction::Back),
    );

    loop {
        state.last_area = Some(terminal.size()?.into());
        terminal.draw(|frame| render::draw_dashboard(frame, &state))?;

        if event::poll(Duration::from_millis(100))? {
            match event::read()? {
                Event::Key(key) => match input::handle_input(&mut state, key, keybinds) {
                    InputResult::Back => return Ok(BackupResult::Back),
                    InputResult::Refresh => state.refresh_git_info(),
                    InputResult::None => {}
                },
                Event::Mouse(mouse) => {
                    if let InputResult::Refresh = input::handle_mouse(&mut state, mouse) {
                        state.refresh_git_info()
                    }
                }
                Event::Resize(_, _) => {
                    terminal.autoresize()?;
                    let _ = terminal.clear();
                }
                _ => {}
            }
        }
    }
}