#![forbid(unsafe_code)]
use bubbles::textinput::TextInput;
use bubbletea::{Cmd, KeyMsg, KeyType, Message, Model, Program, quit};
use lipgloss::Style;
#[derive(bubbletea::Model)]
struct App {
input: TextInput,
submitted: bool,
name: String,
}
impl App {
fn new() -> Self {
let mut input = TextInput::new();
input.set_placeholder("Enter your name...");
let _ = input.focus();
Self {
input,
submitted: false,
name: String::new(),
}
}
fn init(&self) -> Option<Cmd> {
Model::init(&self.input)
}
fn update(&mut self, msg: Message) -> Option<Cmd> {
if let Some(key) = msg.downcast_ref::<KeyMsg>() {
match key.key_type {
KeyType::Enter => {
if self.submitted {
return Some(quit());
}
self.name = self.input.value();
self.submitted = true;
}
KeyType::CtrlC | KeyType::Esc => return Some(quit()),
_ => {}
}
}
if !self.submitted {
return self.input.update(msg);
}
None
}
fn view(&self) -> String {
if self.submitted {
let style = Style::new().foreground("212");
format!(
"Hello, {}!\n\nPress Enter to quit.",
style.render(&self.name)
)
} else {
format!(
"What's your name?\n\n{}\n\nPress Enter to submit, Esc to quit.",
self.input.view()
)
}
}
}
fn main() -> Result<(), bubbletea::Error> {
let model = App::new();
Program::new(model).run()?;
Ok(())
}