import { ArrowLeft } from "lucide-react"; import type { GetServerSideProps } from "next"; import Link from "next/link"; import { useRouter } from "next/router"; import PaymentStatus from "~/components/payment_status"; import { ProgressRedirect } from "~/components/progress_redirect"; import { Button, buttonVariants } from "~/components/ui/button"; import stripe from "~/lib/stripe"; import { cn } from "~/lib/utils"; import { useTranslation } from "~/providers/I18nProvider"; import PaymentStatusEnum from "~/schemas/public/PaymentStatusEnum"; import type { ServizioServizioId } from "~/schemas/public/Servizio"; import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper"; enum AcquistoStatusEnum { success = "success", processing = "processing", failed = "failed", internal_error = "internal_error", not_found = "not_found", } type AcquistoProcessingProps = { servizioId: ServizioServizioId | null; status: AcquistoStatusEnum; }; export const getServerSideProps = (async (context) => { const paymentIntentId = context.query?.payment_intent; if (!paymentIntentId || typeof paymentIntentId !== "string") { return { redirect: { destination: "/500", permanent: false, }, }; } const paymentIntent = await stripe.paymentIntents.retrieve(paymentIntentId); if (!paymentIntent) { return { props: { servizioId: null, status: AcquistoStatusEnum.internal_error, }, }; } const access_token = context.req.cookies.access_token; const helper = await TrpcAuthedFetchingIstance({ access_token }); if (helper) { const payment = await helper.trpc.pagamenti.getPaymentFromIntent.fetch({ pIntentId: paymentIntent.id, }); if (!payment) { return { props: { servizioId: null, status: AcquistoStatusEnum.not_found, }, }; } let resultStatus: AcquistoStatusEnum; if (paymentIntent.status === "succeeded") { if (payment.paymentstatus !== PaymentStatusEnum.success) { resultStatus = AcquistoStatusEnum.internal_error; } resultStatus = AcquistoStatusEnum.success; } else if (paymentIntent.status === "processing") { if (payment.paymentstatus !== PaymentStatusEnum.processing) { resultStatus = AcquistoStatusEnum.internal_error; } resultStatus = AcquistoStatusEnum.processing; } else { resultStatus = AcquistoStatusEnum.failed; } return { props: { servizioId: payment.servizio_id, status: resultStatus, }, }; } return { redirect: { destination: "/500", permanent: false, }, }; }) satisfies GetServerSideProps; export default function AcquistoProcessing({ servizioId, status, }: AcquistoProcessingProps) { const { t } = useTranslation(); const router = useRouter(); return (

{t.acquisto_elaborazione.titolo}

{status === AcquistoStatusEnum.success && ( <> )} {status === AcquistoStatusEnum.processing && ( <> {t.acquisto_elaborazione.to_dashboard} )} {status === AcquistoStatusEnum.failed && ( <> {t.acquisto_elaborazione.to_chat} )} {status === AcquistoStatusEnum.internal_error && ( <> {t.acquisto_elaborazione.to_chat} )} {status === AcquistoStatusEnum.not_found && ( <> {t.acquisto_elaborazione.to_chat} )}
); }