This commit is contained in:
Mikhail Kilin
2026-01-18 11:49:41 +03:00
commit d701464fde
8 changed files with 2148 additions and 0 deletions

68
src/main.rs Normal file
View File

@@ -0,0 +1,68 @@
mod app;
mod telegram;
mod ui;
use anyhow::Result;
use crossterm::{
event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode},
execute,
terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen},
};
use ratatui::{
backend::CrosstermBackend,
Terminal,
};
use std::io;
use app::App;
#[tokio::main]
async fn main() -> Result<()> {
enable_raw_mode()?;
let mut stdout = io::stdout();
execute!(stdout, EnterAlternateScreen, EnableMouseCapture)?;
let backend = CrosstermBackend::new(stdout);
let mut terminal = Terminal::new(backend)?;
let mut app = App::new();
let res = run_app(&mut terminal, &mut app).await;
disable_raw_mode()?;
execute!(
terminal.backend_mut(),
LeaveAlternateScreen,
DisableMouseCapture
)?;
terminal.show_cursor()?;
if let Err(err) = res {
println!("Error: {:?}", err);
}
Ok(())
}
async fn run_app<B: ratatui::backend::Backend>(
terminal: &mut Terminal<B>,
app: &mut App,
) -> Result<()> {
loop {
terminal.draw(|f| ui::draw(f, app))?;
if event::poll(std::time::Duration::from_millis(100))? {
if let Event::Key(key) = event::read()? {
match key.code {
KeyCode::Char('q') | KeyCode::Esc => return Ok(()),
KeyCode::Char('1') => app.select_tab(0),
KeyCode::Char('2') => app.select_tab(1),
KeyCode::Char('3') => app.select_tab(2),
KeyCode::Char('4') => app.select_tab(3),
KeyCode::Up => app.previous_chat(),
KeyCode::Down => app.next_chat(),
KeyCode::Enter => app.open_chat(),
_ => {}
}
}
}
}
}