2025-08-28 18:27:07 +02:00
|
|
|
import { useState } from "react";
|
|
|
|
|
import toast from "react-hot-toast";
|
2025-12-18 15:12:05 +01:00
|
|
|
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,
|
2025-12-18 15:12:05 +01:00
|
|
|
} from "../ui/dialog";
|
2025-08-04 17:45:44 +02:00
|
|
|
|
2025-12-18 15:12:05 +01: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-12-18 15:12:05 +01:00
|
|
|
|
2025-08-28 18:27:07 +02:00
|
|
|
return (
|
2026-02-25 15:30:53 +01:00
|
|
|
<div className="flex w-full flex-wrap items-center justify-between gap-2">
|
|
|
|
|
<h3 className="font-semibold text-xl">Servizi cliente</h3>
|
2025-12-18 15:12:05 +01:00
|
|
|
<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();
|
2025-12-18 15:12:05 +01:00
|
|
|
await utils.servizio.getAllServizioAnnunci.invalidate({ userId });
|
2026-03-06 16:15:47 +01:00
|
|
|
|
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);
|
|
|
|
|
},
|
2025-12-18 12:18:24 +01:00
|
|
|
onSuccess: async (data) => {
|
2025-08-28 18:27:07 +02:00
|
|
|
toast.success("Servizio modificato con successo");
|
|
|
|
|
await utils.servizio.getUserServizi.invalidate();
|
2025-11-11 18:43:51 +01:00
|
|
|
await utils.servizio.getAllServizioAnnunci.invalidate({ userId });
|
2026-03-06 16:15:47 +01:00
|
|
|
await utils.servizio.getServizioData.invalidate({ servizioId: data.servizio_id });
|
2025-11-11 18:43:51 +01:00
|
|
|
await utils.servizio.getServizio.invalidate({
|
2025-12-18 12:18:24 +01:00
|
|
|
servizioId: data.servizio_id,
|
2025-11-11 18:43:51 +01:00
|
|
|
});
|
|
|
|
|
await utils.servizio.getCompatibileAnnunci.invalidate({
|
2025-12-18 12:18:24 +01:00
|
|
|
servizioId: data.servizio_id,
|
|
|
|
|
});
|
|
|
|
|
await utils.servizio.getPacksSolution.invalidate({
|
|
|
|
|
servizioId: data.servizio_id,
|
2025-11-11 18:43:51 +01:00
|
|
|
});
|
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>
|
2025-11-04 19:18:13 +01:00
|
|
|
<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
|
|
|
};
|