import React, { useState, useEffect } from 'react'; import { Users, UserPlus, Settings, Trash2, Shield, Mail, Plus, ArrowRight, ShieldAlert, Search } from 'lucide-react'; import { supabase } from '../services/supabase'; import { useAuth } from '../context/useAuth'; interface Team { id: string; name: string; created_at: string; role?: 'admin' | 'editor' | 'viewer'; } interface TeamMember { id: string; user_id: string; role: 'admin' | 'editor' | 'viewer'; created_at: string; full_name?: string; email?: string; } const TeamsView: React.FC = () => { const { user, profile } = useAuth(); const [teams, setTeams] = useState([]); const [selectedTeam, setSelectedTeam] = useState(null); const [members, setMembers] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [showCreateModal, setShowCreateModal] = useState(false); const [newTeamName, setNewTeamName] = useState(''); const [inviteEmail, setInviteEmail] = useState(''); const [inviteRole, setInviteRole] = useState<'admin' | 'editor' | 'viewer'>('viewer'); const [actionPending, setActionPending] = useState(false); useEffect(() => { fetchTeams(); }, []); useEffect(() => { if (selectedTeam) { fetchMembers(selectedTeam.id); } }, [selectedTeam]); const fetchTeams = async () => { setLoading(true); try { // Fetch teams where user is a member const { data, error } = await supabase .from('teams') .select(` *, team_members!inner(role) `); if (error) throw error; const formattedTeams = data.map(t => ({ ...t, role: t.team_members[0].role })); setTeams(formattedTeams); if (formattedTeams.length > 0 && !selectedTeam) { setSelectedTeam(formattedTeams[0]); } } catch (err: any) { setError(err.message); } finally { setLoading(false); } }; const fetchMembers = async (teamId: string) => { try { const { data, error } = await supabase .from('team_members_with_profiles') .select('*') .eq('team_id', teamId); if (error) throw error; const formattedMembers = data.map(m => ({ ...m, full_name: m.full_name, email: m.email })); setMembers(formattedMembers); } catch (err: any) { setError(err.message); } }; const createTeam = async () => { if (!newTeamName.trim()) return; setActionPending(true); try { const { data, error } = await supabase .from('teams') .insert([{ name: newTeamName, created_by: user?.id }]) .select() .single(); if (error) throw error; setNewTeamName(''); setShowCreateModal(false); fetchTeams(); } catch (err: any) { setError(err.message); } finally { setActionPending(false); } }; const inviteMember = async () => { if (!selectedTeam || !inviteEmail.trim()) return; setActionPending(true); try { // In a real app, we'd send an email or look up by email. // For this demo, we'll assume we can look up by email in profiles. const { data: userData, error: userError } = await supabase .from('profiles') .select('id') .eq('email', inviteEmail.trim()) .single(); if (userError || !userData) { throw new Error('User not found. Please ensure the user has signed up.'); } const { error: inviteError } = await supabase .from('team_members') .insert([{ team_id: selectedTeam.id, user_id: userData.id, role: inviteRole }]); if (inviteError) throw inviteError; setInviteEmail(''); fetchMembers(selectedTeam.id); } catch (err: any) { setError(err.message); } finally { setActionPending(false); } }; const removeMember = async (memberId: string) => { if (!selectedTeam) return; if (!window.confirm('Are you sure you want to remove this member?')) return; try { const { error } = await supabase .from('team_members') .delete() .eq('id', memberId); if (error) throw error; fetchMembers(selectedTeam.id); } catch (err: any) { setError(err.message); } }; const updateMemberRole = async (memberId: string, newRole: string) => { try { const { error } = await supabase .from('team_members') .update({ role: newRole }) .eq('id', memberId); if (error) throw error; if (selectedTeam) fetchMembers(selectedTeam.id); } catch (err: any) { setError(err.message); } }; return (

Team Management

Manage shared workspaces and permissions

{error && (
{error}
)}
{/* Teams List */}

Your Teams

{teams.length === 0 && !loading && (
No teams yet.
)} {teams.map(team => ( ))}
{/* Selected Team Details */}
{selectedTeam ? (

{selectedTeam.name}

Team ID: {selectedTeam.id}

{selectedTeam.role === 'admin' && ( )}
{/* Members Section */}

Team Members ({members.length})

{members.map(member => (
{(member.full_name || member.email || 'U').slice(0, 2).toUpperCase()}
{member.full_name || 'Anonymous User'}
{member.email}
{selectedTeam.role === 'admin' && member.user_id !== user?.id && ( )}
))}
{/* Invite Section */} {selectedTeam.role === 'admin' && (

Invite Member

Invite someone to collaborate on team projects.

setInviteEmail(e.target.value)} style={{ width: '100%', marginBottom: 'var(--space-md)' }} />
)}
) : (

Select a team to manage

Choose a team from the sidebar to view members and permissions.

)}
{/* Create Team Modal */} {showCreateModal && (
setShowCreateModal(false)}>
e.stopPropagation()} style={{ maxWidth: '400px' }}>

Create New Team

Teams allow you to share projects and collaborate with other users.

setNewTeamName(e.target.value)} style={{ width: '100%', marginBottom: 'var(--space-xl)' }} />
)}
); }; export default TeamsView;