hcterm 0.7.0-dev.25

A terminal for Holochain
use crate::cli::Args;
use ratatui::layout::{Constraint, Flex, Rect};
use ratatui::prelude::{Alignment, Buffer, Direction, Layout, Style, Stylize, Widget};
use ratatui::style::Color;
use ratatui::widgets::{Block, List, ListItem};
use std::sync::Arc;

pub struct HomeWidget {
    args: Arc<Args>,
}

impl HomeWidget {
    pub fn new(args: Arc<Args>) -> Self {
        Self { args }
    }
}

impl Widget for HomeWidget {
    fn render(self, area: Rect, buf: &mut Buffer) {
        let layout = Layout::default()
            .constraints([
                Constraint::Length(1),
                Constraint::Length(1),
                Constraint::Percentage(50),
            ])
            .direction(Direction::Vertical)
            .split(area);

        let header = Block::default()
            .title("Welcome to the Holochain Terminal")
            .style(Style::default().bold())
            .title_alignment(Alignment::Center);

        header.render(layout[0], buf);

        let help = Block::default()
            .title("Use the TAB key to navigate between screens and press ESC to exit the terminal")
            .title_alignment(Alignment::Center);

        help.render(layout[1], buf);

        let [args_layout] = Layout::horizontal([Constraint::Percentage(40)])
            .flex(Flex::Center)
            .areas(area);

        let [args_layout] = Layout::vertical([Constraint::Length(5)])
            .flex(Flex::Center)
            .areas(args_layout);

        let args = List::new(vec![
            ListItem::new(format!(
                "- Admin URL    : {}",
                match self.args.admin_url {
                    Some(ref admin_url) => admin_url.to_string(),
                    None => "not configured".to_string(),
                }
            ))
            .style(Style::default().italic().fg(Color::Gray)),
            ListItem::new(format!(
                "- Boostrap URL : {}",
                match self.args.bootstrap_url {
                    Some(ref bootstrap_url) => bootstrap_url.to_string(),
                    None => "not configured".to_string(),
                }
            ))
            .style(Style::default().italic().fg(Color::Gray)),
            ListItem::new(format!(
                "- DNA hash     : {}",
                match self.args.dna_hash {
                    Some(ref app_id) => app_id.to_string(),
                    None => "not configured".to_string(),
                }
            ))
            .style(Style::default().italic().fg(Color::Gray)),
            ListItem::new(format!(
                "- App ID       : {}",
                match self.args.app_id {
                    Some(ref app_id) => app_id.to_string(),
                    None => "not configured".to_string(),
                }
            ))
            .style(Style::default().italic().fg(Color::Gray)),
        ])
        .block(Block::default().title("Started with args:").bold().white())
        .style(Style::default().bg(Color::Black));
        args.render(args_layout, buf);
    }
}