"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 { linkTaskIssue, unlinkTaskIssue } from "@/lib/api/domains/github-api"; import type { Repository } from "@/lib/types/http"; type TaskIssue = { id: string; title: string; repositoryId?: string; issueUrl?: string; issueNumber?: number; repositories?: Array<{ repository_id: string }>; }; type GitHubRepoRef = { owner: string; repo: string; }; type TaskGitHubIssueDialogProps = { open: boolean; onOpenChange: (open: boolean) => void; task: TaskIssue; repositories: Repository[]; }; type DialogFieldsProps = { input: string; setInput: (input: string) => void; inferredRepo: GitHubRepoRef | null; submitting: boolean; error: string | null; }; type DialogActionsProps = { currentLabel: string | null; submitting: boolean; onCancel: () => void; onSubmit: () => void; onUnlink: () => void; }; function githubReposForTask(task: TaskIssue, repositories: Repository[]): GitHubRepoRef[] { const ids = new Set((task.repositories ?? []).map((repo) => repo.repository_id)); if (task.repositoryId) ids.add(task.repositoryId); return repositories .filter((repo) => ids.has(repo.id) && repo.provider === "github") .map((repo) => ({ owner: repo.provider_owner, repo: repo.provider_name })) .filter((repo) => repo.owner && repo.repo); } function issuePayload(input: string, inferredRepo: GitHubRepoRef | null) { const trimmed = input.trim(); if (/^#?\d+$/.test(trimmed) && inferredRepo) { return { issue: trimmed, owner: inferredRepo.owner, repo: inferredRepo.repo, number: Number(trimmed.replace(/^#/, "")), }; } return { issue: trimmed }; } function TaskGitHubIssueFields({ input, setInput, inferredRepo, submitting, error, }: DialogFieldsProps) { const placeholder = inferredRepo ? "#1470 or github.com/owner/repo/issues/1470" : "github.com/owner/repo/issues/1470"; return (
{error}
)}