import { add } from "date-fns"; import { ArrowRight, BadgeCheck, CalendarClock, CircleCheck, CircleCheckBig, CircleMinus, Clock, ClockFading, ExternalLink, type LucideIcon, MousePointerClick, PackageCheck, Trash2, } from "lucide-react"; import Link from "next/link"; import toast from "react-hot-toast"; import { cn } from "~/lib/utils"; import { useTranslation } from "~/providers/I18nProvider"; import { ServizioAnnuncioProvider, ServizioProvider, useServizio, } from "~/providers/ServizioProvider"; import OrderTypeEnum from "~/schemas/public/OrderTypeEnum"; import type { Rinnovi } from "~/schemas/public/Rinnovi"; import type { UsersId } from "~/schemas/public/Users"; import type { ServizioData } from "~/server/controllers/servizio.controller"; import { api } from "~/utils/api"; import { Confirm } from "../confirm"; import { AlarmClockSVG } from "../svgs"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, } from "../ui/alert-dialog"; import { Button } from "../ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "../ui/card"; import { SaldoButton } from "./annuncio_actions"; import { AnnuncioCard, AnnuncioDisplay } from "./annuncio_card"; import { AnnunciCompatibili } from "./compatibili_dialog"; import { ServizioInfos } from "./servizio_actions"; export const ServizioList = ({ data, isAdmin, userId, }: { data: ( | { d: Date; type: "servizio"; data: ServizioData } | { d: Date; type: "rinnovo"; data: Rinnovi } )[]; isAdmin: boolean; userId: UsersId; }) => { const { t } = useTranslation(); if (data.length === 0) { return (
{t.servizio.nessun_servizio}
); } return (
{data.map(({ d: _d, type, data: s }) => { if (type === "rinnovo") { return ( ); } return ( ); })}
); }; const RinnovoLinkCard = ({ data, isAdmin, userId, }: { data: Rinnovi; isAdmin: boolean; userId: UsersId; }) => { return ( Rinnovo {data.codice} Data rinnovo: {data.decorrenza.toLocaleDateString("it-IT")}
Vai al rinnovo
); }; const ServizioLinkCard = ({ servizio, isAdmin, userId, }: { servizio: ServizioData; isAdmin: boolean; userId: UsersId; }) => { const { t } = useTranslation(); let status: keyof typeof t.servizio.status = "attivo"; let StatusIcon: LucideIcon = CircleCheck; if (servizio.isInterrotto) { status = "interrotto"; StatusIcon = Trash2; } else if (!servizio.isOkAcconto) { status = "in_attesa"; StatusIcon = ClockFading; } else if (servizio.decorrenza) { const now = new Date(); const decorrenza = new Date(servizio.decorrenza); if (now > add(decorrenza, { days: 60 }) && !servizio.isOkSaldo) { status = "scaduto"; StatusIcon = CircleMinus; } if (servizio.isOkSaldo) { status = "completato"; StatusIcon = CircleCheckBig; } } return ( {t.servizio.servizio_titolo} {servizio.tipologia} {t.servizio.servizio_creato_il}{" "} {servizio.created_at.toLocaleDateString("it-IT")}
{t.servizio.status[status]}
{t.servizio.vai_al_servizio}
); }; export const Servizio = ({ servizio, userId, isAdmin, }: { servizio: ServizioData; userId: UsersId; isAdmin: boolean; }) => { return ( ); }; const Content = () => { const { servizio } = useServizio(); const { t } = useTranslation(); const dec_txt = servizio.decorrenza ? new Date(servizio.decorrenza).toLocaleDateString("it-IT") : ""; const end_txt = servizio.decorrenza ? new Date(add(servizio.decorrenza, { days: 60 })).toLocaleDateString( "it-IT", ) : ""; return (

{t.servizio.servizio_titolo} {servizio.tipologia}

Creato il: {servizio.created_at.toLocaleDateString("it-IT")}
{t.servizio.durata_servizio}
{servizio.decorrenza !== null ? `${dec_txt} - ${end_txt}` : "In attesa di attivazione"}
); }; const Main = () => { const { servizio, isAdmin } = useServizio(); const { t } = useTranslation(); const utils = api.useUtils(); const { mutate: attivazioneSenzaPagamento } = api.servizio.attivazioneSenzaPagamento.useMutation({ onError: () => { toast.error("Errore durante l'attivazione del servizio"); }, onSuccess: async () => { toast.success("Servizio modificato con successo"); await utils.servizio.invalidate(); }, }); if (servizio.isInterrotto) { return ( <>

{t.servizio.servizio_interrotto}

{t.servizio.servizio_interrotto_desc}

); } if (!servizio.onboardOk) { return (

{t.servizio.non_attivo}

{isAdmin && }
); } if (!servizio.isOkAcconto || servizio.decorrenza === null) { const acconti = servizio.ordini.filter( (o) => o.type === OrderTypeEnum.Acconto, ); const activeAcconto = acconti.find((a) => a.isActive); return (

Parametri di ricerca salvati

{activeAcconto ? (
Attivazione del Servizio Procedendo all'attivazione del servizio, confermi che i parametri di ricerca salvati sono corretti e accetti di essere contattato per eventuali verifiche. {activeAcconto?.testo_condizioni && (

Riceverai copia delle condizioni anche via email

)}
{t.annulla} { attivazioneSenzaPagamento({ ordineId: activeAcconto.ordine_id, }); }} > Attiva il servizio
) : ( )}
{isAdmin && }
); } if ( new Date() > add(servizio.decorrenza, { days: 60, }) && !servizio.isOkSaldo ) { return ( <>

{t.servizio.scaduto}

{t.servizio.scaduto_desc}

); } const annuncioConfermato = servizio.annunci.filter( (a) => a.accettato_conferma_at !== null, ); if (servizio.isOkSaldo && annuncioConfermato.length > 0) { return ( <> {annuncioConfermato.map((data) => { return ( ); })} ); } return ( <> {annuncioConfermato.length > 0 && (
{t.servizio.saldi_in_attesa}
{servizio.annunci .filter((a) => a.accettato_conferma_at !== null) .map((a) => (

{a.codice} -{" "} {a.accettato_conferma_at && new Date(a.accettato_conferma_at).toLocaleDateString("it", { day: "2-digit", hour: "2-digit", minute: "2-digit", month: "2-digit", year: "numeric", })}

))}
)}
{servizio.annunci.map((data) => { return ( ); })} {servizio.annunci.length % 2 === 1 && (
)}
{servizio.annunci.length === 0 && (

Cerca un annuncio ora!

)}
); }; const AnnunciAnteprima = () => { const { servizio, isAdmin } = useServizio(); const { t } = useTranslation(); const utils = api.useUtils(); const { mutate: removeAnnuncioServizio } = api.servizio.removeAnnuncioServizio.useMutation({ onError: () => { toast.error("Errore durante la rimozione dell'annuncio dal servizio"); }, onSuccess: async () => { await utils.servizio.invalidate(); toast.success("Annuncio rimosso"); }, }); if (servizio.annunci.length > 0) { return (

{t.servizio.per_te_1} {servizio.annunci.length} {t.servizio.per_te_2}

{servizio.annunci.map((data) => (
{isAdmin && ( { removeAnnuncioServizio({ annuncioId: data.annunci_id, servizioId: servizio.servizio_id, }); }} title="Rimuovi Annuncio" > )}
))} {servizio.annunci.length % 2 === 1 && (
)}
); } return null; };