import { useMemo, useRef } from 'react'; import { Widget } from '@/hooks/Mapper/components/mapInterface/components'; import { useMapRootState } from '@/hooks/Mapper/mapRootProvider'; import clsx from 'clsx'; import { LayoutEventBlocker, WdCheckbox } from '@/hooks/Mapper/components/ui-kit'; import { sortCharacters } from '@/hooks/Mapper/components/mapInterface/helpers/sortCharacters.ts'; import { useMapCheckPermissions, useMapGetOption } from '@/hooks/Mapper/mapRootProvider/hooks/api'; import { UserPermission } from '@/hooks/Mapper/types/permissions.ts'; import useMaxWidth from '@/hooks/Mapper/hooks/useMaxWidth.ts'; import { WdTooltipWrapper } from '@/hooks/Mapper/components/ui-kit/WdTooltipWrapper'; import { LocalCharactersList } from './components/LocalCharactersList'; import { useLocalCharactersItemTemplate } from './hooks/useLocalCharacters'; import { useLocalCharacterWidgetSettings } from './hooks/useLocalWidgetSettings'; export const LocalCharacters = () => { const { data: { characters, userCharacters, selectedSystems }, } = useMapRootState(); const [settings, setSettings] = useLocalCharacterWidgetSettings(); const [systemId] = selectedSystems; const restrictOfflineShowing = useMapGetOption('restrict_offline_showing'); const isAdminOrManager = useMapCheckPermissions([UserPermission.MANAGE_MAP]); const showOffline = useMemo( () => !restrictOfflineShowing || isAdminOrManager, [isAdminOrManager, restrictOfflineShowing], ); const sorted = useMemo(() => { const filtered = characters .filter(x => x.location?.solar_system_id?.toString() === systemId) .map(x => ({ ...x, isOwn: userCharacters.includes(x.eve_id), compact: settings.compact, showShipName: settings.showShipName, })) .sort(sortCharacters); if (!showOffline || !settings.showOffline) { return filtered.filter(c => c.online); } return filtered; }, [ characters, systemId, userCharacters, settings.compact, settings.showOffline, settings.showShipName, showOffline, ]); const isNobodyHere = sorted.length === 0; const isNotSelectedSystem = selectedSystems.length !== 1; const showList = sorted.length > 0 && selectedSystems.length === 1; const ref = useRef(null); const compact = useMaxWidth(ref, 145); const itemTemplate = useLocalCharactersItemTemplate(settings.showShipName); return (
Local{showList ? ` [${sorted.length}]` : ''}
{showOffline && (
setSettings(prev => ({ ...prev, showOffline: !prev.showOffline })) } />
)} {settings.compact && (
setSettings(prev => ({ ...prev, showShipName: !prev.showShipName })) } />
)} setSettings(prev => ({ ...prev, compact: !prev.compact }))} />
} > {isNotSelectedSystem && (
System is not selected
)} {isNobodyHere && !isNotSelectedSystem && (
Nobody here
)} {showList && ( )}
); };