import React, { useState } from 'react'; import { Users, User as UserIcon, X, Plus, Trash2, Lock, Check, } from 'lucide-react'; import { User, Team, UnifiedShare } from '../lib/types'; import { UserAutocomplete } from '../features/UserAutocomplete'; import { UserAvatar } from './UserAvatar'; export interface UnifiedShareModalProps { isOpen: boolean; onClose: () => void; title?: string; resourceName: string; resourceIcon?: string | React.ReactNode; isOwner: boolean; currentUserId?: string; shares: UnifiedShare[]; teams: Team[]; collaborators: User[]; allowRoleSelection?: boolean; // Default true (editor vs viewer) onAddShare: (targetType: 'team' | 'user', targetId: string, permission: 'editor' | 'viewer') => Promise; onRemoveShare: (shareId: string) => Promise; } export const UnifiedShareModal: React.FC = ({ isOpen, onClose, title = 'Freigeben & Berechtigungen', resourceName, resourceIcon, isOwner, currentUserId, shares, teams, collaborators, allowRoleSelection = true, onAddShare, onRemoveShare, }) => { const [shareType, setShareType] = useState<'team' | 'user'>('team'); const [selectedTeamId, setSelectedTeamId] = useState(''); const [selectedUser, setSelectedUser] = useState(null); const [selectedPermission, setSelectedPermission] = useState<'editor' | 'viewer'>('editor'); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); if (!isOpen) return null; const handleAdd = async (e: React.FormEvent) => { e.preventDefault(); setError(null); const targetId = shareType === 'team' ? selectedTeamId : selectedUser?.id; if (!targetId) { setError(shareType === 'team' ? 'Bitte eine Gruppe auswählen' : 'Bitte einen Benutzer auswählen'); return; } setLoading(true); try { await onAddShare(shareType, targetId, selectedPermission); setSelectedTeamId(''); setSelectedUser(null); } catch (err: any) { setError(err?.message || 'Fehler beim Hinzufügen der Freigabe'); } finally { setLoading(false); } }; const handleRemove = async (shareId: string) => { if (!window.confirm('Möchtest du diese Freigabe wirklich aufheben?')) return; setError(null); setLoading(true); try { await onRemoveShare(shareId); } catch (err: any) { setError(err?.message || 'Fehler beim Entfernen der Freigabe'); } finally { setLoading(false); } }; const excludedUserIds = [ ...(currentUserId ? [currentUserId] : []), ...shares.filter((s) => s.targetType === 'user').map((s) => s.targetId), ]; const availableTeams = teams.filter( (t) => !shares.some((s) => s.targetType === 'team' && s.targetId === t.id) ); return (
{ if (e.target === e.currentTarget) onClose(); }} >
{/* Header */}
{resourceIcon ? ( typeof resourceIcon === 'string' ? ( {resourceIcon} ) : ( resourceIcon ) ) : ( )}

{title}

Objekt: {resourceName}

{error && (
{error}
)} {/* Add Share Section (Only if owner / manager) */} {isOwner ? (
Freigabe hinzufügen:
{shareType === 'team' ? (
{allowRoleSelection && ( )}
) : (
{allowRoleSelection && ( )}
)}
) : (
Nur der Eigentümer kann neue Freigaben einrichten.
)} {/* Active Shares List */}
Aktive Freigaben {shares.length} {shares.length === 1 ? 'Freigabe' : 'Freigaben'}
{shares.length === 0 ? (
Dieses Element ist aktuell privat (nur für dich sichtbar).
) : ( shares.map((sh) => { const isTeam = sh.targetType === 'team'; const roleLabel = sh.permission === 'viewer' || sh.role === 'viewer' ? 'Leser' : 'Bearbeiter'; return (
{isTeam ? (
) : ( c.id === sh.targetId)?.avatarUrl} name={sh.targetName || sh.targetEmail} size="sm" className="border border-border/80" /> )}
{sh.targetName || (isTeam ? 'Gruppe' : sh.targetEmail || 'Benutzer')} {isTeam ? 'Gruppe' : 'Benutzer'}
{sh.targetEmail && sh.targetEmail !== sh.targetName && (
{sh.targetEmail}
)}
{roleLabel} {isOwner && ( )}
); }) )}
{/* Footer */}
); };