infoalloggi-monorepo/apps/infoalloggi/src/components/servizio/compatibili_dialog.tsx
Marco Pedone ac1859e88f feat: add service management features and update Italian translations
- Introduced new service status translations in Italian.
- Added service detail and management components for user and admin views.
- Implemented API endpoints for fetching service data and announcements.
- Enhanced service data handling with improved date parsing and formatting.
- Created new pages for service details accessible by both users and admins.
- Updated database queries to support new service functionalities.
2026-02-25 15:30:53 +01:00

127 lines
4.1 KiB
TypeScript

import { CheckCircle } from "lucide-react";
import { useState } from "react";
import { useTranslation } from "~/providers/I18nProvider";
import { useServizio } from "~/providers/ServizioProvider";
import { api } from "~/utils/api";
import { CardAnnuncio } from "../annuncio_card";
import { InteressatoButtonServizio } from "../annuncio-interactions/annuncio_interactions";
import { LoadingPage } from "../loading";
import { Badge } from "../ui/badge";
import { Button } from "../ui/button";
import {
Dialog,
DialogClose,
DialogContent,
DialogDescription,
DialogFooter,
DialogHeader,
DialogTitle,
DialogTrigger,
} from "../ui/dialog";
import { Label } from "../ui/label";
import { Switch } from "../ui/switch";
import { AnnuncioDettaglio } from "./annuncio_dettaglio";
export const AnnunciCompatibili = () => {
const { servizioId, isAdmin } = useServizio();
const { locale } = useTranslation();
const [adminOverride, setAdminOverride] = useState(false);
const { data, isLoading } = api.servizio.getCompatibileAnnunci.useQuery({
servizioId,
adminOverride,
});
return (
<Dialog>
<DialogTrigger asChild>
<Button className="w-full bg-purple-500 hover:bg-purple-600 sm:w-fit dark:text-white">
{locale === "it"
? "Esplora Annunci Compatibili"
: "Explore Compatible Listings"}
</Button>
</DialogTrigger>
<DialogContent className="max-w-xl p-2 sm:max-w-5xl sm:p-6 md:max-w-7xl 2xl:max-w-400">
<DialogHeader className="flex-row flex-wrap items-center gap-5 pt-6">
<DialogTitle>
{locale === "it"
? "Annunci compatibili con i parametri del servizio"
: "Listings compatible with the service parameters"}
</DialogTitle>
{isAdmin && (
<div className="flex flex-wrap items-center gap-x-2">
<Label htmlFor="adminOverride">
Ignora limitazioni parametri
</Label>
<Switch
checked={adminOverride}
className="data-[state=checked]:bg-neutral-700"
id="adminOverride"
onCheckedChange={setAdminOverride}
/>
</div>
)}
<DialogDescription className="sr-only"></DialogDescription>
</DialogHeader>
<div className="flex max-h-[80vh] flex-col gap-2 overflow-y-auto p-0.5 sm:p-2">
{isLoading ? (
<LoadingPage />
) : (
<>
{!data || data.length === 0 ? (
<span>
{locale === "it"
? "Nessun annuncio compatibile trovato. Amplia la ricerca per trovare annunci compatibili."
: "No compatible listings found. Broaden your search to find compatible listings."}
</span>
) : (
<div className="relative z-0 mx-auto grid max-w-full grid-flow-row grid-cols-1 gap-14 sm:grid-cols-2 sm:gap-6 sm:gap-y-10 lg:grid-cols-3 2xl:grid-cols-4">
{data.map((annuncio) => (
<div
className="flex flex-col justify-center gap-1"
key={annuncio.codice}
>
<CardAnnuncio
{...annuncio}
className="outline outline-neutral-500"
noLink
onlyFirstImage
/>
<div className="flex items-center justify-between gap-2">
<div className="w-full">
<AnnuncioDettaglio data={annuncio} />
</div>
<div className="w-full">
{annuncio.alreadyRequested ? (
<Badge
className="flex h-9 w-full items-center justify-center gap-2 text-base [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0"
variant="success"
>
<span>
{locale === "it"
? "Richiesta inviata"
: "Request sent"}
</span>
<CheckCircle />
</Badge>
) : (
<InteressatoButtonServizio
annuncioId={annuncio.id}
/>
)}
</div>
</div>
</div>
))}
</div>
)}
</>
)}
</div>
<DialogFooter>
<DialogClose asChild></DialogClose>
</DialogFooter>
</DialogContent>
</Dialog>
);
};