vig 0.2.0

Git TUI side-by-side diff viewer
use crate::core::pane::PaneEvent;
use crate::github::domain::types::GhIssueListItem;
use crate::github::domain::{client, disk_cache};
use crate::github::panes::gh_list::{GhListItem, GhListPane};
use crate::github::state::GhBgMessage;
use crossterm::event::KeyCode;
use ratatui::{
    style::{Color, Style},
    text::{Line, Span},
    widgets::ListItem,
};

impl GhListItem for GhIssueListItem {
    fn pane_title() -> &'static str {
        "Issues"
    }

    fn empty_message() -> &'static str {
        "No issues"
    }

    fn render_item(&self) -> ListItem<'static> {
        let icon = if self.state == "OPEN" { "" } else { "" };
        let icon_color = if self.state == "OPEN" {
            Color::Green
        } else {
            Color::Red
        };

        ListItem::new(Line::from(vec![
            Span::raw(" "),
            Span::styled(icon, Style::default().fg(icon_color)),
            Span::raw(" "),
            Span::styled(
                format!("#{}", self.number),
                Style::default().fg(Color::Yellow),
            ),
            Span::raw(" "),
            Span::raw(self.title.clone()),
        ]))
    }

    fn number(&self) -> u64 {
        self.number
    }

    fn search_text(&self) -> String {
        format!("#{} {}", self.number, self.title)
    }

    fn browser_event(&self) -> PaneEvent {
        PaneEvent::OpenIssueBrowser(self.number)
    }

    fn load_disk_cache() -> Option<Vec<Self>> {
        disk_cache::load_issue_list()
    }

    fn save_disk_cache(items: &[Self]) {
        disk_cache::save_issue_list(items);
    }

    fn fetch_list() -> Result<Vec<Self>, String> {
        client::list_issues(50)
    }

    fn wrap_bg_message(result: Result<Vec<Self>, String>) -> GhBgMessage {
        GhBgMessage::IssueList(result)
    }
}

pub type GhIssueListPane = GhListPane<GhIssueListItem>;

pub fn new_pane(pane_id: usize, detail_id: usize, switch_target: usize) -> GhIssueListPane {
    GhListPane::new(pane_id, detail_id, KeyCode::Tab, switch_target)
}