use crossterm::event::{KeyCode, KeyEvent};
use crate::studio::events::SideEffect;
use crate::studio::state::{Modal, StudioState};
use super::super::spawn_chat_task;
pub fn handle(state: &mut StudioState, key: KeyEvent) -> Vec<SideEffect> {
if !matches!(state.modal, Some(Modal::Chat)) {
return vec![];
}
let current_input = state.chat_state.input.clone();
let is_responding = state.chat_state.is_responding;
let mode = state.active_mode;
match key.code {
KeyCode::Esc => {
state.close_modal();
vec![]
}
KeyCode::Enter => {
if !current_input.is_empty() && !is_responding {
state.chat_state.add_user_message(¤t_input);
state.chat_state.is_responding = true;
state.mark_dirty();
vec![spawn_chat_task(current_input, mode)]
} else {
vec![]
}
}
KeyCode::Char(c) => {
state.chat_state.input.push(c);
state.mark_dirty();
vec![]
}
KeyCode::Backspace => {
state.chat_state.input.pop();
state.mark_dirty();
vec![]
}
KeyCode::Up => {
state.chat_state.scroll_up(1);
state.mark_dirty();
vec![]
}
KeyCode::Down => {
let max_scroll = state.chat_state.estimated_max_scroll();
state.chat_state.scroll_down(1, max_scroll);
state.mark_dirty();
vec![]
}
KeyCode::PageUp => {
state.chat_state.scroll_up(10);
state.mark_dirty();
vec![]
}
KeyCode::PageDown => {
let max_scroll = state.chat_state.estimated_max_scroll();
state.chat_state.scroll_down(10, max_scroll);
state.mark_dirty();
vec![]
}
_ => vec![],
}
}