"use client"; import { useEffect, useMemo, useState } from "react"; import { Button } from "@kandev/ui/button"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@kandev/ui/dialog"; import { Input } from "@kandev/ui/input"; import { Label } from "@kandev/ui/label"; import { useToast } from "@/components/toast-provider"; import { createTaskPR } from "@/lib/api/domains/github-api"; import type { Repository } from "@/lib/types/http"; import { githubReposForTask, pullRequestPayload, type TaskPullRequestLinkTarget, } from "./task-github-pr-url"; type TaskGitHubPRDialogProps = { workspaceId: string | null; open: boolean; onOpenChange: (open: boolean) => void; task: TaskPullRequestLinkTarget; repositories: Repository[]; }; export function TaskGitHubPRDialog({ workspaceId, open, onOpenChange, task, repositories, }: TaskGitHubPRDialogProps) { const { toast } = useToast(); const [input, setInput] = useState(""); const [submitting, setSubmitting] = useState(false); const [error, setError] = useState(null); const githubRepos = useMemo(() => githubReposForTask(task, repositories), [task, repositories]); const inferredRepo = githubRepos.length === 1 ? githubRepos[0] : null; const placeholder = inferredRepo ? "#1471 or github.com/owner/repo/pull/1471" : "github.com/owner/repo/pull/1471"; useEffect(() => { if (open) { setInput(""); setError(null); } }, [open]); const submit = async () => { if (!workspaceId) { setError("Select a workspace before linking a GitHub pull request."); return; } if (!input.trim()) { setError("Enter a GitHub pull request URL or number."); return; } setSubmitting(true); setError(null); try { const payload = pullRequestPayload(input, githubRepos); await createTaskPR({ workspace_id: workspaceId, task_id: task.id, pr_url: payload.pr_url, ...(payload.repository_id ? { repository_id: payload.repository_id } : {}), }); toast({ description: "GitHub pull request linked", variant: "success" }); onOpenChange(false); } catch (err) { setError(err instanceof Error ? err.message : "Failed to link GitHub pull request."); } finally { setSubmitting(false); } }; return ( Link GitHub pull request {inferredRepo ? `Use a full pull request URL or number for ${inferredRepo.owner}/${inferredRepo.repo}.` : "Use a full GitHub pull request URL for this task."}
setInput(event.target.value)} placeholder={placeholder} disabled={submitting} /> {error && (

{error}

)}
); }