//! analytics-screen key-input handler (split out of tui/input.rs). use super::{ App, AppEvent, DataPayload, KeyCode, KeyEvent, MnwApiClient, Screen, load_analytics, load_transactions, mpsc, }; pub(crate) async fn handle_analytics_input( key: KeyEvent, app: &mut App, screen: &mut Screen, api: &MnwApiClient, tx: &mpsc::Sender, ) { match key.code { KeyCode::Char('j') | KeyCode::Down if app.analytics_show_transactions => { app.move_down(screen); } KeyCode::Char('k') | KeyCode::Up if app.analytics_show_transactions => { app.move_up(screen); } KeyCode::Esc => { if app.analytics_show_transactions { app.analytics_show_transactions = false; app.selected_index = 0; } else { *screen = Screen::Home; app.analytics_data = None; app.analytics_status = None; app.selected_index = 0; } } // Range selection: 1=7d, 2=30d, 3=90d, 4=all KeyCode::Char('1') => { app.analytics_range = "7d".to_string(); reload_analytics(app, api, tx); } KeyCode::Char('2') => { app.analytics_range = "30d".to_string(); reload_analytics(app, api, tx); } KeyCode::Char('3') => { app.analytics_range = "90d".to_string(); reload_analytics(app, api, tx); } KeyCode::Char('4') => { app.analytics_range = "all".to_string(); reload_analytics(app, api, tx); } KeyCode::Char('t' | 'T') => { if app.analytics_show_transactions { app.analytics_show_transactions = false; } else { app.analytics_show_transactions = true; app.selected_index = 0; if app.transactions.is_empty() { app.loading = true; let api = api.clone(); let user_id = app.user.user_id.clone(); let tx = tx.clone(); tokio::spawn(async move { load_transactions(&api, &user_id, &tx).await; }); } } } KeyCode::Char('e' | 'E') => { app.analytics_status = Some("Exporting...".to_string()); let api = api.clone(); let user_id = app.user.user_id.clone(); let tx = tx.clone(); tokio::spawn(async move { match api.export_sales_csv(&user_id).await { Ok(result) => { let _ = tx .send(AppEvent::DataLoaded(DataPayload::ExportCsv { csv: result.csv, row_count: result.row_count, })) .await; } Err(e) => { let _ = tx .send(AppEvent::DataLoaded(DataPayload::GenericError { error: e.to_string(), })) .await; } } }); } KeyCode::Char('r' | 'R') => { reload_analytics(app, api, tx); } _ => {} } } fn reload_analytics(app: &mut App, api: &MnwApiClient, tx: &mpsc::Sender) { app.loading = true; app.analytics_status = None; let api = api.clone(); let user_id = app.user.user_id.clone(); let range = app.analytics_range.clone(); let tx = tx.clone(); tokio::spawn(async move { load_analytics(&api, &user_id, &range, &tx).await; }); }