synchronisation du contenu avec la DB et amélioration du CMS

- Migration du blog et des interviews des données mockées vers PostgreSQL (Prisma).
- Refonte des pages publiques en Server Components pour de meilleures performances/SEO.
- Intégration d'un éditeur de texte riche (React Quill) avec titres H1-H6 et séparateurs.
- Correction des erreurs de validation Prisma liées aux paramètres asynchrones (Next.js 15+).
- Correction des problèmes d'affichage des modales de suspension via React Portals.
- Installation de @tailwindcss/typography et correction du débordement de texte (break-words).
- Implémentation des actions de modération (suspension/révocation) pour les utilisateurs et boutiques.
This commit is contained in:
2026-04-12 18:59:20 +02:00
parent b73939d381
commit 887030ee47
84 changed files with 5577 additions and 15128 deletions

View File

@@ -1,8 +1,8 @@
// This file is generated automatically by Next.js
// Do not edit this file manually
type AppRoutes = "/" | "/afrolife" | "/afrolife/[id]" | "/annuaire" | "/annuaire/[id]" | "/blog" | "/blog/[id]" | "/dashboard" | "/login" | "/register" | "/subscription"
type AppRouteHandlerRoutes = "/api/analytics" | "/api/auth/login" | "/api/auth/register" | "/api/blog" | "/api/blog/[id]" | "/api/businesses" | "/api/businesses/[id]" | "/api/businesses/[id]/view" | "/api/businesses/me" | "/api/gemini" | "/api/interviews" | "/api/interviews/[id]" | "/api/offers" | "/api/offers/[id]" | "/api/users"
type AppRoutes = "/" | "/afrolife" | "/afrolife/[id]" | "/annuaire" | "/annuaire/[id]" | "/blog" | "/blog/[id]" | "/dashboard" | "/login" | "/register" | "/subscription" | "/suspended"
type AppRouteHandlerRoutes = "/api/admin/reports" | "/api/admin/reports/[id]" | "/api/analytics" | "/api/analytics/businesses/[id]" | "/api/auth/login" | "/api/auth/register" | "/api/blog" | "/api/blog/[id]" | "/api/businesses" | "/api/businesses/[id]" | "/api/businesses/[id]/view" | "/api/businesses/me" | "/api/conversations" | "/api/conversations/[id]" | "/api/conversations/[id]/archive" | "/api/gemini" | "/api/interviews" | "/api/interviews/[id]" | "/api/messages" | "/api/messages/[id]/report" | "/api/messages/unread" | "/api/offers" | "/api/offers/[id]" | "/api/users" | "/api/users/me" | "/api/users/profile"
type PageRoutes = never
type LayoutRoutes = "/"
type RedirectRoutes = never
@@ -16,7 +16,10 @@ interface ParamMap {
"/afrolife/[id]": { "id": string; }
"/annuaire": {}
"/annuaire/[id]": { "id": string; }
"/api/admin/reports": {}
"/api/admin/reports/[id]": { "id": string; }
"/api/analytics": {}
"/api/analytics/businesses/[id]": { "id": string; }
"/api/auth/login": {}
"/api/auth/register": {}
"/api/blog": {}
@@ -25,18 +28,27 @@ interface ParamMap {
"/api/businesses/[id]": { "id": string; }
"/api/businesses/[id]/view": { "id": string; }
"/api/businesses/me": {}
"/api/conversations": {}
"/api/conversations/[id]": { "id": string; }
"/api/conversations/[id]/archive": { "id": string; }
"/api/gemini": {}
"/api/interviews": {}
"/api/interviews/[id]": { "id": string; }
"/api/messages": {}
"/api/messages/[id]/report": { "id": string; }
"/api/messages/unread": {}
"/api/offers": {}
"/api/offers/[id]": { "id": string; }
"/api/users": {}
"/api/users/me": {}
"/api/users/profile": {}
"/blog": {}
"/blog/[id]": { "id": string; }
"/dashboard": {}
"/login": {}
"/register": {}
"/subscription": {}
"/suspended": {}
}

View File

@@ -146,6 +146,42 @@ type RouteHandlerConfig<Route extends AppRouteHandlerRoutes = AppRouteHandlerRou
type __Unused = __Check
}
// Validate ../../../app/suspended/page.tsx
{
type __IsExpected<Specific extends AppPageConfig<"/suspended">> = Specific
const handler = {} as typeof import("../../../app/suspended/page.js")
type __Check = __IsExpected<typeof handler>
// @ts-ignore
type __Unused = __Check
}
// Validate ../../../app/api/admin/reports/[id]/route.ts
{
type __IsExpected<Specific extends RouteHandlerConfig<"/api/admin/reports/[id]">> = Specific
const handler = {} as typeof import("../../../app/api/admin/reports/[id]/route.js")
type __Check = __IsExpected<typeof handler>
// @ts-ignore
type __Unused = __Check
}
// Validate ../../../app/api/admin/reports/route.ts
{
type __IsExpected<Specific extends RouteHandlerConfig<"/api/admin/reports">> = Specific
const handler = {} as typeof import("../../../app/api/admin/reports/route.js")
type __Check = __IsExpected<typeof handler>
// @ts-ignore
type __Unused = __Check
}
// Validate ../../../app/api/analytics/businesses/[id]/route.ts
{
type __IsExpected<Specific extends RouteHandlerConfig<"/api/analytics/businesses/[id]">> = Specific
const handler = {} as typeof import("../../../app/api/analytics/businesses/[id]/route.js")
type __Check = __IsExpected<typeof handler>
// @ts-ignore
type __Unused = __Check
}
// Validate ../../../app/api/analytics/route.ts
{
type __IsExpected<Specific extends RouteHandlerConfig<"/api/analytics">> = Specific
@@ -227,6 +263,33 @@ type RouteHandlerConfig<Route extends AppRouteHandlerRoutes = AppRouteHandlerRou
type __Unused = __Check
}
// Validate ../../../app/api/conversations/[id]/archive/route.ts
{
type __IsExpected<Specific extends RouteHandlerConfig<"/api/conversations/[id]/archive">> = Specific
const handler = {} as typeof import("../../../app/api/conversations/[id]/archive/route.js")
type __Check = __IsExpected<typeof handler>
// @ts-ignore
type __Unused = __Check
}
// Validate ../../../app/api/conversations/[id]/route.ts
{
type __IsExpected<Specific extends RouteHandlerConfig<"/api/conversations/[id]">> = Specific
const handler = {} as typeof import("../../../app/api/conversations/[id]/route.js")
type __Check = __IsExpected<typeof handler>
// @ts-ignore
type __Unused = __Check
}
// Validate ../../../app/api/conversations/route.ts
{
type __IsExpected<Specific extends RouteHandlerConfig<"/api/conversations">> = Specific
const handler = {} as typeof import("../../../app/api/conversations/route.js")
type __Check = __IsExpected<typeof handler>
// @ts-ignore
type __Unused = __Check
}
// Validate ../../../app/api/gemini/route.ts
{
type __IsExpected<Specific extends RouteHandlerConfig<"/api/gemini">> = Specific
@@ -254,6 +317,33 @@ type RouteHandlerConfig<Route extends AppRouteHandlerRoutes = AppRouteHandlerRou
type __Unused = __Check
}
// Validate ../../../app/api/messages/[id]/report/route.ts
{
type __IsExpected<Specific extends RouteHandlerConfig<"/api/messages/[id]/report">> = Specific
const handler = {} as typeof import("../../../app/api/messages/[id]/report/route.js")
type __Check = __IsExpected<typeof handler>
// @ts-ignore
type __Unused = __Check
}
// Validate ../../../app/api/messages/route.ts
{
type __IsExpected<Specific extends RouteHandlerConfig<"/api/messages">> = Specific
const handler = {} as typeof import("../../../app/api/messages/route.js")
type __Check = __IsExpected<typeof handler>
// @ts-ignore
type __Unused = __Check
}
// Validate ../../../app/api/messages/unread/route.ts
{
type __IsExpected<Specific extends RouteHandlerConfig<"/api/messages/unread">> = Specific
const handler = {} as typeof import("../../../app/api/messages/unread/route.js")
type __Check = __IsExpected<typeof handler>
// @ts-ignore
type __Unused = __Check
}
// Validate ../../../app/api/offers/[id]/route.ts
{
type __IsExpected<Specific extends RouteHandlerConfig<"/api/offers/[id]">> = Specific
@@ -272,6 +362,24 @@ type RouteHandlerConfig<Route extends AppRouteHandlerRoutes = AppRouteHandlerRou
type __Unused = __Check
}
// Validate ../../../app/api/users/me/route.ts
{
type __IsExpected<Specific extends RouteHandlerConfig<"/api/users/me">> = Specific
const handler = {} as typeof import("../../../app/api/users/me/route.js")
type __Check = __IsExpected<typeof handler>
// @ts-ignore
type __Unused = __Check
}
// Validate ../../../app/api/users/profile/route.ts
{
type __IsExpected<Specific extends RouteHandlerConfig<"/api/users/profile">> = Specific
const handler = {} as typeof import("../../../app/api/users/profile/route.js")
type __Check = __IsExpected<typeof handler>
// @ts-ignore
type __Unused = __Check
}
// Validate ../../../app/api/users/route.ts
{
type __IsExpected<Specific extends RouteHandlerConfig<"/api/users">> = Specific