do-next 0.0.0-2026.4.8

Pick your next Jira task & manage it from the terminal
use ratatui::{
    Frame,
    layout::Rect,
    style::{Modifier, Style},
    text::{Line, Span},
    widgets::{Paragraph, Wrap},
};

use crate::jira::adf::json_to_text;
use crate::jira::types::Issue;
use crate::tui::app::AppState;
use crate::tui::markdown::markdown_to_lines;

pub fn render_comments(f: &mut Frame, area: Rect, issue: &Issue, app: &AppState) -> usize {
    let mut lines: Vec<Line> = Vec::new();

    lines.push(Line::from(vec![
        Span::styled(&issue.key, Style::default().add_modifier(Modifier::BOLD)),
        Span::raw(" — Comments"),
    ]));
    lines.push(Line::from(""));

    match &issue.fields.comment {
        Some(comment_list) if !comment_list.comments.is_empty() => {
            for comment in &comment_list.comments {
                let author = comment.author.display();
                let date = &comment.created[..10]; // YYYY-MM-DD
                lines.push(Line::from(Span::styled(
                    format!("{author} · {date}"),
                    Style::default().add_modifier(Modifier::BOLD),
                )));
                for mut line in markdown_to_lines(&json_to_text(&comment.body)) {
                    line.spans.insert(0, Span::raw("  "));
                    lines.push(line);
                }
                lines.push(Line::from(""));
            }
        }
        _ => {
            lines.push(Line::from(Span::styled(
                "(no comments)",
                Style::default().add_modifier(Modifier::DIM),
            )));
        }
    }

    let total = lines.len();
    let scroll = u16::try_from(app.detail_scroll).unwrap_or(u16::MAX);
    f.render_widget(
        Paragraph::new(lines)
            .wrap(Wrap { trim: false })
            .scroll((scroll, 0)),
        area,
    );
    total
}