@xyo-network/react-map 2.64.0 → 2.64.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/AnimatedHeatMapSettings.js +56 -3
- package/dist/browser/AnimatedHeatMapSettings.js.map +1 -1
- package/dist/browser/Colors/index.js +0 -1
- package/dist/browser/Colors/index.js.map +1 -1
- package/dist/browser/Components/AnimatedHeatMap.js +623 -10
- package/dist/browser/Components/AnimatedHeatMap.js.map +1 -1
- package/dist/browser/Components/AnimatedHeatMapLoaded.js +864 -13
- package/dist/browser/Components/AnimatedHeatMapLoaded.js.map +1 -1
- package/dist/browser/Components/HeatMapSettings.js +56 -3
- package/dist/browser/Components/HeatMapSettings.js.map +1 -1
- package/dist/browser/Components/LayerAnimator.js +5 -4
- package/dist/browser/Components/LayerAnimator.js.map +1 -1
- package/dist/browser/Components/Legend.js +32 -7
- package/dist/browser/Components/Legend.js.map +1 -1
- package/dist/browser/Components/Legends/ColorGradient.js +3 -2
- package/dist/browser/Components/Legends/ColorGradient.js.map +1 -1
- package/dist/browser/Components/Legends/index.js +25 -1
- package/dist/browser/Components/Legends/index.js.map +1 -1
- package/dist/browser/Components/MapBox.js +66 -12
- package/dist/browser/Components/MapBox.js.map +1 -1
- package/dist/browser/Components/MapBoxHeat.js +151 -6
- package/dist/browser/Components/MapBoxHeat.js.map +1 -1
- package/dist/browser/Components/MapBoxPoints.js +207 -14
- package/dist/browser/Components/MapBoxPoints.js.map +1 -1
- package/dist/browser/Components/MapSettingsComponents/Setting.js +16 -3
- package/dist/browser/Components/MapSettingsComponents/Setting.js.map +1 -1
- package/dist/browser/Components/MapSettingsComponents/SettingsBox.js +38 -6
- package/dist/browser/Components/MapSettingsComponents/SettingsBox.js.map +1 -1
- package/dist/browser/Components/MapSettingsComponents/index.js +50 -2
- package/dist/browser/Components/MapSettingsComponents/index.js.map +1 -1
- package/dist/browser/Components/index.js +1084 -11
- package/dist/browser/Components/index.js.map +1 -1
- package/dist/browser/Contexts/HeatMapInitializer/Context.js +2 -1
- package/dist/browser/Contexts/HeatMapInitializer/Context.js.map +1 -1
- package/dist/browser/Contexts/HeatMapInitializer/Provider.js +235 -14
- package/dist/browser/Contexts/HeatMapInitializer/Provider.js.map +1 -1
- package/dist/browser/Contexts/HeatMapInitializer/index.js +294 -3
- package/dist/browser/Contexts/HeatMapInitializer/index.js.map +1 -1
- package/dist/browser/Contexts/HeatMapInitializer/useHeatMapInitializer.js +8 -2
- package/dist/browser/Contexts/HeatMapInitializer/useHeatMapInitializer.js.map +1 -1
- package/dist/browser/Contexts/MapBoxInstance/Context.js +2 -1
- package/dist/browser/Contexts/MapBoxInstance/Context.js.map +1 -1
- package/dist/browser/Contexts/MapBoxInstance/Provider.js +9 -3
- package/dist/browser/Contexts/MapBoxInstance/Provider.js.map +1 -1
- package/dist/browser/Contexts/MapBoxInstance/index.js +35 -3
- package/dist/browser/Contexts/MapBoxInstance/index.js.map +1 -1
- package/dist/browser/Contexts/MapBoxInstance/useMapBoxInstance.js +8 -2
- package/dist/browser/Contexts/MapBoxInstance/useMapBoxInstance.js.map +1 -1
- package/dist/browser/Contexts/MapSettings/Context.js +2 -1
- package/dist/browser/Contexts/MapSettings/Context.js.map +1 -1
- package/dist/browser/Contexts/MapSettings/Provider.js +117 -5
- package/dist/browser/Contexts/MapSettings/Provider.js.map +1 -1
- package/dist/browser/Contexts/MapSettings/index.js +148 -3
- package/dist/browser/Contexts/MapSettings/index.js.map +1 -1
- package/dist/browser/Contexts/MapSettings/useMapSettings.js +8 -2
- package/dist/browser/Contexts/MapSettings/useMapSettings.js.map +1 -1
- package/dist/browser/Contexts/MapboxAccessToken/Context.js +2 -1
- package/dist/browser/Contexts/MapboxAccessToken/Context.js.map +1 -1
- package/dist/browser/Contexts/MapboxAccessToken/Provider.js +9 -3
- package/dist/browser/Contexts/MapboxAccessToken/Provider.js.map +1 -1
- package/dist/browser/Contexts/MapboxAccessToken/index.js +22 -4
- package/dist/browser/Contexts/MapboxAccessToken/index.js.map +1 -1
- package/dist/browser/Contexts/MapboxAccessToken/use.js +8 -2
- package/dist/browser/Contexts/MapboxAccessToken/use.js.map +1 -1
- package/dist/browser/Contexts/index.js +459 -4
- package/dist/browser/Contexts/index.js.map +1 -1
- package/dist/browser/Layers/Builders/LocationHeatMapLayerBuilder.js +110 -6
- package/dist/browser/Layers/Builders/LocationHeatMapLayerBuilder.js.map +1 -1
- package/dist/browser/Layers/Builders/LocationHeatMapLayerBuilderAnimated.js +36 -4
- package/dist/browser/Layers/Builders/LocationHeatMapLayerBuilderAnimated.js.map +1 -1
- package/dist/browser/Layers/Builders/LocationPointsMapLayerBuilder.js +40 -4
- package/dist/browser/Layers/Builders/LocationPointsMapLayerBuilder.js.map +1 -1
- package/dist/browser/Layers/Builders/index.js +205 -3
- package/dist/browser/Layers/Builders/index.js.map +1 -1
- package/dist/browser/Layers/CircleLayer.js +3 -2
- package/dist/browser/Layers/CircleLayer.js.map +1 -1
- package/dist/browser/Layers/Configs/HeatMapFillLayerConfig.js +2 -1
- package/dist/browser/Layers/Configs/HeatMapFillLayerConfig.js.map +1 -1
- package/dist/browser/Layers/Configs/HeatMapLineLayerConfig.js +2 -1
- package/dist/browser/Layers/Configs/HeatMapLineLayerConfig.js.map +1 -1
- package/dist/browser/Layers/Configs/HeatMapSymbolLayerConfig.js +2 -1
- package/dist/browser/Layers/Configs/HeatMapSymbolLayerConfig.js.map +1 -1
- package/dist/browser/Layers/Configs/LocationPointLayerConfig.js +2 -1
- package/dist/browser/Layers/Configs/LocationPointLayerConfig.js.map +1 -1
- package/dist/browser/Layers/Configs/index.js +62 -4
- package/dist/browser/Layers/Configs/index.js.map +1 -1
- package/dist/browser/Layers/FillLayer.js +3 -2
- package/dist/browser/Layers/FillLayer.js.map +1 -1
- package/dist/browser/Layers/LineLayer.js +3 -2
- package/dist/browser/Layers/LineLayer.js.map +1 -1
- package/dist/browser/Layers/SymbolLayer.js +3 -2
- package/dist/browser/Layers/SymbolLayer.js.map +1 -1
- package/dist/browser/Layers/index.js +213 -7
- package/dist/browser/Layers/index.js.map +1 -1
- package/dist/browser/MapBoxClasses/MapBase.js +3 -2
- package/dist/browser/MapBoxClasses/MapBase.js.map +1 -1
- package/dist/browser/MapBoxClasses/MapHeat.js +41 -11
- package/dist/browser/MapBoxClasses/MapHeat.js.map +1 -1
- package/dist/browser/MapBoxClasses/MapPoints.js +33 -3
- package/dist/browser/MapBoxClasses/MapPoints.js.map +1 -1
- package/dist/browser/MapBoxClasses/MapSettings.js +6 -5
- package/dist/browser/MapBoxClasses/MapSettings.js.map +1 -1
- package/dist/browser/MapBoxClasses/index.js +288 -4
- package/dist/browser/MapBoxClasses/index.js.map +1 -1
- package/dist/browser/Settings/DefaultMapSettings.js +2 -1
- package/dist/browser/Settings/DefaultMapSettings.js.map +1 -1
- package/dist/browser/Settings/index.js +55 -2
- package/dist/browser/Settings/index.js.map +1 -1
- package/dist/browser/hooks/index.js +156 -5
- package/dist/browser/hooks/index.js.map +1 -1
- package/dist/browser/hooks/useDynamicMapResize.js +2 -1
- package/dist/browser/hooks/useDynamicMapResize.js.map +1 -1
- package/dist/browser/hooks/useDynamicPositioning.js +7 -6
- package/dist/browser/hooks/useDynamicPositioning.js.map +1 -1
- package/dist/browser/hooks/useFindHashes.js +4 -3
- package/dist/browser/hooks/useFindHashes.js.map +1 -1
- package/dist/browser/hooks/useHeatMapColors.js +2 -1
- package/dist/browser/hooks/useHeatMapColors.js.map +1 -1
- package/dist/browser/hooks/useQuadKeyPayloadsToFeatures.js +4 -3
- package/dist/browser/hooks/useQuadKeyPayloadsToFeatures.js.map +1 -1
- package/dist/browser/index.js +1298 -10
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/lib/MapStyle.js +1 -0
- package/dist/browser/lib/MapStyle.js.map +1 -1
- package/dist/browser/lib/index.js +13 -2
- package/dist/browser/lib/index.js.map +1 -1
- package/dist/browser/types/index.js +0 -1
- package/dist/browser/types/index.js.map +1 -1
- package/dist/docs.json +296 -296
- package/package.json +14 -14
|
@@ -1,5 +1,289 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
// src/MapBoxClasses/MapBase.ts
|
|
2
|
+
import { assertEx } from "@xylabs/assert";
|
|
3
|
+
import { GeoJson } from "@xyo-network/sdk-geo";
|
|
4
|
+
var MapBase = class {
|
|
5
|
+
_config;
|
|
6
|
+
constructor(config) {
|
|
7
|
+
this._config = { requestLocation: true, zoom: 2, ...config };
|
|
8
|
+
}
|
|
9
|
+
get isMapReady() {
|
|
10
|
+
return !!this._config.map;
|
|
11
|
+
}
|
|
12
|
+
initializeMapSource(layer) {
|
|
13
|
+
const getSource = () => {
|
|
14
|
+
const featuresCollection = GeoJson.featureCollection(this._config.features);
|
|
15
|
+
return GeoJson.featuresSource(featuresCollection);
|
|
16
|
+
};
|
|
17
|
+
const existingSource = this._config.map.getSource(layer.source);
|
|
18
|
+
const source = getSource();
|
|
19
|
+
if (existingSource) {
|
|
20
|
+
existingSource.setData(assertEx(source.data));
|
|
21
|
+
} else {
|
|
22
|
+
this._config.map.addSource(layer.source, source);
|
|
23
|
+
}
|
|
24
|
+
layer.update(this._config.map, true);
|
|
25
|
+
return this;
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
// src/MapBoxClasses/MapHeat.ts
|
|
30
|
+
import { assertEx as assertEx2 } from "@xylabs/assert";
|
|
31
|
+
import { delay } from "@xylabs/delay";
|
|
32
|
+
import { forget } from "@xylabs/forget";
|
|
33
|
+
import { GeoJson as GeoJson2 } from "@xyo-network/sdk-geo";
|
|
34
|
+
import { LngLatBounds } from "mapbox-gl";
|
|
35
|
+
var MapHeat = class extends MapBase {
|
|
36
|
+
static animationStarted = false;
|
|
37
|
+
config;
|
|
38
|
+
constructor(config) {
|
|
39
|
+
super(config);
|
|
40
|
+
this.config = config;
|
|
41
|
+
}
|
|
42
|
+
static initialMapPositioning(options, map, features, initialBounds) {
|
|
43
|
+
if (!features) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
let bounds;
|
|
47
|
+
if (initialBounds) {
|
|
48
|
+
bounds = initialBounds;
|
|
49
|
+
} else {
|
|
50
|
+
bounds = new LngLatBounds();
|
|
51
|
+
features.forEach((feature) => {
|
|
52
|
+
feature.geometry.coordinates.forEach((coordinates) => {
|
|
53
|
+
coordinates.forEach((position) => {
|
|
54
|
+
bounds.extend(position);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
map.setCenter(bounds.getCenter());
|
|
60
|
+
map.fitBounds(bounds, options);
|
|
61
|
+
return this;
|
|
62
|
+
}
|
|
63
|
+
static async initializeAnimatedHeatMapSource(layers, featureSet, map, startColor, endColor) {
|
|
64
|
+
this.animationStarted = true;
|
|
65
|
+
let layerTick = 0;
|
|
66
|
+
let sourceTick = 0;
|
|
67
|
+
const sources = featureSet.map((feature) => {
|
|
68
|
+
const featuresCollection = GeoJson2.featureCollection(feature);
|
|
69
|
+
return GeoJson2.featuresSource(featuresCollection);
|
|
70
|
+
});
|
|
71
|
+
this.updateLayer(map, layers[0], sources[0]);
|
|
72
|
+
this.updateLayer(map, layers[1], sources[1]);
|
|
73
|
+
layers.forEach((layer) => {
|
|
74
|
+
map.setPaintProperty(layer.id, "fill-opacity", 0);
|
|
75
|
+
});
|
|
76
|
+
const frameLength = 3e3;
|
|
77
|
+
const initialPad = 0.5;
|
|
78
|
+
const factor = 10;
|
|
79
|
+
const steps = 30;
|
|
80
|
+
const stepLength = frameLength / steps;
|
|
81
|
+
const lowUsageColor = startColor ?? "#FFB3B3";
|
|
82
|
+
const highUsageColor = endColor ?? "#FF0000";
|
|
83
|
+
const dynamicFillColor = (factor2, initialPad2, i) => {
|
|
84
|
+
const sinFade = Math.sin(i / steps * Math.PI / 2);
|
|
85
|
+
const cosFade = Math.cos(i / steps * Math.PI / 2);
|
|
86
|
+
const divisor = factor2 + factor2 * sinFade;
|
|
87
|
+
const offset = initialPad2 * cosFade;
|
|
88
|
+
return [
|
|
89
|
+
"let",
|
|
90
|
+
"density",
|
|
91
|
+
["+", ["/", ["number", ["get", "value"]], divisor], offset],
|
|
92
|
+
["interpolate", ["linear"], ["var", "density"], 0, lowUsageColor, 0.5, highUsageColor]
|
|
93
|
+
];
|
|
94
|
+
};
|
|
95
|
+
const fadedIn = layers.map((_) => false);
|
|
96
|
+
const fadeIn = async (id, index) => {
|
|
97
|
+
for (let i = steps; i >= 1; i--) {
|
|
98
|
+
map.setPaintProperty(id, "fill-color", dynamicFillColor(factor, initialPad, i * (180 / stepLength)));
|
|
99
|
+
await delay(stepLength);
|
|
100
|
+
}
|
|
101
|
+
fadedIn[index] = true;
|
|
102
|
+
};
|
|
103
|
+
const fadeOut = async (id, index) => {
|
|
104
|
+
for (let i = 1; i <= steps; i++) {
|
|
105
|
+
map.setPaintProperty(id, "fill-color", dynamicFillColor(factor, initialPad, i * (180 / stepLength)));
|
|
106
|
+
await delay(stepLength);
|
|
107
|
+
}
|
|
108
|
+
fadedIn[index] = false;
|
|
109
|
+
};
|
|
110
|
+
let started = false;
|
|
111
|
+
const startAnimation = async () => {
|
|
112
|
+
assertEx2(!started, "Animation Already Started");
|
|
113
|
+
started = true;
|
|
114
|
+
while (this.animationStarted) {
|
|
115
|
+
const upLayer = layerTick % layers.length;
|
|
116
|
+
const downLayer = (layerTick + 1) % layers.length;
|
|
117
|
+
const incomingSource = sourceTick % featureSet.length;
|
|
118
|
+
const outgoingSource = (sourceTick + 1) % featureSet.length;
|
|
119
|
+
if (fadedIn[upLayer]) {
|
|
120
|
+
this.updateLayer(map, layers[upLayer], sources[incomingSource]);
|
|
121
|
+
forget(fadeOut(layers[upLayer].id, upLayer));
|
|
122
|
+
}
|
|
123
|
+
if (!fadedIn[downLayer]) {
|
|
124
|
+
this.updateLayer(map, layers[downLayer], sources[outgoingSource]);
|
|
125
|
+
forget(fadeIn(layers[downLayer].id, downLayer));
|
|
126
|
+
}
|
|
127
|
+
while ((fadedIn[upLayer] || !fadedIn[downLayer]) && this.animationStarted) {
|
|
128
|
+
await delay(1e3);
|
|
129
|
+
}
|
|
130
|
+
layerTick++;
|
|
131
|
+
sourceTick++;
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
await startAnimation();
|
|
135
|
+
}
|
|
136
|
+
static updateLayer(map, layer, source) {
|
|
137
|
+
const existingSource = map.getSource(layer.source);
|
|
138
|
+
if (existingSource && source.data) {
|
|
139
|
+
existingSource.setData(source.data);
|
|
140
|
+
} else if (source) {
|
|
141
|
+
map.addSource(layer.source, source);
|
|
142
|
+
}
|
|
143
|
+
layer.update(map, true);
|
|
144
|
+
}
|
|
145
|
+
// Build layers each with the same features
|
|
146
|
+
initializeHeatMapSource(layers) {
|
|
147
|
+
const getSource = (_) => {
|
|
148
|
+
const featuresCollection = GeoJson2.featureCollection(this.config.features);
|
|
149
|
+
return GeoJson2.featuresSource(featuresCollection);
|
|
150
|
+
};
|
|
151
|
+
layers.forEach((layer, index) => {
|
|
152
|
+
const existingSource = this.config.map.getSource(layer.source);
|
|
153
|
+
const source = getSource(index);
|
|
154
|
+
if (existingSource) {
|
|
155
|
+
existingSource.setData(assertEx2(source.data));
|
|
156
|
+
} else {
|
|
157
|
+
this.config.map.addSource(layer.source, source);
|
|
158
|
+
}
|
|
159
|
+
layer.update(this.config.map, true);
|
|
160
|
+
});
|
|
161
|
+
return this;
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
// src/MapBoxClasses/MapPoints.ts
|
|
166
|
+
import { LngLatBounds as LngLatBounds2 } from "mapbox-gl";
|
|
167
|
+
var MapPoints = class extends MapBase {
|
|
168
|
+
config;
|
|
169
|
+
constructor(config) {
|
|
170
|
+
super(config);
|
|
171
|
+
this.config = config;
|
|
172
|
+
}
|
|
173
|
+
initialMapPositioning(options, initialBounds) {
|
|
174
|
+
let bounds;
|
|
175
|
+
if (initialBounds) {
|
|
176
|
+
bounds = initialBounds;
|
|
177
|
+
} else {
|
|
178
|
+
bounds = new LngLatBounds2();
|
|
179
|
+
this.config.features.forEach((feature) => {
|
|
180
|
+
bounds.extend(feature.geometry.coordinates);
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
this.config.map.setCenter(bounds.getCenter());
|
|
184
|
+
this.config.map.fitBounds(bounds, options);
|
|
185
|
+
return this.config.map;
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
// src/MapBoxClasses/MapSettings.ts
|
|
190
|
+
import { GeolocateControl, NavigationControl } from "mapbox-gl";
|
|
191
|
+
var MapSettings = class _MapSettings {
|
|
192
|
+
static geoLocateControl;
|
|
193
|
+
static mapListeners = {
|
|
194
|
+
logData: (ev, map) => {
|
|
195
|
+
const target = map || ev?.target;
|
|
196
|
+
if (target) {
|
|
197
|
+
console.log("zoom", target.getZoom());
|
|
198
|
+
console.log("center", target.getCenter());
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
static navControl;
|
|
203
|
+
static requestLocation;
|
|
204
|
+
static toggleControls(value, map, zoom, requestLocation) {
|
|
205
|
+
if (value) {
|
|
206
|
+
_MapSettings.addControls(map, zoom, requestLocation);
|
|
207
|
+
} else {
|
|
208
|
+
_MapSettings.removeControls(map);
|
|
209
|
+
}
|
|
210
|
+
return this;
|
|
211
|
+
}
|
|
212
|
+
static toggleDebugLayer(value, map, layerName) {
|
|
213
|
+
const debugLayer = map.getLayer(layerName);
|
|
214
|
+
if (debugLayer) {
|
|
215
|
+
if (value) {
|
|
216
|
+
map.setLayoutProperty(layerName, "visibility", "visible");
|
|
217
|
+
} else {
|
|
218
|
+
map.setLayoutProperty(layerName, "visibility", "none");
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return this;
|
|
222
|
+
}
|
|
223
|
+
static toggleDebugLogging(value, map) {
|
|
224
|
+
const debugEvents = ["resize", "zoomend", "dragend"];
|
|
225
|
+
if (value) {
|
|
226
|
+
this.mapListeners.logData(void 0, map);
|
|
227
|
+
debugEvents.forEach((event) => map.on(event, this.mapListeners.logData));
|
|
228
|
+
} else {
|
|
229
|
+
debugEvents.forEach((event) => map.off(event, this.mapListeners.logData));
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
static toggleScrollToZoom(value, map) {
|
|
233
|
+
if (value) {
|
|
234
|
+
map.scrollZoom.enable();
|
|
235
|
+
} else {
|
|
236
|
+
map.scrollZoom.disable();
|
|
237
|
+
}
|
|
238
|
+
return this;
|
|
239
|
+
}
|
|
240
|
+
static updateSettings(config) {
|
|
241
|
+
const { settings, map, zoom, requestLocation, debugLayerName = "" } = config;
|
|
242
|
+
const { scrollToZoom, enableControls, debugLayer, debugLogging } = settings;
|
|
243
|
+
_MapSettings.toggleControls(enableControls?.value, map, zoom, requestLocation).toggleScrollToZoom(scrollToZoom?.value, map).toggleDebugLayer(debugLayer?.value, map, debugLayerName).toggleDebugLogging(debugLogging.value, map);
|
|
244
|
+
}
|
|
245
|
+
// Needs to be static so we ensure controls are only instantiated once
|
|
246
|
+
static addControls(map, zoom, requestLocation) {
|
|
247
|
+
const geolocateControl = new GeolocateControl({
|
|
248
|
+
fitBoundsOptions: {
|
|
249
|
+
zoom: zoom || 2
|
|
250
|
+
},
|
|
251
|
+
positionOptions: {
|
|
252
|
+
enableHighAccuracy: true
|
|
253
|
+
},
|
|
254
|
+
trackUserLocation: true
|
|
255
|
+
});
|
|
256
|
+
const navControl = new NavigationControl({
|
|
257
|
+
showCompass: false
|
|
258
|
+
});
|
|
259
|
+
this.geoLocateControl = this.geoLocateControl || geolocateControl;
|
|
260
|
+
this.navControl = this.navControl || navControl;
|
|
261
|
+
if (!map.hasControl(this.geoLocateControl)) {
|
|
262
|
+
if (requestLocation) {
|
|
263
|
+
map.addControl(this.geoLocateControl);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
if (!map.hasControl(this.navControl)) {
|
|
267
|
+
map.addControl(this.navControl, "top-left");
|
|
268
|
+
}
|
|
269
|
+
return this;
|
|
270
|
+
}
|
|
271
|
+
static removeControls(map) {
|
|
272
|
+
if (this.geoLocateControl && map.hasControl(this.geoLocateControl)) {
|
|
273
|
+
if (this.requestLocation) {
|
|
274
|
+
map.removeControl(this.geoLocateControl);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
if (this.navControl && map.hasControl(this.navControl)) {
|
|
278
|
+
map.removeControl(this.navControl);
|
|
279
|
+
}
|
|
280
|
+
return this;
|
|
281
|
+
}
|
|
282
|
+
};
|
|
283
|
+
export {
|
|
284
|
+
MapBase,
|
|
285
|
+
MapHeat,
|
|
286
|
+
MapPoints,
|
|
287
|
+
MapSettings
|
|
288
|
+
};
|
|
5
289
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/MapBoxClasses/index.ts"],"sourcesContent":["export * from './MapBase'\nexport * from './MapHeat'\nexport * from './MapPoints'\nexport * from './MapSettings'\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/MapBoxClasses/MapBase.ts","../../../src/MapBoxClasses/MapHeat.ts","../../../src/MapBoxClasses/MapPoints.ts","../../../src/MapBoxClasses/MapSettings.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { GeoJson } from '@xyo-network/sdk-geo'\nimport { Feature, Geometry } from 'geojson'\n// eslint-disable-next-line no-restricted-imports\nimport { GeoJSONSource, Map } from 'mapbox-gl'\n\nimport { MapLayer } from '../Layers'\n\nexport interface MapBaseConfig<T extends Geometry> {\n features: Feature<T>[]\n map: Map\n requestLocation?: boolean\n zoom?: number\n}\n\nexport abstract class MapBase<T extends Geometry> {\n private _config: MapBaseConfig<T>\n\n constructor(config: MapBaseConfig<T>) {\n this._config = { requestLocation: true, zoom: 2, ...config }\n }\n\n get isMapReady() {\n return !!this._config.map\n }\n\n initializeMapSource(layer: MapLayer) {\n const getSource = () => {\n const featuresCollection = GeoJson.featureCollection(this._config.features)\n return GeoJson.featuresSource(featuresCollection)\n }\n\n const existingSource = this._config.map.getSource(layer.source as string) as GeoJSONSource\n const source = getSource()\n if (existingSource) {\n existingSource.setData(assertEx(source.data as GeoJSON.Feature<GeoJSON.Geometry> | GeoJSON.FeatureCollection<GeoJSON.Geometry>))\n } else {\n this._config.map.addSource(layer.source as string, source)\n }\n layer.update(this._config.map, true)\n\n return this\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { delay } from '@xylabs/delay'\nimport { forget } from '@xylabs/forget'\nimport { GeoJson } from '@xyo-network/sdk-geo'\nimport { Feature, Polygon } from 'geojson'\nimport { FitBoundsOptions, GeoJSONSource, GeoJSONSourceRaw, LngLatBounds, Map } from 'mapbox-gl'\n\nimport { MapLayer } from '../Layers'\nimport { MapBase, MapBaseConfig } from './MapBase'\n\nexport class MapHeat extends MapBase<Polygon> {\n static animationStarted = false\n\n config: MapBaseConfig<Polygon>\n constructor(config: MapBaseConfig<Polygon>) {\n super(config)\n this.config = config\n }\n\n static initialMapPositioning(options: FitBoundsOptions, map: Map, features?: Feature<Polygon>[], initialBounds?: LngLatBounds) {\n if (!features) {\n return\n }\n\n let bounds: LngLatBounds\n\n if (initialBounds) {\n bounds = initialBounds\n } else {\n bounds = new LngLatBounds()\n\n features.forEach((feature: Feature<Polygon>) => {\n feature.geometry.coordinates.forEach((coordinates) => {\n coordinates.forEach((position) => {\n bounds.extend(position as [number, number])\n })\n })\n })\n }\n\n map.setCenter(bounds.getCenter())\n map.fitBounds(bounds, options)\n return this\n }\n\n static async initializeAnimatedHeatMapSource(\n layers: MapLayer[],\n featureSet: Feature<Polygon>[][],\n map: Map,\n startColor?: string,\n endColor?: string,\n ) {\n this.animationStarted = true\n let layerTick = 0\n let sourceTick = 0\n\n const sources = featureSet.map((feature) => {\n const featuresCollection = GeoJson.featureCollection(feature)\n return GeoJson.featuresSource(featuresCollection)\n })\n this.updateLayer(map, layers[0], sources[0])\n this.updateLayer(map, layers[1], sources[1])\n\n layers.forEach((layer) => {\n map.setPaintProperty(layer.id, 'fill-opacity', 0)\n })\n\n const frameLength = 3000\n const initialPad = 0.5\n const factor = 10\n const steps = 30\n const stepLength = frameLength / steps\n const lowUsageColor = startColor ?? '#FFB3B3'\n const highUsageColor = endColor ?? '#FF0000'\n\n // Max density at i=0, min density at i=steps\n const dynamicFillColor = (factor: number, initialPad: number, i: number) => {\n const sinFade = Math.sin(((i / steps) * Math.PI) / 2)\n const cosFade = Math.cos(((i / steps) * Math.PI) / 2)\n // we want the divisor to always be at least 1x the desired factor but will go up to\n // 2x factor to account for combinative effect of the overlay of two layers at once\n const divisor = factor + factor * sinFade\n const offset = initialPad * cosFade\n return [\n 'let',\n 'density',\n ['+', ['/', ['number', ['get', 'value']], divisor], offset],\n ['interpolate', ['linear'], ['var', 'density'], 0, lowUsageColor, 0.5, highUsageColor],\n ]\n }\n\n const fadedIn: boolean[] = layers.map((_) => false)\n\n const fadeIn = async (id: string, index: number) => {\n for (let i = steps; i >= 1; i--) {\n map.setPaintProperty(id, 'fill-color', dynamicFillColor(factor, initialPad, i * (180 / stepLength)))\n await delay(stepLength)\n }\n fadedIn[index] = true\n }\n\n const fadeOut = async (id: string, index: number) => {\n for (let i = 1; i <= steps; i++) {\n map.setPaintProperty(id, 'fill-color', dynamicFillColor(factor, initialPad, i * (180 / stepLength)))\n await delay(stepLength)\n }\n fadedIn[index] = false\n }\n\n let started = false\n const startAnimation = async () => {\n assertEx(!started, 'Animation Already Started')\n started = true\n while (this.animationStarted) {\n const upLayer = layerTick % layers.length\n const downLayer = (layerTick + 1) % layers.length\n\n const incomingSource = sourceTick % featureSet.length\n const outgoingSource = (sourceTick + 1) % featureSet.length\n\n // console.log('incoming / outgoing source', incomingSource, outgoingSource)\n\n // console.log(`animate: [${upLayer}, ${downLayer}]`)\n if (fadedIn[upLayer]) {\n this.updateLayer(map, layers[upLayer], sources[incomingSource])\n forget(fadeOut(layers[upLayer].id, upLayer))\n }\n if (!fadedIn[downLayer]) {\n this.updateLayer(map, layers[downLayer], sources[outgoingSource])\n forget(fadeIn(layers[downLayer].id, downLayer))\n }\n while ((fadedIn[upLayer] || !fadedIn[downLayer]) && this.animationStarted) {\n // console.log(`checking: [${fadedIn[upLayer]}, ${!fadedIn[downLayer]}]`)\n await delay(1000)\n }\n layerTick++\n sourceTick++\n\n // console.log(`this.layerTick: ${layerTick}`)\n // console.log(`this.sourceTick: ${sourceTick}`)\n }\n }\n\n await startAnimation()\n }\n\n private static updateLayer(map: Map, layer: MapLayer, source: GeoJSONSourceRaw) {\n const existingSource = map.getSource(layer.source as string) as GeoJSONSource\n if (existingSource && source.data) {\n existingSource.setData(source.data as GeoJSON.Feature<GeoJSON.Geometry> | GeoJSON.FeatureCollection<GeoJSON.Geometry>)\n } else if (source) {\n map.addSource(layer.source as string, source)\n }\n layer.update(map, true)\n }\n\n // Build layers each with the same features\n initializeHeatMapSource(layers: MapLayer[]) {\n const getSource = (_: number) => {\n const featuresCollection = GeoJson.featureCollection(this.config.features)\n return GeoJson.featuresSource(featuresCollection)\n }\n\n layers.forEach((layer, index) => {\n const existingSource = this.config.map.getSource(layer.source as string) as GeoJSONSource\n const source = getSource(index)\n if (existingSource) {\n existingSource.setData(assertEx(source.data) as GeoJSON.Feature<GeoJSON.Geometry> | GeoJSON.FeatureCollection<GeoJSON.Geometry>)\n } else {\n this.config.map.addSource(layer.source as string, source)\n }\n layer.update(this.config.map, true)\n })\n\n return this\n }\n}\n","import { Feature, Point } from 'geojson'\n// eslint-disable-next-line no-restricted-imports\nimport { FitBoundsOptions, LngLatBounds } from 'mapbox-gl'\n\nimport { MapBase, MapBaseConfig } from './MapBase'\n\nexport interface MapPointsConfig extends MapBaseConfig<Point> {\n features: Feature<Point>[]\n}\n\nexport class MapPoints extends MapBase<Point> {\n private config: MapPointsConfig\n\n constructor(config: MapPointsConfig) {\n super(config)\n this.config = config\n }\n\n initialMapPositioning(options: FitBoundsOptions, initialBounds?: LngLatBounds) {\n let bounds: LngLatBounds\n\n if (initialBounds) {\n bounds = initialBounds\n } else {\n bounds = new LngLatBounds()\n\n this.config.features.forEach((feature: Feature<Point>) => {\n bounds.extend(feature.geometry.coordinates as [number, number])\n })\n }\n\n this.config.map.setCenter(bounds.getCenter())\n this.config.map.fitBounds(bounds, options)\n\n return this.config.map\n }\n}\n","import { EventData, GeolocateControl, Map, MapLayerMouseEvent, MapLayerTouchEvent, NavigationControl } from 'mapbox-gl'\n\nimport { MapSetting } from '../Settings'\n\nexport interface MapSettingsConfig {\n debugLayerName?: string\n map: Map\n requestLocation?: boolean\n settings: MapSetting\n zoom?: number\n}\n\n/**\n * Utility class to handle changes in settings\n *\n * Methods are pure functions dedicated to map manipulation\n */\nexport class MapSettings {\n static geoLocateControl: GeolocateControl | undefined\n static mapListeners = {\n logData: (ev?: MapLayerMouseEvent | (MapLayerTouchEvent & EventData), map?: Map) => {\n const target = map || ev?.target\n if (target) {\n console.log('zoom', target.getZoom())\n console.log('center', target.getCenter())\n }\n },\n }\n static navControl: NavigationControl | undefined\n static requestLocation: boolean | undefined\n\n static toggleControls(value: boolean | undefined, map: Map, zoom?: number, requestLocation?: boolean) {\n if (value) {\n MapSettings.addControls(map, zoom, requestLocation)\n } else {\n MapSettings.removeControls(map)\n }\n\n return this\n }\n\n static toggleDebugLayer(value: boolean | undefined, map: Map, layerName: string) {\n const debugLayer = map.getLayer(layerName)\n if (debugLayer) {\n if (value) {\n map.setLayoutProperty(layerName, 'visibility', 'visible')\n } else {\n map.setLayoutProperty(layerName, 'visibility', 'none')\n }\n }\n\n return this\n }\n\n static toggleDebugLogging(value: boolean | undefined, map: Map) {\n const debugEvents = ['resize', 'zoomend', 'dragend']\n if (value) {\n // initial values\n this.mapListeners.logData(undefined, map)\n debugEvents.forEach((event) => map.on(event, this.mapListeners.logData))\n } else {\n debugEvents.forEach((event) => map.off(event, this.mapListeners.logData))\n }\n }\n\n static toggleScrollToZoom(value: boolean | undefined, map: Map) {\n if (value) {\n map.scrollZoom.enable()\n } else {\n map.scrollZoom.disable()\n }\n\n return this\n }\n\n static updateSettings(config: MapSettingsConfig) {\n const { settings, map, zoom, requestLocation, debugLayerName = '' } = config\n const { scrollToZoom, enableControls, debugLayer, debugLogging } = settings\n\n MapSettings.toggleControls(enableControls?.value, map, zoom, requestLocation)\n .toggleScrollToZoom(scrollToZoom?.value, map)\n .toggleDebugLayer(debugLayer?.value, map, debugLayerName)\n .toggleDebugLogging(debugLogging.value, map)\n }\n\n // Needs to be static so we ensure controls are only instantiated once\n private static addControls(map: Map, zoom?: number, requestLocation?: boolean) {\n const geolocateControl = new GeolocateControl({\n fitBoundsOptions: {\n zoom: zoom || 2,\n },\n positionOptions: {\n enableHighAccuracy: true,\n },\n trackUserLocation: true,\n })\n\n const navControl = new NavigationControl({\n showCompass: false,\n })\n\n this.geoLocateControl = this.geoLocateControl || geolocateControl\n this.navControl = this.navControl || navControl\n\n if (!map.hasControl(this.geoLocateControl)) {\n if (requestLocation) {\n map.addControl(this.geoLocateControl)\n }\n }\n\n if (!map.hasControl(this.navControl)) {\n map.addControl(this.navControl, 'top-left')\n }\n\n return this\n }\n\n private static removeControls(map: Map) {\n if (this.geoLocateControl && map.hasControl(this.geoLocateControl)) {\n if (this.requestLocation) {\n map.removeControl(this.geoLocateControl)\n }\n }\n\n if (this.navControl && map.hasControl(this.navControl)) {\n map.removeControl(this.navControl)\n }\n\n return this\n }\n}\n"],"mappings":"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","names":["assertEx","GeoJson","GeoJson","factor","initialPad","assertEx","LngLatBounds","LngLatBounds"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/Settings/DefaultMapSettings.ts"],"sourcesContent":["import { MapSetting } from './MapSetting'\n\nexport const DefaultMapSettings: () => MapSetting = () => ({\n debugLayer: {\n devMode: true,\n field: 'debugLayer',\n hidden: true,\n label: 'Debug Layer',\n value: false,\n },\n debugLogging: {\n devMode: true,\n field: 'debugLogging',\n hidden: true,\n label: 'Debug Logging',\n value: false,\n },\n dynamicMapResize: {\n devMode: true,\n field: 'dynamicMapResize',\n hidden: true,\n label: 'Auto Map Resize',\n value: true,\n },\n enableControls: {\n devMode: true,\n field: 'enableControls',\n hidden: true,\n label: 'Map Controls',\n value: false,\n },\n fitToPoints: {\n devMode: true,\n field: 'fitToPoints',\n hidden: true,\n label: 'Fit To Points',\n value: false,\n },\n preferDark: {\n devMode: false,\n field: 'preferDark',\n hidden: true,\n label: 'Prefer dark',\n value: false,\n },\n scrollToZoom: {\n devMode: true,\n field: 'scrollToZoom',\n hidden: true,\n label: 'Scroll To Zoom',\n value: false,\n },\n})\n"],"mappings":"AAEO,
|
|
1
|
+
{"version":3,"sources":["../../../src/Settings/DefaultMapSettings.ts"],"sourcesContent":["import { MapSetting } from './MapSetting'\n\nexport const DefaultMapSettings: () => MapSetting = () => ({\n debugLayer: {\n devMode: true,\n field: 'debugLayer',\n hidden: true,\n label: 'Debug Layer',\n value: false,\n },\n debugLogging: {\n devMode: true,\n field: 'debugLogging',\n hidden: true,\n label: 'Debug Logging',\n value: false,\n },\n dynamicMapResize: {\n devMode: true,\n field: 'dynamicMapResize',\n hidden: true,\n label: 'Auto Map Resize',\n value: true,\n },\n enableControls: {\n devMode: true,\n field: 'enableControls',\n hidden: true,\n label: 'Map Controls',\n value: false,\n },\n fitToPoints: {\n devMode: true,\n field: 'fitToPoints',\n hidden: true,\n label: 'Fit To Points',\n value: false,\n },\n preferDark: {\n devMode: false,\n field: 'preferDark',\n hidden: true,\n label: 'Prefer dark',\n value: false,\n },\n scrollToZoom: {\n devMode: true,\n field: 'scrollToZoom',\n hidden: true,\n label: 'Scroll To Zoom',\n value: false,\n },\n})\n"],"mappings":";AAEO,IAAM,qBAAuC,OAAO;AAAA,EACzD,YAAY;AAAA,IACV,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAAA,EACA,cAAc;AAAA,IACZ,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAAA,EACA,kBAAkB;AAAA,IAChB,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAAA,EACA,gBAAgB;AAAA,IACd,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAAA,EACA,aAAa;AAAA,IACX,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAAA,EACA,YAAY;AAAA,IACV,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAAA,EACA,cAAc;AAAA,IACZ,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AACF;","names":[]}
|
|
@@ -1,3 +1,56 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
// src/Settings/DefaultMapSettings.ts
|
|
2
|
+
var DefaultMapSettings = () => ({
|
|
3
|
+
debugLayer: {
|
|
4
|
+
devMode: true,
|
|
5
|
+
field: "debugLayer",
|
|
6
|
+
hidden: true,
|
|
7
|
+
label: "Debug Layer",
|
|
8
|
+
value: false
|
|
9
|
+
},
|
|
10
|
+
debugLogging: {
|
|
11
|
+
devMode: true,
|
|
12
|
+
field: "debugLogging",
|
|
13
|
+
hidden: true,
|
|
14
|
+
label: "Debug Logging",
|
|
15
|
+
value: false
|
|
16
|
+
},
|
|
17
|
+
dynamicMapResize: {
|
|
18
|
+
devMode: true,
|
|
19
|
+
field: "dynamicMapResize",
|
|
20
|
+
hidden: true,
|
|
21
|
+
label: "Auto Map Resize",
|
|
22
|
+
value: true
|
|
23
|
+
},
|
|
24
|
+
enableControls: {
|
|
25
|
+
devMode: true,
|
|
26
|
+
field: "enableControls",
|
|
27
|
+
hidden: true,
|
|
28
|
+
label: "Map Controls",
|
|
29
|
+
value: false
|
|
30
|
+
},
|
|
31
|
+
fitToPoints: {
|
|
32
|
+
devMode: true,
|
|
33
|
+
field: "fitToPoints",
|
|
34
|
+
hidden: true,
|
|
35
|
+
label: "Fit To Points",
|
|
36
|
+
value: false
|
|
37
|
+
},
|
|
38
|
+
preferDark: {
|
|
39
|
+
devMode: false,
|
|
40
|
+
field: "preferDark",
|
|
41
|
+
hidden: true,
|
|
42
|
+
label: "Prefer dark",
|
|
43
|
+
value: false
|
|
44
|
+
},
|
|
45
|
+
scrollToZoom: {
|
|
46
|
+
devMode: true,
|
|
47
|
+
field: "scrollToZoom",
|
|
48
|
+
hidden: true,
|
|
49
|
+
label: "Scroll To Zoom",
|
|
50
|
+
value: false
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
export {
|
|
54
|
+
DefaultMapSettings
|
|
55
|
+
};
|
|
3
56
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/Settings/
|
|
1
|
+
{"version":3,"sources":["../../../src/Settings/DefaultMapSettings.ts"],"sourcesContent":["import { MapSetting } from './MapSetting'\n\nexport const DefaultMapSettings: () => MapSetting = () => ({\n debugLayer: {\n devMode: true,\n field: 'debugLayer',\n hidden: true,\n label: 'Debug Layer',\n value: false,\n },\n debugLogging: {\n devMode: true,\n field: 'debugLogging',\n hidden: true,\n label: 'Debug Logging',\n value: false,\n },\n dynamicMapResize: {\n devMode: true,\n field: 'dynamicMapResize',\n hidden: true,\n label: 'Auto Map Resize',\n value: true,\n },\n enableControls: {\n devMode: true,\n field: 'enableControls',\n hidden: true,\n label: 'Map Controls',\n value: false,\n },\n fitToPoints: {\n devMode: true,\n field: 'fitToPoints',\n hidden: true,\n label: 'Fit To Points',\n value: false,\n },\n preferDark: {\n devMode: false,\n field: 'preferDark',\n hidden: true,\n label: 'Prefer dark',\n value: false,\n },\n scrollToZoom: {\n devMode: true,\n field: 'scrollToZoom',\n hidden: true,\n label: 'Scroll To Zoom',\n value: false,\n },\n})\n"],"mappings":";AAEO,IAAM,qBAAuC,OAAO;AAAA,EACzD,YAAY;AAAA,IACV,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAAA,EACA,cAAc;AAAA,IACZ,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAAA,EACA,kBAAkB;AAAA,IAChB,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAAA,EACA,gBAAgB;AAAA,IACd,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAAA,EACA,aAAa;AAAA,IACX,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAAA,EACA,YAAY;AAAA,IACV,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAAA,EACA,cAAc;AAAA,IACZ,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AACF;","names":[]}
|
|
@@ -1,6 +1,157 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
// src/hooks/useDynamicMapResize.tsx
|
|
2
|
+
import { useEffect, useMemo, useState } from "react";
|
|
3
|
+
var useDynamicMapResize = (mapContainerRef, mapCanvasRef, mapInstance, active = true) => {
|
|
4
|
+
const [dependenciesReady, setDependenciesReady] = useState(false);
|
|
5
|
+
const resizer = useMemo(
|
|
6
|
+
() => new ResizeObserver(() => {
|
|
7
|
+
const width = mapContainerRef.current?.getBoundingClientRect().width;
|
|
8
|
+
if (width && mapCanvasRef.current) {
|
|
9
|
+
mapCanvasRef.current.style.width = `${width}px`;
|
|
10
|
+
setTimeout(() => mapInstance?.resize());
|
|
11
|
+
}
|
|
12
|
+
}),
|
|
13
|
+
[mapCanvasRef, mapContainerRef, mapInstance]
|
|
14
|
+
);
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
const dependenciesReady2 = !!(active && mapInstance && mapContainerRef?.current && mapCanvasRef.current);
|
|
17
|
+
setDependenciesReady(dependenciesReady2);
|
|
18
|
+
}, [active, mapCanvasRef, mapContainerRef, mapInstance]);
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
if (dependenciesReady) {
|
|
21
|
+
if (mapContainerRef.current) {
|
|
22
|
+
resizer.observe(mapContainerRef.current);
|
|
23
|
+
}
|
|
24
|
+
return () => {
|
|
25
|
+
resizer.disconnect();
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
}, [active, dependenciesReady, mapCanvasRef, mapContainerRef, mapInstance, resizer]);
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
// src/hooks/useDynamicPositioning.tsx
|
|
32
|
+
import { useWindowSize } from "@xylabs/react-shared";
|
|
33
|
+
import { useEffect as useEffect2, useState as useState2 } from "react";
|
|
34
|
+
var defaultZoom = 1.6;
|
|
35
|
+
var defaultAspectRatioRange = [0.5, 2];
|
|
36
|
+
var latRange = [0.9121644205263664, 1.71785031559439];
|
|
37
|
+
var lngRange = [-81.4742014851959, 12.788958675506933];
|
|
38
|
+
var linearInterpolate = (aspectRatio, degreeRange, aspectRatioRange) => {
|
|
39
|
+
const [degreeMin, degreeMax] = degreeRange;
|
|
40
|
+
const [aspectRatioMin, aspectRatioMax] = aspectRatioRange || defaultAspectRatioRange;
|
|
41
|
+
const aspectRatioRangeSpan = aspectRatioMax - aspectRatioMin;
|
|
42
|
+
const degreeRangeSpan = degreeMax - degreeMin;
|
|
43
|
+
const percent = (aspectRatio - aspectRatioMin) / aspectRatioRangeSpan;
|
|
44
|
+
const scaledDegree = percent * degreeRangeSpan + degreeMin;
|
|
45
|
+
return scaledDegree;
|
|
46
|
+
};
|
|
47
|
+
var useDynamicPositioning = () => {
|
|
48
|
+
const [options, setOptions] = useState2({});
|
|
49
|
+
const { width, height } = useWindowSize();
|
|
50
|
+
useEffect2(() => {
|
|
51
|
+
if (width && height) {
|
|
52
|
+
const aspectRatio = width / height;
|
|
53
|
+
setOptions({
|
|
54
|
+
center: [linearInterpolate(aspectRatio, lngRange), linearInterpolate(aspectRatio, latRange)],
|
|
55
|
+
zoom: defaultZoom
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}, [height, width]);
|
|
59
|
+
return { options };
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
// src/hooks/useFindHashes.tsx
|
|
63
|
+
import { useNetwork } from "@xyo-network/react-network";
|
|
64
|
+
import { useMemo as useMemo2 } from "react";
|
|
65
|
+
var animatedAnswerHashesConst = [
|
|
66
|
+
"79af071f451fc7af10d009dc63236ef9a9b211732c1ee0c06f028fcecf2336c5",
|
|
67
|
+
"531bfba6d8dfefd3bcc888aca54cdbbd4574ed2b3ec551b230845a1f9a608898",
|
|
68
|
+
"c874412b4faa4947de81372fd1ba12fdd6f43f5e408622b7f357cb2bcb3f17cb",
|
|
69
|
+
"29d3f8b882c61a82a1a1675782a27e797ea7196f45a23b4409680ab8b8d5f14e",
|
|
70
|
+
"cfd20f80ac073fd9518f4ef3f43d2a1f5e4e56e40c2677f38d6f6fecd05df60c",
|
|
71
|
+
"1354fa73497519a39aed19fc99bdbae78a880a1eafb2f7898d607e07db36528d",
|
|
72
|
+
"1043b0d25eacfc5013ae9dba780305a6fbf01a43543bd871d7c00537fca142a9",
|
|
73
|
+
"973dfc5df142851ced258d52d0ac2784e814000ac22e35776f772256b0d4dde9",
|
|
74
|
+
"463808eb74d3d87e6563970e0301a493577f8cd1b501e6e0ffa5e027ad2cea95",
|
|
75
|
+
"15b21acea2e3fd9d1ace3768a72636ee7bdf67a6f8e0807bfa2273dea2207555",
|
|
76
|
+
"32d377bfe7ebe382598c54dd13f8af7510e0a1e2fd2e913311fdd58e517e5e2e,"
|
|
77
|
+
];
|
|
78
|
+
var staticAnswerHashConst = "c7bbf61f61cfd4a1b2def160c28136fc1d100d39fbdb67b227a2c6e558d9d3a5";
|
|
79
|
+
var useFindHashes = () => {
|
|
80
|
+
const { network } = useNetwork();
|
|
81
|
+
const exploreMapHashes = network?.nodes?.find((node) => node.type === "archivist")?.explorerMapHashes;
|
|
82
|
+
const animatedAnswerHashes = exploreMapHashes?.animatedAnswerHashes || animatedAnswerHashesConst;
|
|
83
|
+
const staticAnswerHash = exploreMapHashes?.staticAnswerHash || staticAnswerHashConst;
|
|
84
|
+
const foundHashes = useMemo2(() => [staticAnswerHash, ...animatedAnswerHashes], [animatedAnswerHashes, staticAnswerHash]);
|
|
85
|
+
return foundHashes;
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
// src/hooks/useHeatMapColors.tsx
|
|
89
|
+
import { useTheme } from "@mui/material";
|
|
90
|
+
var useHeatMapColors = () => {
|
|
91
|
+
const theme = useTheme();
|
|
92
|
+
const staticMapColor = "#FFFF75";
|
|
93
|
+
const highUsageColor = "#FF0000";
|
|
94
|
+
const heatMapColorProps = {
|
|
95
|
+
highUsageColor,
|
|
96
|
+
lowUsageColor: "#FFB3B3",
|
|
97
|
+
staticMapColor
|
|
98
|
+
};
|
|
99
|
+
const legendProps = {
|
|
100
|
+
endColor: highUsageColor,
|
|
101
|
+
endLabel: "High",
|
|
102
|
+
heading: "Network Usage",
|
|
103
|
+
startColor: staticMapColor,
|
|
104
|
+
startLabel: "Low",
|
|
105
|
+
textColor: theme.palette.common.white
|
|
106
|
+
};
|
|
107
|
+
return { heatMapColorProps, legendProps };
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
// src/hooks/useQuadKeyPayloadsToFeatures.tsx
|
|
111
|
+
import { compact } from "@xylabs/lodash";
|
|
112
|
+
import { GeoJson } from "@xyo-network/sdk-geo";
|
|
113
|
+
import { useEffect as useEffect3, useState as useState3 } from "react";
|
|
114
|
+
var quadKeyToFeature = ({ density, quadkey }) => {
|
|
115
|
+
const polygonFeature = new GeoJson(quadkey).polygonFeature();
|
|
116
|
+
polygonFeature.properties = {
|
|
117
|
+
count: density,
|
|
118
|
+
density
|
|
119
|
+
};
|
|
120
|
+
return polygonFeature;
|
|
121
|
+
};
|
|
122
|
+
var setDensity = (feature) => {
|
|
123
|
+
if (feature.properties) {
|
|
124
|
+
feature.properties.value = feature.properties.density / 5;
|
|
125
|
+
}
|
|
126
|
+
return feature;
|
|
127
|
+
};
|
|
128
|
+
var useQuadKeyPayloadsToFeatures = (payloads) => {
|
|
129
|
+
const [multipleFeatureSets, setMultipleFeatureSets] = useState3([[]]);
|
|
130
|
+
const [features, setFeatures] = useState3([]);
|
|
131
|
+
const [error, setError] = useState3();
|
|
132
|
+
useEffect3(() => {
|
|
133
|
+
if (Array.isArray(payloads)) {
|
|
134
|
+
if (compact(payloads).length !== 0) {
|
|
135
|
+
const payloadsArray = payloads;
|
|
136
|
+
const mappedFeatures = payloadsArray?.map((payload) => payload?.result.map(quadKeyToFeature));
|
|
137
|
+
setMultipleFeatureSets(mappedFeatures.map((features2) => features2?.map(setDensity) ?? []));
|
|
138
|
+
} else {
|
|
139
|
+
setError(new Error("Cannot find payloads for provided hashes"));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if (payloads && payloads.result) {
|
|
143
|
+
const singlePayload = payloads;
|
|
144
|
+
const mappedFeatures = singlePayload.result.map(quadKeyToFeature);
|
|
145
|
+
setFeatures(mappedFeatures.map(setDensity));
|
|
146
|
+
}
|
|
147
|
+
}, [payloads]);
|
|
148
|
+
return { error, features, multipleFeatureSets };
|
|
149
|
+
};
|
|
150
|
+
export {
|
|
151
|
+
useDynamicMapResize,
|
|
152
|
+
useDynamicPositioning,
|
|
153
|
+
useFindHashes,
|
|
154
|
+
useHeatMapColors,
|
|
155
|
+
useQuadKeyPayloadsToFeatures
|
|
156
|
+
};
|
|
6
157
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/hooks/index.ts"],"sourcesContent":["export * from './useDynamicMapResize'\nexport * from './useDynamicPositioning'\nexport * from './useFindHashes'\nexport * from './useHeatMapColors'\nexport * from './useQuadKeyPayloadsToFeatures'\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/useDynamicMapResize.tsx","../../../src/hooks/useDynamicPositioning.tsx","../../../src/hooks/useFindHashes.tsx","../../../src/hooks/useHeatMapColors.tsx","../../../src/hooks/useQuadKeyPayloadsToFeatures.tsx"],"sourcesContent":["import { Map } from 'mapbox-gl'\nimport { MutableRefObject, useEffect, useMemo, useState } from 'react'\n\n/**\n * Inspired by - https://bl.ocks.org/danswick/fc56f37c10d40be62e4feac5984250d2\n */\nexport const useDynamicMapResize = (\n mapContainerRef: MutableRefObject<HTMLDivElement | null>,\n mapCanvasRef: MutableRefObject<HTMLCanvasElement | null>,\n mapInstance?: Map,\n active = true,\n) => {\n const [dependenciesReady, setDependenciesReady] = useState(false)\n\n const resizer = useMemo(\n () =>\n new ResizeObserver(() => {\n const width = mapContainerRef.current?.getBoundingClientRect().width\n if (width && mapCanvasRef.current) {\n mapCanvasRef.current.style.width = `${width}px`\n // setTimeout allows for the smoothest animation (vs requestAnimationFrame, debouce, etc)\n // likely because it lets mapbox resize once when the event loop is ready?\n setTimeout(() => mapInstance?.resize())\n }\n }),\n [mapCanvasRef, mapContainerRef, mapInstance],\n )\n\n useEffect(() => {\n const dependenciesReady = !!(active && mapInstance && mapContainerRef?.current && mapCanvasRef.current)\n setDependenciesReady(dependenciesReady)\n }, [active, mapCanvasRef, mapContainerRef, mapInstance])\n\n useEffect(() => {\n if (dependenciesReady) {\n if (mapContainerRef.current) {\n resizer.observe(mapContainerRef.current)\n }\n\n return () => {\n resizer.disconnect()\n }\n }\n }, [active, dependenciesReady, mapCanvasRef, mapContainerRef, mapInstance, resizer])\n}\n","import { useWindowSize } from '@xylabs/react-shared'\nimport { MapboxOptions } from 'mapbox-gl'\nimport { useEffect, useState } from 'react'\n\n/**\n * Zoom level for the map\n *\n * Note: Changing zoom will require changes to Lat/Lng Ranges\n */\nconst defaultZoom = 1.6\n\n/**\n * Range of aspect ratio values (width / height = aspect ratio) to scale against degrees\n * On lower aspect ratios, the width is larger than the height and vice-versa for higher\n */\nconst defaultAspectRatioRange = [0.5, 2]\n\n/**\n * Lat/Lng ranges, the first index is the minimum and the second is the maximum\n * Index 0 is for portrait screens and centers on the Eastern Hemisphere\n * Index 1 is for wider screens near the Prime Meridian and north of the Equator\n *\n * Note: Values are based off the zoom level\n */\nconst latRange = [0.9121644205263664, 1.71785031559439]\nconst lngRange = [-81.4742014851959, 12.788958675506933]\n\n/**\n * Function to interpolate an aspect ratio value across a range of degrees and aspect ratios\n *\n * Inspired by - https://stackoverflow.com/questions/14224535/scaling-between-two-number-ranges\n *\n * @param aspectRatio aspect ratio to scale\n * @param degreeRange A latitude or longitude range (i.e. [minLat, maxLat])\n * @param aspectRatioRange A range of aspect ratios to scale against degreeRange parameter\n * @returns number\n */\nconst linearInterpolate = (aspectRatio: number, degreeRange: number[], aspectRatioRange?: number[]): number => {\n const [degreeMin, degreeMax] = degreeRange\n const [aspectRatioMin, aspectRatioMax] = aspectRatioRange || defaultAspectRatioRange\n\n const aspectRatioRangeSpan = aspectRatioMax - aspectRatioMin\n const degreeRangeSpan = degreeMax - degreeMin\n\n const percent = (aspectRatio - aspectRatioMin) / aspectRatioRangeSpan\n const scaledDegree = percent * degreeRangeSpan + degreeMin\n\n return scaledDegree\n}\n\nconst useDynamicPositioning = () => {\n const [options, setOptions] = useState<Partial<MapboxOptions>>({})\n const { width, height } = useWindowSize()\n\n useEffect(() => {\n if (width && height) {\n const aspectRatio = width / height\n\n setOptions({\n center: [linearInterpolate(aspectRatio, lngRange), linearInterpolate(aspectRatio, latRange)],\n zoom: defaultZoom,\n })\n }\n }, [height, width])\n\n return { options }\n}\n\nexport { useDynamicPositioning }\n","import { ArchivistPreset, useNetwork } from '@xyo-network/react-network'\nimport { useMemo } from 'react'\n\nconst animatedAnswerHashesConst = [\n '79af071f451fc7af10d009dc63236ef9a9b211732c1ee0c06f028fcecf2336c5',\n '531bfba6d8dfefd3bcc888aca54cdbbd4574ed2b3ec551b230845a1f9a608898',\n 'c874412b4faa4947de81372fd1ba12fdd6f43f5e408622b7f357cb2bcb3f17cb',\n '29d3f8b882c61a82a1a1675782a27e797ea7196f45a23b4409680ab8b8d5f14e',\n 'cfd20f80ac073fd9518f4ef3f43d2a1f5e4e56e40c2677f38d6f6fecd05df60c',\n '1354fa73497519a39aed19fc99bdbae78a880a1eafb2f7898d607e07db36528d',\n '1043b0d25eacfc5013ae9dba780305a6fbf01a43543bd871d7c00537fca142a9',\n '973dfc5df142851ced258d52d0ac2784e814000ac22e35776f772256b0d4dde9',\n '463808eb74d3d87e6563970e0301a493577f8cd1b501e6e0ffa5e027ad2cea95',\n '15b21acea2e3fd9d1ace3768a72636ee7bdf67a6f8e0807bfa2273dea2207555',\n '32d377bfe7ebe382598c54dd13f8af7510e0a1e2fd2e913311fdd58e517e5e2e,',\n]\n\nconst staticAnswerHashConst = 'c7bbf61f61cfd4a1b2def160c28136fc1d100d39fbdb67b227a2c6e558d9d3a5'\n\nexport const useFindHashes = () => {\n const { network } = useNetwork()\n const exploreMapHashes = (network?.nodes?.find((node) => node.type === 'archivist') as ArchivistPreset)?.explorerMapHashes\n const animatedAnswerHashes = exploreMapHashes?.animatedAnswerHashes || animatedAnswerHashesConst\n const staticAnswerHash = exploreMapHashes?.staticAnswerHash || staticAnswerHashConst\n const foundHashes = useMemo(() => [staticAnswerHash, ...animatedAnswerHashes], [animatedAnswerHashes, staticAnswerHash])\n return foundHashes\n}\n","import { useTheme } from '@mui/material'\n\nimport { AnimatedHeatMapColorProps, ColorGradientLegendProps } from '../Colors'\n\nconst useHeatMapColors = () => {\n const theme = useTheme()\n const staticMapColor = '#FFFF75'\n const highUsageColor = '#FF0000'\n\n const heatMapColorProps: AnimatedHeatMapColorProps = {\n highUsageColor,\n lowUsageColor: '#FFB3B3',\n staticMapColor,\n }\n\n const legendProps: ColorGradientLegendProps = {\n endColor: highUsageColor,\n endLabel: 'High',\n heading: 'Network Usage',\n startColor: staticMapColor,\n startLabel: 'Low',\n textColor: theme.palette.common.white,\n }\n\n return { heatMapColorProps, legendProps }\n}\n\nexport { useHeatMapColors }\n","import { compact } from '@xylabs/lodash'\nimport { GeoJson } from '@xyo-network/sdk-geo'\nimport { Feature, Geometry } from 'geojson'\nimport { useEffect, useState } from 'react'\n\nimport { NetworkLocationHeatmapQuadkeyAnswerPayload } from '../types'\n\nconst quadKeyToFeature = ({ density, quadkey }: { density: number; quadkey: string }) => {\n const polygonFeature = new GeoJson(quadkey).polygonFeature()\n polygonFeature.properties = {\n count: density,\n density,\n }\n return polygonFeature\n}\n\nconst setDensity = (feature: Feature) => {\n if (feature.properties) {\n feature.properties.value = feature.properties.density / 5\n }\n return feature\n}\n\nconst useQuadKeyPayloadsToFeatures = (payloads?: NetworkLocationHeatmapQuadkeyAnswerPayload[] | NetworkLocationHeatmapQuadkeyAnswerPayload) => {\n const [multipleFeatureSets, setMultipleFeatureSets] = useState<Feature<Geometry>[][]>([[]])\n const [features, setFeatures] = useState<Feature<Geometry>[]>([])\n const [error, setError] = useState<Error>()\n\n useEffect(() => {\n // Convert Multiple Payloads from Quadkey to GeoJson\n if (Array.isArray(payloads)) {\n if (compact(payloads).length !== 0) {\n const payloadsArray = payloads as (NetworkLocationHeatmapQuadkeyAnswerPayload | null)[]\n const mappedFeatures = payloadsArray?.map((payload) => payload?.result.map(quadKeyToFeature))\n\n setMultipleFeatureSets(mappedFeatures.map((features) => features?.map(setDensity) ?? []))\n } else {\n setError(new Error('Cannot find payloads for provided hashes'))\n }\n }\n\n // Convert Single Payload from Quadkey to GeoJson\n if (payloads && (payloads as NetworkLocationHeatmapQuadkeyAnswerPayload).result) {\n const singlePayload = payloads as NetworkLocationHeatmapQuadkeyAnswerPayload\n const mappedFeatures = singlePayload.result.map(quadKeyToFeature)\n\n setFeatures(mappedFeatures.map(setDensity))\n }\n }, [payloads])\n\n return { error, features, multipleFeatureSets }\n}\n\nexport { useQuadKeyPayloadsToFeatures }\n"],"mappings":";AACA,SAA2B,WAAW,SAAS,gBAAgB;AAKxD,IAAM,sBAAsB,CACjC,iBACA,cACA,aACA,SAAS,SACN;AACH,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,SAAS,KAAK;AAEhE,QAAM,UAAU;AAAA,IACd,MACE,IAAI,eAAe,MAAM;AACvB,YAAM,QAAQ,gBAAgB,SAAS,sBAAsB,EAAE;AAC/D,UAAI,SAAS,aAAa,SAAS;AACjC,qBAAa,QAAQ,MAAM,QAAQ,GAAG,KAAK;AAG3C,mBAAW,MAAM,aAAa,OAAO,CAAC;AAAA,MACxC;AAAA,IACF,CAAC;AAAA,IACH,CAAC,cAAc,iBAAiB,WAAW;AAAA,EAC7C;AAEA,YAAU,MAAM;AACd,UAAMA,qBAAoB,CAAC,EAAE,UAAU,eAAe,iBAAiB,WAAW,aAAa;AAC/F,yBAAqBA,kBAAiB;AAAA,EACxC,GAAG,CAAC,QAAQ,cAAc,iBAAiB,WAAW,CAAC;AAEvD,YAAU,MAAM;AACd,QAAI,mBAAmB;AACrB,UAAI,gBAAgB,SAAS;AAC3B,gBAAQ,QAAQ,gBAAgB,OAAO;AAAA,MACzC;AAEA,aAAO,MAAM;AACX,gBAAQ,WAAW;AAAA,MACrB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,mBAAmB,cAAc,iBAAiB,aAAa,OAAO,CAAC;AACrF;;;AC5CA,SAAS,qBAAqB;AAE9B,SAAS,aAAAC,YAAW,YAAAC,iBAAgB;AAOpC,IAAM,cAAc;AAMpB,IAAM,0BAA0B,CAAC,KAAK,CAAC;AASvC,IAAM,WAAW,CAAC,oBAAoB,gBAAgB;AACtD,IAAM,WAAW,CAAC,mBAAmB,kBAAkB;AAYvD,IAAM,oBAAoB,CAAC,aAAqB,aAAuB,qBAAwC;AAC7G,QAAM,CAAC,WAAW,SAAS,IAAI;AAC/B,QAAM,CAAC,gBAAgB,cAAc,IAAI,oBAAoB;AAE7D,QAAM,uBAAuB,iBAAiB;AAC9C,QAAM,kBAAkB,YAAY;AAEpC,QAAM,WAAW,cAAc,kBAAkB;AACjD,QAAM,eAAe,UAAU,kBAAkB;AAEjD,SAAO;AACT;AAEA,IAAM,wBAAwB,MAAM;AAClC,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAiC,CAAC,CAAC;AACjE,QAAM,EAAE,OAAO,OAAO,IAAI,cAAc;AAExC,EAAAD,WAAU,MAAM;AACd,QAAI,SAAS,QAAQ;AACnB,YAAM,cAAc,QAAQ;AAE5B,iBAAW;AAAA,QACT,QAAQ,CAAC,kBAAkB,aAAa,QAAQ,GAAG,kBAAkB,aAAa,QAAQ,CAAC;AAAA,QAC3F,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,QAAQ,KAAK,CAAC;AAElB,SAAO,EAAE,QAAQ;AACnB;;;AClEA,SAA0B,kBAAkB;AAC5C,SAAS,WAAAE,gBAAe;AAExB,IAAM,4BAA4B;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,wBAAwB;AAEvB,IAAM,gBAAgB,MAAM;AACjC,QAAM,EAAE,QAAQ,IAAI,WAAW;AAC/B,QAAM,mBAAoB,SAAS,OAAO,KAAK,CAAC,SAAS,KAAK,SAAS,WAAW,GAAuB;AACzG,QAAM,uBAAuB,kBAAkB,wBAAwB;AACvE,QAAM,mBAAmB,kBAAkB,oBAAoB;AAC/D,QAAM,cAAcA,SAAQ,MAAM,CAAC,kBAAkB,GAAG,oBAAoB,GAAG,CAAC,sBAAsB,gBAAgB,CAAC;AACvH,SAAO;AACT;;;AC1BA,SAAS,gBAAgB;AAIzB,IAAM,mBAAmB,MAAM;AAC7B,QAAM,QAAQ,SAAS;AACvB,QAAM,iBAAiB;AACvB,QAAM,iBAAiB;AAEvB,QAAM,oBAA+C;AAAA,IACnD;AAAA,IACA,eAAe;AAAA,IACf;AAAA,EACF;AAEA,QAAM,cAAwC;AAAA,IAC5C,UAAU;AAAA,IACV,UAAU;AAAA,IACV,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,WAAW,MAAM,QAAQ,OAAO;AAAA,EAClC;AAEA,SAAO,EAAE,mBAAmB,YAAY;AAC1C;;;ACzBA,SAAS,eAAe;AACxB,SAAS,eAAe;AAExB,SAAS,aAAAC,YAAW,YAAAC,iBAAgB;AAIpC,IAAM,mBAAmB,CAAC,EAAE,SAAS,QAAQ,MAA4C;AACvF,QAAM,iBAAiB,IAAI,QAAQ,OAAO,EAAE,eAAe;AAC3D,iBAAe,aAAa;AAAA,IAC1B,OAAO;AAAA,IACP;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,aAAa,CAAC,YAAqB;AACvC,MAAI,QAAQ,YAAY;AACtB,YAAQ,WAAW,QAAQ,QAAQ,WAAW,UAAU;AAAA,EAC1D;AACA,SAAO;AACT;AAEA,IAAM,+BAA+B,CAAC,aAAyG;AAC7I,QAAM,CAAC,qBAAqB,sBAAsB,IAAIA,UAAgC,CAAC,CAAC,CAAC,CAAC;AAC1F,QAAM,CAAC,UAAU,WAAW,IAAIA,UAA8B,CAAC,CAAC;AAChE,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAgB;AAE1C,EAAAD,WAAU,MAAM;AAEd,QAAI,MAAM,QAAQ,QAAQ,GAAG;AAC3B,UAAI,QAAQ,QAAQ,EAAE,WAAW,GAAG;AAClC,cAAM,gBAAgB;AACtB,cAAM,iBAAiB,eAAe,IAAI,CAAC,YAAY,SAAS,OAAO,IAAI,gBAAgB,CAAC;AAE5F,+BAAuB,eAAe,IAAI,CAACE,cAAaA,WAAU,IAAI,UAAU,KAAK,CAAC,CAAC,CAAC;AAAA,MAC1F,OAAO;AACL,iBAAS,IAAI,MAAM,0CAA0C,CAAC;AAAA,MAChE;AAAA,IACF;AAGA,QAAI,YAAa,SAAwD,QAAQ;AAC/E,YAAM,gBAAgB;AACtB,YAAM,iBAAiB,cAAc,OAAO,IAAI,gBAAgB;AAEhE,kBAAY,eAAe,IAAI,UAAU,CAAC;AAAA,IAC5C;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAEb,SAAO,EAAE,OAAO,UAAU,oBAAoB;AAChD;","names":["dependenciesReady","useEffect","useState","useMemo","useEffect","useState","features"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
// src/hooks/useDynamicMapResize.tsx
|
|
1
2
|
import { useEffect, useMemo, useState } from "react";
|
|
2
|
-
|
|
3
|
+
var useDynamicMapResize = (mapContainerRef, mapCanvasRef, mapInstance, active = true) => {
|
|
3
4
|
const [dependenciesReady, setDependenciesReady] = useState(false);
|
|
4
5
|
const resizer = useMemo(
|
|
5
6
|
() => new ResizeObserver(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/hooks/useDynamicMapResize.tsx"],"sourcesContent":["import { Map } from 'mapbox-gl'\nimport { MutableRefObject, useEffect, useMemo, useState } from 'react'\n\n/**\n * Inspired by - https://bl.ocks.org/danswick/fc56f37c10d40be62e4feac5984250d2\n */\nexport const useDynamicMapResize = (\n mapContainerRef: MutableRefObject<HTMLDivElement | null>,\n mapCanvasRef: MutableRefObject<HTMLCanvasElement | null>,\n mapInstance?: Map,\n active = true,\n) => {\n const [dependenciesReady, setDependenciesReady] = useState(false)\n\n const resizer = useMemo(\n () =>\n new ResizeObserver(() => {\n const width = mapContainerRef.current?.getBoundingClientRect().width\n if (width && mapCanvasRef.current) {\n mapCanvasRef.current.style.width = `${width}px`\n // setTimeout allows for the smoothest animation (vs requestAnimationFrame, debouce, etc)\n // likely because it lets mapbox resize once when the event loop is ready?\n setTimeout(() => mapInstance?.resize())\n }\n }),\n [mapCanvasRef, mapContainerRef, mapInstance],\n )\n\n useEffect(() => {\n const dependenciesReady = !!(active && mapInstance && mapContainerRef?.current && mapCanvasRef.current)\n setDependenciesReady(dependenciesReady)\n }, [active, mapCanvasRef, mapContainerRef, mapInstance])\n\n useEffect(() => {\n if (dependenciesReady) {\n if (mapContainerRef.current) {\n resizer.observe(mapContainerRef.current)\n }\n\n return () => {\n resizer.disconnect()\n }\n }\n }, [active, dependenciesReady, mapCanvasRef, mapContainerRef, mapInstance, resizer])\n}\n"],"mappings":"AACA,SAA2B,WAAW,SAAS,gBAAgB;AAKxD,
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/useDynamicMapResize.tsx"],"sourcesContent":["import { Map } from 'mapbox-gl'\nimport { MutableRefObject, useEffect, useMemo, useState } from 'react'\n\n/**\n * Inspired by - https://bl.ocks.org/danswick/fc56f37c10d40be62e4feac5984250d2\n */\nexport const useDynamicMapResize = (\n mapContainerRef: MutableRefObject<HTMLDivElement | null>,\n mapCanvasRef: MutableRefObject<HTMLCanvasElement | null>,\n mapInstance?: Map,\n active = true,\n) => {\n const [dependenciesReady, setDependenciesReady] = useState(false)\n\n const resizer = useMemo(\n () =>\n new ResizeObserver(() => {\n const width = mapContainerRef.current?.getBoundingClientRect().width\n if (width && mapCanvasRef.current) {\n mapCanvasRef.current.style.width = `${width}px`\n // setTimeout allows for the smoothest animation (vs requestAnimationFrame, debouce, etc)\n // likely because it lets mapbox resize once when the event loop is ready?\n setTimeout(() => mapInstance?.resize())\n }\n }),\n [mapCanvasRef, mapContainerRef, mapInstance],\n )\n\n useEffect(() => {\n const dependenciesReady = !!(active && mapInstance && mapContainerRef?.current && mapCanvasRef.current)\n setDependenciesReady(dependenciesReady)\n }, [active, mapCanvasRef, mapContainerRef, mapInstance])\n\n useEffect(() => {\n if (dependenciesReady) {\n if (mapContainerRef.current) {\n resizer.observe(mapContainerRef.current)\n }\n\n return () => {\n resizer.disconnect()\n }\n }\n }, [active, dependenciesReady, mapCanvasRef, mapContainerRef, mapInstance, resizer])\n}\n"],"mappings":";AACA,SAA2B,WAAW,SAAS,gBAAgB;AAKxD,IAAM,sBAAsB,CACjC,iBACA,cACA,aACA,SAAS,SACN;AACH,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,SAAS,KAAK;AAEhE,QAAM,UAAU;AAAA,IACd,MACE,IAAI,eAAe,MAAM;AACvB,YAAM,QAAQ,gBAAgB,SAAS,sBAAsB,EAAE;AAC/D,UAAI,SAAS,aAAa,SAAS;AACjC,qBAAa,QAAQ,MAAM,QAAQ,GAAG,KAAK;AAG3C,mBAAW,MAAM,aAAa,OAAO,CAAC;AAAA,MACxC;AAAA,IACF,CAAC;AAAA,IACH,CAAC,cAAc,iBAAiB,WAAW;AAAA,EAC7C;AAEA,YAAU,MAAM;AACd,UAAMA,qBAAoB,CAAC,EAAE,UAAU,eAAe,iBAAiB,WAAW,aAAa;AAC/F,yBAAqBA,kBAAiB;AAAA,EACxC,GAAG,CAAC,QAAQ,cAAc,iBAAiB,WAAW,CAAC;AAEvD,YAAU,MAAM;AACd,QAAI,mBAAmB;AACrB,UAAI,gBAAgB,SAAS;AAC3B,gBAAQ,QAAQ,gBAAgB,OAAO;AAAA,MACzC;AAEA,aAAO,MAAM;AACX,gBAAQ,WAAW;AAAA,MACrB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,mBAAmB,cAAc,iBAAiB,aAAa,OAAO,CAAC;AACrF;","names":["dependenciesReady"]}
|