import { useState } from 'react';
export default function PermissionIndicator({ userRole, isPublic, showTooltip = true }) {
const [showDetails, setShowDetails] = useState(false);
const getRoleInfo = (role) => {
switch (role) {
case 'owner':
return {
icon: '👑',
label: 'Owner',
color: '#f59e0b',
permissions: ['View', 'Edit', 'Delete', 'Manage Users', 'Change Visibility']
};
case 'editor':
return {
icon: '✏️',
label: 'Editor',
color: '#10b981',
permissions: ['View', 'Edit', 'Add/Remove Cards']
};
case 'viewer':
return {
icon: '👁️',
label: 'Viewer',
color: '#6b7280',
permissions: ['View Only']
};
default:
return {
icon: '🔒',
label: 'No Access',
color: '#ef4444',
permissions: []
};
}
};
const getVisibilityInfo = (isPublic) => {
if (isPublic) {
return {
icon: '🌍',
label: 'Public',
color: '#10b981',
description: 'Visible in community, invite-only editing'
};
} else {
return {
icon: '🔒',
label: 'Private',
color: '#6b7280',
description: 'Hidden from community, invite-only editing'
};
}
};
const roleInfo = getRoleInfo(userRole);
const visibilityInfo = getVisibilityInfo(isPublic);
return (
{/* Role Badge */}
{userRole && (
showTooltip && setShowDetails(true)}
onMouseLeave={() => setShowDetails(false)}
>
{roleInfo.icon}
{roleInfo.label}
{/* Role Tooltip */}
{showDetails && showTooltip && (
{roleInfo.icon} {roleInfo.label} Permissions:
{roleInfo.permissions.map((permission, index) => (
-
✓
{permission}
))}
)}
)}
{/* Visibility Badge */}
{isPublic !== undefined && (
showTooltip && setShowDetails(true)}
onMouseLeave={() => setShowDetails(false)}
>
{visibilityInfo.icon}
{visibilityInfo.label}
{/* Visibility Tooltip */}
{showDetails && showTooltip && (
{visibilityInfo.icon} {visibilityInfo.label}
{visibilityInfo.description}
)}
)}
);
}
// Utility component for inline permission checks
export function CanEdit({ userRole, children }) {
const canEdit = ['owner', 'editor'].includes(userRole);
return canEdit ? children : null;
}
export function CanManage({ userRole, children }) {
const canManage = userRole === 'owner';
return canManage ? children : null;
}
export function PermissionGate({ userRole, requiredRole, children, fallback = null }) {
const roleHierarchy = { viewer: 1, editor: 2, owner: 3 };
const userLevel = roleHierarchy[userRole] || 0;
const requiredLevel = roleHierarchy[requiredRole] || 0;
return userLevel >= requiredLevel ? children : fallback;
}