mirror of
https://github.com/BigBodyCobain/Shadowbroker.git
synced 2026-05-15 04:40:26 +02:00
fc9eff865e
New features: - In-app auto-updater with confirmation dialog, manual download fallback, restart polling, and protected file safety net - Ship layers split into 4 independent toggles (Military/Carriers, Cargo/Tankers, Civilian, Cruise/Passenger) with per-category counts - Stable entity IDs using MMSI/callsign instead of volatile array indices - Dismissible threat alert bubbles (session-scoped, survives data refresh) Performance: - GDELT title fetching is now non-blocking (background enrichment) - Removed duplicate startup fetch jobs - Docker healthcheck start_period 15s → 90s Bug fixes: - Removed fake intelligence assessment generator (OSINT-only policy) - Fixed carrier tracker GDELT 429/TypeError crash - Fixed ETag collision (full payload hash) - Added concurrent /api/refresh guard Contributors: @imqdcr (ship split + stable IDs), @csysp (dismissible alerts, PR #48) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> Former-commit-id: a2c4c67da54345393f70a9b33b52e7e4fd6c049f
26 lines
1.1 KiB
TypeScript
26 lines
1.1 KiB
TypeScript
import { useEffect, useRef } from "react";
|
|
import type { MapRef } from "react-map-gl/maplibre";
|
|
import { EMPTY_FC } from "@/components/map/mapConstants";
|
|
|
|
// Imperatively push GeoJSON data to a MapLibre source, bypassing React reconciliation.
|
|
// This is critical for high-volume layers (flights, ships, satellites, fires) where
|
|
// React's prop diffing on thousands of coordinate arrays causes memory pressure.
|
|
export function useImperativeSource(map: MapRef | null, sourceId: string, geojson: any, debounceMs = 0) {
|
|
const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
useEffect(() => {
|
|
if (!map) return;
|
|
const push = () => {
|
|
const src = map.getSource(sourceId) as any;
|
|
if (src && typeof src.setData === 'function') {
|
|
src.setData(geojson || EMPTY_FC);
|
|
}
|
|
};
|
|
if (debounceMs > 0) {
|
|
if (timerRef.current) clearTimeout(timerRef.current);
|
|
timerRef.current = setTimeout(push, debounceMs);
|
|
return () => { if (timerRef.current) clearTimeout(timerRef.current); };
|
|
}
|
|
push();
|
|
}, [map, sourceId, geojson, debounceMs]);
|
|
}
|