import { Button } from "@/components/ui/button"; import { Dropzone } from "@/components/ui/dropzone"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { api } from "@/utils/api"; import { type UploadFile, uploadFileSchema } from "@/utils/schema"; import { zodResolver } from "@hookform/resolvers/zod"; import { TrashIcon } from "lucide-react"; import { useEffect } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; interface Props { applicationId: string; } export const SaveDragNDrop = ({ applicationId }: Props) => { const { data, refetch } = api.application.one.useQuery({ applicationId }); const { mutateAsync, isLoading } = api.application.dropDeployment.useMutation(); const form = useForm({ defaultValues: {}, resolver: zodResolver(uploadFileSchema), }); useEffect(() => { if (data) { form.reset({ dropBuildPath: data.dropBuildPath || "", }); } }, [data, form, form.reset, form.formState.isSubmitSuccessful]); const zip = form.watch("zip"); const onSubmit = async (values: UploadFile) => { const formData = new FormData(); formData.append("zip", values.zip); formData.append("applicationId", applicationId); if (values.dropBuildPath) { formData.append("dropBuildPath", values.dropBuildPath); } await mutateAsync(formData) .then(async () => { toast.success("Deployment saved"); await refetch(); }) .catch(() => { toast.error("Error to save the deployment"); }); }; return (
( Build Path )} /> ( Zip file { if (e instanceof FileList) { field.onChange(e[0]); } else { field.onChange(e); } }} /> {zip instanceof File && (
{zip.name} ({zip.size} bytes)
)}
)} />
); };