'use client'; import { useState, useCallback } from 'react'; import { useSessionLive, type LiveEvent } from '@/hooks/useSessionLive'; import { LiveIndicator } from './LiveIndicator'; import { ShareModal } from './ShareModal'; import { Button } from '@/components/ui/Button'; import type { ShareRole } from '@prisma/client'; interface ShareUser { id: string; name: string | null; email: string; } interface Share { id: string; role: ShareRole; user: ShareUser; createdAt: Date; } interface SessionLiveWrapperProps { sessionId: string; sessionTitle: string; shares: Share[]; isOwner: boolean; canEdit: boolean; children: React.ReactNode; } export function SessionLiveWrapper({ sessionId, sessionTitle, shares, isOwner, canEdit, children, }: SessionLiveWrapperProps) { const [shareModalOpen, setShareModalOpen] = useState(false); const [lastEventUser, setLastEventUser] = useState(null); const handleEvent = useCallback((event: LiveEvent) => { // Show who made the last change if (event.user?.name || event.user?.email) { setLastEventUser(event.user.name || event.user.email); // Clear after 3 seconds setTimeout(() => setLastEventUser(null), 3000); } }, []); const { isConnected, error } = useSessionLive({ sessionId, onEvent: handleEvent, }); return ( <> {/* Header toolbar */}
{lastEventUser && (
✏️ {lastEventUser} édite...
)} {!canEdit && (
👁️ Mode lecture
)}
{/* Collaborators avatars */} {shares.length > 0 && (
{shares.slice(0, 3).map((share) => (
{share.user.name?.[0]?.toUpperCase() || share.user.email[0].toUpperCase()}
))} {shares.length > 3 && (
+{shares.length - 3}
)}
)}
{/* Content */}
{children}
{/* Share Modal */} setShareModalOpen(false)} sessionId={sessionId} sessionTitle={sessionTitle} shares={shares} isOwner={isOwner} /> ); }