/** * Component: User Permissions Modal * Documentation: documentation/admin-dashboard.md */ 'use client'; import { Modal } from '@/components/ui/Modal'; interface UserPermissionsUser { id: string; plexUsername: string; plexEmail: string; avatarUrl: string | null; role: 'user' | 'admin'; autoApproveRequests: boolean | null; interactiveSearchAccess: boolean | null; } interface UserPermissionsModalProps { isOpen: boolean; onClose: () => void; user: UserPermissionsUser | null; globalAutoApprove: boolean; globalInteractiveSearch: boolean; onToggleAutoApprove: (user: UserPermissionsUser, newValue: boolean) => void; onToggleInteractiveSearch: (user: UserPermissionsUser, newValue: boolean) => void; } interface PermissionToggleProps { label: string; ariaLabel: string; value: boolean; disabled: boolean; disabledMessage?: string; description: string; onToggle: () => void; } function PermissionToggle({ label, ariaLabel, value, disabled, disabledMessage, description, onToggle }: PermissionToggleProps) { return (
{label}
{disabledMessage ? (

{disabledMessage}

) : (

{description}

)}
); } export function UserPermissionsModal({ isOpen, onClose, user, globalAutoApprove, globalInteractiveSearch, onToggleAutoApprove, onToggleInteractiveSearch, }: UserPermissionsModalProps) { if (!user) return null; const isAdmin = user.role === 'admin'; // Auto-Approve resolution const isAutoApproveGlobalOverride = !isAdmin && globalAutoApprove; const isAutoApproveDisabled = isAdmin || isAutoApproveGlobalOverride; const autoApproveValue = isAdmin ? true : isAutoApproveGlobalOverride ? true : (user.autoApproveRequests ?? false); // Interactive Search resolution const isSearchGlobalOverride = !isAdmin && globalInteractiveSearch; const isSearchDisabled = isAdmin || isSearchGlobalOverride; const searchValue = isAdmin ? true : isSearchGlobalOverride ? true : (user.interactiveSearchAccess ?? false); const getDisabledMessage = (isAdminUser: boolean, isGlobalOverride: boolean, adminMessage: string, globalMessage: string): string | undefined => { if (isAdminUser) return adminMessage; if (isGlobalOverride) return globalMessage; return undefined; }; return (
{/* User Info */}
{user.avatarUrl && ( {user.plexUsername} )}
{user.plexUsername}
{user.plexEmail || 'No email'}
{user.role.toUpperCase()}
{/* Permissions Section */}

Permissions

{/* Auto-Approve Permission */} onToggleAutoApprove(user, !autoApproveValue)} /> {/* Interactive Search Access Permission */} onToggleInteractiveSearch(user, !searchValue)} />
); }