import { add } from "date-fns"; import { Bug, Calculator, CalendarClock, ChevronDown, ChevronUp, ClockAlert, Cog, Info, Plus, UserCircle, } 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 { cn } from "~/lib/utils"; 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"; import { Progress } from "../ui/progress"; export const ServizioActions = () => { const { servizio, isAdmin, userId } = useServizio(); return (
{isAdmin && (
Azioni Admin:
)}
); }; const ServizioInfos = () => { const { servizio } = useServizio(); const [open, setOpen] = useState(false); const openContattiAnnunci = servizio.annunci.filter( (a) => a.open_contatti_at !== null, ); if (!servizio.decorrenza) return null; const dec_txt = new Date(servizio.decorrenza).toLocaleDateString("it-IT"); const end_txt = new Date( add(servizio.decorrenza, { days: 60 }), ).toLocaleDateString("it-IT"); return ( {open ? ( ) : ( )}
Contatti sbloccati
{openContattiAnnunci.length} / 10
Durata servizio:
{dec_txt} - {end_txt}
); }; export const ServizioBasicActions = ({ className }: { className?: string }) => { const { servizio, isAdmin } = useServizio(); const canUserEdit = servizio.isOkAcconto && servizio.decorrenza !== null && !servizio.annunci.some((a) => a.user_confirmed_at !== null); if (isAdmin || canUserEdit) { return (
); } return null; }; 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 ( { 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 ? ( ) : ( { setSelectedAnnunci( value.map((v) => ({ label: v.label, value: parseInt(v.value) as AnnunciId, })), ); }} options={ codici?.map((cod) => ({ label: cod.codice, value: cod.id.toString(), })) || [] } placeholder="" /> )}
); }; const InterruzioneServizio = () => { const { servizio, userId, isAdmin } = 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, servizio } = 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)}
; })()}
); };