concord 2.1.1

A terminal user interface client for Discord
Documentation
use super::*;

pub(in crate::tui::ui) fn render_message_url_picker(
    frame: &mut Frame,
    area: Rect,
    state: &DashboardState,
) {
    if !state.is_message_url_picker_open() {
        return;
    }

    let urls = state.selected_message_url_items();
    if urls.is_empty() {
        return;
    }
    let selected = state.selected_message_url_index().unwrap_or(0);
    let popup = centered_rect(area, 54, (urls.len() as u16).saturating_add(2));
    let lines = truncate_message_url_picker_lines(
        message_url_picker_lines(&urls, selected),
        popup.width.saturating_sub(2) as usize,
    );
    frame.render_widget(Clear, popup);
    frame.render_widget(
        Paragraph::new(lines)
            .block(panel_block("Open URL", true))
            .wrap(Wrap { trim: false }),
        popup,
    );
}

pub(in crate::tui::ui) fn message_url_picker_lines(
    urls: &[MessageUrlItem],
    selected: usize,
) -> Vec<Line<'static>> {
    urls.iter()
        .enumerate()
        .map(|(index, item)| {
            let marker = if index == selected { "" } else { "  " };
            let shortcut = shortcut_prefix(
                crate::tui::keybindings::KeyBindings::default().indexed_shortcut(index),
            );
            let mut style = Style::default();
            if index == selected {
                style = style
                    .bg(Color::Rgb(40, 45, 90))
                    .add_modifier(Modifier::BOLD);
            }
            Line::from(vec![
                Span::styled(marker, Style::default().fg(ACCENT)),
                Span::styled(shortcut, Style::default().fg(DIM)),
                Span::styled(item.label.to_owned(), style),
            ])
        })
        .collect()
}

#[cfg(test)]
pub(in crate::tui::ui) fn message_url_picker_lines_for_width(
    urls: &[MessageUrlItem],
    selected: usize,
    width: usize,
) -> Vec<Line<'static>> {
    truncate_message_url_picker_lines(message_url_picker_lines(urls, selected), width)
}

fn truncate_message_url_picker_lines(
    lines: Vec<Line<'static>>,
    width: usize,
) -> Vec<Line<'static>> {
    lines
        .into_iter()
        .map(|line| truncate_line_to_display_width(line, width.max(1)))
        .collect()
}