use anyhow::Result;
use crossterm::event::{KeyCode, KeyEvent};
use crate::app::{App, InputMode};
pub fn handle_tasks_input(app: &mut App, key: KeyEvent) -> Result<bool> {
if let InputMode::Tasks { confirm_delete, editing, .. } = &app.input_mode {
if *confirm_delete {
return handle_confirm_delete(app, key);
}
if editing.is_some() {
return handle_edit_mode(app, key);
}
}
handle_browse_mode(app, key)
}
fn handle_browse_mode(app: &mut App, key: KeyEvent) -> Result<bool> {
match key.code {
KeyCode::Esc | KeyCode::Char('q') => {
app.input_mode = InputMode::Normal;
Ok(false)
}
KeyCode::Up => {
if let InputMode::Tasks { selected_index, tasks, .. } = &mut app.input_mode {
if !tasks.is_empty() {
*selected_index = if *selected_index == 0 {
tasks.len() - 1
} else {
*selected_index - 1
};
}
}
Ok(false)
}
KeyCode::Down => {
if let InputMode::Tasks { selected_index, tasks, .. } = &mut app.input_mode {
if !tasks.is_empty() {
*selected_index = (*selected_index + 1) % tasks.len();
}
}
Ok(false)
}
KeyCode::Char('n') => {
app.tasks_start_creating();
Ok(false)
}
KeyCode::Char('e') => {
app.tasks_start_editing();
Ok(false)
}
KeyCode::Char('d') => {
app.tasks_confirm_delete();
Ok(false)
}
_ => Ok(false),
}
}
fn handle_edit_mode(app: &mut App, key: KeyEvent) -> Result<bool> {
match key.code {
KeyCode::Esc => {
app.tasks_cancel_edit();
Ok(false)
}
KeyCode::Enter => {
app.tasks_save()?;
Ok(false)
}
KeyCode::Tab => {
if let InputMode::Tasks { editing, .. } = &mut app.input_mode {
if let Some(edit) = editing {
edit.current_field = (edit.current_field + 1) % 3;
}
}
Ok(false)
}
KeyCode::Char(c) => {
if let InputMode::Tasks { editing, .. } = &mut app.input_mode {
if let Some(edit) = editing {
match edit.current_field {
0 => edit.issue_key.push(c),
1 => edit.name.push(c),
2 => edit.project.push(c),
_ => {}
}
}
}
Ok(false)
}
KeyCode::Backspace => {
if let InputMode::Tasks { editing, .. } = &mut app.input_mode {
if let Some(edit) = editing {
match edit.current_field {
0 => { edit.issue_key.pop(); }
1 => { edit.name.pop(); }
2 => { edit.project.pop(); }
_ => {}
}
}
}
Ok(false)
}
_ => Ok(false),
}
}
fn handle_confirm_delete(app: &mut App, key: KeyEvent) -> Result<bool> {
match key.code {
KeyCode::Char('y') | KeyCode::Char('Y') => {
app.tasks_delete()?;
Ok(false)
}
_ => {
app.tasks_cancel_delete();
Ok(false)
}
}
}