'use client'; import { useState, useTransition } from 'react'; import Link from 'next/link'; import { Modal } from '@/components/ui/Modal'; import { Input } from '@/components/ui/Input'; import { Button } from '@/components/ui/Button'; import { Badge } from '@/components/ui/Badge'; import { Avatar } from '@/components/ui/Avatar'; import { Select } from '@/components/ui/Select'; import { getTeamMembersForShare, type TeamWithMembers, type Share } from '@/lib/share-utils'; import type { ShareRole } from '@prisma/client'; type ShareTab = 'teamMember' | 'team' | 'email'; interface ShareModalProps { isOpen: boolean; onClose: () => void; title: string; sessionSubtitle?: string; sessionTitle: string; shares: Share[]; isOwner: boolean; userTeams?: TeamWithMembers[]; currentUserId?: string; onShareWithEmail: ( email: string, role: ShareRole ) => Promise<{ success: boolean; error?: string }>; onShareWithTeam?: ( teamId: string, role: ShareRole ) => Promise<{ success: boolean; error?: string }>; onRemoveShare: (userId: string) => Promise; helpText?: React.ReactNode; } const ROLE_OPTIONS = [ { value: 'EDITOR', label: 'Éditeur' }, { value: 'VIEWER', label: 'Lecteur' }, ] as const; export function ShareModal({ isOpen, onClose, title, sessionSubtitle, sessionTitle, shares, isOwner, userTeams = [], currentUserId = '', onShareWithEmail, onShareWithTeam, onRemoveShare, helpText, }: ShareModalProps) { const teamMembers = getTeamMembersForShare(userTeams, currentUserId); const hasTeamShare = !!onShareWithTeam; const [shareType, setShareType] = useState('teamMember'); const [email, setEmail] = useState(''); const [teamId, setTeamId] = useState(''); const [selectedMemberId, setSelectedMemberId] = useState(''); const [role, setRole] = useState('EDITOR'); const [error, setError] = useState(null); const [isPending, startTransition] = useTransition(); const resetForm = () => { setEmail(''); setTeamId(''); setSelectedMemberId(''); }; async function handleShare(e: React.FormEvent) { e.preventDefault(); setError(null); startTransition(async () => { let result: { success: boolean; error?: string }; if (shareType === 'team' && onShareWithTeam) { result = await onShareWithTeam(teamId, role); } else { const targetEmail = shareType === 'teamMember' ? (teamMembers.find((m) => m.id === selectedMemberId)?.email ?? '') : email; result = await onShareWithEmail(targetEmail, role); } if (result.success) { resetForm(); } else { setError(result.error || 'Erreur lors du partage'); } }); } async function handleRemove(userId: string) { startTransition(async () => { await onRemoveShare(userId); }); } const tabs: { value: ShareTab; label: string; icon: string }[] = [ { value: 'teamMember', label: 'Membre', icon: '👥' }, ...(hasTeamShare ? [{ value: 'team' as ShareTab, label: 'Équipe', icon: '🏢' }] : []), { value: 'email', label: 'Email', icon: '👤' }, ]; return (
{sessionSubtitle &&

{sessionSubtitle}

}

{sessionTitle}

{isOwner && (
{tabs.map((tab) => ( ))}
{shareType === 'email' && (
setEmail(e.target.value)} className="flex-1" required /> setSelectedMemberId(e.target.value)} options={[ { value: '', label: 'Sélectionner un membre', disabled: true }, ...teamMembers.map((m) => ({ value: m.id, label: m.name ? `${m.name} (${m.email})` : m.email, })), ]} wrapperClassName="flex-1 min-w-0" required /> setTeamId(e.target.value)} options={[ { value: '', label: 'Sélectionner une équipe', disabled: true }, ...userTeams.map((team) => ({ value: team.id, label: `${team.name}${team.userRole === 'ADMIN' ? ' (Admin)' : ''}`, })), ]} wrapperClassName="flex-1 min-w-0" required />