import { add } from "date-fns";
import { Bug, Calculator, ClockAlert, Plus, ShieldUser } from "lucide-react";
import { useState } from "react";
import toast from "react-hot-toast";
import {
Credenza,
CredenzaBody,
CredenzaContent,
CredenzaDescription,
CredenzaHeader,
CredenzaTitle,
CredenzaTrigger,
} from "~/components/custom_ui/credenza";
import { MultiSelect } from "~/components/custom_ui/multiselect";
import { LoadingPage } from "~/components/loading";
import {
AlertDialog,
AlertDialogAction,
AlertDialogCancel,
AlertDialogContent,
AlertDialogDescription,
AlertDialogFooter,
AlertDialogHeader,
AlertDialogTitle,
AlertDialogTrigger,
} from "~/components/ui/alert-dialog";
import { Button } from "~/components/ui/button";
import {
Collapsible,
CollapsibleContent,
CollapsibleTrigger,
} from "~/components/ui/collapsible";
import {
Dialog,
DialogContent,
DialogDescription,
DialogFooter,
DialogHeader,
DialogTitle,
DialogTrigger,
} from "~/components/ui/dialog";
import {
type FormValues as EditFormValues,
FormEditServizio,
} from "~/forms/FormEditServizioAdmin";
import { FormNewServizio, type FormValues } from "~/forms/FormNewServizio";
import { useServizio } from "~/providers/ServizioProvider";
import type { AnnunciId } from "~/schemas/public/Annunci";
import type { ServizioServizioId } from "~/schemas/public/Servizio";
import type { UsersId } from "~/schemas/public/Users";
import { api } from "~/utils/api";
export const ServizioActions = () => {
const { servizio, isAdmin, userId } = useServizio();
const canUserEdit =
servizio.isOkAcconto &&
servizio.decorrenza !== null &&
!servizio.annunci.some((a) => a.user_confirmed_at !== null);
if (!isAdmin && !canUserEdit) {
return null; // If the user is not an admin and cannot edit, do not render the actions
}
return (
{(isAdmin || canUserEdit) && (
{/* Azioni: */}
)}
{isAdmin && (
)}
);
};
export const AddAnnuncio = ({
servizioId,
userId,
}: {
servizioId: ServizioServizioId;
userId: UsersId;
}) => {
const { data: codici, isLoading: loading } =
api.servizio.getAnnunciAvailableToAdd.useQuery({
servizioId,
});
const [selectedAnnunci, setSelectedAnnunci] = useState<
{ value: AnnunciId; label: string }[]
>([]);
const [openModal, setOpenModal] = useState(false);
const utils = api.useUtils();
const { mutate } = api.servizio.addServizioAnnunci.useMutation({
onError: (error) => {
console.error(error);
toast.error("Errore durante l'aggiunta dell'annuncio");
},
onSuccess: async () => {
await utils.servizio.getAllServizioAnnunci.invalidate({ userId });
await utils.servizio.getAnnunciAvailableToAdd.invalidate({
servizioId,
});
await utils.servizio.getCompatibileAnnunci.invalidate({
servizioId,
});
await utils.servizio.getUserServizi.invalidate({ userId });
toast.success("Annuncio aggiunto");
setOpenModal(false);
setSelectedAnnunci([]);
},
});
return (
);
};
const InterruzioneServizio = () => {
const { servizio, userId } = useServizio();
const beforeInterruzioneLimit =
servizio.decorrenza != null &&
new Date() <=
add(servizio.decorrenza, {
days: 14,
});
const utils = api.useUtils();
const { mutate } = api.servizio.interruzioneServizio.useMutation({
onError: (error) => {
console.error(error);
toast.error("Errore durante la richiesta di interruzione");
},
onSuccess: async () => {
await utils.servizio.getAllServizioAnnunci.invalidate({ userId });
toast.success("Interruzione richiesta");
},
});
return (
Sei sicuro di voler richiedere l'interruzione?
Questa azione รจ irreversibile e comporta la disattivazione dei
servizi attivati. Confermando l'azione recedi dal servizio
secondo le condizioni contrattuali. Verrai notificato via email
della conferma dell'avvenuta interruzione.
Annulla
mutate({ servizioId: servizio.servizio_id })}
>
Continua
);
};
const EditPreferenze = () => {
const { servizioId, userId, isAdmin } = useServizio();
const [openEditPreferenze, setOpenEditPreferenze] = useState(false);
const { data, isLoading } = api.servizio.getServizio.useQuery({ servizioId });
const utils = api.useUtils();
const { mutate: update } = api.servizio.updateServizio.useMutation({
onError: (error) => {
toast.error(error.message);
},
onSuccess: async () => {
toast.success("Servizio modificato con successo");
await utils.servizio.getAllServizioAnnunci.invalidate({ userId });
await utils.servizio.getServizio.invalidate({ servizioId });
await utils.servizio.getCompatibileAnnunci.invalidate({
servizioId,
});
setOpenEditPreferenze(false);
},
});
function onSubmit(fields: FormValues) {
update({
data: {
...fields,
},
servizioId,
});
}
return (
Preferenze di ricerca
Preferenze
{isLoading ? (
) : (
)}
);
};
const EditServizioAdmin = () => {
const { servizioId, userId, servizio } = useServizio();
const [open, setOpen] = useState(false);
const { data, isLoading } = api.servizio.getServizio.useQuery({ servizioId });
const utils = api.useUtils();
const { mutate: update } = api.servizio.updateServizio.useMutation({
onError: (error) => {
toast.error(error.message);
},
onSuccess: async () => {
toast.success("Servizio modificato con successo");
await utils.servizio.getAllServizioAnnunci.invalidate({ userId });
await utils.servizio.getServizio.invalidate({ servizioId });
await utils.servizio.getCompatibileAnnunci.invalidate({
servizioId,
});
setOpen(false);
},
});
function onSubmit(fields: EditFormValues) {
update({
data: {
...fields,
},
servizioId,
});
}
return (
Modifica Servizio Admin
Modifica
{isLoading ? (
) : (
)}
{(() => {
// biome-ignore lint/correctness/noUnusedVariables:
const { annunci, ...rest } = servizio;
return {JSON.stringify(rest, null, 2)};
})()}
);
};