'use client' import { CirclePlayIcon, DollarSignIcon, GraduationCapIcon, LayoutDashboardIcon, LightbulbIcon, LogOutIcon, UserIcon, type LucideIcon } from 'lucide-react' import { Link } from 'react-router' import { initials } from '../lib/utils' import { Avatar, AvatarFallback } from './ui/avatar' import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger } from './ui/dropdown-menu' type NavItem = { title: string url: string icon: LucideIcon scope?: string[] } const apps: NavItem[] = [ { title: 'Sala de aula', url: '//scorm.eduseg.workers.dev', icon: GraduationCapIcon }, { title: 'Administrador', url: '//admin.saladeaula.digital', icon: LayoutDashboardIcon, scope: ['apps:admin'] }, { title: 'EDUSEG® Estúdio', url: '//studio.saladeaula.digital', icon: CirclePlayIcon, scope: ['apps:studio'] }, { title: 'EDUSEG® Insights', url: '//insights.saladeaula.digital', icon: LightbulbIcon, scope: ['apps:insights'] } ] export function NavUser({ user }: { user: { name: string email: string scope: string } }) { const userScope = user.scope.split(' ') return ( {initials(user.name)}
{initials(user.name)}
{user.name} {user.email}
Minha conta Histórico de compras {grantIfHas( ['apps:admin', 'apps:studio', 'apps:insights'], userScope, 'any' ) && ( <> Aplicações )} {apps.map(({ title, url, scope = [], icon: Icon }, idx) => { if (grantIfHas(scope, userScope)) { return ( {title} ) } return <> })} Sair
) } function grantIfHas( required: string[], granted: string[], mode: 'all' | 'any' = 'all' ): boolean { const grantedSet: Set = new Set(granted) if (mode === 'all') { return required.every((scope) => grantedSet.has(scope)) } return required.some((scope) => grantedSet.has(scope)) }