infoalloggi-monorepo/apps/infoalloggi/src/components/area-riservata/ordini.tsx

168 lines
4.4 KiB
TypeScript
Raw Normal View History

import { CircleCheck, CircleSlash, ReceiptText } from "lucide-react";
2025-08-28 18:27:07 +02:00
import Link from "next/link";
import type { Dispatch, SetStateAction } from "react";
2025-08-04 17:45:44 +02:00
import {
2025-08-28 18:27:07 +02:00
Credenza,
CredenzaBody,
CredenzaClose,
CredenzaContent,
CredenzaDescription,
CredenzaFooter,
CredenzaHeader,
CredenzaTitle,
2025-08-04 17:45:44 +02:00
} from "~/components/custom_ui/credenza";
import { Button } from "~/components/ui/button";
import { FormEditOrder } from "~/forms/FormEditOrdine";
import { formatCurrency } from "~/lib/utils";
2025-08-28 18:27:07 +02:00
import type { OrdiniOrdineId } from "~/schemas/public/Ordini";
import PaymentStatusEnum from "~/schemas/public/PaymentStatusEnum";
import type { Prezziario } from "~/schemas/public/Prezziario";
2025-08-28 18:27:07 +02:00
import { api } from "~/utils/api";
2025-08-04 17:45:44 +02:00
export const AdminWrapperOrdiniModal = ({
ordineId,
setSelected,
}: {
ordineId: OrdiniOrdineId | null;
setSelected: Dispatch<SetStateAction<OrdiniOrdineId | null>>;
}) => {
const { data: prezzi, isLoading } = api.prezziario.getPrezziario.useQuery();
if (isLoading || !ordineId || !prezzi) return null;
return (
<AdminOrdiniModal
ordineId={ordineId}
prezzi={prezzi}
setSelected={setSelected}
/>
);
};
const AdminOrdiniModal = ({
prezzi,
setSelected,
2025-08-28 18:27:07 +02:00
ordineId,
2025-08-04 17:45:44 +02:00
}: {
prezzi: Prezziario[];
setSelected: Dispatch<SetStateAction<OrdiniOrdineId | null>>;
2025-08-28 18:27:07 +02:00
ordineId: OrdiniOrdineId;
2025-08-04 17:45:44 +02:00
}) => {
const { data } = api.servizio.getOrdineById.useQuery({
ordineId,
2025-08-28 18:27:07 +02:00
});
2025-08-04 17:45:44 +02:00
if (!data) return null;
return (
<Credenza
onOpenChange={(b) => {
if (!b) setSelected(null);
}}
open={ordineId !== null}
>
<CredenzaContent className="max-h-[90vh] max-w-2xl sm:max-w-4xl">
<CredenzaHeader>
<CredenzaTitle>Dettagli Ordine</CredenzaTitle>
<CredenzaDescription>
Visualizza i dettagli e i pagamenti associati.
</CredenzaDescription>
</CredenzaHeader>
<CredenzaBody className="max-h-[80vh] space-y-2 overflow-auto pb-5">
<p>Id Ordine: {data.ordine_id}</p>
{data.isActive &&
data.paymentstatus === PaymentStatusEnum.success && (
<div>
<Link
href={`/servizio/ricevuta-cortesia/${data.ordine_id}`}
target="_blank"
>
<Button variant="outline">
Ricevuta di cortesia <ReceiptText />
</Button>
</Link>
</div>
)}
<FormEditOrder
close={() => setSelected(null)}
data={data}
prezziario={prezzi}
/>
</CredenzaBody>
</CredenzaContent>
</Credenza>
);
};
2025-08-04 17:45:44 +02:00
export const UserOrdiniModal = ({
setSelected,
ordineId,
}: {
setSelected: (ordineId: OrdiniOrdineId | null) => void;
ordineId: OrdiniOrdineId;
}) => {
2025-08-28 18:27:07 +02:00
const { data } = api.servizio.getOrdineById.useQuery({
ordineId,
});
if (!data) return null;
2025-08-04 17:45:44 +02:00
2025-08-28 18:27:07 +02:00
return (
<Credenza
onOpenChange={(b) => {
if (!b) setSelected(null);
2025-08-28 18:27:07 +02:00
}}
open={ordineId !== null}
2025-08-28 18:27:07 +02:00
>
<CredenzaContent className="max-h-[90vh] max-w-2xl sm:max-w-4xl">
2025-08-28 18:27:07 +02:00
<CredenzaHeader>
<CredenzaTitle>Dettagli Ordine</CredenzaTitle>
<CredenzaDescription>
Visualizza i dettagli e i pagamenti associati.
</CredenzaDescription>
</CredenzaHeader>
<CredenzaBody className="max-h-[80vh] space-y-2 overflow-auto pb-5">
<p>Id Ordine: {data.ordine_id}</p>
<p>
Data Ordine: {new Date(data.created_at).toLocaleDateString("it-IT")}
2025-08-28 18:27:07 +02:00
</p>
<p>Tipologia: {data.type.toString()}</p>
<p>Pack ID: {data.packid}</p>
<p className="flex items-center gap-2">
Stato:{" "}
{data.isActive ? (
<span className="inline-flex items-center gap-1 text-green-500">
<CircleCheck className="size-5" />
Attivo
</span>
) : (
<span className="inline-flex items-center gap-1">
<CircleSlash className="size-5" />
Non Attivo
</span>
)}
</p>
<p>
Importo: {formatCurrency(data.amount_cent / 100)}{" "}
{data.sconto > 0 && <span>({data.sconto}%)</span>}
</p>
2025-08-28 18:27:07 +02:00
{data.isActive &&
data.paymentstatus === PaymentStatusEnum.success && (
2025-08-28 18:27:07 +02:00
<div>
<Link
href={`/servizio/ricevuta-cortesia/${data.ordine_id}`}
2025-08-28 18:27:07 +02:00
target="_blank"
>
<Button variant="outline">
2025-08-28 18:27:07 +02:00
Ricevuta di cortesia <ReceiptText />
</Button>
</Link>
</div>
)}
</CredenzaBody>
<CredenzaFooter className="flex w-full sm:justify-end">
2025-08-28 18:27:07 +02:00
<CredenzaClose asChild>
<Button variant="ghost">Chiudi</Button>
</CredenzaClose>
</CredenzaFooter>
</CredenzaContent>
</Credenza>
);
2025-08-04 17:45:44 +02:00
};