import React from 'react'; import { hasPermission } from '../../../server/lib/permissions'; import { Permission, User } from '../../hooks/useUser'; export interface PermissionItem { id: string; name: string; description: string; permission: Permission; children?: PermissionItem[]; requires?: PermissionRequirement[]; } interface PermissionRequirement { permissions: Permission[]; type?: 'and' | 'or'; } interface PermissionOptionProps { option: PermissionItem; actingUser?: User; currentUser?: User; currentPermission: number; parent?: PermissionItem; onUpdate: (newPermissions: number) => void; } const PermissionOption: React.FC = ({ option, actingUser, currentUser, currentPermission, onUpdate, parent, }) => { const autoApprovePermissions = [ Permission.AUTO_APPROVE, Permission.AUTO_APPROVE_MOVIE, Permission.AUTO_APPROVE_TV, Permission.AUTO_APPROVE_4K, Permission.AUTO_APPROVE_4K_MOVIE, Permission.AUTO_APPROVE_4K_TV, ]; return ( <>
hasPermission(requirement.permissions, currentPermission, { type: requirement.type ?? 'and', }) )) ? 'opacity-50' : '' }`} >
hasPermission(requirement.permissions, currentPermission, { type: requirement.type ?? 'and', }) )) } onChange={() => { onUpdate( hasPermission(option.permission, currentPermission) ? currentPermission - option.permission : currentPermission + option.permission ); }} checked={ (hasPermission(option.permission, currentPermission) || (!!parent?.permission && hasPermission(parent.permission, currentPermission)) || (autoApprovePermissions.includes(option.permission) && hasPermission( Permission.MANAGE_REQUESTS, currentPermission ))) && (!option.requires || option.requires.every((requirement) => hasPermission(requirement.permissions, currentPermission, { type: requirement.type ?? 'and', }) )) } />
{(option.children ?? []).map((child) => (
onUpdate(newPermission)} parent={option} />
))} ); }; export default PermissionOption;