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, TreePos};
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, tree: &TreePos) -> ListItem<'static> {
let open = self.state == "OPEN";
let icon = if open { "●" } else { "✓" };
let icon_color = if open { Color::Green } else { Color::Red };
let title_style = if open {
Style::default()
} else {
Style::default().fg(Color::DarkGray)
};
ListItem::new(Line::from(vec![
Span::raw(" "),
Span::styled(tree.prefix.clone(), Style::default().fg(Color::DarkGray)),
Span::styled(icon, Style::default().fg(icon_color)),
Span::raw(" "),
Span::styled(
format!("#{}", self.number),
Style::default().fg(Color::Yellow),
),
Span::raw(" "),
Span::styled(self.title.clone(), title_style),
]))
}
fn number(&self) -> u64 {
self.number
}
fn parent_number(&self, _items: &[Self]) -> Option<u64> {
self.parent.as_ref().map(|p| p.number)
}
fn search_text(&self) -> String {
format!("#{} {}", self.number, self.title)
}
fn browser_event(&self) -> PaneEvent {
PaneEvent::OpenIssueBrowser(self.number)
}
fn copy_url(&self) -> Option<String> {
client::issue_url(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(show_closed: bool) -> Result<Vec<Self>, String> {
client::list_issues(50, show_closed)
}
fn wrap_bg_message(result: Result<Vec<Self>, String>, show_closed: bool) -> GhBgMessage {
GhBgMessage::IssueList {
result,
show_closed,
}
}
}
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)
}