2025-10-17 19:14:27 +02:00
import { CodeSquare , RefreshCcw , TriangleAlert } from "lucide-react" ;
2025-10-15 15:45:24 +02:00
import toast from "react-hot-toast" ;
import { Confirm } from "~/components/confirm" ;
2025-08-04 17:45:44 +02:00
import { AreaRiservataLayout } from "~/components/Layout" ;
import { LoadingPage } from "~/components/loading" ;
import { Status500 } from "~/components/status-page" ;
import { AnnunciTable } from "~/components/tables/annunci-tables" ;
2025-10-15 15:45:24 +02:00
import { Button } from "~/components/ui/button" ;
2025-10-17 19:14:27 +02:00
import {
Popover ,
PopoverContent ,
PopoverTrigger ,
} from "~/components/ui/popover" ;
2025-08-28 18:27:07 +02:00
import type { NextPageWithLayout } from "~/pages/_app" ;
2025-10-17 18:12:10 +02:00
import { generateSSGHelper } from "~/server/utils/ssgHelper" ;
2025-08-28 18:27:07 +02:00
import { api } from "~/utils/api" ;
2025-08-04 17:45:44 +02:00
const Admin_Annunci : NextPageWithLayout = ( ) = > {
2025-08-28 18:27:07 +02:00
const { data , isLoading , refetch } = api . annunci . getAnnunciList . useQuery ( ) ;
2025-10-15 15:45:24 +02:00
2025-10-17 19:14:27 +02:00
const { mutateAsync : update } = api . settings . updateAllAnnunci . useMutation ( {
onSettled : async ( ) = > {
toast . success (
"La revalidazione dell'annuncio è stata richiesta con successo,\n potrebbero volerci alcuni minuti prima che le modifiche siano visibili." ,
{
duration : 5000 ,
} ,
) ;
} ,
} ) ;
2025-10-15 15:45:24 +02:00
const { mutateAsync : revalidate } =
api . settings . revalidateAllAnnunci . useMutation ( {
onSettled : async ( ) = > {
2025-10-17 19:14:27 +02:00
toast . success ( "Revalidazione completata" ) ;
2025-10-15 15:45:24 +02:00
} ,
} ) ;
2025-08-28 18:27:07 +02:00
if ( isLoading ) return < LoadingPage / > ;
if ( ! data ) return < Status500 / > ;
return (
< div className = "mx-1 flex-1 overflow-auto" >
< div className = "mx-auto pt-4" >
< div className = "mx-3 items-start justify-between 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" > Annunci < / h3 >
2025-08-28 18:27:07 +02:00
< button
className = "cursor-pointer"
2025-08-29 16:18:32 +02:00
onClick = { async ( ) = > await refetch ( ) }
type = "button"
2025-08-28 18:27:07 +02:00
>
< RefreshCcw className = "size-6" / >
< / button >
2025-10-17 19:14:27 +02:00
< Popover >
< PopoverTrigger asChild >
< Button
className = "flex items-center gap-2"
size = "sm"
type = "button"
>
< CodeSquare / > Strumenti avanzati
< / Button >
< / PopoverTrigger >
< PopoverContent className = "flex flex-col items-center gap-2" >
< Button
className = "flex items-center gap-2 bg-purple-500"
onClick = { async ( ) = > {
await revalidate ( ) ;
} }
size = "sm"
type = "button"
>
< RefreshCcw / > Rigenera pagine annnunci
< / Button >
< Confirm
description = "Sei sicuro di voler richiedere l'aggiornamento degli annunci? Questa operazione potrebbe richiedere alcuni minuti prima che le modifiche siano visibili e resetterà eventuali modifiche effettuate dopo la sincronizzazione giornaliera."
onConfirm = { async ( ) = > {
await update ( ) ;
} }
title = "Aggiornamento Annunci"
>
< Button
className = "flex items-center gap-2"
size = "sm"
type = "button"
variant = "warning"
>
< TriangleAlert / > Aggiorna tutti gli annunci
< / Button >
< / Confirm >
< / PopoverContent >
< / Popover >
2025-08-28 18:27:07 +02:00
< / div >
< / div >
< AnnunciTable data = { data } / >
< / div >
< / div >
) ;
2025-08-04 17:45:44 +02:00
} ;
2025-10-17 18:12:10 +02:00
export async function getServerSideProps() {
const helpers = generateSSGHelper ( ) ;
await helpers . annunci . getAnnunciList . prefetch ( ) ;
return {
props : {
trpcState : helpers.dehydrate ( ) ,
} ,
} ;
}
2025-08-04 17:45:44 +02:00
export default Admin_Annunci ;
Admin_Annunci . getLayout = function getLayout ( page ) {
2025-08-28 18:27:07 +02:00
return < AreaRiservataLayout > { page } < / AreaRiservataLayout > ;
2025-08-04 17:45:44 +02:00
} ;