Testing ratatui

This commit is contained in:
Marco De Araujo 2025-12-24 07:36:23 -04:00
parent 843d05bec9
commit ae9065a1e0
7 changed files with 25 additions and 47 deletions

View file

@ -8,3 +8,7 @@ invalid-json-heartbeat = ❌ Error parssing heartbeat JSON
invalid-uptime-key-format = Invalid format for uptime key. Expected format "monitorID_period". Received key: {key} invalid-uptime-key-format = Invalid format for uptime key. Expected format "monitorID_period". Received key: {key}
invalid-monitor-id = Invalid monitor ID: {id} invalid-monitor-id = Invalid monitor ID: {id}
invalid-period-hours = Invalid period in hours: {hours} invalid-period-hours = Invalid period in hours: {hours}
loading = Loading
dashboard-header = Dashboard
monitors = Monitors
unknown = Unknown

View file

@ -8,3 +8,7 @@ invalid-json-heartbeat = ❌ Falha ao parsear JSON do heartbeat
invalid-uptime-key-format = Formato inválido na chave de uptime. Chave esperada no formato "monitorID_periodo". Chave recebida: {key} invalid-uptime-key-format = Formato inválido na chave de uptime. Chave esperada no formato "monitorID_periodo". Chave recebida: {key}
invalid-monitor-id = ID de monitor inválido: {id} invalid-monitor-id = ID de monitor inválido: {id}
invalid-period-hours = Período em horas inválido: {hours} invalid-period-hours = Período em horas inválido: {hours}
loading = Carregando
dashboard-header = Dashboard
monitors = Monitors
unknown = Desconhecido

View file

@ -1,12 +1,11 @@
use anyhow::Result; use anyhow::Result;
use clap::Parser; use clap::Parser;
use std::result::Result::Ok; use std::result::Result::Ok;
mod i18n;
use i18n::init_locales;
mod api; mod api;
use crate::core::unify_data; mod i18n;
use api::UptimeKumaClient;
use api::UptimeKumaEndpoints; use api::UptimeKumaEndpoints;
use crate::ui::App;
mod core; mod core;
mod data; mod data;
mod ui; mod ui;
@ -22,39 +21,11 @@ struct Args {
} }
fn main() -> Result<()> { fn main() -> Result<()> {
init_locales()?; i18n::init_locales()?;
let args = Args::parse(); let args = Args::parse();
let client = UptimeKumaClient::new();
let endpoints = UptimeKumaEndpoints::new(&args.base_url, &args.slug)?; let endpoints = UptimeKumaEndpoints::new(&args.base_url, &args.slug)?;
let heartbeat_data = client.fetch_heartbeat(&endpoints)?; let mut app = App::new(endpoints)?;
app.run()?;
let status_page_data = client.fetch_status_page(&endpoints)?;
let unified_data = unify_data(&status_page_data, &heartbeat_data);
println!("Title: {}", unified_data.title);
for monitor in unified_data.monitors {
println!("Monitor ID: {}", monitor.monitor_info.id);
println!("Nome: {}", monitor.monitor_info.name);
println!(
"Uptime Service: {}",
monitor.uptime_data.expect("Formgen?").get_perc_formated()
);
println!(
"Status atual: {}",
monitor
.heartbeats
.last()
.map(|h| if h.status == 1 {
"✅ Online"
} else {
"❌ Offline"
})
.unwrap_or("❓ Sem dados")
);
}
Ok(()) Ok(())
} }

View file

@ -1,12 +1,11 @@
use crate::api::{UptimeKumaClient, UptimeKumaEndpoints, endpoints}; use crate::api::{UptimeKumaClient, UptimeKumaEndpoints};
use crate::core; use crate::core;
use crate::data::{self, HeartbeatResponse, StatusPageResponse, heartbeat, status_page}; use crate::i18n::{t};
use crate::i18n::{t, t_with_args};
use crate::ui::components::{render_header, render_monitor_list}; use crate::ui::components::{render_header, render_monitor_list};
use crate::ui::dashboard::model::{DashboardViewState, MonitorStatus}; use crate::ui::dashboard::model::{DashboardViewState};
use crossterm::{ use crossterm::{
event::{ event::{
self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode, KeyEventKind, KeyModifiers, self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode, KeyEventKind,
}, },
execute, execute,
terminal::{EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode}, terminal::{EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode},
@ -15,7 +14,7 @@ use ratatui::{
Frame, Terminal, Frame, Terminal,
backend::CrosstermBackend, backend::CrosstermBackend,
layout::{Alignment, Constraint, Direction, Layout, Rect}, layout::{Alignment, Constraint, Direction, Layout, Rect},
style::{Color, Modifier, Style, Stylize}, style::{Color, Modifier, Style},
text::{Line, Span, Text}, text::{Line, Span, Text},
widgets::{Block, Borders, ListState, Padding, Paragraph}, widgets::{Block, Borders, ListState, Padding, Paragraph},
}; };

View file

@ -12,7 +12,7 @@ pub fn render_header(frame: &mut Frame, area: Rect, state: &DashboardViewState)
let title = if state.is_loading { let title = if state.is_loading {
t("loading").to_string() t("loading").to_string()
} else { } else {
format!("{} - {}", t("dashboard-heaser"), state.title) format!("{} - {}", t("dashboard-header"), state.title)
}; };
let header = Paragraph::new(Line::from(vec![ let header = Paragraph::new(Line::from(vec![

View file

@ -4,10 +4,10 @@ use ratatui::style::Modifier;
use ratatui::widgets::{List, ListItem, ListState}; use ratatui::widgets::{List, ListItem, ListState};
use ratatui::{ use ratatui::{
Frame, Frame,
layout::{Alignment, Rect}, layout::Rect,
style::{Color, Style, Stylize}, style::{Color, Style},
text::{Line, Span}, text::{Line, Span},
widgets::{Block, Borders, Paragraph}, widgets::{Block, Borders},
}; };
pub fn render_monitor_list( pub fn render_monitor_list(
@ -28,7 +28,7 @@ pub fn render_monitor_list(
let status_icon = match monitor.status { let status_icon = match monitor.status {
MonitorStatus::Up => "", MonitorStatus::Up => "",
MonitorStatus::Down => "", MonitorStatus::Down => "",
MonitorStatus::Unknown => "?", MonitorStatus::Unknown => "",
}; };
let status_color = match monitor.status { let status_color = match monitor.status {

View file

@ -56,7 +56,7 @@ impl DashboardViewState {
.last() .last()
.and_then(|h| h.ping) .and_then(|h| h.ping)
.map(|ms| format!("{}", ms)) .map(|ms| format!("{}", ms))
.unwrap_or_else(|| t("unknown").to_string()); .unwrap_or_else(|| t("unknown").to_string() + " ");
let uptime_24h = monitor let uptime_24h = monitor
.uptime_data .uptime_data