refactor: enhance AnnuncioCard to accept confirming prop and improve layout in interactions

This commit is contained in:
Marco Pedone 2025-12-18 15:12:25 +01:00
parent dacea2481e
commit e4d7e94ae2
4 changed files with 44 additions and 10 deletions

View file

@ -10,13 +10,20 @@ import { useServizioAnnuncio } from "~/providers/ServizioProvider";
import type { AnnuncioRicerca } from "~/server/controllers/annunci.controller";
import { AnnuncioDettaglio, TipoBadge } from "./annuncio_dettaglio";
export const AnnuncioCard = ({ className }: { className?: string }) => {
export const AnnuncioCard = ({
className,
confirming,
}: {
className?: string;
confirming?: boolean;
}) => {
const { data } = useServizioAnnuncio();
return (
<BasicAnnuncioCard
actions={<AnnuncioActions />}
className={className}
confirming={confirming}
data={{
...data,
modificato_il: data.modificato_il ? new Date(data.modificato_il) : null,
@ -33,23 +40,36 @@ export const BasicAnnuncioCard = ({
interactions,
className,
data,
confirming,
}: {
actions?: React.ReactNode;
interactions?: React.ReactNode;
className?: string;
data: AnnuncioRicerca;
confirming?: boolean;
}) => {
const { t } = useTranslation();
return (
<Card className={cn("w-full gap-2 border-white py-3", className)}>
<CardHeader className="flex flex-row flex-wrap items-center justify-between space-y-0 px-3 pb-0">
<CardHeader className="flex flex-row flex-wrap items-center justify-between space-y-0 px-3 pb-2">
<CardTitle className="text-2xl">Annuncio {data.codice}</CardTitle>
{actions}
</CardHeader>
<CardContent className="px-3">
<div className="@container flex w-full flex-col gap-2">
<div className="grid @md:grid-cols-[12rem_1fr] grid-cols-[6rem_1fr] gap-x-4 gap-y-2 rounded-md md:max-w-3xl md:border md:border-white md:bg-[#e6e9ec]/50 lg:gap-x-6 xl:gap-x-8 dark:md:border-primary dark:md:bg-card">
<div
className={cn(
"@container flex w-full flex-col gap-4",
confirming && "xl:flex-row xl:gap-6",
)}
id="container"
>
<div
className={cn(
"grid @md:grid-cols-[12rem_1fr] grid-cols-[6rem_1fr] gap-x-4 gap-y-2 rounded-md md:max-w-3xl md:border md:border-white md:bg-[#e6e9ec]/50 lg:gap-x-6 xl:gap-x-8 dark:md:border-primary dark:md:bg-card",
confirming && "xl:w-1/2",
)}
>
<div className="row-span-1 md:row-span-3">
<Image
alt={data.codice}
@ -94,7 +114,14 @@ export const BasicAnnuncioCard = ({
<AnnuncioDettaglio data={data} />
</div>
</div>
<div className="flex w-full flex-col gap-5">{interactions}</div>
<div
className={cn(
"flex w-full flex-col gap-4",
confirming && "xl:w-1/2",
)}
>
{interactions}
</div>
</div>
</CardContent>
</Card>

View file

@ -190,13 +190,15 @@ export const Interactions = () => {
const { data } = useServizioAnnuncio();
return (
<div className="flex w-full flex-col flex-wrap gap-2 sm:flex-row">
<ContattiProprietarioModal />
<>
<div className="flex w-full flex-col flex-wrap gap-2 sm:flex-row">
<ContattiProprietarioModal />
<SezioneConferma />
<SezioneConferma />
</div>
{data.accettato_conferma_at != null && <PostConfermaSection />}
</div>
</>
);
};

View file

@ -221,7 +221,10 @@ export const ServizioContent = () => {
servizioId={servizio.servizio_id}
userId={userId}
>
<AnnuncioCard />
<AnnuncioCard
className="rounded-md border-primary"
confirming
/>
</ServizioAnnuncioProvider>
);
})}

View file

@ -167,6 +167,8 @@ const ServizioBasicActions = ({ className }: { className?: string }) => {
servizio.isOkAcconto &&
servizio.decorrenza !== null &&
new Date() <= add(new Date(servizio.decorrenza), { days: 60 }) &&
!servizio.annunci.some((a) => a.user_confirmed_at !== null) &&
!servizio.isInterrotto &&
!servizio.annunci.some((a) => a.user_confirmed_at !== null);
if (isAdmin || canUserEdit) {