import Link from "next/link"; import { eq, or, sql, and } from "drizzle-orm"; import { requireUser } from "@/lib/auth/session"; import { db } from "@/db/client"; import { listings, inquiries, messages, viewingRequests, favorites } from "@/db/schema"; import { Stat, Notice } from "@/components/ui"; import { fmtInt } from "@/lib/format"; export const dynamic = "force-dynamic"; export default async function Dashboard() { const u = await requireUser(); const d = db(); const [[l], [m], [v], [f]] = await Promise.all([ d.select({ total: sql`count(*)::int`, published: sql`sum(case when status='PUBLISHED' then 1 else 0 end)::int`, views: sql`coalesce(sum(views_count),0)::int`, drafts: sql`sum(case when status='DRAFT' then 1 else 0 end)::int` }).from(listings).where(eq(listings.ownerUserId, u.id)), d.select({ unread: sql`count(*)::int` }).from(messages).innerJoin(inquiries, eq(inquiries.id, messages.inquiryId)).where(and(or(eq(inquiries.senderUserId, u.id), eq(inquiries.recipientUserId, u.id)), sql`${messages.senderId} <> ${u.id}`, sql`${messages.readAt} is null`)), d.select({ pending: sql`count(*)::int` }).from(viewingRequests).where(and(eq(viewingRequests.ownerId, u.id), eq(viewingRequests.status, "REQUESTED"))), d.select({ n: sql`count(*)::int` }).from(favorites).where(eq(favorites.userId, u.id)), ]); return (

Tableau de bord

Une seule identité pour chercher, publier et échanger. Vous êtes à la fois visiteur, acheteur ou locataire potentiel et, si vous publiez, propriétaire : aucun profil à choisir.

1 ? "s" : ""} · ${l.drafts} brouillon${l.drafts > 1 ? "s" : ""}`} />

Publier

Un logement à louer

Appartement, condo, maison, chambre… Loyer, inclusions, disponibilité, photos.

Publier

Une propriété à vendre

Maison, condo, plex, chalet, terrain, local commercial. Estimation Toveli affichée à titre indicatif.

Vues totales de vos annonces : {fmtInt(l.views)} (comptage de pages, sans suivi des visiteurs). Les demandes et visites passent par la messagerie Toveli : votre courriel et votre téléphone ne sont jamais affichés publiquement.
); }