use super::{Component, State};
use crate::action::{mode::Mode, scene::Scene, view::View, Action};
use crate::router::Message;
use crate::{tui::Event, tui::Frame};
use color_eyre::eyre::Result;
use ratatui::prelude::*;
use tokio::sync::mpsc;
mod about;
mod email_prompt;
mod layers;
use about::About;
use email_prompt::EmailPrompt;
#[derive(Debug)]
pub struct Home<'a> {
state: State,
pub message_tx_to_self: mpsc::UnboundedSender<Message>,
email_prompt: EmailPrompt<'a>,
mode: Mode,
}
impl<'a> Home<'a> {
pub fn new(tx: mpsc::UnboundedSender<Message>) -> Home<'a> {
let (message_tx_to_self, _) = mpsc::unbounded_channel::<Message>();
Home {
state: State::Visible,
message_tx_to_self,
email_prompt: EmailPrompt::new(tx),
mode: Mode::default(),
}
}
fn should_restore_navigation_mode(&self) -> bool {
!self.email_prompt.is_active() && (self.mode == Mode::TextInput)
}
}
impl<'a> Component for Home<'a> {
fn update(&mut self, action: Action) -> Result<Option<Action>> {
if let Action::ChangeMode(mode) = action {
self.mode = mode;
}
match self.mode {
Mode::Navigation => match action {
Action::ChangeScene(scene) => {
match scene {
Scene::Home => self.state = State::Visible,
_ => self.state = State::Hidden,
}
}
Action::ChangeView(k) => {
if self.state == State::Visible {
if let View::Prompt = k {
return self.email_prompt.activate();
}
}
}
_ => {}
},
Mode::TextInput => {
if self.should_restore_navigation_mode() {
return Ok(Some(Action::ChangeMode(Mode::Navigation)));
}
}
}
Ok(None)
}
fn handle_events(&mut self, event: Option<Event>) -> Result<Option<Action>> {
if self.email_prompt.is_active() {
if let Some(Event::Key(k)) = event {
self.email_prompt.handle_key_event(k)?;
}
}
Ok(None)
}
fn draw(&mut self, f: &mut Frame<'_>, area: Rect) -> Result<()> {
if let State::Hidden = self.state {
} else {
let layers = layers::Layers::new(area);
self.email_prompt.render(layers.zero[2], f);
About::render(layers.zero[1], f);
}
Ok(())
}
}