import { add } from "date-fns"; import { Bug, Calculator, ClockAlert, Plus, Wrench } 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) && ( <> )} {isAdmin && ( <> )}
); }; export const ServizioActions2 = () => { 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({ 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([]); }, onError: (error) => { console.error(error); toast.error("Errore durante l'aggiunta dell'annuncio"); }, }); return ( { if (selectedAnnunci.length !== 0) { e.preventDefault(); // Prevent closing the dialog if there are selected announcements } }} > Aggiungi annuncio Salva un annuncio nella ricerca dell'utente
{loading ? ( ) : ( ({ label: cod.codice, value: cod.id.toString(), })) || [] } onValueChange={(value) => { setSelectedAnnunci( value.map((v) => ({ value: parseInt(v.value) as AnnunciId, label: v.label, })), ); }} /> )}
); }; 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({ onSuccess: async () => { await utils.servizio.getAllServizioAnnunci.invalidate({ userId }); toast.success("Interruzione richiesta"); }, onError: (error) => { console.error(error); toast.error("Errore durante la richiesta di interruzione"); }, }); 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({ 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); }, onError: (error) => { toast.error(error.message); }, }); function onSubmit(fields: FormValues) { update({ servizioId, data: { ...fields, }, }); } 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({ 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); }, onError: (error) => { toast.error(error.message); }, }); function onSubmit(fields: EditFormValues) { update({ servizioId, data: { ...fields, }, }); } return ( Modifica Servizio Admin Modifica {isLoading ? ( ) : ( )} {(() => { // biome-ignore lint/correctness/noUnusedVariables: const { annunci, ...rest } = servizio; return
{JSON.stringify(rest, null, 2)}
; })()}
); };