import { add } from "date-fns";
import {
ArrowRight,
BadgeCheck,
CalendarClock,
CircleCheck,
CircleCheckBig,
CircleMinus,
Clock,
ClockFading,
ExternalLink,
type LucideIcon,
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 { 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 = ({
servizi,
isAdmin,
userId,
}: {
servizi: ServizioData[];
isAdmin: boolean;
userId: UsersId;
}) => {
const { t } = useTranslation();
if (servizi.length === 0) {
return (
{t.servizio.nessun_servizio}
);
}
// if (servizi.length === 1 && servizi[0]) {
// return ;
// }
return (
{servizi.map((servizio) => (
))}
);
};
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}
{t.servizio.attiva_cta}
{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 ? (
Attiva il servizio
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 && (
{t.acquisto.leggi_condizioni}
Riceverai copia delle condizioni anche via email
)}
{t.annulla}
{
attivazioneSenzaPagamento({
ordineId: activeAcconto.ordine_id,
});
}}
>
Attiva il servizio
) : (
Procedi al pagamento
)}
{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;
};