From 80fd57810e36b9ff67d07686050c923c966894e4 Mon Sep 17 00:00:00 2001 From: Benjamyn Love Date: Sat, 30 Mar 2024 20:26:48 +1100 Subject: [PATCH] Added vertical UI Added reactivity --- src/app.rs | 2 +- src/main.rs | 3 +++ src/ui.rs | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 76 insertions(+), 5 deletions(-) diff --git a/src/app.rs b/src/app.rs index 83e20d9..7459853 100644 --- a/src/app.rs +++ b/src/app.rs @@ -22,7 +22,7 @@ impl App { domain_input: String::new(), whois_info: vec![], dns_info: vec![], - render_direction: AppRenderDir::Horizontal, + render_direction: AppRenderDir::Vertical, current_state: CurrentState::Lookup, } } diff --git a/src/main.rs b/src/main.rs index 213d83f..ef3541f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -80,6 +80,9 @@ fn run_app( let whois = WhoisData::new(app.domain_input.clone()); app.whois_info = whois.to_vec(); } + KeyCode::Delete => { + app.domain_input = String::new(); + } _ => {} }, CurrentState::Menu => {} diff --git a/src/ui.rs b/src/ui.rs index 25a1ed6..79b82b8 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -11,7 +11,12 @@ use crate::{ CurrentState, }; -pub fn ui(f: &mut Frame, app: &App) { +pub fn ui(f: &mut Frame, app: &mut App) { + if f.size().width > 100 { + app.render_direction = AppRenderDir::Horizontal; + } else { + app.render_direction = AppRenderDir::Vertical; + } match app.current_state { CurrentState::Lookup => { match app.render_direction { @@ -65,6 +70,7 @@ pub fn ui(f: &mut Frame, app: &App) { // DNS list let mut dns_list_items = Vec::::new(); + for record in &app.dns_info { dns_list_items.push(ListItem::new(Line::from(Span::styled( record, @@ -93,8 +99,9 @@ pub fn ui(f: &mut Frame, app: &App) { let key_hint_block = Block::default() .borders(Borders::ALL) .style(Style::default()); + let key_hint = Paragraph::new(Text::styled( - "[ESC] Quit / [Enter] Check domain", + "[ESC] Quit / [Enter] Check domain / [Del] Clear Input", Style::default().fg(Color::Red), )) .block(key_hint_block); @@ -110,12 +117,73 @@ pub fn ui(f: &mut Frame, app: &App) { let chunks = Layout::default() .direction(Direction::Vertical) .constraints([ - Constraint::Max(30), + Constraint::Length(3), Constraint::Percentage(50), Constraint::Percentage(50), - Constraint::Max(30), + Constraint::Length(3), ]) .split(f.size()); + + let title_block = Block::default() + .borders(Borders::ALL) + .style(Style::default()); + + let title = Paragraph::new(Span::styled( + "Dns Lookup tool", + Style::default().fg(Color::White), + )) + .block(title_block); + + f.render_widget(title, chunks[0]); + + // Whois list + let mut whois_list_items = Vec::::new(); + for record in &app.whois_info { + whois_list_items.push(ListItem::new(Line::from(Span::styled( + record, + Style::default(), + )))) + } + let whois_list = List::new(whois_list_items); + + f.render_widget(whois_list, chunks[1]); + + // DNS list + let mut dns_list_items = Vec::::new(); + for record in &app.dns_info { + dns_list_items.push(ListItem::new(Line::from(Span::styled( + record, + Style::default(), + )))) + } + let dns_list = List::new(dns_list_items); + + f.render_widget(dns_list, chunks[2]); + let footer_chunks = Layout::default() + .direction(Direction::Horizontal) + .constraints([Constraint::Percentage(50), Constraint::Percentage(50)]) + .split(chunks[3]); + + let domain_block = Block::new().borders(Borders::ALL).style(Style::default()); + let mut domain_string = String::from("Domain: "); + domain_string.push_str(&app.domain_input); + let domain_text = Paragraph::new(Text::styled( + domain_string, + Style::default().fg(Color::Blue), + )) + .block(domain_block); + f.render_widget(domain_text, footer_chunks[0]); + + let key_hint_block = Block::default() + .borders(Borders::ALL) + .style(Style::default()); + + let key_hint = Paragraph::new(Text::styled( + "[ESC] Quit / [Enter] Check domain", + Style::default().fg(Color::Red), + )) + .block(key_hint_block); + f.render_widget(key_hint, footer_chunks[1]); } } }