vcard_tui 0.1.2

Terminal UI application for managing vCard contacts.
use crossterm::event::{Event, KeyCode};

use crate::state::list::StatefulList;
use crate::state::popup::export::ExportSelected;
use crate::state::popup::PopupState;
use crate::state::selected::Select;
use crate::tui::HasTextArea;
use crate::State;

pub fn handle_popup_export(event: &Event, state: &mut State) -> anyhow::Result<()> {
    if let (Some(PopupState::Export(s)), Event::Key(key_event)) = (state.popup.as_mut(), event) {
        match key_event.code {
            KeyCode::Enter => match s.selected.get() {
                ExportSelected::Files => {
                    if let Some((path, _)) = &s.files.current {
                        if path.is_dir() {
                            s.files.path = path.clone();
                            s.files.refresh()?;
                        }
                    }
                }
                ExportSelected::TextArea => {
                    s.toggle_textarea();
                }
                ExportSelected::Export => {
                    if !s.value.is_empty() && s.files.path.is_dir() {
                        let path = s.files.path.join(&s.value);
                        state.contacts.export(path.to_str().unwrap())?;
                        state.popup = None;
                    }
                }
                ExportSelected::Cancel => state.popup = None,
            },
            KeyCode::Up => {
                if s.selected.is(ExportSelected::Files) {
                    s.files.prev()
                }
            }
            KeyCode::Down => {
                if s.selected.is(ExportSelected::Files) {
                    s.files.next()
                }
            }
            KeyCode::BackTab => s.selected.prev(),
            KeyCode::Tab => s.selected.next(),
            KeyCode::Left => {
                if let Some(textarea) = s.textarea.as_mut() {
                    textarea.input(*key_event);
                } else {
                    s.selected.prev()
                }
            }
            KeyCode::Right => {
                if let Some(textarea) = s.textarea.as_mut() {
                    textarea.input(*key_event);
                } else {
                    s.selected.next()
                }
            }
            _ => {
                if let Some(textarea) = s.textarea.as_mut() {
                    textarea.input(*key_event);
                }
            }
        }
    }
    Ok(())
}