darwincode 1.9.73

The open source terminal AI coding agent
use crate::app::{App, Screen};
use anyhow::Result;
use crossterm::event::{KeyCode, KeyEvent, KeyModifiers};

pub(crate) fn handle_ask_user_key(app: &mut App, key: KeyEvent) -> Result<()> {
    if app
        .keybindings
        .matches(crate::tui::keybindings::TuiAction::Quit, key)
    {
        let tx = crate::tui::ASK_USER_CHANNEL
            .lock()
            .ok()
            .and_then(|mut g| g.take().map(|(tx, _, _)| tx));
        if let Some(tx) = tx {
            let _ = tx.send("Aborted by user".to_owned());
        }
        app.cancel_generation();
        app.screen = Screen::Chat;
        app.status = "Aborted by user".to_owned();
        return Ok(());
    }

    if app.ask_user.is_custom {
        match key.code {
            KeyCode::Enter => {
                if key.modifiers.contains(KeyModifiers::SHIFT)
                    || key.modifiers.contains(KeyModifiers::ALT)
                {
                    app.ask_user.custom_input.push('\n');
                } else {
                    let answer = app.ask_user.custom_input.trim().to_owned();
                    if !answer.is_empty() {
                        let tx = crate::tui::ASK_USER_CHANNEL
                            .lock()
                            .ok()
                            .and_then(|mut g| g.take().map(|(tx, _, _)| tx));
                        if let Some(tx) = tx {
                            let _ = tx.send(answer);
                        }
                        app.screen = Screen::Chat;
                        app.status = "Ready".to_owned();
                    }
                }
            }
            KeyCode::Esc => {
                if !app.ask_user.options.is_empty() {
                    app.ask_user.is_custom = false;
                }
            }
            KeyCode::Backspace => {
                app.ask_user.custom_input.pop();
            }
            KeyCode::Char(c) => {
                app.ask_user.custom_input.push(c);
            }
            _ => {}
        }
    } else {
        match key.code {
            KeyCode::Up => {
                app.ask_user.selected_idx = app.ask_user.selected_idx.saturating_sub(1);
            }
            KeyCode::Down => {
                let max = app.ask_user.options.len();
                if app.ask_user.selected_idx < max {
                    app.ask_user.selected_idx += 1;
                }
            }
            KeyCode::Enter => {
                if app.ask_user.selected_idx == app.ask_user.options.len() {
                    app.ask_user.is_custom = true;
                } else if let Some(opt) = app.ask_user.options.get(app.ask_user.selected_idx) {
                    let answer = opt.clone();
                    let tx = crate::tui::ASK_USER_CHANNEL
                        .lock()
                        .ok()
                        .and_then(|mut g| g.take().map(|(tx, _, _)| tx));
                    if let Some(tx) = tx {
                        let _ = tx.send(answer);
                    }
                    app.screen = Screen::Chat;
                    app.status = "Ready".to_owned();
                }
            }
            _ => {}
        }
    }
    Ok(())
}