use crate::{
components::utils::centered_rect_fixed,
style::{EUCALYPTUS, GHOST_WHITE, RED, clear_area},
tui::Frame,
};
use crossterm::event::{KeyCode, KeyEvent};
use ratatui::{
layout::{Alignment, Constraint, Direction, Layout, Rect},
style::{Style, Stylize},
text::{Line, Span},
widgets::{Block, Borders, Padding, Paragraph, Wrap},
};
#[derive(Clone)]
pub struct ErrorPopup {
visible: bool,
title: String,
message: String,
error_message: String,
}
impl ErrorPopup {
pub fn new(title: String, message: String, error_message: String) -> Self {
Self {
visible: false,
title,
message,
error_message,
}
}
pub fn draw_error(&self, f: &mut Frame, area: Rect) {
if !self.visible {
return;
}
let layer_zero = centered_rect_fixed(52, 15, area);
let layer_one = Layout::new(
Direction::Vertical,
[
Constraint::Length(2),
Constraint::Min(1),
Constraint::Length(1),
],
)
.split(layer_zero);
let pop_up_border = Paragraph::new("").block(
Block::default()
.borders(Borders::ALL)
.title(format!(" {} ", self.title))
.bold()
.title_style(Style::new().fg(RED))
.padding(Padding::uniform(2))
.border_style(Style::new().fg(RED)),
);
clear_area(f, layer_zero);
let layer_two = Layout::new(
Direction::Vertical,
[
Constraint::Length(4),
Constraint::Length(7),
Constraint::Length(1),
Constraint::Length(1),
],
)
.split(layer_one[1]);
let prompt = Paragraph::new(self.message.clone())
.block(
Block::default()
.padding(Padding::horizontal(2))
.padding(Padding::vertical(1)),
)
.alignment(Alignment::Center)
.wrap(Wrap { trim: true });
f.render_widget(prompt.fg(GHOST_WHITE), layer_two[0]);
let text = Paragraph::new(self.error_message.clone())
.block(Block::default().padding(Padding::horizontal(2)))
.alignment(Alignment::Center)
.wrap(Wrap { trim: true });
f.render_widget(text.fg(GHOST_WHITE), layer_two[1]);
let dash = Block::new()
.borders(Borders::BOTTOM)
.border_style(Style::new().fg(GHOST_WHITE));
f.render_widget(dash, layer_two[2]);
let buttons_layer =
Layout::horizontal(vec![Constraint::Percentage(50), Constraint::Percentage(50)])
.split(layer_two[3]);
let button_ok = Line::from(vec![
Span::styled("OK ", Style::default().fg(EUCALYPTUS)),
Span::styled("[Enter] ", Style::default().fg(GHOST_WHITE)),
])
.alignment(Alignment::Right);
f.render_widget(button_ok, buttons_layer[1]);
f.render_widget(pop_up_border, layer_zero);
}
pub fn handle_input(&mut self, key: KeyEvent) -> bool {
if self.visible && (key.code == KeyCode::Esc || key.code == KeyCode::Enter) {
self.hide();
true
} else {
false
}
}
pub fn show(&mut self) {
debug!("Showing error popup");
self.visible = true;
}
pub fn hide(&mut self) {
debug!("Hiding error popup");
self.visible = false;
}
pub fn is_visible(&self) -> bool {
self.visible
}
}