feat: update page titles and descriptions for improved SEO and user experience

- Updated Italian translations for "Area Riservata" description in it.ts
- Added <Head> components with appropriate titles for the following pages:
  - Admin Annunci
  - Admin Banners
  - Admin Blacklist
  - Admin Chats
  - Admin Etichette
  - Admin Flags
  - Admin Impostazioni
  - Admin Ordini
  - Admin Potenziali
  - Admin Prezziario
  - Admin Storage
  - Admin Testi Stringhe
  - Admin Utenti
  - Allegati
  - User Chat
  - Comunicazioni
  - Ordini
  - Profilo
- Removed unused translation hooks from several components
This commit is contained in:
Marco Pedone 2026-01-19 10:23:16 +01:00
parent ea8f9fe0fa
commit a4f822d462
23 changed files with 384 additions and 379 deletions

View file

@ -11,7 +11,6 @@ import { LoadingPage } from "~/components/loading";
import { SiteHeader } from "~/components/navbar/site-header";
import { UserViewProvider } from "~/lib/userViewContext";
import { cn } from "~/lib/utils";
import { useTranslation } from "~/providers/I18nProvider";
import {
EnforcedSessionContext,
useSession,
@ -161,7 +160,6 @@ export const AreaRiservataLayoutUserView = ({
}: {
children: ReactNode & { props: { userId: UsersId } };
}) => {
const { t } = useTranslation();
const session = useSession();
const props = children.props as { userId: UsersId };
if (session.status === "pending") {
@ -178,11 +176,7 @@ export const AreaRiservataLayoutUserView = ({
<UserViewProvider userId={props.userId}>
<EnforcedSessionContext.Provider value={session as ValidSession}>
<Head>
<title>{t.heads.area_riservata_titolo}</title>
<meta
content={t.heads.area_riservata_description}
name="description"
/>
<title>User View - Infoalloggi.it</title>
</Head>
<div className="flex h-auto w-full flex-col md:flex-row">
<Sidebar

View file

@ -37,7 +37,7 @@ export const AnnuncioCard = ({ className }: { className?: string }) => {
isAdmin ? (
<div className="flex flex-col gap-2">
<Collapsible className="space-y-2">
<CollapsibleTrigger>
<CollapsibleTrigger asChild>
<Button variant="outline">
<Toolbox />
<span>Azioni Utente</span>
@ -97,7 +97,7 @@ export const AnnuncioDisplay = ({
return (
<div
className={cn(
"grid @md:grid-cols-[12rem_1fr] grid-cols-[7rem_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-4 xl:gap-x-6 dark:md:border-primary dark:md:bg-card",
"grid @md:grid-cols-[12rem_1fr] grid-cols-[7rem_1fr] gap-x-4 gap-y-2 rounded-md bg-[#e6e9ec]/50 md:max-w-3xl md:border md:border-white lg:gap-x-4 xl:gap-x-6 dark:md:border-primary dark:md:bg-card",
className,
)}
>

View file

@ -285,7 +285,7 @@ export const ServizioContent = () => {
servizioId={servizio.servizio_id}
userId={userId}
>
<AnnuncioCard className="rounded-md border-primary" />
<AnnuncioCard className="max-w-4xl rounded-md border-primary" />
</ServizioAnnuncioProvider>
);
})}
@ -342,23 +342,18 @@ export const ServizioContent = () => {
</div>
)}
<div className="flex flex-col gap-4">
<div className="grid grid-cols-1 gap-3 lg:grid-cols-2">
{servizio.annunci.map((data) => {
return (
<ServizioAnnuncioProvider
data={data}
key={data.id}
servizioId={servizio.servizio_id}
userId={userId}
>
<AnnuncioCard className="rounded-md border-primary" />
</ServizioAnnuncioProvider>
);
})}
{servizio.annunci.length % 2 === 1 && (
<div className="size-full rounded-md border border-(--pattern-fg) bg-[repeating-linear-gradient(45deg,var(--pattern-fg)_0,var(--pattern-fg)_1px,transparent_0,transparent_50%)] bg-size-[10px_10px] bg-fixed opacity-10 [--pattern-fg:#696969] dark:[--pattern-fg:#e1e1e1]" />
)}
</div>
{servizio.annunci.map((data) => {
return (
<ServizioAnnuncioProvider
data={data}
key={data.id}
servizioId={servizio.servizio_id}
userId={userId}
>
<AnnuncioCard className="max-w-4xl rounded-md border-primary" />
</ServizioAnnuncioProvider>
);
})}
<div className="flex items-center justify-center">
<AnnunciCompatibili />

View file

@ -552,7 +552,7 @@ export const en: LangDict = {
heads: {
annunci_description: "Search for properties",
annunci_titolo: "Solutions - Infoalloggi.it",
area_riservata_description: "Access your personal area",
area_riservata_description: "Personal Area Infoalloggi.it",
area_riservata_titolo: "Personal Area - Infoalloggi.it",
chi_siamo_titolo: "Who we are - Infoalloggi.it",
contatti_titolo: "Contacts - Infoalloggi.it",

View file

@ -556,7 +556,7 @@ export const it: LangDict = {
heads: {
annunci_description: "Ricerca immobili",
annunci_titolo: "Annunci - Infoalloggi.it",
area_riservata_description: "Accedi alla tua area riservata",
area_riservata_description: "Area Riservata Infoalloggi.it",
area_riservata_titolo: "Area Riservata - Infoalloggi.it",
chi_siamo_titolo: "Chi Siamo - Infoalloggi.it",
contatti_titolo: "Contatti - Infoalloggi.it",

View file

@ -1,4 +1,5 @@
import { CodeSquare, RefreshCcw, TriangleAlert } from "lucide-react";
import Head from "next/head";
import toast from "react-hot-toast";
import { Confirm } from "~/components/confirm";
import { AreaRiservataLayout } from "~/components/Layout";
@ -41,53 +42,59 @@ const Admin_Annunci: NextPageWithLayout = () => {
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">
<h3 className="font-bold text-2xl">Annunci</h3>
<button
className="cursor-pointer"
onClick={async () => await refetch()}
type="button"
>
<RefreshCcw className="size-6" />
</button>
<Popover>
<PopoverTrigger asChild>
<Button size="sm" type="button">
<CodeSquare /> Strumenti avanzati
</Button>
</PopoverTrigger>
<PopoverContent className="flex flex-col items-center gap-2">
<Button
className="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 size="sm" type="button" variant="warning">
<TriangleAlert /> Aggiorna tutti gli annunci
<>
<Head>
<title>Annunci - Infoalloggi.it</title>
</Head>
<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">
<h3 className="font-bold text-2xl">Annunci</h3>
<button
className="cursor-pointer"
onClick={async () => await refetch()}
type="button"
>
<RefreshCcw className="size-6" />
</button>
<Popover>
<PopoverTrigger asChild>
<Button size="sm" type="button">
<CodeSquare /> Strumenti avanzati
</Button>
</Confirm>
</PopoverContent>
</Popover>
</PopoverTrigger>
<PopoverContent className="flex flex-col items-center gap-2">
<Button
className="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 size="sm" type="button" variant="warning">
<TriangleAlert /> Aggiorna tutti gli annunci
</Button>
</Confirm>
</PopoverContent>
</Popover>
</div>
</div>
<AnnunciTable data={data} />
</div>
<AnnunciTable data={data} />
</div>
</div>
</>
);
};

View file

@ -1,4 +1,5 @@
import { Plus, RefreshCcw } from "lucide-react";
import Head from "next/head";
import { useState } from "react";
import toast from "react-hot-toast";
import { AreaRiservataLayout } from "~/components/Layout";
@ -36,51 +37,56 @@ const AdminBanners: NextPageWithLayout = () => {
if (!data) return <Status500 />;
return (
<div className="mx-1 flex-1 overflow-auto">
<div className="mx-auto pt-4">
<div className="mx-auto items-start justify-between px-2 md:flex">
<div className="flex items-center gap-3">
<h3 className="font-bold text-accent-foreground text-xl sm:text-2xl">
Banners
</h3>
<button
className="cursor-pointer"
onClick={async () => await refetch()}
type="button"
>
<RefreshCcw className="size-6" />
</button>
<>
<Head>
<title>Banners - Infoalloggi.it</title>
</Head>
<div className="mx-1 flex-1 overflow-auto">
<div className="mx-auto pt-4">
<div className="mx-auto items-start justify-between px-2 md:flex">
<div className="flex items-center gap-3">
<h3 className="font-bold text-accent-foreground text-xl sm:text-2xl">
Banners
</h3>
<button
className="cursor-pointer"
onClick={async () => await refetch()}
type="button"
>
<RefreshCcw className="size-6" />
</button>
</div>
<div className="mt-3 md:mt-0">
<EditModal
initial={editData}
open={openEdit}
setOpen={handleOpen}
/>
</div>
<div className="mt-3 md:mt-0">
<Button
className="font-semibold"
onClick={() => {
handleEdit(null);
handleOpen(true);
}}
variant="outline"
>
<Plus className="size-6" />
Nuovo
</Button>
</div>
</div>
<div className="mt-3 md:mt-0">
<EditModal
initial={editData}
open={openEdit}
setOpen={handleOpen}
/>
</div>
<div className="mt-3 md:mt-0">
<Button
className="font-semibold"
onClick={() => {
handleEdit(null);
handleOpen(true);
}}
variant="outline"
>
<Plus className="size-6" />
Nuovo
</Button>
</div>
<BannersTable
data={data}
setEditData={handleEdit}
setOpenEdit={handleOpen}
/>
</div>
<BannersTable
data={data}
setEditData={handleEdit}
setOpenEdit={handleOpen}
/>
</div>
</div>
</>
);
};
export default AdminBanners;
@ -147,7 +153,7 @@ const EditModal = ({
return (
<Dialog onOpenChange={setOpen} open={open}>
<DialogTrigger asChild />
<DialogContent className="sm:max-w-[425px]">
<DialogContent className="sm:max-w-106.25">
<DialogHeader>
<DialogTitle>
{!initial ? "Aggiungi Banner" : "Modifica Valori"}

View file

@ -1,5 +1,6 @@
import { Plus, RefreshCcw } from "lucide-react";
import type { GetServerSideProps } from "next";
import Head from "next/head";
import { useState } from "react";
import toast from "react-hot-toast";
import { AreaRiservataLayout } from "~/components/Layout";
@ -37,51 +38,56 @@ const AdminBlacklist: NextPageWithLayout = () => {
if (!data) return <Status500 />;
return (
<div className="mx-1 flex-1 overflow-auto">
<div className="mx-auto pt-4">
<div className="mx-auto items-start justify-between px-2 md:flex">
<div className="flex items-center gap-3">
<h3 className="font-bold text-accent-foreground text-xl sm:text-2xl">
Black list
</h3>
<button
className="cursor-pointer"
onClick={async () => await refetch()}
type="button"
>
<RefreshCcw className="size-6" />
</button>
<>
<Head>
<title>Utenti - Infoalloggi.it</title>
</Head>
<div className="mx-1 flex-1 overflow-auto">
<div className="mx-auto pt-4">
<div className="mx-auto items-start justify-between px-2 md:flex">
<div className="flex items-center gap-3">
<h3 className="font-bold text-accent-foreground text-xl sm:text-2xl">
Black list
</h3>
<button
className="cursor-pointer"
onClick={async () => await refetch()}
type="button"
>
<RefreshCcw className="size-6" />
</button>
</div>
<div className="mt-3 md:mt-0">
<EditModal
initial={editData}
open={openEdit}
setOpen={handleOpen}
/>
</div>
<div className="mt-3 md:mt-0">
<Button
className="font-semibold"
onClick={() => {
handleEdit(null);
handleOpen(true);
}}
variant="outline"
>
<Plus className="size-6" />
Nuovo
</Button>
</div>
</div>
<div className="mt-3 md:mt-0">
<EditModal
initial={editData}
open={openEdit}
setOpen={handleOpen}
/>
</div>
<div className="mt-3 md:mt-0">
<Button
className="font-semibold"
onClick={() => {
handleEdit(null);
handleOpen(true);
}}
variant="outline"
>
<Plus className="size-6" />
Nuovo
</Button>
</div>
<BanlistTable
data={data}
setEditData={handleEdit}
setOpenEdit={handleOpen}
/>
</div>
<BanlistTable
data={data}
setEditData={handleEdit}
setOpenEdit={handleOpen}
/>
</div>
</div>
</>
);
};
export default AdminBlacklist;
@ -151,7 +157,7 @@ const EditModal = ({
return (
<Dialog onOpenChange={setOpen} open={open}>
<DialogTrigger asChild />
<DialogContent className="sm:max-w-[425px]">
<DialogContent className="sm:max-w-106.25">
<DialogHeader>
<DialogTitle>
{!initial ? "Aggiungi Ban" : "Modifica Valori"}

View file

@ -7,13 +7,11 @@ import { LoadingPage } from "~/components/loading";
import { SiteHeader } from "~/components/navbar/site-header";
import { Status500 } from "~/components/status-page";
import type { NextPageWithLayout } from "~/pages/_app";
import { useTranslation } from "~/providers/I18nProvider";
import { useSession } from "~/providers/SessionProvider";
import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper";
import { api } from "~/utils/api";
const AdminChats: NextPageWithLayout = () => {
const { t } = useTranslation();
const session = useSession();
const { data: activeChats, isLoading: isLoadingActiveChats } =
@ -38,8 +36,7 @@ const AdminChats: NextPageWithLayout = () => {
return (
<>
<Head>
<title>{t.heads.area_riservata_titolo}</title>
<meta content={t.heads.area_riservata_description} name="description" />
<title>Chat - Infoalloggi.it</title>
</Head>
<div className="flex h-full w-full flex-col md:flex-row">
<Sidebar

View file

@ -1,5 +1,6 @@
import { Plus, RefreshCcw } from "lucide-react";
import type { GetServerSideProps } from "next";
import Head from "next/head";
import { useState } from "react";
import toast from "react-hot-toast";
import { AreaRiservataLayout } from "~/components/Layout";
@ -38,50 +39,56 @@ const AdminEtichette: NextPageWithLayout = () => {
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">
<h3 className="font-bold text-accent-foreground text-xl sm:text-2xl">
Etichette
</h3>
<button
className="cursor-pointer"
onClick={async () => await refetch()}
type="button"
>
<RefreshCcw className="size-6" />
</button>
</div>
<div className="mt-3 md:mt-0">
<EditModal
initial={editData}
open={openEdit}
setOpen={handleOpen}
/>
</div>
<div className="mt-3 md:mt-0">
<Button
className="font-semibold"
onClick={() => {
handleEdit(null);
handleOpen(true);
}}
variant="outline"
>
<Plus className="size-6" />
Nuovo
</Button>
</div>
</div>
<>
<Head>
<title>Etichette - Infoalloggi.it</title>
</Head>
<EtichetteTable
data={data}
setEditData={handleEdit}
setOpenEdit={handleOpen}
/>
<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">
<h3 className="font-bold text-accent-foreground text-xl sm:text-2xl">
Etichette
</h3>
<button
className="cursor-pointer"
onClick={async () => await refetch()}
type="button"
>
<RefreshCcw className="size-6" />
</button>
</div>
<div className="mt-3 md:mt-0">
<EditModal
initial={editData}
open={openEdit}
setOpen={handleOpen}
/>
</div>
<div className="mt-3 md:mt-0">
<Button
className="font-semibold"
onClick={() => {
handleEdit(null);
handleOpen(true);
}}
variant="outline"
>
<Plus className="size-6" />
Nuovo
</Button>
</div>
</div>
<EtichetteTable
data={data}
setEditData={handleEdit}
setOpenEdit={handleOpen}
/>
</div>
</div>
</div>
</>
);
};
export default AdminEtichette;

View file

@ -1,5 +1,6 @@
import { Plus, RefreshCcw } from "lucide-react";
import type { GetServerSideProps } from "next";
import Head from "next/head";
import { useState } from "react";
import toast from "react-hot-toast";
import { AreaRiservataLayout } from "~/components/Layout";
@ -37,50 +38,55 @@ const AdminFlags: NextPageWithLayout = () => {
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">
<h3 className="font-bold text-accent-foreground text-xl sm:text-2xl">
Impostazioni
</h3>
<button
className="cursor-pointer"
onClick={async () => await refetch()}
type="button"
>
<RefreshCcw className="size-6" />
</button>
<>
<Head>
<title>Flags - Infoalloggi.it</title>
</Head>
<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">
<h3 className="font-bold text-accent-foreground text-xl sm:text-2xl">
Impostazioni
</h3>
<button
className="cursor-pointer"
onClick={async () => await refetch()}
type="button"
>
<RefreshCcw className="size-6" />
</button>
</div>
<div className="mt-3 md:mt-0">
<EditModal
initial={editData}
open={openEdit}
setOpen={handleOpen}
/>
</div>
<div className="mt-3 md:mt-0">
<Button
className="font-semibold"
onClick={() => {
handleEdit(null);
handleOpen(true);
}}
variant="outline"
>
<Plus className="size-6" />
Nuovo
</Button>
</div>
</div>
<div className="mt-3 md:mt-0">
<EditModal
initial={editData}
open={openEdit}
setOpen={handleOpen}
/>
</div>
<div className="mt-3 md:mt-0">
<Button
className="font-semibold"
onClick={() => {
handleEdit(null);
handleOpen(true);
}}
variant="outline"
>
<Plus className="size-6" />
Nuovo
</Button>
</div>
</div>
<FlagsTable
data={data}
setEditData={handleEdit}
setOpenEdit={handleOpen}
/>
<FlagsTable
data={data}
setEditData={handleEdit}
setOpenEdit={handleOpen}
/>
</div>
</div>
</div>
</>
);
};
export default AdminFlags;
@ -149,7 +155,7 @@ const EditModal = ({
return (
<Dialog onOpenChange={setOpen} open={open}>
<DialogContent className="sm:max-w-[425px]">
<DialogContent className="sm:max-w-106.25">
<DialogHeader>
<DialogTitle>{initial ? "Modifica" : "Aggiungi"}</DialogTitle>
<DialogDescription>

View file

@ -1,17 +1,13 @@
import Head from "next/head";
import { AreaRiservataLayout } from "~/components/Layout";
import type { NextPageWithLayout } from "~/pages/_app";
import { useTranslation } from "~/providers/I18nProvider";
import { api } from "~/utils/api";
const Impostazioni: NextPageWithLayout = () => {
const { t } = useTranslation();
return (
<>
<Head>
<title>{t.heads.area_riservata_titolo}</title>
<meta content={t.heads.area_riservata_description} name="description" />
<title>Impostazioni - Infoalloggi.it</title>
</Head>
<div className="mx-3 flex flex-1 flex-col gap-4 overflow-auto pt-5">
@ -27,23 +23,6 @@ const Impostazioni: NextPageWithLayout = () => {
};
export default Impostazioni;
// export const getServerSideProps = (async (context) => {
// const access_token = context.req.cookies.access_token;
// const helpers = await TrpcAuthedFetchingIstance({ access_token });
// if (helpers) {
// return {
// props: {
// trpcState: helpers.trpc.dehydrate(),
// },
// };
// }
// return {
// props: {},
// };
// }) satisfies GetServerSideProps;
Impostazioni.getLayout = function getLayout(page) {
return <AreaRiservataLayout>{page}</AreaRiservataLayout>;
};
@ -53,7 +32,7 @@ const StripeSection = () => {
if (isLoading) {
return <div>Loading...</div>;
}
console.log(data);
return (
<div className="rounded-lg border p-4">
<h4 className="mb-2 font-semibold text-lg">

View file

@ -5,12 +5,10 @@ import { LoadingPage } from "~/components/loading";
import { Status500 } from "~/components/status-page";
import { OrdiniTable } from "~/components/tables/orders-table";
import type { NextPageWithLayout } from "~/pages/_app";
import { useTranslation } from "~/providers/I18nProvider";
import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper";
import { api } from "~/utils/api";
const Ordini: NextPageWithLayout = () => {
const { t } = useTranslation();
const { data, isLoading } = api.servizio.getOrdini.useQuery({});
if (isLoading) return <LoadingPage />;
@ -19,8 +17,7 @@ const Ordini: NextPageWithLayout = () => {
return (
<>
<Head>
<title>{t.heads.area_riservata_titolo}</title>
<meta content={t.heads.area_riservata_description} name="description" />
<title>Ordini - Infoalloggi.it</title>
</Head>
<div className="mx-3 flex flex-1 flex-col gap-4 overflow-auto pt-5">

View file

@ -1,4 +1,5 @@
import dynamic from "next/dynamic";
import Head from "next/head";
import { NewColumn } from "~/components/area-riservata/potenziali";
import { AreaRiservataLayout } from "~/components/Layout";
import { LoadingPage } from "~/components/loading";
@ -19,6 +20,9 @@ const PotenzialiBoard = dynamic(
const AdminPotenziali: NextPageWithLayout = () => {
return (
<PotenzialiProvider>
<Head>
<title>Potenziali - Infoalloggi.it</title>
</Head>
<div className="mx-1 flex-1 overflow-auto">
<div className="mx-auto pt-4">
<div className="mx-3 flex-wrap items-start justify-between pb-5 sm:flex">

View file

@ -1,4 +1,5 @@
import { RefreshCcw } from "lucide-react";
import Head from "next/head";
import { useState } from "react";
import toast from "react-hot-toast";
import { AreaRiservataLayout } from "~/components/Layout";
@ -39,37 +40,43 @@ const Admin_Prezziario: NextPageWithLayout = () => {
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">
<h3 className="font-bold text-2xl">Prezziario</h3>
<button
className="cursor-pointer"
onClick={async () => await refetch()}
type="button"
>
<RefreshCcw className="size-6" />
</button>
</div>
<div className="mt-3 md:mt-0">
<NewPrezzoModal />
<>
<Head>
<title>Prezziario - Infoalloggi.it</title>
</Head>
<EditPrezzoModal
initial={editData}
open={openEdit}
setOpen={handleOpen}
/>
<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">
<h3 className="font-bold text-2xl">Prezziario</h3>
<button
className="cursor-pointer"
onClick={async () => await refetch()}
type="button"
>
<RefreshCcw className="size-6" />
</button>
</div>
<div className="mt-3 md:mt-0">
<NewPrezzoModal />
<EditPrezzoModal
initial={editData}
open={openEdit}
setOpen={handleOpen}
/>
</div>
</div>
<PrezzarioTable
data={data}
setEditData={handleEdit}
setOpenEdit={handleOpen}
/>
</div>
<PrezzarioTable
data={data}
setEditData={handleEdit}
setOpenEdit={handleOpen}
/>
</div>
</div>
</>
);
};
@ -109,7 +116,7 @@ const NewPrezzoModal = () => {
<DialogTrigger asChild>
<Button variant="outline">Aggiungi Servizio</Button>
</DialogTrigger>
<DialogContent className="sm:max-w-[425px]">
<DialogContent className="sm:max-w-106.25">
<DialogHeader>
<DialogTitle>Aggiungi Servizio</DialogTitle>
<DialogDescription className="sr-only">Edit</DialogDescription>

View file

@ -1,5 +1,6 @@
import { ChevronsUpDown, RefreshCcw } from "lucide-react";
import type { GetServerSideProps } from "next";
import Head from "next/head";
import { useState } from "react";
import toast from "react-hot-toast";
import { AreaRiservataLayout } from "~/components/Layout";
@ -77,6 +78,9 @@ const AdminStorage: NextPageWithLayout = () => {
//magari query amche file ownership per poter filtrare in tab se da admin o da utente o una lista di utenti a cui è visibile il file
return (
<StorageTableProvider>
<Head>
<title>Allegati - Infoalloggi.it</title>
</Head>
<div className="mx-1 flex-1 overflow-auto">
<div className="mx-auto py-8">
<StorageTableHeader

View file

@ -1,5 +1,6 @@
import { Plus, RefreshCcw } from "lucide-react";
import type { GetServerSideProps } from "next";
import Head from "next/head";
import { useState } from "react";
import toast from "react-hot-toast";
import { AreaRiservataLayout } from "~/components/Layout";
@ -37,51 +38,56 @@ const AdminTestiStringhe: NextPageWithLayout = () => {
if (!data) return <Status500 />;
return (
<div className="mx-1 flex-1 overflow-auto">
<div className="mx-auto pt-4">
<div className="mx-auto items-start justify-between px-2 md:flex">
<div className="flex items-center gap-3">
<h3 className="font-bold text-accent-foreground text-xl sm:text-2xl">
Testi e Stringhe
</h3>
<button
className="cursor-pointer"
onClick={async () => await refetch()}
type="button"
>
<RefreshCcw className="size-6" />
</button>
<>
<Head>
<title>Testi e Stringhe - Infoalloggi.it</title>
</Head>
<div className="mx-1 flex-1 overflow-auto">
<div className="mx-auto pt-4">
<div className="mx-auto items-start justify-between px-2 md:flex">
<div className="flex items-center gap-3">
<h3 className="font-bold text-accent-foreground text-xl sm:text-2xl">
Testi e Stringhe
</h3>
<button
className="cursor-pointer"
onClick={async () => await refetch()}
type="button"
>
<RefreshCcw className="size-6" />
</button>
</div>
<div className="mt-3 md:mt-0">
<EditModal
initial={editData}
open={openEdit}
setOpen={handleOpen}
/>
</div>
<div className="mt-3 md:mt-0">
<Button
className="font-semibold"
onClick={() => {
handleEdit(null);
handleOpen(true);
}}
variant="outline"
>
<Plus className="size-6" />
Nuovo
</Button>
</div>
</div>
<div className="mt-3 md:mt-0">
<EditModal
initial={editData}
open={openEdit}
setOpen={handleOpen}
/>
</div>
<div className="mt-3 md:mt-0">
<Button
className="font-semibold"
onClick={() => {
handleEdit(null);
handleOpen(true);
}}
variant="outline"
>
<Plus className="size-6" />
Nuovo
</Button>
</div>
<StringheTable
data={data}
setEditData={handleEdit}
setOpenEdit={handleOpen}
/>
</div>
<StringheTable
data={data}
setEditData={handleEdit}
setOpenEdit={handleOpen}
/>
</div>
</div>
</>
);
};

View file

@ -1,5 +1,6 @@
import { RefreshCcw } from "lucide-react";
import type { GetServerSideProps } from "next";
import Head from "next/head";
import { useState } from "react";
import { AreaRiservataLayout } from "~/components/Layout";
import { LoadingPage } from "~/components/loading";
@ -32,27 +33,32 @@ const Admin_Utenti: NextPageWithLayout = () => {
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">
<h3 className="font-bold text-2xl">Utenti</h3>
<button
className="cursor-pointer"
onClick={async () => await refetch()}
type="button"
>
<RefreshCcw className="size-6" />
</button>
<>
<Head>
<title>Utenti - Infoalloggi.it</title>
</Head>
<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">
<h3 className="font-bold text-2xl">Utenti</h3>
<button
className="cursor-pointer"
onClick={async () => await refetch()}
type="button"
>
<RefreshCcw className="size-6" />
</button>
</div>
<div className="mt-3 md:mt-0">
<NewUserModal />
</div>
</div>
<div className="mt-3 md:mt-0">
<NewUserModal />
</div>
</div>
<UsersTable data={data} />
<UsersTable data={data} />
</div>
</div>
</div>
</>
);
};

View file

@ -2,18 +2,15 @@ import Head from "next/head";
import { AllegatiComp } from "~/components/area-riservata/allegati";
import { AreaRiservataLayout } from "~/components/Layout";
import type { NextPageWithLayout } from "~/pages/_app";
import { useTranslation } from "~/providers/I18nProvider";
import { useEnforcedSession } from "~/providers/SessionProvider";
const Allegati: NextPageWithLayout = () => {
const { t } = useTranslation();
const session = useEnforcedSession();
return (
<>
<Head>
<title>{t.heads.area_riservata_titolo}</title>
<meta content={t.heads.area_riservata_description} name="description" />
<title>Allegati - Infoalloggi.it</title>
</Head>
<div className="grow p-4">

View file

@ -7,7 +7,6 @@ import Chat from "~/components/chat/chat";
import { LoadingPage } from "~/components/loading";
import { SiteHeader } from "~/components/navbar/site-header";
import type { NextPageWithLayout } from "~/pages/_app";
import { useTranslation } from "~/providers/I18nProvider";
import type { ChatsChatid } from "~/schemas/public/Chats";
import type { Session } from "~/server/api/trpc";
import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper";
@ -21,13 +20,10 @@ const UserChat: NextPageWithLayout<UserChatProps> = ({
chatId,
session,
}: UserChatProps) => {
const { t } = useTranslation();
return (
<>
<Head>
<title>{t.heads.area_riservata_titolo}</title>
<meta content={t.heads.area_riservata_description} name="description" />
<title>Chat - Infoalloggi.it</title>
</Head>
<div className="h-full flex-1 grow">
<div className="flex h-full w-full flex-row">

View file

@ -2,18 +2,15 @@ import Head from "next/head";
import { EmailAccordion } from "~/components/area-riservata/comunicazioni";
import { AreaRiservataLayout } from "~/components/Layout";
import type { NextPageWithLayout } from "~/pages/_app";
import { useTranslation } from "~/providers/I18nProvider";
import { useEnforcedSession } from "~/providers/SessionProvider";
const Comunicazioni: NextPageWithLayout = () => {
const { t } = useTranslation();
const session = useEnforcedSession();
return (
<>
<Head>
<title>{t.heads.area_riservata_titolo}</title>
<meta content={t.heads.area_riservata_description} name="description" />
<title>Comunicazioni - Infoalloggi.it</title>
</Head>
<div className="mx-auto max-w-8xl grow p-4">

View file

@ -5,20 +5,17 @@ import { LoadingPage } from "~/components/loading";
import { Status500 } from "~/components/status-page";
import { OrdiniTable } from "~/components/tables/orders-table";
import type { NextPageWithLayout } from "~/pages/_app";
import { useTranslation } from "~/providers/I18nProvider";
import { useEnforcedSession } from "~/providers/SessionProvider";
import type { UsersId } from "~/schemas/public/Users";
import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper";
import { api } from "~/utils/api";
const Ordini: NextPageWithLayout = () => {
const { t } = useTranslation();
const session = useEnforcedSession();
return (
<>
<Head>
<title>{t.heads.area_riservata_titolo}</title>
<meta content={t.heads.area_riservata_description} name="description" />
<title>Ordini - Infoalloggi.it</title>
</Head>
<SessionWrapper userId={session.user.id} />
</>

View file

@ -17,12 +17,10 @@ import { ProfileFormAccount } from "~/forms/FormProfilo_Account";
import { ProfileFormAnagrafica } from "~/forms/FormProfilo_Anagrafica";
import type { NextPageWithLayout } from "~/pages/_app";
import { CatastoProvider } from "~/providers/CatastoProvider";
import { useTranslation } from "~/providers/I18nProvider";
import { useEnforcedSession } from "~/providers/SessionProvider";
import { api } from "~/utils/api";
const Dashboard: NextPageWithLayout = () => {
const { t } = useTranslation();
const { user } = useEnforcedSession();
const { data: userData, isLoading } = api.users.getClientProfilo.useQuery({
@ -35,8 +33,7 @@ const Dashboard: NextPageWithLayout = () => {
return (
<>
<Head>
<title>{t.heads.area_riservata_titolo}</title>
<meta content={t.heads.area_riservata_description} name="description" />
<title>Profilo - Infoalloggi.it</title>
</Head>
<div className="mx-auto w-full max-w-5xl grow p-4">