import { AlertBlock } from "@/components/shared/alert-block"; import { Button } from "@/components/ui/button"; import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, } from "@/components/ui/command"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { ScrollArea } from "@/components/ui/scroll-area"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { cn } from "@/lib/utils"; import { api } from "@/utils/api"; import { zodResolver } from "@hookform/resolvers/zod"; import { CheckIcon, ChevronsUpDown } from "lucide-react"; import { useEffect } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; const GitlabProviderSchema = z.object({ buildPath: z.string().min(1, "Path is required").default("/"), repository: z .object({ repo: z.string().min(1, "Repo is required"), owner: z.string().min(1, "Owner is required"), gitlabPathNamespace: z.string().min(1), id: z.number().nullable(), }) .required(), branch: z.string().min(1, "Branch is required"), gitlabId: z.string().min(1, "Gitlab Provider is required"), }); type GitlabProvider = z.infer; interface Props { applicationId: string; } export const SaveGitlabProvider = ({ applicationId }: Props) => { const { data: gitlabProviders } = api.gitlab.gitlabProviders.useQuery(); const { data, refetch } = api.application.one.useQuery({ applicationId }); const { mutateAsync, isLoading: isSavingGitlabProvider } = api.application.saveGitlabProvider.useMutation(); const form = useForm({ defaultValues: { buildPath: "/", repository: { owner: "", repo: "", gitlabPathNamespace: "", id: null, }, gitlabId: "", branch: "", }, resolver: zodResolver(GitlabProviderSchema), }); const repository = form.watch("repository"); const gitlabId = form.watch("gitlabId"); const { data: repositories, isLoading: isLoadingRepositories, error, } = api.gitlab.getGitlabRepositories.useQuery( { gitlabId, }, { enabled: !!gitlabId, }, ); const { data: branches, fetchStatus, status, } = api.gitlab.getGitlabBranches.useQuery( { owner: repository?.owner, repo: repository?.repo, id: repository?.id || 0, gitlabId: gitlabId, }, { enabled: !!repository?.owner && !!repository?.repo && !!gitlabId, }, ); useEffect(() => { if (data) { form.reset({ branch: data.gitlabBranch || "", repository: { repo: data.gitlabRepository || "", owner: data.gitlabOwner || "", gitlabPathNamespace: data.gitlabPathNamespace || "", id: data.gitlabProjectId, }, buildPath: data.gitlabBuildPath || "/", gitlabId: data.gitlabId || "", }); } }, [form.reset, data, form]); const onSubmit = async (data: GitlabProvider) => { await mutateAsync({ gitlabBranch: data.branch, gitlabRepository: data.repository.repo, gitlabOwner: data.repository.owner, gitlabBuildPath: data.buildPath, gitlabId: data.gitlabId, applicationId, gitlabProjectId: data.repository.id, gitlabPathNamespace: data.repository.gitlabPathNamespace, }) .then(async () => { toast.success("Service Provided Saved"); await refetch(); }) .catch(() => { toast.error("Error to save the gitlab provider"); }); }; return (
{error && {error?.message}}
( Gitlab Account )} /> ( Repository {isLoadingRepositories && ( Loading Repositories.... )} No repositories found. {repositories && repositories.length === 0 && ( No repositories found. )} {repositories?.map((repo) => { return ( { form.setValue("repository", { owner: repo.owner.username as string, repo: repo.name, id: repo.id, gitlabPathNamespace: repo.url, }); form.setValue("branch", ""); }} > {repo.name} ); })} {form.formState.errors.repository && (

Repository is required

)}
)} /> ( Branch {status === "loading" && fetchStatus === "fetching" && ( Loading Branches.... )} {!repository?.owner && ( Select a repository )} No branch found. {branches?.map((branch) => ( { form.setValue("branch", branch.name); }} > {branch.name} ))} )} /> ( Build Path )} />
); };