mod action;
mod app;
mod input;
mod views;
mod widgets;
use std::io;
use std::time::{Duration, Instant};
use crossterm::{
ExecutableCommand,
event::{self, Event, KeyEventKind},
terminal::{EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode},
};
use ratatui::prelude::*;
use app::App;
use input::map_key;
use crate::{state::State, storage::DbConnection};
const TICK_RATE: Duration = Duration::from_millis(50);
pub fn run(state: &mut State, conn: &DbConnection) -> io::Result<()> {
enable_raw_mode()?;
io::stdout().execute(EnterAlternateScreen)?;
let mut terminal = Terminal::new(CrosstermBackend::new(io::stdout()))?;
let mut app = App::new(state, conn);
let mut last_tick = Instant::now();
loop {
terminal.draw(|frame| app.render(frame))?;
let timeout = TICK_RATE.saturating_sub(last_tick.elapsed());
if event::poll(timeout)?
&& let Event::Key(key) = event::read()?
&& key.kind == KeyEventKind::Press
&& let Some(action) = map_key(key)
&& !app.handle(action)
{
break;
}
if last_tick.elapsed() >= TICK_RATE {
app.tick();
last_tick = Instant::now();
}
}
app.save();
io::stdout().execute(LeaveAlternateScreen)?;
disable_raw_mode()?;
Ok(())
}