import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; import { api } from "@/utils/api"; import { zodResolver } from "@hookform/resolvers/zod"; import { Cog } from "lucide-react"; import { useEffect } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; enum BuildType { dockerfile = "dockerfile", heroku_buildpacks = "heroku_buildpacks", paketo_buildpacks = "paketo_buildpacks", nixpacks = "nixpacks", } const mySchema = z.discriminatedUnion("buildType", [ z.object({ buildType: z.literal("dockerfile"), dockerfile: z .string({ required_error: "Dockerfile path is required", invalid_type_error: "Dockerfile path is required", }) .min(1, "Dockerfile required"), }), z.object({ buildType: z.literal("heroku_buildpacks"), }), z.object({ buildType: z.literal("paketo_buildpacks"), }), z.object({ buildType: z.literal("nixpacks"), }), ]); type AddTemplate = z.infer; interface Props { applicationId: string; } export const ShowBuildChooseForm = ({ applicationId }: Props) => { const { mutateAsync, isLoading } = api.application.saveBuildType.useMutation(); const { data, refetch } = api.application.one.useQuery( { applicationId, }, { enabled: !!applicationId, }, ); const form = useForm({ defaultValues: { buildType: BuildType.nixpacks, }, resolver: zodResolver(mySchema), }); const buildType = form.watch("buildType"); useEffect(() => { if (data) { // TODO: refactor this if (data.buildType === "dockerfile") { form.reset({ buildType: data.buildType, ...(data.buildType && { dockerfile: data.dockerfile || "", }), }); } else { form.reset({ buildType: data.buildType, }); } } }, [form.formState.isSubmitSuccessful, form.reset, data, form]); const onSubmit = async (data: AddTemplate) => { await mutateAsync({ applicationId, buildType: data.buildType, dockerfile: data.buildType === "dockerfile" ? data.dockerfile : null, }) .then(async () => { toast.success("Build type saved"); await refetch(); }) .catch(() => { toast.error("Error to save the build type"); }); }; return (
Build Type

Select the way of building your code

{ return ( Build Type Dockerfile Nixpacks Heroku Buildpacks Paketo Buildpacks ); }} /> {buildType === "dockerfile" && ( { return ( Docker File ); }} /> )}
); };