mod app;
mod ui;
use std::time::Duration;
use anyhow::Result;
use crossterm::event::{self, Event, KeyCode, KeyEventKind};
pub use app::App;
pub fn run_dashboard() -> Result<()> {
let mut terminal = ratatui::init();
let result = event_loop(&mut terminal);
ratatui::restore();
result
}
fn event_loop(terminal: &mut ratatui::DefaultTerminal) -> Result<()> {
let mut app = App::new();
app.refresh();
loop {
terminal.draw(|frame| ui::render(frame, &mut app))?;
if event::poll(Duration::from_millis(100))? {
match event::read()? {
Event::Key(key) if key.kind == KeyEventKind::Press => {
handle_key(&mut app, key.code);
}
Event::Resize(_, _) => {
}
_ => {}
}
}
if app.last_refresh.elapsed() >= Duration::from_secs(2) {
app.refresh();
}
if app.should_quit {
break;
}
}
Ok(())
}
fn handle_key(app: &mut App, code: KeyCode) {
if code == KeyCode::Esc {
if app.confirm_delete {
app.confirm_delete = false;
} else {
app.should_quit = true;
}
return;
}
match code {
KeyCode::Down | KeyCode::Char('j') => {
app.confirm_delete = false;
app.select_next();
}
KeyCode::Up | KeyCode::Char('k') => {
app.confirm_delete = false;
app.select_prev();
}
KeyCode::Char('r') => {
app.confirm_delete = false;
app.restart_selected();
}
KeyCode::Char('s') => {
app.confirm_delete = false;
app.toggle_stop();
}
KeyCode::Char('d') => {
app.delete_selected();
}
KeyCode::Char('e') => {
app.confirm_delete = false;
app.toggle_log_source();
}
KeyCode::Char('q') => {
if app.confirm_delete {
app.confirm_delete = false;
} else {
app.should_quit = true;
}
}
_ => {}
}
}