'use client' import { ChevronDown, CirclePlayIcon, ShoppingCartIcon, 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 = { appId: string title: string url: string icon: LucideIcon scope?: string[] } const apps: NavItem[] = [ { appId: 'saladeaula', title: 'Sala de aula', url: '//scorm.eduseg.workers.dev', icon: GraduationCapIcon }, { appId: 'admin', title: 'Administrador', url: '//admin.saladeaula.digital', icon: LayoutDashboardIcon, scope: ['apps:admin'] }, { appId: 'studio', title: 'EDUSEG® Estúdio', url: '//studio.saladeaula.digital', icon: CirclePlayIcon, scope: ['apps:studio'] }, { appId: 'insights', title: 'EDUSEG® Insights', url: '//insights.saladeaula.digital', icon: LightbulbIcon, scope: ['apps:insights'] } ] export function NavUser({ user, excludeApps }: { user: { name: string email: string scope: string } excludeApps: string[] }) { const userScope = user.scope.split(' ') return (
{initials(user.name)}
{initials(user.name)}
{user.name} {user.email}
Minha conta Histórico de pagamentos {grantIfHas( ['apps:admin', 'apps:studio', 'apps:insights'], userScope, 'any' ) && ( <> Aplicações )} {apps .filter(({ appId }) => !excludeApps.includes(appId)) .filter(({ scope = [] }) => grantIfHas(scope, userScope)) .map(({ appId, title, url, icon: Icon }) => ( {title} ))} 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)) }