import { CalendarDays, Check, Laptop, LogOut, Menu, Moon, Settings, Sun, User, X, } from 'lucide-react'; import { useEffect, useMemo, useRef, useState } from 'react'; import PlayzerIcon from '@/assets/playzer-favicon-512-transparent.png'; import { useQuery, useQueryClient } from '@tanstack/react-query'; import { Link, useNavigate } from '@tanstack/react-router'; import { Button } from '@/components/ui/button'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { Sheet, SheetContent, SheetTrigger } from '@/components/ui/sheet'; import { UserAvatar } from '@/components/user-avatar'; import { apiClient } from '@/lib/api-client'; import { useAuth } from '@/lib/auth'; import { acceptStoredPendingInvite } from '@/lib/invitations'; import { useCurrentComplexStore } from '@/lib/stores/current-complex-store'; import { useTheme } from '@/lib/theme'; export function Header() { const [open, setOpen] = useState(false); const navigate = useNavigate(); const queryClient = useQueryClient(); const { user, isAuthenticated, displayName, avatarUrl, signOut } = useAuth(); const { theme, setTheme } = useTheme(); const { currentComplexSlug, setCurrentComplex } = useCurrentComplexStore(); const processedInviteForUser = useRef(null); const myComplexesQuery = useQuery({ queryKey: ['my-complexes'], enabled: isAuthenticated, queryFn: () => apiClient.complexes.listMine(), }); useEffect(() => { if (!isAuthenticated) { processedInviteForUser.current = null; return; } const userKey = user?.email ?? displayName ?? 'authenticated-user'; if (processedInviteForUser.current === userKey) { return; } processedInviteForUser.current = userKey; void (async () => { await acceptStoredPendingInvite(apiClient.complexes.acceptPendingInvitations); await queryClient.invalidateQueries({ queryKey: ['my-complexes'] }); })(); }, [displayName, isAuthenticated, queryClient, user?.email]); const complexSlug = currentComplexSlug || myComplexesQuery.data?.[0]?.complexSlug; const currentComplexName = useMemo(() => { const complexes = myComplexesQuery.data ?? []; if (complexes.length === 0) return 'Mi complejo'; const selected = complexes.find((complex) => complex.complexSlug === complexSlug); return selected?.complexName ?? complexes[0]?.complexName ?? 'Mi complejo'; }, [complexSlug, myComplexesQuery.data]); const handleSelectComplex = async (complexId: string, nextSlug: string) => { await apiClient.complexes.select({ complexId }); setCurrentComplex(nextSlug); await queryClient.invalidateQueries({ queryKey: ['current-complex'] }); }; const handleSignOut = async () => { await signOut(); await navigate({ to: '/login' }); }; const handleOpenBookingCreate = async () => { if (location.pathname !== '/') { await navigate({ to: '/' }); } window.setTimeout(() => { window.dispatchEvent(new Event('playzer:open-booking-create')); }, 0); }; return (
Playzer
Playzer
{isAuthenticated ? (
{displayName} {user?.email} {currentComplexName}
{myComplexesQuery.data && myComplexesQuery.data.length > 1 && ( <> Cambiar complejo {myComplexesQuery.data.map((complex) => ( { void handleSelectComplex(complex.id, complex.complexSlug); }} > {complex.complexSlug === complexSlug && } {complex.complexName} ))} )} Apariencia setTheme(value as 'light' | 'dark' | 'system')} > Light Dark System { void navigate({ to: '/profile' }); }} > Mi Perfil {currentComplexSlug && ( { void navigate({ to: '/complex/$slug/edit', params: { slug: currentComplexSlug }, }); }} > Configuración )} { void handleSignOut(); }} > Cerrar sesión
) : ( )}

{displayName}

{user?.email}

{isAuthenticated && (

{currentComplexName}

)}

Cuenta

); }