"use client"; import { useEffect, useState } from "react"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import type { ForgejoIssue } from "@/lib/api-forgejo"; import { editForgejoIssue } from "@/lib/api-forgejo"; type EditForgejoIssueDialogProps = { issue: ForgejoIssue | null; repositoryName: string; open: boolean; onOpenChange: (open: boolean) => void; onSuccess: (updated: { title: string; body: string | null; state: string }) => void; }; export function EditForgejoIssueDialog({ issue, repositoryName, open, onOpenChange, onSuccess, }: EditForgejoIssueDialogProps) { const [title, setTitle] = useState(""); const [body, setBody] = useState(""); const [isSubmitting, setIsSubmitting] = useState(false); const [error, setError] = useState(null); useEffect(() => { if (open && issue) { setTitle(issue.title); setBody(issue.body ?? issue.body_preview ?? ""); setError(null); } }, [open, issue]); if (!issue) return null; const isDirty = title.trim() !== issue.title || body !== (issue.body ?? issue.body_preview ?? ""); const handleSubmit = async () => { if (!title.trim()) return; setIsSubmitting(true); setError(null); try { const patch: { title?: string; body?: string } = {}; if (title.trim() !== issue.title) patch.title = title.trim(); if (body !== (issue.body ?? issue.body_preview ?? "")) patch.body = body; const result = await editForgejoIssue(issue.id, patch); onSuccess({ title: result.title, body: result.body, state: result.state }); onOpenChange(false); } catch (err) { setError(err instanceof Error ? err.message : "Failed to edit issue"); } finally { setIsSubmitting(false); } }; return ( { if (!isSubmitting) { setError(null); onOpenChange(next); } }} > Edit issue Editing{" "} {repositoryName}#{issue.forgejo_issue_number} . Changes will be saved to the connected Git provider.
setTitle(e.target.value)} disabled={isSubmitting} placeholder="Issue title" />