fix(Map): Added ability to see focused element

This commit is contained in:
DanSylvest
2025-10-09 15:52:48 +03:00
parent c6c065dbb9
commit 8498846d9c
6 changed files with 49 additions and 3 deletions

View File

@@ -11,6 +11,7 @@ export type MapData = MapUnionTypes & {
isThickConnections: boolean; isThickConnections: boolean;
linkedSigEveId: string; linkedSigEveId: string;
localShowShipName: boolean; localShowShipName: boolean;
systemHighlighted: string | undefined;
}; };
interface MapProviderProps { interface MapProviderProps {
@@ -44,6 +45,7 @@ const INITIAL_DATA: MapData = {
userHubs: [], userHubs: [],
pings: [], pings: [],
localShowShipName: false, localShowShipName: false,
systemHighlighted: undefined,
}; };
export interface MapContextProps { export interface MapContextProps {

View File

@@ -22,6 +22,7 @@ import { useLocalCounter } from '@/hooks/Mapper/components/hooks/useLocalCounter
// let render = 0; // let render = 0;
export const SolarSystemNodeDefault = memo((props: NodeProps<MapSolarSystemType>) => { export const SolarSystemNodeDefault = memo((props: NodeProps<MapSolarSystemType>) => {
const nodeVars = useSolarSystemNode(props); const nodeVars = useSolarSystemNode(props);
const { localCounterCharacters } = useLocalCounter(nodeVars); const { localCounterCharacters } = useLocalCounter(nodeVars);
const { killsCount: localKillsCount, killsActivityType: localKillsActivityType } = useNodeKillsCount( const { killsCount: localKillsCount, killsActivityType: localKillsActivityType } = useNodeKillsCount(
nodeVars.solarSystemId, nodeVars.solarSystemId,
@@ -192,6 +193,17 @@ export const SolarSystemNodeDefault = memo((props: NodeProps<MapSolarSystemType>
</> </>
)} )}
{nodeVars.systemHighlighted === nodeVars.solarSystemId && (
<div
className={clsx('absolute top-[-4px] left-[-4px]', 'w-[calc(100%+8px)] h-[calc(100%+8px)]', 'animate-pulse')}
>
<div className="absolute left-0 top-0 w-3 h-2 border-t-2 border-l-2 border-sky-300"></div>
<div className="absolute right-0 top-0 w-3 h-2 border-t-2 border-r-2 border-sky-300"></div>
<div className="absolute left-0 bottom-0 w-3 h-2 border-b-2 border-l-2 border-sky-300"></div>
<div className="absolute right-0 bottom-0 w-3 h-2 border-b-2 border-r-2 border-sky-300"></div>
</div>
)}
<div className={classes.Handlers}> <div className={classes.Handlers}>
<Handle <Handle
type="source" type="source"

View File

@@ -173,6 +173,17 @@ export const SolarSystemNodeTheme = memo((props: NodeProps<MapSolarSystemType>)
</> </>
)} )}
{nodeVars.systemHighlighted === nodeVars.solarSystemId && (
<div
className={clsx('absolute top-[-4px] left-[-4px]', 'w-[calc(100%+8px)] h-[calc(100%+8px)]', 'animate-pulse')}
>
<div className="absolute left-0 top-0 w-3 h-2 border-t-2 border-l-2 border-sky-300"></div>
<div className="absolute right-0 top-0 w-3 h-2 border-t-2 border-r-2 border-sky-300"></div>
<div className="absolute left-0 bottom-0 w-3 h-2 border-b-2 border-l-2 border-sky-300"></div>
<div className="absolute right-0 bottom-0 w-3 h-2 border-b-2 border-r-2 border-sky-300"></div>
</div>
)}
<div className={classes.Handlers}> <div className={classes.Handlers}>
<Handle <Handle
type="source" type="source"

View File

@@ -1,12 +1,18 @@
import { useReactFlow } from 'reactflow'; import { useReactFlow } from 'reactflow';
import { useCallback, useRef } from 'react'; import { useCallback, useRef } from 'react';
import { CommandCenterSystem } from '@/hooks/Mapper/types'; import { CommandCenterSystem } from '@/hooks/Mapper/types';
import { useMapState } from '@/hooks/Mapper/components/map/MapProvider.tsx';
import { SYSTEM_FOCUSED_LIFETIME } from '@/hooks/Mapper/constants.ts';
export const useCenterSystem = () => { export const useCenterSystem = () => {
const rf = useReactFlow(); const rf = useReactFlow();
const ref = useRef({ rf }); const { update } = useMapState();
ref.current = { rf };
const ref = useRef({ rf, update });
ref.current = { rf, update };
const highlightTimeout = useRef<number>();
return useCallback((systemId: CommandCenterSystem) => { return useCallback((systemId: CommandCenterSystem) => {
const systemNode = ref.current.rf.getNodes().find(x => x.data.id === systemId); const systemNode = ref.current.rf.getNodes().find(x => x.data.id === systemId);
@@ -14,5 +20,16 @@ export const useCenterSystem = () => {
return; return;
} }
ref.current.rf.setCenter(systemNode.position.x, systemNode.position.y, { duration: 1000 }); ref.current.rf.setCenter(systemNode.position.x, systemNode.position.y, { duration: 1000 });
ref.current.update({ systemHighlighted: systemId });
if (highlightTimeout.current !== undefined) {
clearTimeout(highlightTimeout.current);
}
highlightTimeout.current = setTimeout(() => {
highlightTimeout.current = undefined;
ref.current.update({ systemHighlighted: undefined });
}, SYSTEM_FOCUSED_LIFETIME);
}, []); }, []);
}; };

View File

@@ -52,6 +52,7 @@ export interface SolarSystemNodeVars {
temporaryName?: string | null; temporaryName?: string | null;
description: string | null; description: string | null;
comments_count: number | null; comments_count: number | null;
systemHighlighted: string | undefined;
} }
export const useSolarSystemNode = (props: NodeProps<MapSolarSystemType>): SolarSystemNodeVars => { export const useSolarSystemNode = (props: NodeProps<MapSolarSystemType>): SolarSystemNodeVars => {
@@ -108,6 +109,7 @@ export const useSolarSystemNode = (props: NodeProps<MapSolarSystemType>): SolarS
showKSpaceBG, showKSpaceBG,
isThickConnections, isThickConnections,
pings, pings,
systemHighlighted,
}, },
outCommand, outCommand,
} = useMapState(); } = useMapState();
@@ -217,6 +219,7 @@ export const useSolarSystemNode = (props: NodeProps<MapSolarSystemType>): SolarS
isRally, isRally,
description, description,
comments_count, comments_count,
systemHighlighted,
}; };
return nodeVars; return nodeVars;

View File

@@ -7,6 +7,8 @@ export enum SESSION_KEY {
routes = 'routes', routes = 'routes',
} }
export const SYSTEM_FOCUSED_LIFETIME = 10000;
export const GRADIENT_MENU_ACTIVE_CLASSES = 'bg-gradient-to-br from-transparent/10 to-fuchsia-300/10'; export const GRADIENT_MENU_ACTIVE_CLASSES = 'bg-gradient-to-br from-transparent/10 to-fuchsia-300/10';
export enum Regions { export enum Regions {
@@ -152,7 +154,6 @@ export const MINIMAP_PLACEMENT_MAP = {
[PingsPlacement.leftBottom]: 'bottom-left', [PingsPlacement.leftBottom]: 'bottom-left',
}; };
export const SPACE_TO_CLASS: Record<string, string> = { export const SPACE_TO_CLASS: Record<string, string> = {
[Spaces.Caldari]: 'Caldaria', [Spaces.Caldari]: 'Caldaria',
[Spaces.Matar]: 'Mataria', [Spaces.Matar]: 'Mataria',