mayday 0.1.0

A multi-messaging-sevice aggregator into an all-in-one application (android's app beeper-like)
Documentation
use crate::models::stateful_messaging_services::StatefulMessagingServices;
use crate::models::stateful_scrollbar::StatefulScrollbar;
use crate::states::AppState;
use ratatui::DefaultTerminal;
use tui_textarea::TextArea;

pub struct App<'a> {
    pub state: AppState,
    pub should_quit: bool,

    pub stateful_messaging_services: StatefulMessagingServices,

    pub discussion_scrollbar: StatefulScrollbar,
    pub last_messages_area_size: (u16, u16),
    pub should_update_discussion_scrollbar: bool,
    pub message_input: TextArea<'a>,
}

impl<'a> App<'a> {
    pub async fn new(stateful_messaging_services: StatefulMessagingServices) -> anyhow::Result<Self> {
        let mut app = App {
            state: AppState::Main,
            should_quit: false,
            stateful_messaging_services,

            discussion_scrollbar: StatefulScrollbar::default(),
            last_messages_area_size: (0, 0),
            should_update_discussion_scrollbar: false,
            message_input: TextArea::new(vec![]),
        };

        app.reset_message_input();
        app.load_all_messages().await?;

        Ok(app)
    }
    
    pub async fn run(&mut self, terminal: &mut DefaultTerminal) -> anyhow::Result<()> {
        loop {
            terminal.draw(|frame| self.ui(frame))?;
            self.handle_events().await?;
            
            if self.should_quit {
                return Ok(());
            }
        }
    }
}