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

111 lines
3.1 KiB
TypeScript
Raw Normal View History

import { CircleHelp } from "lucide-react";
2025-08-04 17:45:44 +02:00
import { AccordionComp } from "~/components/accordionComp";
2025-08-28 18:27:07 +02:00
import { LoadingPage } from "~/components/loading";
import {
2025-08-28 18:27:07 +02:00
Card,
CardContent,
CardDescription,
CardHeader,
CardTitle,
} from "~/components/ui/card";
2025-08-28 18:27:07 +02:00
import { useTranslation } from "~/providers/I18nProvider";
import type { UsersId } from "~/schemas/public/Users";
import { api } from "~/utils/api";
import {
Credenza,
CredenzaBody,
CredenzaContent,
CredenzaDescription,
CredenzaHeader,
CredenzaTitle,
CredenzaTrigger,
} from "../custom_ui/credenza";
import { ServizioList } from "../servizio/servizio";
import { Button } from "../ui/button";
2025-08-04 17:45:44 +02:00
export const AdminDashboard = () => {
2025-08-28 18:27:07 +02:00
const { data: stats, isLoading } = api.stats.adminDashStats.useQuery();
2025-08-04 17:45:44 +02:00
2025-08-28 18:27:07 +02:00
if (isLoading) return <LoadingPage />;
return (
<div className="mx-1 flex-1 overflow-auto">
<div className="mx-auto pt-4 pb-8">
<div className="mx-3 items-start justify-between pb-3 md:flex">
<div className="flex max-w-lg items-center gap-3">
2025-10-10 16:18:43 +02:00
<h3 className="font-bold text-2xl">Admin Dashboard</h3>
2025-08-28 18:27:07 +02:00
</div>
</div>
{!stats ? (
<div className="text-red-500">Errore caricamento statistiche</div>
) : (
<div className="grid grid-cols-1 gap-4 px-2 pt-4 sm:grid-cols-2 sm:px-4">
<Card>
2025-08-28 18:27:07 +02:00
<CardHeader>
<CardTitle>Utenti</CardTitle>
<CardDescription>
Numero totale di utenti registrati
</CardDescription>
</CardHeader>
2025-10-10 16:18:43 +02:00
<CardContent className="flex h-full items-center justify-center font-bold text-6xl">
2025-08-28 18:27:07 +02:00
{stats.userCount}
</CardContent>
</Card>
</div>
)}
</div>
</div>
);
2025-08-04 17:45:44 +02:00
};
export const UserDashboard = ({ userId }: { userId: UsersId }) => {
const { data, isLoading } = api.servizio.getAllServizioAnnunci.useQuery({
userId,
});
if (isLoading) return <LoadingPage />;
2025-08-28 18:27:07 +02:00
return (
<div className="mt-2 flex w-full flex-1 flex-col items-start justify-center gap-4 overflow-auto p-2 md:gap-6">
<h3 className="font-bold text-2xl">Le tue ricerche</h3>
2025-08-04 17:45:44 +02:00
<div className="flex w-full flex-1 grow flex-col space-y-5">
<ServizioList isAdmin={false} servizi={data || []} userId={userId} />
</div>
<div className="mx-auto">
<UserDashboardFaq />
2025-08-28 18:27:07 +02:00
</div>
</div>
);
2025-08-04 17:45:44 +02:00
};
export const UserDashboardFaq = () => {
const { t, locale } = useTranslation();
const title =
locale === "it" ? "Domande frequenti" : "Frequently Asked Questions";
return (
<Credenza>
<CredenzaTrigger asChild>
<Button variant="secondary">
<span>{title}</span>
<CircleHelp />
</Button>
</CredenzaTrigger>
<CredenzaContent className="max-h-[90vh] w-full md:max-w-3xl">
<CredenzaHeader>
<CredenzaTitle className="text-center font-semibold text-2xl">
{title}
</CredenzaTitle>
<CredenzaDescription className="sr-only">{title}</CredenzaDescription>
</CredenzaHeader>
<CredenzaBody className="max-h-[80vh] overflow-auto pb-5">
<AccordionComp
className="w-full max-w-full"
texts={t.area_riservata.dash_accordion_minifaq}
/>
</CredenzaBody>
</CredenzaContent>
</Credenza>
);
};