'use client'; import { useState, useEffect } from 'react'; import { useQueryClient } from '@tanstack/react-query'; import { useAuthStore } from '@/stores/auth-store'; import { switchTenant } from '@/lib/api/auth'; import { Building2, ChevronDown, Check, Loader2, Crown } from 'lucide-react'; import { cn } from '@horux/shared-ui'; import { isGlobalAdminRfc } from '@horux/shared'; /** * Switcher para users con múltiples memberships (owner o contador con varias * empresas). Distinto del TenantSelector de admin global: * - Admin global: impersonación via X-View-Tenant (no cambia el JWT) * - Membership switcher: cambia de tenant *real* con nuevo JWT * * Se oculta si: * - El user tiene ≤1 membership * - El user es admin global (ya tiene su propio TenantSelector, sería redundante) */ export function MembershipSwitcher() { const [open, setOpen] = useState(false); const [switching, setSwitching] = useState(false); const { user, setUser, setTokens } = useAuthStore(); const queryClient = useQueryClient(); const isGlobalAdmin = isGlobalAdminRfc(user?.tenantRfc, user?.role, user?.platformRoles); const tenants = user?.tenants || []; const showSwitcher = !isGlobalAdmin && tenants.length > 1; useEffect(() => { const handleClickOutside = (e: MouseEvent) => { const target = e.target as HTMLElement; if (!target.closest('.membership-switcher')) setOpen(false); }; document.addEventListener('click', handleClickOutside); return () => document.removeEventListener('click', handleClickOutside); }, []); if (!showSwitcher) return null; const activeTenant = tenants.find(t => t.id === user?.tenantId); const handleSwitch = async (tenantId: string) => { if (tenantId === user?.tenantId) { setOpen(false); return; } setSwitching(true); try { const res = await switchTenant(tenantId); setTokens(res.accessToken, res.refreshToken); setUser(res.user); // Refresca todo el cache — las queries dependen del tenant activo queryClient.clear(); setOpen(false); // Reload para que React Query re-fetche desde cero con el nuevo JWT window.location.reload(); } catch (err: any) { alert(err?.response?.data?.message || 'Error al cambiar de empresa'); } finally { setSwitching(false); } }; return (
Mis empresas