import { useCallback, useMemo, useRef } from 'react'; import { Widget } from '@/hooks/Mapper/components/mapInterface/components'; import { useMapRootState } from '@/hooks/Mapper/mapRootProvider'; import { VirtualScroller, VirtualScrollerTemplateOptions } from 'primereact/virtualscroller'; import clsx from 'clsx'; import classes from './LocalCharacters.module.scss'; import { CharacterTypeRaw, WithIsOwnCharacter } from '@/hooks/Mapper/types'; import { CharacterCard, LayoutEventBlocker, WdCheckbox } from '@/hooks/Mapper/components/ui-kit'; import { sortCharacters } from '@/hooks/Mapper/components/mapInterface/helpers/sortCharacters.ts'; import useLocalStorageState from 'use-local-storage-state'; 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'; type CharItemProps = { compact: boolean; } & CharacterTypeRaw & WithIsOwnCharacter; const useItemTemplate = () => { const { data: { presentCharacters }, } = useMapRootState(); return useCallback( (char: CharItemProps, options: VirtualScrollerTemplateOptions) => { return (
); }, // eslint-disable-next-line [presentCharacters], ); }; type WindowLocalSettingsType = { compact: boolean; showOffline: boolean; version: number; }; const STORED_DEFAULT_VALUES: WindowLocalSettingsType = { compact: true, showOffline: false, version: 0, }; export const LocalCharacters = () => { const { data: { characters, userCharacters, selectedSystems, presentCharacters }, } = useMapRootState(); const [settings, setSettings] = useLocalStorageState('window:local:settings', { defaultValue: STORED_DEFAULT_VALUES, }); const [systemId] = selectedSystems; const restrictOfflineShowing = useMapGetOption('restrict_offline_showing'); const isAdminOrManager = useMapCheckPermissions([UserPermission.MANAGE_MAP]); const showOffline = useMemo( () => !restrictOfflineShowing || isAdminOrManager, [isAdminOrManager, restrictOfflineShowing], ); const itemTemplate = useItemTemplate(); const sorted = useMemo(() => { const sorted = characters .filter(x => x.location?.solar_system_id?.toString() === systemId) .map(x => ({ ...x, isOwn: userCharacters.includes(x.eve_id), compact: settings.compact })) .sort(sortCharacters); if (!showOffline || !settings.showOffline) { return sorted.filter(c => c.online); } return sorted; // eslint-disable-next-line }, [showOffline, characters, settings.showOffline, settings.compact, systemId, userCharacters, presentCharacters]); 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); return ( Local{showList ? ` [${sorted.length}]` : ''} {showOffline && ( setSettings(() => ({ ...settings, showOffline: !settings.showOffline }))} /> )} setSettings(() => ({ ...settings, compact: !settings.compact }))} > } > {isNotSelectedSystem && (
System is not selected
)} {isNobodyHere && !isNotSelectedSystem && (
Nobody here
)} {showList && ( )}
); };