use ratatui::{
layout::{Alignment, Rect},
style::{Modifier, Style},
widgets::{ListItem, ListState, Paragraph},
Frame,
};
use super::super::components::list::styled_list;
use super::super::theme::ThemeColors;
pub use crate::ui::components::modal::{render_modal_container, ModalConfig};
pub use crate::ui::components::tab_bar::{render_tab_bar, TabBarConfig};
pub fn render_loading_state(frame: &mut Frame, area: Rect, message: &str, theme: &ThemeColors) {
let loading = Paragraph::new(message)
.alignment(Alignment::Center)
.style(Style::default().fg(theme.warning));
frame.render_widget(loading, area);
}
pub struct UserListConfig {
pub selected_index: usize,
pub show_stats: bool,
}
pub trait UserListItem {
fn username(&self) -> &str;
fn follower_count(&self) -> Option<usize> {
None
}
fn following_count(&self) -> Option<usize> {
None
}
}
pub fn render_user_list<T: UserListItem>(
frame: &mut Frame,
area: Rect,
users: &[T],
config: &UserListConfig,
theme: &ThemeColors,
) {
if users.is_empty() {
return;
}
let items: Vec<ListItem> = users
.iter()
.map(|user| {
let content = if config.show_stats {
if let (Some(followers), Some(following)) =
(user.follower_count(), user.following_count())
{
format!(
"@{} {} followers | {} following",
user.username(),
followers,
following
)
} else {
format!("@{}", user.username())
}
} else {
format!("@{}", user.username())
};
ListItem::new(content)
})
.collect();
let list = styled_list(items, theme, Some(">> ")).highlight_style(
Style::default()
.bg(theme.highlight_bg)
.add_modifier(Modifier::BOLD),
);
let mut list_state = ListState::default();
if !users.is_empty() {
list_state.select(Some(config.selected_index.min(users.len() - 1)));
}
frame.render_stateful_widget(list, area, &mut list_state);
}