diff --git a/dev.db b/dev.db index e22196a..6ee2b29 100644 Binary files a/dev.db and b/dev.db differ diff --git a/src/actions/session.ts b/src/actions/session.ts new file mode 100644 index 0000000..d0a44d4 --- /dev/null +++ b/src/actions/session.ts @@ -0,0 +1,72 @@ +'use server'; + +import { revalidatePath } from 'next/cache'; +import { auth } from '@/lib/auth'; +import * as sessionsService from '@/services/sessions'; + +export async function updateSessionTitle(sessionId: string, title: string) { + const session = await auth(); + if (!session?.user?.id) { + return { success: false, error: 'Non autorisé' }; + } + + if (!title.trim()) { + return { success: false, error: 'Le titre ne peut pas être vide' }; + } + + try { + const result = await sessionsService.updateSession(sessionId, session.user.id, { + title: title.trim(), + }); + + if (result.count === 0) { + return { success: false, error: 'Session non trouvée ou non autorisé' }; + } + + // Emit event for real-time sync + await sessionsService.createSessionEvent(sessionId, session.user.id, 'SESSION_UPDATED', { + title: title.trim(), + }); + + revalidatePath(`/sessions/${sessionId}`); + revalidatePath('/sessions'); + return { success: true }; + } catch (error) { + console.error('Error updating session title:', error); + return { success: false, error: 'Erreur lors de la mise à jour' }; + } +} + +export async function updateSessionCollaborator(sessionId: string, collaborator: string) { + const session = await auth(); + if (!session?.user?.id) { + return { success: false, error: 'Non autorisé' }; + } + + if (!collaborator.trim()) { + return { success: false, error: 'Le nom du collaborateur ne peut pas être vide' }; + } + + try { + const result = await sessionsService.updateSession(sessionId, session.user.id, { + collaborator: collaborator.trim(), + }); + + if (result.count === 0) { + return { success: false, error: 'Session non trouvée ou non autorisé' }; + } + + // Emit event for real-time sync + await sessionsService.createSessionEvent(sessionId, session.user.id, 'SESSION_UPDATED', { + collaborator: collaborator.trim(), + }); + + revalidatePath(`/sessions/${sessionId}`); + revalidatePath('/sessions'); + return { success: true }; + } catch (error) { + console.error('Error updating session collaborator:', error); + return { success: false, error: 'Erreur lors de la mise à jour' }; + } +} + diff --git a/src/app/sessions/[id]/page.tsx b/src/app/sessions/[id]/page.tsx index 9b231b6..98ac952 100644 --- a/src/app/sessions/[id]/page.tsx +++ b/src/app/sessions/[id]/page.tsx @@ -4,6 +4,7 @@ import { auth } from '@/lib/auth'; import { getSessionById } from '@/services/sessions'; import { SwotBoard } from '@/components/swot/SwotBoard'; import { SessionLiveWrapper } from '@/components/collaboration'; +import { EditableTitle } from '@/components/session'; import { Badge } from '@/components/ui'; interface SessionPageProps { @@ -43,7 +44,11 @@ export default async function SessionPage({ params }: SessionPageProps) {
👤 {session.collaborator}
diff --git a/src/components/session/EditableTitle.tsx b/src/components/session/EditableTitle.tsx new file mode 100644 index 0000000..3b580d8 --- /dev/null +++ b/src/components/session/EditableTitle.tsx @@ -0,0 +1,106 @@ +'use client'; + +import { useState, useTransition, useRef, useEffect } from 'react'; +import { updateSessionTitle } from '@/actions/session'; + +interface EditableTitleProps { + sessionId: string; + initialTitle: string; + isOwner: boolean; +} + +export function EditableTitle({ sessionId, initialTitle, isOwner }: EditableTitleProps) { + const [isEditing, setIsEditing] = useState(false); + const [title, setTitle] = useState(initialTitle); + const [isPending, startTransition] = useTransition(); + const inputRef = useRef