"use client"; import { useState } from "react"; import { IconCheck, IconMessagePlus, IconSend } from "@tabler/icons-react"; import { Badge } from "@kandev/ui/badge"; import { Button } from "@kandev/ui/button"; import { Textarea } from "@kandev/ui/textarea"; import type { GitLabMRDiscussion } from "@/lib/types/gitlab"; import { CollapsibleSection, formatTimeAgo, PRMarkdownBody } from "@/components/github/pr-shared"; import { useTranslation } from "react-i18next"; function discussionLocation(discussion: GitLabMRDiscussion): string { if (!discussion.path) return ""; const line = discussion.line || discussion.old_line; return `\`${discussion.path}${line ? `:${line}` : ""}\``; } export function buildDiscussionContext(discussion: GitLabMRDiscussion, mrUrl: string): string { const parts = ["### Merge request discussion", ""]; const location = discussionLocation(discussion); if (location) parts.push(`Location: ${location}`, ""); for (const note of discussion.notes) { parts.push(`**${note.author}**:`, note.body, ""); } parts.push(`Merge request: ${mrUrl}`, "Please address this discussion."); return parts.join("\n"); } export function buildAllDiscussionsContext( discussions: GitLabMRDiscussion[], mrUrl: string, ): string { return discussions .map((discussion) => buildDiscussionContext(discussion, mrUrl)) .join("\n\n---\n\n"); } type DiscussionProps = { discussion: GitLabMRDiscussion; busy: boolean; onReply: (discussionId: string, body: string) => Promise; onResolve: (discussionId: string) => Promise; onAddContext: (content: string) => void; mrUrl: string; }; function Discussion({ discussion, busy, onReply, onResolve, onAddContext, mrUrl, }: DiscussionProps) { const { t } = useTranslation(); const [reply, setReply] = useState(""); const submitReply = async () => { const body = reply.trim(); if (!body) return; if (await onReply(discussion.id, body)) setReply(""); }; const location = discussionLocation(discussion); return (
{location && ( {location.replaceAll("`", "")} )} {discussion.resolved && ( {t("gitlab:resolved")} )}
{discussion.notes.map((note) => (
{note.author} {formatTimeAgo(note.created_at)}
))}