infoalloggi-monorepo/apps/infoalloggi/src/components/servizio/servizi_header.tsx

128 lines
3.2 KiB
TypeScript
Raw Normal View History

2025-08-28 18:27:07 +02:00
import { useState } from "react";
import toast from "react-hot-toast";
import { FormNewServizio, type FormValues } from "~/forms/FormNewServizio";
import type { Servizio } from "~/schemas/public/Servizio";
import type { UsersId } from "~/schemas/public/Users";
import { api } from "~/utils/api";
import { Button } from "../ui/button";
2025-08-04 17:45:44 +02:00
import {
2025-08-28 18:27:07 +02:00
Dialog,
DialogContent,
DialogDescription,
DialogHeader,
DialogTitle,
DialogTrigger,
} from "../ui/dialog";
2025-08-04 17:45:44 +02:00
export const ServiziHeader = ({ userId }: { userId: UsersId }) => {
2025-08-28 18:27:07 +02:00
const [open, setOpen] = useState(false);
const [editData, setEditData] = useState<Servizio | undefined>(undefined);
2025-08-28 18:27:07 +02:00
return (
<div className="flex w-full flex-wrap items-center justify-between gap-2">
<h3 className="font-semibold text-xl">Servizi cliente</h3>
<NewServizioModal
editData={editData}
open={open}
2025-08-28 18:27:07 +02:00
setEditData={setEditData}
setOpen={setOpen}
2025-08-29 16:18:32 +02:00
userId={userId}
2025-08-28 18:27:07 +02:00
/>
</div>
);
2025-08-04 17:45:44 +02:00
};
const NewServizioModal = ({
2025-08-28 18:27:07 +02:00
userId,
editData,
2025-08-04 17:45:44 +02:00
2025-08-28 18:27:07 +02:00
setEditData,
open,
setOpen,
2025-08-04 17:45:44 +02:00
}: {
2025-08-28 18:27:07 +02:00
userId: UsersId;
editData: Servizio | undefined;
setEditData: (data: Servizio | undefined) => void;
open: boolean;
setOpen: (open: boolean) => void;
2025-08-04 17:45:44 +02:00
}) => {
2025-08-28 18:27:07 +02:00
const utils = api.useUtils();
2025-08-04 17:45:44 +02:00
2025-08-28 18:27:07 +02:00
const { mutate: add } = api.servizio.addServizio.useMutation({
2025-08-29 16:18:32 +02:00
onError: (error) => {
toast.error(error.message);
},
2025-08-28 18:27:07 +02:00
onSuccess: async () => {
toast.success("Servizio creato con successo");
await utils.servizio.getUserServizi.invalidate();
await utils.servizio.getAllServizioAnnunci.invalidate({ userId });
2025-08-28 18:27:07 +02:00
setEditData(undefined);
setOpen(false);
},
});
2025-08-04 17:45:44 +02:00
2025-08-28 18:27:07 +02:00
const { mutate: update } = api.servizio.updateServizio.useMutation({
2025-08-29 16:18:32 +02:00
onError: (error) => {
toast.error(error.message);
},
onSuccess: async (data) => {
2025-08-28 18:27:07 +02:00
toast.success("Servizio modificato con successo");
await utils.servizio.getUserServizi.invalidate();
await utils.servizio.getAllServizioAnnunci.invalidate({ userId });
await utils.servizio.getServizioData.invalidate({ servizioId: data.servizio_id });
await utils.servizio.getServizio.invalidate({
servizioId: data.servizio_id,
});
await utils.servizio.getCompatibileAnnunci.invalidate({
servizioId: data.servizio_id,
});
await utils.servizio.getPacksSolution.invalidate({
servizioId: data.servizio_id,
});
2025-08-28 18:27:07 +02:00
setEditData(undefined);
setOpen(false);
},
});
function onSubmit(fields: FormValues) {
if (editData) {
update({
data: {
...fields,
},
2025-08-29 16:18:32 +02:00
servizioId: editData.servizio_id,
2025-08-28 18:27:07 +02:00
});
} else {
add({ data: { ...fields, user_id: userId } });
}
}
return (
2025-08-29 16:18:32 +02:00
<Dialog onOpenChange={setOpen} open={open}>
2025-08-28 18:27:07 +02:00
<DialogTrigger asChild>
<Button
onClick={() => {
setEditData(undefined);
setOpen(true);
}}
2025-08-29 16:18:32 +02:00
variant="outline"
2025-08-28 18:27:07 +02:00
>
Nuovo Servizio
</Button>
</DialogTrigger>
<DialogContent className="max-h-[80%] w-full overflow-auto p-4 sm:max-w-5xl">
2025-08-28 18:27:07 +02:00
<DialogHeader>
<DialogTitle>Creazione Servizio</DialogTitle>
<DialogDescription className="sr-only">desc</DialogDescription>
</DialogHeader>
<div className="overflow-y-auto">
<FormNewServizio
initialData={editData}
isLimited={false}
2025-08-29 16:18:32 +02:00
onSubmit={onSubmit}
2025-08-28 18:27:07 +02:00
/>
</div>
</DialogContent>
</Dialog>
);
2025-08-04 17:45:44 +02:00
};