use std::sync::Arc;
use std::time::Duration;
use ratatui::crossterm::event::{KeyEvent, MouseEvent};
use tokio::sync::mpsc::UnboundedSender;
use crate::settings::AppSettings;
use kimun_core::{NoteVault, nfs::VaultPath};
#[derive(Debug, Clone)]
pub enum AppEvent {
Input(InputEvent),
OpenScreen(ScreenEvent),
Quit,
Redraw,
Autosave,
OpenPath(VaultPath),
FocusEditor,
FocusSidebar,
SettingsSaved(AppSettings),
CloseSettings,
OpenFileBrowser,
TriggerFastReindex,
TriggerFullReindex,
IndexingDone(Result<Duration, String>),
OpenJournal,
CloseNoteBrowser,
FollowLink(String),
ShowFileOpsMenu(VaultPath),
ShowDeleteDialog(VaultPath),
ShowRenameDialog(VaultPath),
ShowMoveDialog(VaultPath),
EntryDeleted(VaultPath),
EntryRenamed { from: VaultPath, to: VaultPath },
EntryMoved { from: VaultPath, to: VaultPath },
EntryCreated(VaultPath),
DialogError(String),
CloseDialog,
RenameValidation { available: bool },
MoveDirectoriesLoaded(Vec<VaultPath>),
MoveFilterResults(Vec<VaultPath>),
MoveDestValidation { available: bool },
}
impl AppEvent {
pub fn send_input(event: InputEvent) -> Self {
AppEvent::Input(event)
}
}
#[derive(Debug, Clone)]
pub enum InputEvent {
Key(KeyEvent),
Mouse(MouseEvent),
}
#[derive(Debug, Clone)]
pub enum ScreenEvent {
Start,
OpenSettings,
OpenEditor(Arc<NoteVault>, VaultPath),
OpenBrowse(Arc<NoteVault>, VaultPath),
}
pub type AppTx = UnboundedSender<AppEvent>;
#[cfg(test)]
mod tests {
use super::*;
fn _assert_new_variants_exist(e: AppEvent) {
match e {
AppEvent::ShowDeleteDialog(_) => {}
AppEvent::ShowRenameDialog(_) => {}
AppEvent::ShowMoveDialog(_) => {}
AppEvent::EntryDeleted(_) => {}
AppEvent::EntryRenamed { from: _, to: _ } => {}
AppEvent::EntryMoved { from: _, to: _ } => {}
AppEvent::DialogError(_) => {}
AppEvent::CloseDialog => {}
_ => {}
}
}
}