import { add } from "date-fns"; import { Bug, ChevronDown, ClockAlert, Cog, Euro, ExternalLink, Plus, Search, SlidersHorizontal, Trash2, } from "lucide-react"; import Link from "next/link"; 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, formatCurrency } from "~/lib/utils"; import { useTranslation } from "~/providers/I18nProvider"; import { useServizio } from "~/providers/ServizioProvider"; import type { AnnunciId } from "~/schemas/public/Annunci"; import type { ServizioServizioId } from "~/schemas/public/Servizio"; import TipologiaPosizioneEnum from "~/schemas/public/TipologiaPosizioneEnum"; import type { UsersId } from "~/schemas/public/Users"; import { api } from "~/utils/api"; import { Confirm } from "../confirm"; export const AdminActions = () => { const { servizio, isAdmin, userId } = useServizio(); if (!isAdmin) return null; return (
); }; export const ServizioBasicActions = ({ className }: { className?: string }) => { const { servizio, isAdmin } = useServizio(); const canUserEdit = servizio.isOkAcconto && servizio.decorrenza !== null; /*&& new Date() <= add(new Date(servizio.decorrenza), { days: 60 }) && !servizio.annunci.some((a) => a.user_confirmed_at !== null) && !servizio.isInterrotto && !servizio.annunci.some((a) => a.user_confirmed_at !== null);*/ if (isAdmin || canUserEdit) { return (
); } return null; }; export const ServizioPacksInfos = () => { const { servizio } = useServizio(); const { t } = useTranslation(); const { data: packs } = api.servizio.getPacksSolution.useQuery({ servizioId: servizio.servizio_id, }); if (!packs) return null; return ( {t.servizio.prezzi.sub}
{packs.acconto.success ? ( <> {packs.acconto.pack.nome_it} {packs.acconto.pack.desc_it} {formatCurrency(packs.acconto.pack.prezzo_cent / 100)} COD: {packs.acconto.pack.idprezziario} ) : ( {packs.acconto.message} )}
{packs.saldo.success ? ( <> {packs.saldo.pack.nome_it} {packs.saldo.pack.desc_it} {formatCurrency(packs.saldo.pack.prezzo_cent / 100)} COD: {packs.saldo.pack.idprezziario} ) : ( {packs.saldo.message} )}
{servizio.tipologia === TipologiaPosizioneEnum.Stabile && (
<> {t.servizio.prezzi.consulenza} {t.servizio.prezzi.consulenza_desc} {t.servizio.prezzi.gotoprezzi}
)}
); }; 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 { t } = useTranslation(); 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 ( {t.servizio.interruzione.title} {t.servizio.interruzione.description} {t.annulla} mutate({ servizioId: servizio.servizio_id })} > {t.conferma} ); }; const EditParametri = () => { const { servizioId, userId, isAdmin, servizio } = useServizio(); const { t } = useTranslation(); const [openEditParametri, setOpenEditParametri] = 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, }); await utils.servizio.getPacksSolution.invalidate({ servizioId }); setOpenEditParametri(false); }, }); function onSubmit(fields: FormValues) { update({ data: { ...fields, }, servizioId, }); } return ( {t.servizio.parametri.title} {t.servizio.parametri.title} {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, }); await utils.servizio.getPacksSolution.invalidate({ servizioId }); setOpen(false); }, }); const { mutate: remove } = api.servizio.deleteServizio.useMutation({ onError: (error) => { toast.error(error.message); }, onSuccess: async () => { toast.success("Servizio rimosso con successo"); await utils.servizio.getAllServizioAnnunci.invalidate({ userId }); await utils.servizio.getServizio.invalidate({ servizioId }); }, }); function onSubmit(fields: EditFormValues) { update({ data: { ...fields, }, servizioId, }); } return ( Modifica Servizio Admin Modifica {isLoading ? ( ) : ( )} {(() => { const { annunci, ...rest } = servizio; return
{JSON.stringify(rest, null, 2)}
; })()}
{ remove({ servizioId }); }} title="Elimina servizio" >
); };