import React, { useEffect, useMemo, useRef, useState } from 'react'; import { useAuth } from '../context/AuthContext.tsx'; import { useFarm } from '../context/FarmContext.tsx'; import type { UserStatus } from '../types/api.ts'; import { formatDateId, resolveCycleStatus } from '../utils/format.ts'; const ROLE_LABELS: Record = { inactive: 'Inactive', gm: 'GM', gm_admin: 'GM Admin', buh: 'BUH', bu_admin: 'BU Admin', director: 'Director', director_admin: 'Director Admin', account_admin: 'Account Admin', superuser: 'Superuser', }; type HeaderProps = { onToggleSidebar: () => void; isTimelineVisible: boolean; onToggleTimeline: () => void; }; const Header: React.FC = ({ onToggleSidebar, isTimelineVisible, onToggleTimeline, }) => { const { user, logout } = useAuth(); const { sites, kandangs, cycles, selectedSiteId, selectedKandangId, selectedCycleId, setSelectedSiteId, setSelectedKandangId, setSelectedCycleId, } = useFarm(); const [open, setOpen] = useState(false); const [gmFilter, setGmFilter] = useState<'all' | number>('all'); const dropdownRef = useRef(null); const isBuh = user?.status === 'buh' || user?.status === 'bu_admin'; const gmOptions = useMemo(() => { const byId = new Map(); for (const site of sites) { if (!byId.has(site.user)) { byId.set(site.user, site.owner_name ?? `GM #${site.user}`); } } return [...byId.entries()] .map(([id, name]) => ({ id, name })) .sort((a, b) => a.name.localeCompare(b.name)); }, [sites]); const visibleSites = useMemo(() => { if (!isBuh || gmFilter === 'all') return sites; return sites.filter((site) => site.user === gmFilter); }, [gmFilter, isBuh, sites]); useEffect(() => { if (!isBuh || gmFilter === 'all') return; if (selectedSiteId == null) return; const stillVisible = visibleSites.some((site) => site.id === selectedSiteId); if (!stillVisible) { setSelectedSiteId(visibleSites[0]?.id ?? null); } }, [gmFilter, isBuh, selectedSiteId, setSelectedSiteId, visibleSites]); useEffect(() => { const onClick = (event: MouseEvent) => { if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { setOpen(false); } }; document.addEventListener('mousedown', onClick); return () => document.removeEventListener('mousedown', onClick); }, []); if (!user) return null; return (
{isBuh && gmOptions.length > 0 && (
)}
{open && (

{user.display_name}

{ROLE_LABELS[user.status]}

)}
); }; export default Header;