import Link from "next/link"; import { redirect } from "next/navigation"; import type { CSSProperties } from "react"; import { desc, eq, sql } from "drizzle-orm"; import { getSession } from "@/lib/session"; import { db } from "@/db"; import { meetingRegistrations, meetings } from "@/db/schema"; import { ImageField } from "@/components/ImageField"; import { MeetingEmailComposer } from "@/components/MeetingEmailComposer"; import { can } from "@/lib/rbac"; import { getSiteSettings } from "@/lib/site-settings"; import { createMeeting, deleteMeeting, updateMeeting } from "../actions"; export const dynamic = "force-dynamic"; function dateTimeValue(date: Date) { const local = new Date(date); local.setMinutes(local.getMinutes() - local.getTimezoneOffset()); return local.toISOString().slice(0, 16); } export default async function RencontresAdminPage() { const session = await getSession(); if (!can(session?.user.role, "manageMeetings")) redirect("/backend"); const [rows, settings] = await Promise.all([ db .select({ id: meetings.id, title: meetings.title, startsAt: meetings.startsAt, location: meetings.location, description: meetings.description, capacity: meetings.capacity, participantsPerAccount: meetings.participantsPerAccount, imageUrl: meetings.imageUrl, registered: sql`count(${meetingRegistrations.id})`, }) .from(meetings) .leftJoin(meetingRegistrations, eq(meetingRegistrations.meetingId, meetings.id)) .groupBy(meetings.id) .orderBy(desc(meetings.startsAt)), getSiteSettings(), ]); const emailBrand = { associationName: settings.association_name, address: settings.association_address, email: settings.association_email, phone: settings.association_phone, siret: settings.association_siret, }; return (

Nouvelle rencontre