From 71d850c98575cad39836062fa4cde4972b9a6ed5 Mon Sep 17 00:00:00 2001 From: Julien Froidefond Date: Fri, 5 Dec 2025 11:05:14 +0100 Subject: [PATCH] chore: clean up code formatting and remove unnecessary whitespace across multiple files for improved readability --- .dockerignore | 1 + docker-compose.yml | 3 +- src/actions/moving-motivators.ts | 31 +---- src/actions/profile.ts | 13 +-- src/actions/session.ts | 8 +- src/actions/share.ts | 12 +- src/actions/swot.ts | 33 +++--- src/app/(auth)/login/page.tsx | 1 - src/app/(auth)/register/page.tsx | 1 - src/app/api/auth/[...nextauth]/route.ts | 1 - src/app/api/auth/register/route.ts | 1 - .../api/motivators/[id]/subscribe/route.ts | 11 +- src/app/api/sessions/[id]/subscribe/route.ts | 6 +- src/app/api/sessions/route.ts | 6 +- src/app/motivators/[id]/EditableTitle.tsx | 1 - src/app/motivators/[id]/page.tsx | 13 +-- src/app/motivators/new/page.tsx | 11 +- src/app/page.tsx | 101 ++++++++++------- src/app/profile/PasswordForm.tsx | 19 +--- src/app/profile/ProfileForm.tsx | 6 +- src/app/profile/page.tsx | 13 +-- src/app/sessions/WorkshopTabs.tsx | 106 ++++++++++-------- src/app/sessions/[id]/page.tsx | 7 +- src/app/sessions/new/page.tsx | 11 +- src/app/sessions/page.tsx | 12 +- src/app/users/page.tsx | 26 ++--- .../collaboration/LiveIndicator.tsx | 10 +- .../collaboration/SessionLiveWrapper.tsx | 14 +-- src/components/collaboration/ShareModal.tsx | 18 +-- src/components/collaboration/index.ts | 1 - src/components/layout/Header.tsx | 11 +- .../moving-motivators/InfluenceZone.tsx | 1 - .../moving-motivators/MotivatorBoard.tsx | 23 ++-- .../moving-motivators/MotivatorCard.tsx | 19 +--- .../MotivatorLiveWrapper.tsx | 13 +-- .../moving-motivators/MotivatorShareModal.tsx | 17 +-- .../moving-motivators/MotivatorSummary.tsx | 9 +- src/components/moving-motivators/index.ts | 1 - src/components/session/EditableTitle.tsx | 1 - src/components/session/index.ts | 1 - src/components/swot/ActionPanel.tsx | 24 +++- src/components/swot/QuadrantHelp.tsx | 44 +++----- src/components/swot/SwotBoard.tsx | 12 +- src/components/swot/SwotCard.tsx | 26 ++++- src/components/swot/SwotQuadrant.tsx | 15 ++- src/components/swot/index.ts | 1 - src/components/ui/Avatar.tsx | 2 - src/components/ui/Badge.tsx | 1 - src/components/ui/Button.tsx | 21 ++-- src/components/ui/Card.tsx | 12 +- src/components/ui/CollaboratorDisplay.tsx | 2 - src/components/ui/Input.tsx | 10 +- src/components/ui/Modal.tsx | 7 +- src/components/ui/Textarea.tsx | 10 +- src/components/ui/index.ts | 1 - src/hooks/useMotivatorLive.ts | 1 - src/hooks/useSessionLive.ts | 3 +- src/lib/auth.config.ts | 1 - src/lib/auth.ts | 1 - src/lib/gravatar.ts | 6 +- src/lib/types.ts | 18 ++- src/middleware.ts | 1 - src/services/auth.ts | 15 +-- src/services/moving-motivators.ts | 12 +- src/services/sessions.ts | 13 +-- 65 files changed, 347 insertions(+), 505 deletions(-) diff --git a/.dockerignore b/.dockerignore index 82eeb26..331f6a3 100644 --- a/.dockerignore +++ b/.dockerignore @@ -44,3 +44,4 @@ README.md devbook.md TODO.md + diff --git a/docker-compose.yml b/docker-compose.yml index 37feebf..61dc6a3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,7 +4,7 @@ services: context: . dockerfile: Dockerfile ports: - - "3011:3000" + - '3011:3000' environment: - NODE_ENV=production - DATABASE_URL=file:/app/data/dev.db @@ -14,4 +14,3 @@ services: volumes: - ./data:/app/data restart: unless-stopped - diff --git a/src/actions/moving-motivators.ts b/src/actions/moving-motivators.ts index 139e8c2..e22df7d 100644 --- a/src/actions/moving-motivators.ts +++ b/src/actions/moving-motivators.ts @@ -15,10 +15,7 @@ export async function createMotivatorSession(data: { title: string; participant: } try { - const motivatorSession = await motivatorsService.createMotivatorSession( - session.user.id, - data - ); + const motivatorSession = await motivatorsService.createMotivatorSession(session.user.id, data); revalidatePath('/motivators'); return { success: true, data: motivatorSession }; } catch (error) { @@ -89,10 +86,7 @@ export async function updateMotivatorCard( } // Check edit permission - const canEdit = await motivatorsService.canEditMotivatorSession( - sessionId, - authSession.user.id - ); + const canEdit = await motivatorsService.canEditMotivatorSession(sessionId, authSession.user.id); if (!canEdit) { return { success: false, error: 'Permission refusée' }; } @@ -132,10 +126,7 @@ export async function reorderMotivatorCards(sessionId: string, cardIds: string[] } // Check edit permission - const canEdit = await motivatorsService.canEditMotivatorSession( - sessionId, - authSession.user.id - ); + const canEdit = await motivatorsService.canEditMotivatorSession(sessionId, authSession.user.id); if (!canEdit) { return { success: false, error: 'Permission refusée' }; } @@ -159,11 +150,7 @@ export async function reorderMotivatorCards(sessionId: string, cardIds: string[] } } -export async function updateCardInfluence( - cardId: string, - sessionId: string, - influence: number -) { +export async function updateCardInfluence(cardId: string, sessionId: string, influence: number) { return updateMotivatorCard(cardId, sessionId, { influence }); } @@ -192,8 +179,7 @@ export async function shareMotivatorSession( return { success: true, data: share }; } catch (error) { console.error('Error sharing motivator session:', error); - const message = - error instanceof Error ? error.message : 'Erreur lors du partage'; + const message = error instanceof Error ? error.message : 'Erreur lors du partage'; return { success: false, error: message }; } } @@ -205,11 +191,7 @@ export async function removeMotivatorShare(sessionId: string, shareUserId: strin } try { - await motivatorsService.removeMotivatorShare( - sessionId, - authSession.user.id, - shareUserId - ); + await motivatorsService.removeMotivatorShare(sessionId, authSession.user.id, shareUserId); revalidatePath(`/motivators/${sessionId}`); return { success: true }; } catch (error) { @@ -217,4 +199,3 @@ export async function removeMotivatorShare(sessionId: string, shareUserId: strin return { success: false, error: 'Erreur lors de la suppression du partage' }; } } - diff --git a/src/actions/profile.ts b/src/actions/profile.ts index 2d11b1c..88659dc 100644 --- a/src/actions/profile.ts +++ b/src/actions/profile.ts @@ -35,10 +35,7 @@ export async function updateProfileAction(data: { name?: string; email?: string return result; } -export async function updatePasswordAction(data: { - currentPassword: string; - newPassword: string; -}) { +export async function updatePasswordAction(data: { currentPassword: string; newPassword: string }) { const session = await auth(); if (!session?.user?.id) { return { success: false, error: 'Non authentifié' }; @@ -48,12 +45,6 @@ export async function updatePasswordAction(data: { return { success: false, error: 'Le nouveau mot de passe doit faire au moins 6 caractères' }; } - const result = await updateUserPassword( - session.user.id, - data.currentPassword, - data.newPassword - ); + const result = await updateUserPassword(session.user.id, data.currentPassword, data.newPassword); return result; } - - diff --git a/src/actions/session.ts b/src/actions/session.ts index 73ec155..2d36d63 100644 --- a/src/actions/session.ts +++ b/src/actions/session.ts @@ -99,7 +99,12 @@ export async function updateSwotSession( } // Emit event for real-time sync - await sessionsService.createSessionEvent(sessionId, session.user.id, 'SESSION_UPDATED', updateData); + await sessionsService.createSessionEvent( + sessionId, + session.user.id, + 'SESSION_UPDATED', + updateData + ); revalidatePath(`/sessions/${sessionId}`); revalidatePath('/sessions'); @@ -130,4 +135,3 @@ export async function deleteSwotSession(sessionId: string) { return { success: false, error: 'Erreur lors de la suppression' }; } } - diff --git a/src/actions/share.ts b/src/actions/share.ts index 74ba578..ba2cd88 100644 --- a/src/actions/share.ts +++ b/src/actions/share.ts @@ -2,11 +2,7 @@ import { revalidatePath } from 'next/cache'; import { auth } from '@/lib/auth'; -import { - shareSession, - removeShare, - getSessionShares, -} from '@/services/sessions'; +import { shareSession, removeShare, getSessionShares } from '@/services/sessions'; import type { ShareRole } from '@prisma/client'; export async function shareSessionAction( @@ -26,10 +22,10 @@ export async function shareSessionAction( } catch (error) { const message = error instanceof Error ? error.message : 'Erreur inconnue'; if (message === 'User not found') { - return { success: false, error: "Aucun utilisateur trouvé avec cet email" }; + return { success: false, error: 'Aucun utilisateur trouvé avec cet email' }; } if (message === 'Cannot share session with yourself') { - return { success: false, error: "Vous ne pouvez pas partager avec vous-même" }; + return { success: false, error: 'Vous ne pouvez pas partager avec vous-même' }; } return { success: false, error: message }; } @@ -65,5 +61,3 @@ export async function getSharesAction(sessionId: string) { return { success: false, error: message, data: [] }; } } - - diff --git a/src/actions/swot.ts b/src/actions/swot.ts index 5bed846..70691ce 100644 --- a/src/actions/swot.ts +++ b/src/actions/swot.ts @@ -20,14 +20,14 @@ export async function createSwotItem( try { const item = await sessionsService.createSwotItem(sessionId, data); - + // Emit event for real-time sync await sessionsService.createSessionEvent(sessionId, session.user.id, 'ITEM_CREATED', { itemId: item.id, content: item.content, category: item.category, }); - + revalidatePath(`/sessions/${sessionId}`); return { success: true, data: item }; } catch (error) { @@ -48,13 +48,13 @@ export async function updateSwotItem( try { const item = await sessionsService.updateSwotItem(itemId, data); - + // Emit event for real-time sync await sessionsService.createSessionEvent(sessionId, session.user.id, 'ITEM_UPDATED', { itemId: item.id, ...data, }); - + revalidatePath(`/sessions/${sessionId}`); return { success: true, data: item }; } catch (error) { @@ -71,12 +71,12 @@ export async function deleteSwotItem(itemId: string, sessionId: string) { try { await sessionsService.deleteSwotItem(itemId); - + // Emit event for real-time sync await sessionsService.createSessionEvent(sessionId, session.user.id, 'ITEM_DELETED', { itemId, }); - + revalidatePath(`/sessions/${sessionId}`); return { success: true }; } catch (error) { @@ -93,7 +93,7 @@ export async function duplicateSwotItem(itemId: string, sessionId: string) { try { const item = await sessionsService.duplicateSwotItem(itemId); - + // Emit event for real-time sync await sessionsService.createSessionEvent(sessionId, session.user.id, 'ITEM_CREATED', { itemId: item.id, @@ -101,7 +101,7 @@ export async function duplicateSwotItem(itemId: string, sessionId: string) { category: item.category, duplicatedFrom: itemId, }); - + revalidatePath(`/sessions/${sessionId}`); return { success: true, data: item }; } catch (error) { @@ -123,14 +123,14 @@ export async function moveSwotItem( try { const item = await sessionsService.moveSwotItem(itemId, newCategory, newOrder); - + // Emit event for real-time sync await sessionsService.createSessionEvent(sessionId, session.user.id, 'ITEM_MOVED', { itemId: item.id, newCategory, newOrder, }); - + revalidatePath(`/sessions/${sessionId}`); return { success: true, data: item }; } catch (error) { @@ -159,14 +159,14 @@ export async function createAction( try { const action = await sessionsService.createAction(sessionId, data); - + // Emit event for real-time sync await sessionsService.createSessionEvent(sessionId, session.user.id, 'ACTION_CREATED', { actionId: action.id, title: action.title, linkedItemIds: data.linkedItemIds, }); - + revalidatePath(`/sessions/${sessionId}`); return { success: true, data: action }; } catch (error) { @@ -192,13 +192,13 @@ export async function updateAction( try { const action = await sessionsService.updateAction(actionId, data); - + // Emit event for real-time sync await sessionsService.createSessionEvent(sessionId, session.user.id, 'ACTION_UPDATED', { actionId: action.id, ...data, }); - + revalidatePath(`/sessions/${sessionId}`); return { success: true, data: action }; } catch (error) { @@ -215,12 +215,12 @@ export async function deleteAction(actionId: string, sessionId: string) { try { await sessionsService.deleteAction(actionId); - + // Emit event for real-time sync await sessionsService.createSessionEvent(sessionId, session.user.id, 'ACTION_DELETED', { actionId, }); - + revalidatePath(`/sessions/${sessionId}`); return { success: true }; } catch (error) { @@ -228,4 +228,3 @@ export async function deleteAction(actionId: string, sessionId: string) { return { success: false, error: 'Erreur lors de la suppression' }; } } - diff --git a/src/app/(auth)/login/page.tsx b/src/app/(auth)/login/page.tsx index f0b8c0f..25d00dd 100644 --- a/src/app/(auth)/login/page.tsx +++ b/src/app/(auth)/login/page.tsx @@ -109,4 +109,3 @@ export default function LoginPage() { ); } - diff --git a/src/app/(auth)/register/page.tsx b/src/app/(auth)/register/page.tsx index 6803e5a..b8e8115 100644 --- a/src/app/(auth)/register/page.tsx +++ b/src/app/(auth)/register/page.tsx @@ -170,4 +170,3 @@ export default function RegisterPage() { ); } - diff --git a/src/app/api/auth/[...nextauth]/route.ts b/src/app/api/auth/[...nextauth]/route.ts index dc9560d..5ef28c1 100644 --- a/src/app/api/auth/[...nextauth]/route.ts +++ b/src/app/api/auth/[...nextauth]/route.ts @@ -1,4 +1,3 @@ import { handlers } from '@/lib/auth'; export const { GET, POST } = handlers; - diff --git a/src/app/api/auth/register/route.ts b/src/app/api/auth/register/route.ts index 0dc4c6c..34eca4b 100644 --- a/src/app/api/auth/register/route.ts +++ b/src/app/api/auth/register/route.ts @@ -22,4 +22,3 @@ export async function POST(request: Request) { return NextResponse.json({ error: 'Erreur lors de la création du compte' }, { status: 500 }); } } - diff --git a/src/app/api/motivators/[id]/subscribe/route.ts b/src/app/api/motivators/[id]/subscribe/route.ts index 6facd00..31bddab 100644 --- a/src/app/api/motivators/[id]/subscribe/route.ts +++ b/src/app/api/motivators/[id]/subscribe/route.ts @@ -1,18 +1,12 @@ import { auth } from '@/lib/auth'; -import { - canAccessMotivatorSession, - getMotivatorSessionEvents, -} from '@/services/moving-motivators'; +import { canAccessMotivatorSession, getMotivatorSessionEvents } from '@/services/moving-motivators'; export const dynamic = 'force-dynamic'; // Store active connections per session const connections = new Map>(); -export async function GET( - request: Request, - { params }: { params: Promise<{ id: string }> } -) { +export async function GET(request: Request, { params }: { params: Promise<{ id: string }> }) { const { id: sessionId } = await params; const session = await auth(); @@ -115,4 +109,3 @@ export function broadcastToMotivatorSession(sessionId: string, event: object) { } } } - diff --git a/src/app/api/sessions/[id]/subscribe/route.ts b/src/app/api/sessions/[id]/subscribe/route.ts index 29894fd..93f08bd 100644 --- a/src/app/api/sessions/[id]/subscribe/route.ts +++ b/src/app/api/sessions/[id]/subscribe/route.ts @@ -6,10 +6,7 @@ export const dynamic = 'force-dynamic'; // Store active connections per session const connections = new Map>(); -export async function GET( - request: Request, - { params }: { params: Promise<{ id: string }> } -) { +export async function GET(request: Request, { params }: { params: Promise<{ id: string }> }) { const { id: sessionId } = await params; const session = await auth(); @@ -112,4 +109,3 @@ export function broadcastToSession(sessionId: string, event: object) { } } } - diff --git a/src/app/api/sessions/route.ts b/src/app/api/sessions/route.ts index 4cccef7..30d6f03 100644 --- a/src/app/api/sessions/route.ts +++ b/src/app/api/sessions/route.ts @@ -45,10 +45,7 @@ export async function POST(request: Request) { const { title, collaborator } = body; if (!title || !collaborator) { - return NextResponse.json( - { error: 'Titre et collaborateur requis' }, - { status: 400 } - ); + return NextResponse.json({ error: 'Titre et collaborateur requis' }, { status: 400 }); } const newSession = await prisma.session.create({ @@ -68,4 +65,3 @@ export async function POST(request: Request) { ); } } - diff --git a/src/app/motivators/[id]/EditableTitle.tsx b/src/app/motivators/[id]/EditableTitle.tsx index 4ff8d83..94913fe 100644 --- a/src/app/motivators/[id]/EditableTitle.tsx +++ b/src/app/motivators/[id]/EditableTitle.tsx @@ -107,4 +107,3 @@ export function EditableMotivatorTitle({ ); } - diff --git a/src/app/motivators/[id]/page.tsx b/src/app/motivators/[id]/page.tsx index b3f9744..8504fca 100644 --- a/src/app/motivators/[id]/page.tsx +++ b/src/app/motivators/[id]/page.tsx @@ -49,11 +49,7 @@ export default async function MotivatorSessionPage({ params }: MotivatorSessionP isOwner={session.isOwner} />
- +
@@ -80,13 +76,8 @@ export default async function MotivatorSessionPage({ params }: MotivatorSessionP isOwner={session.isOwner} canEdit={session.canEdit} > - + ); } - diff --git a/src/app/motivators/new/page.tsx b/src/app/motivators/new/page.tsx index b2ffee7..61a113d 100644 --- a/src/app/motivators/new/page.tsx +++ b/src/app/motivators/new/page.tsx @@ -2,7 +2,15 @@ import { useState } from 'react'; import { useRouter } from 'next/navigation'; -import { Card, CardHeader, CardTitle, CardDescription, CardContent, Button, Input } from '@/components/ui'; +import { + Card, + CardHeader, + CardTitle, + CardDescription, + CardContent, + Button, + Input, +} from '@/components/ui'; import { createMotivatorSession } from '@/actions/moving-motivators'; export default function NewMotivatorSessionPage() { @@ -99,4 +107,3 @@ export default function NewMotivatorSessionPage() { ); } - diff --git a/src/app/page.tsx b/src/app/page.tsx index 13498f1..7d0fc1f 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -10,8 +10,8 @@ export default function Home() { Vos ateliers, réinventés

- Des outils interactifs et collaboratifs pour accompagner vos équipes. - Analysez, comprenez et faites progresser vos collaborateurs avec des ateliers modernes. + Des outils interactifs et collaboratifs pour accompagner vos équipes. Analysez, + comprenez et faites progresser vos collaborateurs avec des ateliers modernes.

@@ -46,7 +46,7 @@ export default function Home() { description="Explorez les 10 motivations intrinsèques de vos collaborateurs. Comprenez leur impact et alignez aspirations et missions." features={[ '10 cartes de motivation à classer', - 'Évaluation de l\'influence positive/négative', + "Évaluation de l'influence positive/négative", 'Récapitulatif personnalisé des motivations', ]} accentColor="#8b5cf6" @@ -73,8 +73,9 @@ export default function Home() { Pourquoi faire un SWOT ?

- L'analyse SWOT est un outil puissant pour prendre du recul sur une situation professionnelle. - Elle permet de dresser un portrait objectif et structuré, base indispensable pour définir des actions pertinentes. + L'analyse SWOT est un outil puissant pour prendre du recul sur une situation + professionnelle. Elle permet de dresser un portrait objectif et structuré, base + indispensable pour définir des actions pertinentes.

  • @@ -105,15 +106,21 @@ export default function Home() {

    💪 Forces

    -

    Compétences, talents, réussites, qualités distinctives

    +

    + Compétences, talents, réussites, qualités distinctives +

    ⚠️ Faiblesses

    -

    Lacunes, difficultés récurrentes, axes de progression

    +

    + Lacunes, difficultés récurrentes, axes de progression +

    🚀 Opportunités

    -

    Projets, formations, évolutions, nouveaux défis

    +

    + Projets, formations, évolutions, nouveaux défis +

    🛡️ Menaces

    @@ -129,10 +136,26 @@ export default function Home() { Comment ça marche ?
    - - - - + + + +
    @@ -156,8 +179,9 @@ export default function Home() { Pourquoi explorer ses motivations ?

    - Créé par Jurgen Appelo (Management 3.0), cet exercice révèle les motivations intrinsèques qui nous animent. - Comprendre ce qui nous motive permet de mieux s'épanouir et d'aligner nos missions avec nos aspirations profondes. + Créé par Jurgen Appelo (Management 3.0), cet exercice révèle les motivations + intrinsèques qui nous animent. Comprendre ce qui nous motive permet de mieux + s'épanouir et d'aligner nos missions avec nos aspirations profondes.

    • @@ -206,20 +230,20 @@ export default function Home() { Comment ça marche ?
      - - -
@@ -279,9 +303,7 @@ function WorkshopCard({ newHref: string; }) { return ( -
+
{/* Accent gradient */}
- + {feature} @@ -380,22 +407,16 @@ function StepCard({ ); } -function MotivatorPill({ - icon, - name, - color, -}: { - icon: string; - name: string; - color: string; -}) { +function MotivatorPill({ icon, name, color }: { icon: string; name: string; color: string }) { return (
{icon} - {name} + + {name} +
); } diff --git a/src/app/profile/PasswordForm.tsx b/src/app/profile/PasswordForm.tsx index 205d3d2..1f2fa43 100644 --- a/src/app/profile/PasswordForm.tsx +++ b/src/app/profile/PasswordForm.tsx @@ -12,9 +12,7 @@ export function PasswordForm() { const [message, setMessage] = useState<{ type: 'success' | 'error'; text: string } | null>(null); const canSubmit = - currentPassword.length > 0 && - newPassword.length >= 6 && - newPassword === confirmPassword; + currentPassword.length > 0 && newPassword.length >= 6 && newPassword === confirmPassword; async function handleSubmit(e: React.FormEvent) { e.preventDefault(); @@ -58,10 +56,7 @@ export function PasswordForm() {
-
{message && (

{message.text}

@@ -112,5 +103,3 @@ export function PasswordForm() { ); } - - diff --git a/src/app/profile/ProfileForm.tsx b/src/app/profile/ProfileForm.tsx index 15e54c3..9cb9943 100644 --- a/src/app/profile/ProfileForm.tsx +++ b/src/app/profile/ProfileForm.tsx @@ -67,9 +67,7 @@ export function ProfileForm({ initialData }: ProfileFormProps) { {message && (

{message.text}

@@ -81,5 +79,3 @@ export function ProfileForm({ initialData }: ProfileFormProps) { ); } - - diff --git a/src/app/profile/page.tsx b/src/app/profile/page.tsx index de0d100..8abfd7f 100644 --- a/src/app/profile/page.tsx +++ b/src/app/profile/page.tsx @@ -38,9 +38,7 @@ export default async function ProfilePage() { {/* Profile Info */}
-

- Informations personnelles -

+

Informations personnelles

-

- Changer le mot de passe -

+

Changer le mot de passe

{/* Account Info */}
-

- Informations du compte -

+

Informations du compte

ID du compte @@ -92,4 +86,3 @@ export default async function ProfilePage() { ); } - diff --git a/src/app/sessions/WorkshopTabs.tsx b/src/app/sessions/WorkshopTabs.tsx index fb23fbf..b189b74 100644 --- a/src/app/sessions/WorkshopTabs.tsx +++ b/src/app/sessions/WorkshopTabs.tsx @@ -3,7 +3,15 @@ import { useState, useTransition } from 'react'; import Link from 'next/link'; import { useSearchParams, useRouter } from 'next/navigation'; -import { Card, Badge, Button, Modal, ModalFooter, Input, CollaboratorDisplay } from '@/components/ui'; +import { + Card, + Badge, + Button, + Modal, + ModalFooter, + Input, + CollaboratorDisplay, +} from '@/components/ui'; import { deleteSwotSession, updateSwotSession } from '@/actions/session'; import { deleteMotivatorSession, updateMotivatorSession } from '@/actions/moving-motivators'; @@ -104,10 +112,10 @@ function getGroupKey(session: AnySession): string { // Group sessions by participant (using matched user ID when available) function groupByPerson(sessions: AnySession[]): Map { const grouped = new Map(); - + sessions.forEach((session) => { const key = getGroupKey(session); - + const existing = grouped.get(key); if (existing) { existing.push(session); @@ -115,24 +123,23 @@ function groupByPerson(sessions: AnySession[]): Map { grouped.set(key, [session]); } }); - + // Sort sessions within each group by date grouped.forEach((sessions) => { sessions.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime()); }); - + return grouped; } export function WorkshopTabs({ swotSessions, motivatorSessions }: WorkshopTabsProps) { const searchParams = useSearchParams(); const router = useRouter(); - + // Get tab from URL or default to 'all' const tabParam = searchParams.get('tab'); - const activeTab: WorkshopType = tabParam && VALID_TABS.includes(tabParam as WorkshopType) - ? (tabParam as WorkshopType) - : 'all'; + const activeTab: WorkshopType = + tabParam && VALID_TABS.includes(tabParam as WorkshopType) ? (tabParam as WorkshopType) : 'all'; const setActiveTab = (tab: WorkshopType) => { const params = new URLSearchParams(searchParams.toString()); @@ -205,9 +212,7 @@ export function WorkshopTabs({ swotSessions, motivatorSessions }: WorkshopTabsPr {activeTab === 'byPerson' ? ( // By Person View sortedPersons.length === 0 ? ( -
- Aucun atelier pour le moment -
+
Aucun atelier pour le moment
) : (
{sortedPersons.map(([personKey, sessions]) => { @@ -231,9 +236,7 @@ export function WorkshopTabs({ swotSessions, motivatorSessions }: WorkshopTabsPr
) ) : filteredSessions.length === 0 ? ( -
- Aucun atelier de ce type pour le moment -
+
Aucun atelier de ce type pour le moment
) : (
{/* My Sessions */} @@ -287,9 +290,10 @@ function TabButton({ onClick={onClick} className={` flex items-center gap-2 px-4 py-2 rounded-lg font-medium transition-colors - ${active - ? 'bg-primary text-primary-foreground' - : 'text-muted hover:bg-card-hover hover:text-foreground' + ${ + active + ? 'bg-primary text-primary-foreground' + : 'text-muted hover:bg-card-hover hover:text-foreground' } `} > @@ -306,7 +310,7 @@ function SessionCard({ session }: { session: AnySession }) { const [showDeleteModal, setShowDeleteModal] = useState(false); const [showEditModal, setShowEditModal] = useState(false); const [isPending, startTransition] = useTransition(); - + // Edit form state const [editTitle, setEditTitle] = useState(session.title); const [editParticipant, setEditParticipant] = useState( @@ -328,7 +332,7 @@ function SessionCard({ session }: { session: AnySession }) { const result = isSwot ? await deleteSwotSession(session.id) : await deleteMotivatorSession(session.id); - + if (result.success) { setShowDeleteModal(false); } else { @@ -341,8 +345,11 @@ function SessionCard({ session }: { session: AnySession }) { startTransition(async () => { const result = isSwot ? await updateSwotSession(session.id, { title: editTitle, collaborator: editParticipant }) - : await updateMotivatorSession(session.id, { title: editTitle, participant: editParticipant }); - + : await updateMotivatorSession(session.id, { + title: editTitle, + participant: editParticipant, + }); + if (result.success) { setShowEditModal(false); } else { @@ -372,14 +379,13 @@ function SessionCard({ session }: { session: AnySession }) { {/* Header: Icon + Title + Role badge */}
{icon} -

- {session.title} -

+

{session.title}

{!session.isOwner && ( @@ -390,12 +396,11 @@ function SessionCard({ session }: { session: AnySession }) { {/* Participant + Owner info */}
- + {!session.isOwner && ( - · par {session.user.name || session.user.email} + + · par {session.user.name || session.user.email} + )}
@@ -441,9 +446,7 @@ function SessionCard({ session }: { session: AnySession }) {
))} {session.shares.length > 3 && ( - - +{session.shares.length - 3} - + +{session.shares.length - 3} )}
@@ -464,7 +467,12 @@ function SessionCard({ session }: { session: AnySession }) { title="Modifier" > - +
@@ -511,7 +524,10 @@ function SessionCard({ session }: { session: AnySession }) { />
-