use ratatui::layout::{Constraint, Layout, Rect};
use ratatui::style::{Modifier, Style};
use ratatui::text::{Line, Span};
use ratatui::widgets::{Block, Clear, Paragraph, Wrap};
use ratatui::Frame;
use crate::app::AppState;
use crate::theme::Theme;
pub fn render(frame: &mut Frame<'_>, area: Rect, app: &AppState, theme: &Theme) {
let Some(modal) = app.current_error_modal() else {
return;
};
frame.render_widget(Clear, area);
let block = Block::bordered()
.title(Line::from(vec![
Span::raw(" "),
Span::styled(
"\u{2716}",
Style::new().fg(theme.error).add_modifier(Modifier::BOLD),
),
Span::raw(" "),
Span::styled(
modal.title.clone(),
Style::new().fg(theme.error).add_modifier(Modifier::BOLD),
),
Span::raw(" "),
]))
.border_style(Style::new().fg(theme.error));
let inner = block.inner(area);
frame.render_widget(block, area);
let rows = Layout::vertical([
Constraint::Length(1), Constraint::Length(3), Constraint::Length(1), Constraint::Min(3), Constraint::Length(1), Constraint::Length(1), ])
.split(inner);
if let Some(&r) = rows.get(1) {
let lines = vec![Line::from(vec![
Span::styled(
" \u{2716} ",
Style::new().fg(theme.error).add_modifier(Modifier::BOLD),
),
Span::styled(modal.message.clone(), Style::new().fg(theme.error)),
])];
frame.render_widget(Paragraph::new(lines).wrap(Wrap { trim: false }), r);
}
if let (Some(&r), Some(hint)) = (rows.get(3), modal.hint.as_deref()) {
let lines: Vec<Line<'_>> = hint
.split('\n')
.map(|chunk| {
Line::from(vec![
Span::raw(" "),
Span::styled(chunk.to_owned(), theme.dim_cell()),
])
})
.collect();
let para = Paragraph::new(lines).wrap(Wrap { trim: false });
frame.render_widget(para, r);
}
if let Some(&r) = rows.get(5) {
let hint = Line::from(vec![
Span::styled(" Enter ", Style::new().fg(theme.accent)),
Span::styled("acknowledge \u{00b7} ", theme.dim_cell()),
Span::styled("Esc ", Style::new().fg(theme.accent)),
Span::styled("dismiss", theme.dim_cell()),
]);
frame.render_widget(Paragraph::new(hint), r);
}
}