addRegularVesselForm.tsx
Mon Jun 17 2024 07:18:57 GMT+0000 (Coordinated Universal Time)
Saved by @rafal_rydz
@ -0,0 +1,159 @@
import {
ButtonContent,
DestructiveButton,
Form,
FormControl,
FormField,
FormItem,
FormLabel,
FormMessage,
Icon,
If,
Input,
Toaster,
Tooltip,
TooltipContent,
TooltipProvider,
TooltipTrigger,
} from "ui";
import { zodResolver } from "@hookform/resolvers/zod";
import { useForm } from "react-hook-form";
import type * as z from "zod";
import React, { useEffect, useState } from "react";
import { toast } from "sonner";
import wretch from "wretch";
import {
fieldsNameHelper,
formSchema,
numberFields,
toTitleCase,
} from "./regularVesselInfoForm";
interface AddRegularVesselFormProps {
fields: string[];
vesselId?: string;
imo?: string;
returnIdentifier: (identifier: any) => void;
}
export const AddRegularVesselForm = ({
fields,
vesselId,
imo,
returnIdentifier,
}: AddRegularVesselFormProps) => {
const excludeFields: string[] = ["id"];
const disabledFields: string[] = ["vessel_id", "imo"];
const [identifier, setIdentifier] = useState<string>(vesselId || imo || "");
fields = fields?.sort().filter((item) => !excludeFields.includes(item));
const form = useForm<z.infer<typeof formSchema>>({
resolver: zodResolver(formSchema),
defaultValues: {
vessel_id: vesselId,
imo: imo,
},
});
async function onSubmit(values: z.infer<typeof formSchema>) {
const addVessel: VesselInfo = Object.entries(values).reduce(
(acc: VesselInfo, [key, value]) => {
const vesselInfoKey: string = fieldsNameHelper[key].name;
acc[vesselInfoKey] = (value || "").toString().toLowerCase();
return acc;
},
{},
);
try {
const response = await wretch("/api/form/regularVessel")
.post(addVessel)
.res();
if (response.ok) {
toast.success("Success!", {
description: "Vessel details inserted.",
});
returnIdentifier({ vessel_id: values.vessel_id, imo: values.imo });
} else {
toast.error("Error submitting form");
}
} catch (error) {
toast.error("Something went wrong", {
description: (error as PostgrestError | null)?.message,
});
}
}
const reset = form.reset;
useEffect(() => {
reset({}, { keepValues: false });
reset(
{
vessel_id: vesselId,
imo: imo,
},
{ keepValues: false },
);
}, [reset]);
return (
<div className={"mt-4"}>
<Form {...form}>
<form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4">
{Object.keys(formSchema.shape).map((key, index) => (
<>
<If condition={fields?.includes(fieldsNameHelper[key].name)}>
<FormField
key={key + index}
control={form.control}
name={key as any}
render={({ field }) => (
<FormItem className={"flex flex-row items-center"}>
<FormLabel className={"w-64 text-lg font-light"}>
{toTitleCase(fieldsNameHelper[key].name)}
</FormLabel>
<div className={"mr-2"}>
<TooltipProvider>
<Tooltip>
<TooltipTrigger className="text-black hover:text-black/50 dark:text-white dark:hover:text-white/50">
<Icon name="unknown" style="h-5 w-5" />
</TooltipTrigger>
<TooltipContent>
<p>{fieldsNameHelper[key].description}</p>
</TooltipContent>
</Tooltip>
</TooltipProvider>
</div>
<FormControl className={"w-full"}>
<Input
className={"text-md font-light"}
required={false}
{...field}
type={numberFields.includes(key) ? "number" : "text"}
value={field.value ?? ""}
disabled={disabledFields.includes(key)}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
</If>
</>
))}
<div className="flex flex-row justify-end">
<DestructiveButton type="submit" className="mt-4">
<ButtonContent>Add vessel</ButtonContent>
</DestructiveButton>
</div>
<Toaster />
</form>
</Form>
</div>
);
};



Comments