mirror of
https://github.com/R0m1k3/Socialflow.git
synced 2026-10-23 06:58:12 +02:00
- Nouveaux tokens (indigo/corail, statuts, plateformes) et mode sombre - Logo et favicon Social Flow redessinés - AppShell partagé : sidebar groupée (desktop) + barre de navigation basse (mobile) - Suppression des pages mobiles dupliquées et des composants morts - Tableau de bord, connexion, 404, calendrier, médiathèque, IA, statistiques Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ADkrVcVFTT14hbB148HYS
108 lines
3.4 KiB
TypeScript
108 lines
3.4 KiB
TypeScript
import {
|
|
BarChart3,
|
|
Bot,
|
|
Calendar,
|
|
CalendarClock,
|
|
Clock,
|
|
Database,
|
|
Film,
|
|
Home,
|
|
Images,
|
|
Link2,
|
|
Music,
|
|
PenSquare,
|
|
Settings,
|
|
UserCog,
|
|
Wand2,
|
|
type LucideIcon,
|
|
} from "lucide-react";
|
|
|
|
export interface NavItem {
|
|
href: string;
|
|
label: string;
|
|
icon: LucideIcon;
|
|
/** Courte description affichée dans les menus mobiles. */
|
|
description?: string;
|
|
adminOnly?: boolean;
|
|
testId: string;
|
|
}
|
|
|
|
export interface NavGroup {
|
|
label: string | null;
|
|
items: NavItem[];
|
|
adminOnly?: boolean;
|
|
}
|
|
|
|
/** Source unique de la navigation (sidebar desktop, barre mobile, menus). */
|
|
export const NAV_GROUPS: NavGroup[] = [
|
|
{
|
|
label: null,
|
|
items: [{ href: "/", label: "Tableau de bord", icon: Home, testId: "link-tableau-de-bord" }],
|
|
},
|
|
{
|
|
label: "Créer",
|
|
items: [
|
|
{ href: "/new", label: "Publication", icon: PenSquare, description: "Photo ou vidéo avec texte", testId: "link-nouvelle-publication" },
|
|
{ href: "/reel", label: "Reel", icon: Film, description: "Montage guidé avec musique et voix", testId: "link-nouveau-reel" },
|
|
{ href: "/reel/schedule", label: "Programmer un Reel", icon: CalendarClock, description: "Vidéo déjà montée", testId: "link-programmer-un-reel" },
|
|
{ href: "/image-editor", label: "Éditeur d'images", icon: Wand2, description: "Bandeaux, prix et logo", testId: "link-éditeur-d'images" },
|
|
],
|
|
},
|
|
{
|
|
label: "Planifier",
|
|
items: [
|
|
{ href: "/calendar", label: "Calendrier", icon: Calendar, testId: "link-calendrier" },
|
|
{ href: "/history", label: "Historique", icon: Clock, testId: "link-historique" },
|
|
],
|
|
},
|
|
{
|
|
label: "Bibliothèque",
|
|
items: [
|
|
{ href: "/media", label: "Médiathèque", icon: Images, testId: "link-médiathèque" },
|
|
{ href: "/audio-admin", label: "Musiques", icon: Music, adminOnly: true, testId: "link-audio-admin" },
|
|
],
|
|
},
|
|
{
|
|
label: "Analyser",
|
|
items: [
|
|
{ href: "/analytics", label: "Statistiques", icon: BarChart3, testId: "link-analytics" },
|
|
{ href: "/ai", label: "Assistant IA", icon: Bot, adminOnly: true, testId: "link-assistant-ia" },
|
|
],
|
|
},
|
|
{
|
|
label: "Administration",
|
|
adminOnly: true,
|
|
items: [
|
|
{ href: "/pages", label: "Comptes connectés", icon: Link2, testId: "link-pages-gérées" },
|
|
{ href: "/users", label: "Utilisateurs", icon: UserCog, testId: "link-users" },
|
|
{ href: "/settings", label: "Paramètres", icon: Settings, testId: "link-settings" },
|
|
{ href: "/sql", label: "Base de données", icon: Database, testId: "link-sql" },
|
|
],
|
|
},
|
|
];
|
|
|
|
export const CREATE_ITEMS = NAV_GROUPS.find((g) => g.label === "Créer")!.items;
|
|
|
|
export function visibleGroups(isAdmin: boolean): NavGroup[] {
|
|
return NAV_GROUPS.filter((g) => isAdmin || !g.adminOnly)
|
|
.map((g) => ({ ...g, items: g.items.filter((i) => isAdmin || !i.adminOnly) }))
|
|
.filter((g) => g.items.length > 0);
|
|
}
|
|
|
|
export function isActivePath(location: string, href: string): boolean {
|
|
if (href === "/") return location === "/";
|
|
// /reel ne doit pas rester actif sur /reel/schedule
|
|
if (href === "/reel") return location === "/reel";
|
|
return location === href || location.startsWith(href + "/");
|
|
}
|
|
|
|
/** Titre de la page courante (header mobile). */
|
|
export function titleForPath(location: string): string {
|
|
for (const g of NAV_GROUPS) {
|
|
for (const i of g.items) {
|
|
if (isActivePath(location, i.href)) return i.label;
|
|
}
|
|
}
|
|
return "Social Flow";
|
|
}
|