diff --git a/packages/geoview-core/src/api/event-processors/event-processor-children/map-event-processor.ts b/packages/geoview-core/src/api/event-processors/event-processor-children/map-event-processor.ts
index a0b89902274..8a754694dfd 100644
--- a/packages/geoview-core/src/api/event-processors/event-processor-children/map-event-processor.ts
+++ b/packages/geoview-core/src/api/event-processors/event-processor-children/map-event-processor.ts
@@ -48,7 +48,7 @@ import { UIEventProcessor } from './ui-event-processor';
import { TypeMapFeaturesConfig } from '@/core/types/global-types';
import { TypeClickMarker } from '@/core/components';
import { IMapState, TypeOrderedLayerInfo, TypeScaleInfo } from '@/core/stores/store-interface-and-intial-values/map-state';
-import { TypeFeatureInfoResultSet, TypeHoverFeatureInfo } from '@/core/stores/store-interface-and-intial-values/feature-info-state';
+import { TypeHoverFeatureInfo } from '@/core/stores/store-interface-and-intial-values/feature-info-state';
import { TypeBasemapProps } from '@/geo/layer/basemap/basemap-types';
import { LegendEventProcessor } from './legend-event-processor';
import { TypeLegendLayer } from '@/core/components/layers/types';
@@ -109,6 +109,20 @@ export class MapEventProcessor extends AbstractEventProcessor {
(removedFeatures[i].geometry as TypeGeometry).ol_uid
);
}
+ },
+ {
+ equalityFn: (prev, curr) => {
+ // Quick length checks first (prevents re-render) and calls to to removeHighlight
+ if (prev === curr) return true;
+ if (prev.length !== curr.length) return false;
+ if (prev.length === 0) return true;
+
+ // Use Set for O(1) lookup instead of array operations
+ const prevUids = new Set(prev.map((feature) => (feature.geometry as TypeGeometry).ol_uid));
+
+ // Single pass through current features
+ return curr.every((feature) => prevUids.has((feature.geometry as TypeGeometry).ol_uid));
+ },
}
);
diff --git a/packages/geoview-core/src/core/components/crosshair/crosshair.tsx b/packages/geoview-core/src/core/components/crosshair/crosshair.tsx
index 3e1dadc872b..45c250b3457 100644
--- a/packages/geoview-core/src/core/components/crosshair/crosshair.tsx
+++ b/packages/geoview-core/src/core/components/crosshair/crosshair.tsx
@@ -47,10 +47,7 @@ export const Crosshair = memo(function Crosshair({ mapTargetElement }: Crosshair
logger.logTraceUseCallback('CROSSHAIR - simulateClick', pointerPosition);
if (event.key === 'Enter' && pointerPosition) {
// Update the store
- setClickCoordinates(pointerPosition).catch((error) => {
- // Log
- logger.logPromiseFailed('Failed to setClickCoordinates in crosshair.simulateClick', error);
- });
+ setClickCoordinates(pointerPosition);
}
},
[pointerPosition, setClickCoordinates]
diff --git a/packages/geoview-core/src/core/components/details/details-panel.tsx b/packages/geoview-core/src/core/components/details/details-panel.tsx
index d2264680370..cdbc462d711 100644
--- a/packages/geoview-core/src/core/components/details/details-panel.tsx
+++ b/packages/geoview-core/src/core/components/details/details-panel.tsx
@@ -426,9 +426,12 @@ export function DetailsPanel({ fullWidth = false }: DetailsPanelType): JSX.Eleme
* NOTE: Here we return null, so that in responsive grid layout, it can be used as flag to render the guide for details.
* @returns {JSX.Element | null} JSX.Element | null
*/
- logger.logMarkerStart('DETAILS-MARKER');
const renderContent = (): JSX.Element | null => {
- if (!memoIsAllLayersQueryStatusProcessed()) {
+ // If there is no layer, return null for the guide to show
+ if (memoLayersList && memoLayersList.length === 0) return null;
+
+ // Until process, return skeleton
+ if (!memoIsAllLayersQueryStatusProcessed() || !(memoSelectedLayerDataFeatures && memoSelectedLayerDataFeatures.length > 0)) {
return ;
}
diff --git a/packages/geoview-core/src/core/components/details/feature-info-table.tsx b/packages/geoview-core/src/core/components/details/feature-info-table.tsx
index dc40ba95853..d4ffbdadeb7 100644
--- a/packages/geoview-core/src/core/components/details/feature-info-table.tsx
+++ b/packages/geoview-core/src/core/components/details/feature-info-table.tsx
@@ -86,7 +86,7 @@ export const FeatureItem = memo(function FeatureItem({
return (
-
+
);
});
@@ -97,18 +97,15 @@ export const FeatureRow = memo(function FeatureRow({ featureInfoItem, index, onI
const { alias, value } = featureInfoItem;
// Convert value to string, handling arrays and other types
- const stringValue = useMemo((): string => {
+ const stringValue = useMemo((): string[] => {
if (Array.isArray(value)) {
- return value.map((item) => stringify(item)).join(';');
+ return [value.map((item) => stringify(item)).join(';')] as string[];
}
- return stringify(value) as string;
+ return [stringify(value)] as string[];
}, [value]);
- // Split text but leave html intact
- const valueArray = alias !== 'html' ? stringValue.split(';') : [stringValue];
-
// Generate stable IDs for each item when component mounts
- const itemIds = useMemo(() => valueArray.map(() => generateId()), [valueArray]);
+ const itemIds = useMemo(() => stringValue.map(() => generateId()), [stringValue]);
return (
- {valueArray.map((item: string, idx: number) => (
+ {stringValue.map((item: string, idx: number) => (
Promise;
zoomToMyLocation: (position: GeolocationPosition) => Promise;
transformPoints: (coords: Coordinate[], outputProjection: number) => Coordinate[];
- setClickCoordinates: (pointerPosition: TypeMapMouseInfo) => Promise;
+ setClickCoordinates: (pointerPosition: TypeMapMouseInfo) => void;
setCurrentBasemapOptions: (basemapOptions: TypeBasemapOptions) => void;
setFixNorth: (ifFix: boolean) => void;
setOverlayClickMarkerRef: (htmlRef: HTMLElement) => void;
@@ -459,7 +459,7 @@ export function initializeMapState(set: TypeSetStore, get: TypeGetStore): IMapSt
* @param {TypeMapMouseInfo} pointerPosition - The pointer position.
* @returns {Promise}
*/
- setClickCoordinates: (pointerPosition: TypeMapMouseInfo): Promise => {
+ setClickCoordinates: (pointerPosition: TypeMapMouseInfo): void => {
// Redirect to processor
return MapEventProcessor.setClickCoordinates(get().mapId, pointerPosition);
},
diff --git a/packages/geoview-core/src/geo/map/map-viewer.ts b/packages/geoview-core/src/geo/map/map-viewer.ts
index 12365f032ac..b5459648cac 100644
--- a/packages/geoview-core/src/geo/map/map-viewer.ts
+++ b/packages/geoview-core/src/geo/map/map-viewer.ts
@@ -547,7 +547,7 @@ export class MapViewer {
});
}
}
- }, 250);
+ }, 1000);
}
/**
@@ -692,7 +692,7 @@ export class MapViewer {
this.#checkMapLayersLoaded();
}
}
- }, 250);
+ }, 1000);
}
/**
@@ -726,7 +726,7 @@ export class MapViewer {
this.#emitMapLayersLoaded();
}
}
- }, 250);
+ }, 1000);
}
/**
@@ -761,7 +761,7 @@ export class MapViewer {
resolve();
}
}
- }, 250);
+ }, 1000);
});
}