"use client"; import type { User, WorkspaceMember } from "@mosaic/shared"; import { WorkspaceMemberRole } from "@mosaic/shared"; import { toWorkspaceMemberRole } from "./validation"; export interface WorkspaceMemberWithUser extends WorkspaceMember { user: User; } interface MemberListProps { members: WorkspaceMemberWithUser[]; currentUserId: string; currentUserRole: WorkspaceMemberRole; workspaceOwnerId: string; onRoleChange: (userId: string, newRole: WorkspaceMemberRole) => Promise; onRemove: (userId: string) => Promise; } const roleColors: Record = { [WorkspaceMemberRole.OWNER]: "bg-purple-100 text-purple-700", [WorkspaceMemberRole.ADMIN]: "bg-blue-100 text-blue-700", [WorkspaceMemberRole.MEMBER]: "bg-green-100 text-green-700", [WorkspaceMemberRole.GUEST]: "bg-gray-100 text-gray-700", }; export function MemberList({ members, currentUserId, currentUserRole, workspaceOwnerId, onRoleChange, onRemove, }: MemberListProps): React.JSX.Element { const canManageMembers = currentUserRole === WorkspaceMemberRole.OWNER || currentUserRole === WorkspaceMemberRole.ADMIN; const handleRoleChange = async (userId: string, newRole: WorkspaceMemberRole): Promise => { try { await onRoleChange(userId, newRole); } catch (error) { console.error("Failed to change role:", error); alert("Failed to change member role"); } }; const handleRemove = async (userId: string): Promise => { if (!confirm("Are you sure you want to remove this member?")) { return; } try { await onRemove(userId); } catch (error) { console.error("Failed to remove member:", error); alert("Failed to remove member"); } }; return (

Members ({members.length})

    {members.map((member) => { const isCurrentUser = member.userId === currentUserId; const isOwner = member.userId === workspaceOwnerId; const canModify = canManageMembers && !isOwner && !isCurrentUser; return (
  • {member.user.name.charAt(0).toUpperCase()}

    {member.user.name}

    {isCurrentUser && (you)}

    {member.user.email}

    Joined {new Date(member.joinedAt).toLocaleDateString()}

    {canModify ? ( ) : ( {member.role} )} {canModify && ( )}
  • ); })}
); }