use std::sync::Arc;
use std::time::Duration;
use ratatui::crossterm::event::{KeyEvent, MouseEvent};
use tokio::sync::mpsc::UnboundedSender;
use kimun_core::{NoteVault, nfs::VaultPath};
#[derive(Debug, Clone)]
pub enum AppEvent {
Input(InputEvent),
OpenScreen(ScreenEvent),
Quit,
Redraw,
Autosave,
OpenPath(VaultPath),
FocusEditor,
FocusSidebar,
SettingsSaved,
CloseSettings,
OpenFileBrowser,
TriggerFastReindex,
TriggerFullReindex,
IndexingDone(Result<Duration, String>),
OpenJournal,
CloseNoteBrowser,
FollowLink(String),
FollowLabel(String),
InsertAtCursor(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,
VaultConflict(String),
RenameValidation {
available: bool,
},
MoveDirectoriesLoaded(Vec<VaultPath>),
MoveFilterResults(Vec<VaultPath>),
MoveDestValidation {
available: bool,
},
BacklinksLoaded(Vec<crate::components::backlinks_panel::BacklinkEntry>),
WorkspaceSwitched(String),
}
impl AppEvent {
pub fn send_input(event: InputEvent) -> Self {
AppEvent::Input(event)
}
}
#[derive(Debug, Clone)]
pub enum InputEvent {
Key(KeyEvent),
Mouse(MouseEvent),
Paste(String),
}
#[derive(Debug, Clone)]
pub enum ScreenEvent {
Start,
OpenSettings,
OpenSettingsWithError(String),
OpenEditor(Arc<NoteVault>, VaultPath),
OpenBrowse(Arc<NoteVault>, VaultPath),
}
pub type AppTx = UnboundedSender<AppEvent>;
pub fn redraw_callback(tx: AppTx) -> Arc<dyn Fn() + Send + Sync + 'static> {
Arc::new(move || {
let _ = tx.send(AppEvent::Redraw);
})
}
#[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 => {}
_ => {}
}
}
}