use std::collections::HashMap;
use news_flash::{
error::NewsFlashError,
models::{ArticleID, Category, FatArticle, Feed, FeedID, Tag, Thumbnail},
};
use ratatui::{
crossterm::event::{KeyEvent, MouseEvent},
text::Text,
};
use crate::prelude::*;
#[derive(thiserror::Error, Debug)]
pub enum AsyncOperationError {
#[error("news flash error")]
NewsFlashError(#[from] NewsFlashError),
#[error("error report")]
Report(#[from] color_eyre::Report),
}
#[derive(Debug)]
pub enum Event {
ArticlesSelected(AugmentedArticleFilter),
ArticleSelected(ArticleID),
FatArticleSelected(ArticleID),
AsyncSync,
AsyncSyncFinished(HashMap<FeedID, i64>),
AsyncArticleThumbnailFetch,
AsyncArticleThumbnailFetchFinished(Option<Thumbnail>),
AsyncArticleFatFetch,
AsyncArticleFatFetchFinished(FatArticle),
AsyncArticlesMark,
AsyncArticlesMarkFinished,
AsyncArticleTag,
AsyncArticleTagFinished,
AsyncArticleUntag,
AsyncArticleUntagFinished,
AsyncTagAdd,
AsyncTagAddFinished(Tag),
AsyncTagRemove,
AsyncTagRemoveFinished,
AsyncFeedAdd,
AsyncFeedAddFinished(Feed),
AsyncFeedFetch,
AsyncFeedFetchFinished(FeedID, i64),
AsyncCategoryAdd,
AsyncCategoryAddFinished(Category),
AsyncFeedRename,
AsyncRenameFeedFinished(Feed),
AsyncCategoryRename,
AsyncCategoryRenameFinished(Category),
AsyncCategoryRemove,
AsyncCategoryRemoveFinished,
AsyncFeedRemove,
AsyncFeedRemoveFinished,
AsyncFeedUrlChange,
AsyncFeedUrlChangeFinished,
AsyncTagEdit,
AsyncTagEditFinished(Tag),
AsyncOperationFailed(AsyncOperationError, Box<Event>),
AsyncSetOffline,
AsyncSetOfflineFinished(bool),
AsyncSetAllRead,
AsyncSetAllReadFinished,
AsyncFeedSetRead,
AsyncFeedSetReadFinished,
AsyncCategorySetRead,
AsyncCategorySetReadFinished,
AsyncTagSetRead,
AsyncTagSetReadFinished,
AsyncArticlesSetRead,
AsyncArticlesSetReadFinished,
AsyncFeedMove,
AsyncFeedMoveFinished,
AsyncCategoryMove,
AsyncCategoryMoveFinished,
AsyncImportOpml,
AsyncImportOpmlFinished,
AsyncLogout,
AsyncLogoutFinished,
Tick,
Tooltip(Tooltip<'static>),
ShowHelpPopup(String, Text<'static>),
ShowModalHelpPopup(String, Text<'static>),
HideHelpPopup,
ApplicationStarted,
ApplicationStateChanged(AppState),
Key(KeyEvent),
Mouse(MouseEvent),
MouseArticleClick(u16),
MouseFeedClick(u16, u16),
MouseScrollUp(Panel),
MouseScrollDown(Panel),
Resized(u16, u16),
ConnectionAvailable,
ConnectionLost(ConnectionLostReason),
}
impl Event {
pub fn caused_model_update(&self) -> bool {
use Event::*;
matches!(
self,
AsyncSyncFinished(_)
| AsyncFeedAddFinished(_)
| AsyncFeedFetchFinished(..)
| AsyncRenameFeedFinished(_)
| AsyncCategoryRenameFinished(_)
| AsyncArticleFatFetchFinished(_)
| AsyncArticlesMarkFinished
| AsyncArticleTagFinished
| AsyncArticleUntagFinished
| AsyncTagAddFinished(_)
| AsyncTagRemoveFinished
| AsyncTagEditFinished(_)
| AsyncOperationFailed(..)
| AsyncSetOfflineFinished(_)
| AsyncSetAllReadFinished
| AsyncFeedSetReadFinished
| AsyncCategorySetReadFinished
| AsyncTagSetReadFinished
| AsyncArticlesSetReadFinished
| AsyncImportOpmlFinished,
)
}
}