import * as React from "react"; import { toast } from "sonner"; import type { Project, Repository } from "@/features/projects/hooks"; import { useCreateProjectIssueMutation } from "@/features/projects/issueMutations"; import { selectProjectRepository } from "@/features/projects/projectModels"; import { CreateProjectWorkItemDialog, type CreateProjectWorkItemDialogInput, } from "./CreateProjectWorkItemDialog"; export function CreateProjectIssueDialog({ initialProjectId, onCreated, onOpenChange, open, projects, }: { initialProjectId?: string; onCreated: ( project: Project, repository: Repository, issueId: string, ) => void | Promise; onOpenChange: (open: boolean) => void; open: boolean; projects: Project[]; }) { const repositoryOptions = React.useMemo( () => projects.flatMap((project) => project.repositories.map((repository) => ({ project, repository })), ), [projects], ); const initialProject = projects.find((project) => project.id === initialProjectId) ?? projects[0]; const [repositoryId, setRepositoryId] = React.useState( selectProjectRepository(initialProject, null)?.id ?? "", ); const selection = repositoryOptions.find( (candidate) => candidate.repository.id === repositoryId, ) ?? repositoryOptions[0]; const project = selection?.project; const repository = selection?.repository; const createMutation = useCreateProjectIssueMutation(repository); React.useEffect(() => { if (!open) return; const nextProject = projects.find((candidate) => candidate.id === initialProjectId) ?? projects[0]; setRepositoryId(selectProjectRepository(nextProject, null)?.id ?? ""); }, [initialProjectId, open, projects]); async function handleCreate(input: CreateProjectWorkItemDialogInput) { if (!project || !repository) throw new Error("Choose a repository."); const issueId = await createMutation.mutateAsync(input); toast.success("Task created."); await onCreated(project, repository, issueId); } return ( ); }