+
Throttle
+
{telemetryData.length > 0 &&
selectedIndex !== null &&
selectedIndex >= 0
diff --git a/dashboard/components/OptimizedTrackMap.tsx b/dashboard/components/OptimizedTrackMap.tsx
index e349606..19eb163 100644
--- a/dashboard/components/OptimizedTrackMap.tsx
+++ b/dashboard/components/OptimizedTrackMap.tsx
@@ -1,38 +1,34 @@
"use client";
-import Feature from "ol/Feature";
-import { LineString, Point } from "ol/geom";
-import TileLayer from "ol/layer/Tile";
-import VectorLayer from "ol/layer/Vector";
-import OlMap from "ol/Map";
-import { fromLonLat } from "ol/proj";
-import VectorSource from "ol/source/Vector";
-import XYZ from "ol/source/XYZ";
-import { Circle, Fill, Stroke, Style } from "ol/style";
-import View from "ol/View";
-import { useCallback, useEffect, useMemo, useRef, useState } from "react";
-import type { TelemetryDataPoint } from "@/lib/types";
-import { usePerformanceMonitor } from "@/hooks/usePerformanceMonitor";
+// Tree-shaken OpenLayers imports for better performance
+import Feature from "ol/Feature.js";
+import { LineString, Point } from "ol/geom.js";
+import TileLayer from "ol/layer/Tile.js";
+import VectorLayer from "ol/layer/Vector.js";
+import OlMap from "ol/Map.js";
+import { fromLonLat } from "ol/proj.js";
+import VectorSource from "ol/source/Vector.js";
+import XYZ from "ol/source/XYZ.js";
+import { Circle, Fill, Stroke, Style } from "ol/style.js";
+import View from "ol/View.js";
+import { memo, useCallback, useEffect, useMemo, useRef } from "react";
+import type { TelemetryDataPoint } from "../lib/types";
interface OptimizedTrackMapProps {
dataWithCoordinates: TelemetryDataPoint[];
selectedPointIndex: number;
onPointClick?: (index: number) => void;
selectedMetric?: string;
+ setSelectedMetric: (metric: string) => void;
+ onMetricChange?: (metric: string) => void;
}
-const MAP_THEMES = {
- dark: {
- name: "Dark",
- url: "https://{a-d}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png",
- },
-};
-
-export default function OptimizedTrackMap({
+export const OptimizedTrackMap = memo(function OptimizedTrackMap({
dataWithCoordinates,
selectedPointIndex,
onPointClick,
selectedMetric = "Speed",
+ setSelectedMetric,
}: OptimizedTrackMapProps) {
const mapRef = useRef(null);
const mapInstanceRef = useRef(null);
@@ -40,23 +36,12 @@ export default function OptimizedTrackMap({
const markerSourceRef = useRef(null);
const trackRenderedRef = useRef(false);
- const [mapTheme, setMapTheme] = useState("dark");
- const [displayMetric, setDisplayMetric] = useState(
- selectedMetric || "Speed",
- );
-
- // PERFORMANCE FIX: Color cache to avoid recalculating same colors
const colorCacheRef = useRef