@xyo-network/react-map 2.64.0 → 2.64.3

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.
Files changed (130) hide show
  1. package/dist/browser/AnimatedHeatMapSettings.js +56 -3
  2. package/dist/browser/AnimatedHeatMapSettings.js.map +1 -1
  3. package/dist/browser/Colors/index.js +0 -1
  4. package/dist/browser/Colors/index.js.map +1 -1
  5. package/dist/browser/Components/AnimatedHeatMap.js +623 -10
  6. package/dist/browser/Components/AnimatedHeatMap.js.map +1 -1
  7. package/dist/browser/Components/AnimatedHeatMapLoaded.js +864 -13
  8. package/dist/browser/Components/AnimatedHeatMapLoaded.js.map +1 -1
  9. package/dist/browser/Components/HeatMapSettings.js +56 -3
  10. package/dist/browser/Components/HeatMapSettings.js.map +1 -1
  11. package/dist/browser/Components/LayerAnimator.js +5 -4
  12. package/dist/browser/Components/LayerAnimator.js.map +1 -1
  13. package/dist/browser/Components/Legend.js +32 -7
  14. package/dist/browser/Components/Legend.js.map +1 -1
  15. package/dist/browser/Components/Legends/ColorGradient.js +3 -2
  16. package/dist/browser/Components/Legends/ColorGradient.js.map +1 -1
  17. package/dist/browser/Components/Legends/index.js +25 -1
  18. package/dist/browser/Components/Legends/index.js.map +1 -1
  19. package/dist/browser/Components/MapBox.js +66 -12
  20. package/dist/browser/Components/MapBox.js.map +1 -1
  21. package/dist/browser/Components/MapBoxHeat.js +151 -6
  22. package/dist/browser/Components/MapBoxHeat.js.map +1 -1
  23. package/dist/browser/Components/MapBoxPoints.js +207 -14
  24. package/dist/browser/Components/MapBoxPoints.js.map +1 -1
  25. package/dist/browser/Components/MapSettingsComponents/Setting.js +16 -3
  26. package/dist/browser/Components/MapSettingsComponents/Setting.js.map +1 -1
  27. package/dist/browser/Components/MapSettingsComponents/SettingsBox.js +38 -6
  28. package/dist/browser/Components/MapSettingsComponents/SettingsBox.js.map +1 -1
  29. package/dist/browser/Components/MapSettingsComponents/index.js +50 -2
  30. package/dist/browser/Components/MapSettingsComponents/index.js.map +1 -1
  31. package/dist/browser/Components/index.js +1084 -11
  32. package/dist/browser/Components/index.js.map +1 -1
  33. package/dist/browser/Contexts/HeatMapInitializer/Context.js +2 -1
  34. package/dist/browser/Contexts/HeatMapInitializer/Context.js.map +1 -1
  35. package/dist/browser/Contexts/HeatMapInitializer/Provider.js +235 -14
  36. package/dist/browser/Contexts/HeatMapInitializer/Provider.js.map +1 -1
  37. package/dist/browser/Contexts/HeatMapInitializer/index.js +294 -3
  38. package/dist/browser/Contexts/HeatMapInitializer/index.js.map +1 -1
  39. package/dist/browser/Contexts/HeatMapInitializer/useHeatMapInitializer.js +8 -2
  40. package/dist/browser/Contexts/HeatMapInitializer/useHeatMapInitializer.js.map +1 -1
  41. package/dist/browser/Contexts/MapBoxInstance/Context.js +2 -1
  42. package/dist/browser/Contexts/MapBoxInstance/Context.js.map +1 -1
  43. package/dist/browser/Contexts/MapBoxInstance/Provider.js +9 -3
  44. package/dist/browser/Contexts/MapBoxInstance/Provider.js.map +1 -1
  45. package/dist/browser/Contexts/MapBoxInstance/index.js +35 -3
  46. package/dist/browser/Contexts/MapBoxInstance/index.js.map +1 -1
  47. package/dist/browser/Contexts/MapBoxInstance/useMapBoxInstance.js +8 -2
  48. package/dist/browser/Contexts/MapBoxInstance/useMapBoxInstance.js.map +1 -1
  49. package/dist/browser/Contexts/MapSettings/Context.js +2 -1
  50. package/dist/browser/Contexts/MapSettings/Context.js.map +1 -1
  51. package/dist/browser/Contexts/MapSettings/Provider.js +117 -5
  52. package/dist/browser/Contexts/MapSettings/Provider.js.map +1 -1
  53. package/dist/browser/Contexts/MapSettings/index.js +148 -3
  54. package/dist/browser/Contexts/MapSettings/index.js.map +1 -1
  55. package/dist/browser/Contexts/MapSettings/useMapSettings.js +8 -2
  56. package/dist/browser/Contexts/MapSettings/useMapSettings.js.map +1 -1
  57. package/dist/browser/Contexts/MapboxAccessToken/Context.js +2 -1
  58. package/dist/browser/Contexts/MapboxAccessToken/Context.js.map +1 -1
  59. package/dist/browser/Contexts/MapboxAccessToken/Provider.js +9 -3
  60. package/dist/browser/Contexts/MapboxAccessToken/Provider.js.map +1 -1
  61. package/dist/browser/Contexts/MapboxAccessToken/index.js +22 -4
  62. package/dist/browser/Contexts/MapboxAccessToken/index.js.map +1 -1
  63. package/dist/browser/Contexts/MapboxAccessToken/use.js +8 -2
  64. package/dist/browser/Contexts/MapboxAccessToken/use.js.map +1 -1
  65. package/dist/browser/Contexts/index.js +459 -4
  66. package/dist/browser/Contexts/index.js.map +1 -1
  67. package/dist/browser/Layers/Builders/LocationHeatMapLayerBuilder.js +110 -6
  68. package/dist/browser/Layers/Builders/LocationHeatMapLayerBuilder.js.map +1 -1
  69. package/dist/browser/Layers/Builders/LocationHeatMapLayerBuilderAnimated.js +36 -4
  70. package/dist/browser/Layers/Builders/LocationHeatMapLayerBuilderAnimated.js.map +1 -1
  71. package/dist/browser/Layers/Builders/LocationPointsMapLayerBuilder.js +40 -4
  72. package/dist/browser/Layers/Builders/LocationPointsMapLayerBuilder.js.map +1 -1
  73. package/dist/browser/Layers/Builders/index.js +205 -3
  74. package/dist/browser/Layers/Builders/index.js.map +1 -1
  75. package/dist/browser/Layers/CircleLayer.js +3 -2
  76. package/dist/browser/Layers/CircleLayer.js.map +1 -1
  77. package/dist/browser/Layers/Configs/HeatMapFillLayerConfig.js +2 -1
  78. package/dist/browser/Layers/Configs/HeatMapFillLayerConfig.js.map +1 -1
  79. package/dist/browser/Layers/Configs/HeatMapLineLayerConfig.js +2 -1
  80. package/dist/browser/Layers/Configs/HeatMapLineLayerConfig.js.map +1 -1
  81. package/dist/browser/Layers/Configs/HeatMapSymbolLayerConfig.js +2 -1
  82. package/dist/browser/Layers/Configs/HeatMapSymbolLayerConfig.js.map +1 -1
  83. package/dist/browser/Layers/Configs/LocationPointLayerConfig.js +2 -1
  84. package/dist/browser/Layers/Configs/LocationPointLayerConfig.js.map +1 -1
  85. package/dist/browser/Layers/Configs/index.js +62 -4
  86. package/dist/browser/Layers/Configs/index.js.map +1 -1
  87. package/dist/browser/Layers/FillLayer.js +3 -2
  88. package/dist/browser/Layers/FillLayer.js.map +1 -1
  89. package/dist/browser/Layers/LineLayer.js +3 -2
  90. package/dist/browser/Layers/LineLayer.js.map +1 -1
  91. package/dist/browser/Layers/SymbolLayer.js +3 -2
  92. package/dist/browser/Layers/SymbolLayer.js.map +1 -1
  93. package/dist/browser/Layers/index.js +213 -7
  94. package/dist/browser/Layers/index.js.map +1 -1
  95. package/dist/browser/MapBoxClasses/MapBase.js +3 -2
  96. package/dist/browser/MapBoxClasses/MapBase.js.map +1 -1
  97. package/dist/browser/MapBoxClasses/MapHeat.js +41 -11
  98. package/dist/browser/MapBoxClasses/MapHeat.js.map +1 -1
  99. package/dist/browser/MapBoxClasses/MapPoints.js +33 -3
  100. package/dist/browser/MapBoxClasses/MapPoints.js.map +1 -1
  101. package/dist/browser/MapBoxClasses/MapSettings.js +6 -5
  102. package/dist/browser/MapBoxClasses/MapSettings.js.map +1 -1
  103. package/dist/browser/MapBoxClasses/index.js +288 -4
  104. package/dist/browser/MapBoxClasses/index.js.map +1 -1
  105. package/dist/browser/Settings/DefaultMapSettings.js +2 -1
  106. package/dist/browser/Settings/DefaultMapSettings.js.map +1 -1
  107. package/dist/browser/Settings/index.js +55 -2
  108. package/dist/browser/Settings/index.js.map +1 -1
  109. package/dist/browser/hooks/index.js +156 -5
  110. package/dist/browser/hooks/index.js.map +1 -1
  111. package/dist/browser/hooks/useDynamicMapResize.js +2 -1
  112. package/dist/browser/hooks/useDynamicMapResize.js.map +1 -1
  113. package/dist/browser/hooks/useDynamicPositioning.js +7 -6
  114. package/dist/browser/hooks/useDynamicPositioning.js.map +1 -1
  115. package/dist/browser/hooks/useFindHashes.js +4 -3
  116. package/dist/browser/hooks/useFindHashes.js.map +1 -1
  117. package/dist/browser/hooks/useHeatMapColors.js +2 -1
  118. package/dist/browser/hooks/useHeatMapColors.js.map +1 -1
  119. package/dist/browser/hooks/useQuadKeyPayloadsToFeatures.js +4 -3
  120. package/dist/browser/hooks/useQuadKeyPayloadsToFeatures.js.map +1 -1
  121. package/dist/browser/index.js +1298 -10
  122. package/dist/browser/index.js.map +1 -1
  123. package/dist/browser/lib/MapStyle.js +1 -0
  124. package/dist/browser/lib/MapStyle.js.map +1 -1
  125. package/dist/browser/lib/index.js +13 -2
  126. package/dist/browser/lib/index.js.map +1 -1
  127. package/dist/browser/types/index.js +0 -1
  128. package/dist/browser/types/index.js.map +1 -1
  129. package/dist/docs.json +296 -296
  130. package/package.json +14 -14
@@ -1,11 +1,156 @@
1
- import { jsx, jsxs } from "react/jsx-runtime";
1
+ // src/Components/MapBoxHeat.tsx
2
2
  import { FlexCol } from "@xylabs/react-flexbox";
3
- import { MapBox } from "./MapBox";
4
- import { MapSettingsBox } from "./MapSettingsComponents";
5
- const MapboxHeatFlexBox = ({ accessToken, children, mapBoxOptions, zoom, legend, developerMode, ...props }) => {
3
+
4
+ // src/Components/MapBox.tsx
5
+ import "mapbox-gl/dist/mapbox-gl.css";
6
+ import { Map } from "mapbox-gl";
7
+ import { useEffect as useEffect2, useRef, useState as useState2 } from "react";
8
+
9
+ // src/hooks/useDynamicMapResize.tsx
10
+ import { useEffect, useMemo, useState } from "react";
11
+ var useDynamicMapResize = (mapContainerRef, mapCanvasRef, mapInstance, active = true) => {
12
+ const [dependenciesReady, setDependenciesReady] = useState(false);
13
+ const resizer = useMemo(
14
+ () => new ResizeObserver(() => {
15
+ const width = mapContainerRef.current?.getBoundingClientRect().width;
16
+ if (width && mapCanvasRef.current) {
17
+ mapCanvasRef.current.style.width = `${width}px`;
18
+ setTimeout(() => mapInstance?.resize());
19
+ }
20
+ }),
21
+ [mapCanvasRef, mapContainerRef, mapInstance]
22
+ );
23
+ useEffect(() => {
24
+ const dependenciesReady2 = !!(active && mapInstance && mapContainerRef?.current && mapCanvasRef.current);
25
+ setDependenciesReady(dependenciesReady2);
26
+ }, [active, mapCanvasRef, mapContainerRef, mapInstance]);
27
+ useEffect(() => {
28
+ if (dependenciesReady) {
29
+ if (mapContainerRef.current) {
30
+ resizer.observe(mapContainerRef.current);
31
+ }
32
+ return () => {
33
+ resizer.disconnect();
34
+ };
35
+ }
36
+ }, [active, dependenciesReady, mapCanvasRef, mapContainerRef, mapInstance, resizer]);
37
+ };
38
+
39
+ // src/Contexts/MapBoxInstance/Context.ts
40
+ import { createContext } from "react";
41
+ var MapBoxInstanceContext = createContext({});
42
+
43
+ // src/Contexts/MapBoxInstance/useMapBoxInstance.tsx
44
+ import { assertEx } from "@xylabs/assert";
45
+ import { useContext } from "react";
46
+ var useMapBoxInstance = () => {
47
+ const context = useContext(MapBoxInstanceContext);
48
+ assertEx("map" in context, "useMapBoxInstance must be used within a MapBoxInstanceContext");
49
+ return context;
50
+ };
51
+
52
+ // src/Contexts/MapSettings/Context.ts
53
+ import { createContext as createContext2 } from "react";
54
+ var MapSettingsContext = createContext2({});
55
+
56
+ // src/Contexts/MapSettings/useMapSettings.tsx
57
+ import { useContext as useContext2 } from "react";
58
+ var useMapSettings = () => {
59
+ const context = useContext2(MapSettingsContext);
60
+ return context;
61
+ };
62
+
63
+ // src/Components/MapBox.tsx
64
+ import { jsx } from "react/jsx-runtime";
65
+ var MapBox = ({ accessToken, darkMode = false, options, zoom = 2, ...props }) => {
66
+ const [map, setMap] = useState2();
67
+ const mapContainerRef = useRef(null);
68
+ const mapCanvasRef = useRef(null);
69
+ const { setMapBoxInstance, map: mapInstance } = useMapBoxInstance();
70
+ const { mapSettings } = useMapSettings();
71
+ const activeResize = mapSettings?.dynamicMapResize.value;
72
+ useDynamicMapResize(mapContainerRef, mapCanvasRef, mapInstance, activeResize);
73
+ useEffect2(() => {
74
+ if (mapSettings?.preferDark?.value === true) {
75
+ map?.setStyle(`mapbox://styles/${"mapbox/dark-v10" /* Dark */}`);
76
+ } else {
77
+ map?.setStyle(`mapbox://styles/${darkMode ? "mapbox/dark-v10" /* Dark */ : "mapbox/light-v10" /* Light */}`);
78
+ }
79
+ }, [map, darkMode, mapSettings]);
80
+ useEffect2(() => {
81
+ const map2 = new Map({
82
+ accessToken,
83
+ center: [0, 0],
84
+ container: mapContainerRef.current ?? "",
85
+ style: `mapbox://styles/${"mapbox/light-v10" /* Light */}`,
86
+ zoom,
87
+ ...options
88
+ });
89
+ setMapBoxInstance?.(map2);
90
+ setMap(map2);
91
+ mapCanvasRef.current = document.querySelector(".mapboxgl-canvas");
92
+ console.log("Created Map");
93
+ return () => {
94
+ console.log("Removing Map");
95
+ map2.remove();
96
+ };
97
+ }, [mapContainerRef, setMap, options, zoom, setMapBoxInstance, accessToken]);
98
+ return /* @__PURE__ */ jsx(
99
+ "div",
100
+ {
101
+ ref: (el) => mapContainerRef.current = el,
102
+ style: {
103
+ bottom: 0,
104
+ left: 0,
105
+ position: "absolute",
106
+ right: 0,
107
+ top: 0,
108
+ ...props
109
+ }
110
+ }
111
+ );
112
+ };
113
+
114
+ // src/Components/MapSettingsComponents/Setting.tsx
115
+ import { FormControlLabel, Switch } from "@mui/material";
116
+ import { jsx as jsx2 } from "react/jsx-runtime";
117
+ var MapSettingSwitch = ({ developerMode, field, ...props }) => {
118
+ const { mapSettings, setMapSettings } = useMapSettings();
119
+ const setting = mapSettings?.[field];
120
+ const onLocalChange = (event) => {
121
+ if (setting) {
122
+ setMapSettings?.((previous) => {
123
+ previous[setting.field].value = event.target.checked;
124
+ return { ...previous };
125
+ });
126
+ }
127
+ };
128
+ if (setting?.devMode && developerMode === false) {
129
+ return null;
130
+ }
131
+ return setting?.hidden ? null : /* @__PURE__ */ jsx2(FormControlLabel, { label: setting?.label, control: /* @__PURE__ */ jsx2(Switch, { checked: setting?.value, onChange: onLocalChange, ...props }) });
132
+ };
133
+
134
+ // src/Components/MapSettingsComponents/SettingsBox.tsx
135
+ import { Paper, Stack } from "@mui/material";
136
+ import { FlexGrowRow, FlexRow } from "@xylabs/react-flexbox";
137
+ import { useAppSettings } from "@xyo-network/react-app-settings";
138
+ import { jsx as jsx3 } from "react/jsx-runtime";
139
+ var MapSettingsBox = ({ developerMode, ...props }) => {
140
+ const { mapSettings } = useMapSettings();
141
+ const { developerMode: devModeFromContext } = useAppSettings();
142
+ const resolveDeveloperMode = developerMode ?? devModeFromContext;
143
+ return mapSettings && resolveDeveloperMode ? /* @__PURE__ */ jsx3(FlexGrowRow, { bottom: 36, left: 10, position: "absolute", ...props, children: /* @__PURE__ */ jsx3(FlexRow, { paddingX: 2, children: /* @__PURE__ */ jsx3(Paper, { children: /* @__PURE__ */ jsx3(Stack, { direction: "row", spacing: 1, marginX: 1, children: Object.keys(mapSettings).map((key, index) => {
144
+ return /* @__PURE__ */ jsx3(MapSettingSwitch, { field: mapSettings[key].field, developerMode }, index);
145
+ }) }) }) }) }) : null;
146
+ };
147
+
148
+ // src/Components/MapBoxHeat.tsx
149
+ import { jsx as jsx4, jsxs } from "react/jsx-runtime";
150
+ var MapboxHeatFlexBox = ({ accessToken, children, mapBoxOptions, zoom, legend, developerMode, ...props }) => {
6
151
  return /* @__PURE__ */ jsxs(FlexCol, { ...props, children: [
7
- /* @__PURE__ */ jsx(MapBox, { accessToken, options: mapBoxOptions, zoom }),
8
- /* @__PURE__ */ jsx(MapSettingsBox, { developerMode }),
152
+ /* @__PURE__ */ jsx4(MapBox, { accessToken, options: mapBoxOptions, zoom }),
153
+ /* @__PURE__ */ jsx4(MapSettingsBox, { developerMode }),
9
154
  legend,
10
155
  children
11
156
  ] });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/Components/MapBoxHeat.tsx"],"sourcesContent":["import { FlexCol } from '@xylabs/react-flexbox'\n\nimport { MapboxFlexBoxProps } from '../lib'\nimport { MapBox } from './MapBox'\nimport { MapSettingsBox } from './MapSettingsComponents'\n\nexport const MapboxHeatFlexBox: React.FC<MapboxFlexBoxProps> = ({ accessToken, children, mapBoxOptions, zoom, legend, developerMode, ...props }) => {\n return (\n <FlexCol {...props}>\n <MapBox accessToken={accessToken} options={mapBoxOptions} zoom={zoom} />\n <MapSettingsBox developerMode={developerMode} />\n {legend}\n {children}\n </FlexCol>\n )\n}\n"],"mappings":"AAQI,SACE,KADF;AARJ,SAAS,eAAe;AAGxB,SAAS,cAAc;AACvB,SAAS,sBAAsB;AAExB,MAAM,oBAAkD,CAAC,EAAE,aAAa,UAAU,eAAe,MAAM,QAAQ,eAAe,GAAG,MAAM,MAAM;AAClJ,SACE,qBAAC,WAAS,GAAG,OACX;AAAA,wBAAC,UAAO,aAA0B,SAAS,eAAe,MAAY;AAAA,IACtE,oBAAC,kBAAe,eAA8B;AAAA,IAC7C;AAAA,IACA;AAAA,KACH;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/Components/MapBoxHeat.tsx","../../../src/Components/MapBox.tsx","../../../src/hooks/useDynamicMapResize.tsx","../../../src/Contexts/MapBoxInstance/Context.ts","../../../src/Contexts/MapBoxInstance/useMapBoxInstance.tsx","../../../src/Contexts/MapSettings/Context.ts","../../../src/Contexts/MapSettings/useMapSettings.tsx","../../../src/Components/MapSettingsComponents/Setting.tsx","../../../src/Components/MapSettingsComponents/SettingsBox.tsx"],"sourcesContent":["import { FlexCol } from '@xylabs/react-flexbox'\n\nimport { MapboxFlexBoxProps } from '../lib'\nimport { MapBox } from './MapBox'\nimport { MapSettingsBox } from './MapSettingsComponents'\n\nexport const MapboxHeatFlexBox: React.FC<MapboxFlexBoxProps> = ({ accessToken, children, mapBoxOptions, zoom, legend, developerMode, ...props }) => {\n return (\n <FlexCol {...props}>\n <MapBox accessToken={accessToken} options={mapBoxOptions} zoom={zoom} />\n <MapSettingsBox developerMode={developerMode} />\n {legend}\n {children}\n </FlexCol>\n )\n}\n","// eslint-disable-next-line import/no-internal-modules\nimport 'mapbox-gl/dist/mapbox-gl.css'\n\nimport { Map, MapboxOptions } from 'mapbox-gl'\nimport { useEffect, useRef, useState } from 'react'\n\nimport { useMapBoxInstance, useMapSettings } from '../Contexts'\nimport { useDynamicMapResize } from '../hooks'\nimport { MapStyle } from '../lib'\n\nexport interface MapBoxProps {\n accessToken: string\n darkMode?: boolean\n options?: Partial<MapboxOptions>\n zoom?: number\n}\n\nexport const MapBox: React.FC<MapBoxProps> = ({ accessToken, darkMode = false, options, zoom = 2, ...props }) => {\n const [map, setMap] = useState<Map>()\n const mapContainerRef = useRef<HTMLDivElement | null>(null)\n const mapCanvasRef = useRef<HTMLCanvasElement | null>(null)\n const { setMapBoxInstance, map: mapInstance } = useMapBoxInstance()\n const { mapSettings } = useMapSettings()\n\n const activeResize = mapSettings?.dynamicMapResize.value\n useDynamicMapResize(mapContainerRef, mapCanvasRef, mapInstance, activeResize)\n\n useEffect(() => {\n if (mapSettings?.preferDark?.value === true) {\n map?.setStyle(`mapbox://styles/${MapStyle.Dark}`)\n } else {\n map?.setStyle(`mapbox://styles/${darkMode ? MapStyle.Dark : MapStyle.Light}`)\n }\n }, [map, darkMode, mapSettings])\n\n useEffect(() => {\n const map = new Map({\n accessToken,\n center: [0, 0],\n container: mapContainerRef.current ?? '',\n style: `mapbox://styles/${MapStyle.Light}`,\n zoom,\n ...options,\n })\n\n // Allow external components to control the map\n setMapBoxInstance?.(map)\n setMap(map)\n\n // save the map canvas ref to help with resizing\n mapCanvasRef.current = document.querySelector('.mapboxgl-canvas')\n\n console.log('Created Map')\n\n return () => {\n console.log('Removing Map')\n map.remove()\n }\n }, [mapContainerRef, setMap, options, zoom, setMapBoxInstance, accessToken])\n\n return (\n <div\n ref={(el) => (mapContainerRef.current = el)}\n style={{\n bottom: 0,\n left: 0,\n position: 'absolute',\n right: 0,\n top: 0,\n ...props,\n }}\n />\n )\n}\n","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 { createContext } from 'react'\n\nimport { MapBoxInstanceState } from './State'\n\nconst MapBoxInstanceContext = createContext<MapBoxInstanceState>({})\n\nexport { MapBoxInstanceContext }\n","import { assertEx } from '@xylabs/assert'\nimport { useContext } from 'react'\n\nimport { MapBoxInstanceContext } from './Context'\n\nconst useMapBoxInstance = () => {\n const context = useContext(MapBoxInstanceContext)\n assertEx('map' in context, 'useMapBoxInstance must be used within a MapBoxInstanceContext')\n\n return context\n}\n\nexport { useMapBoxInstance }\n","import { createContext } from 'react'\n\nimport { MapSettingsState } from './State'\n\nconst MapSettingsContext = createContext<MapSettingsState>({})\n\nexport { MapSettingsContext }\n","import { useContext } from 'react'\n\nimport { MapSettingsContext } from './Context'\n\nconst useMapSettings = () => {\n const context = useContext(MapSettingsContext)\n\n return context\n}\n\nexport { useMapSettings }\n","import { FormControlLabel, Switch, SwitchProps } from '@mui/material'\n\nimport { useMapSettings } from '../../Contexts'\n\nexport interface MapSettingSwitchProps extends SwitchProps {\n developerMode?: boolean\n field: string\n}\n\nexport const MapSettingSwitch: React.FC<MapSettingSwitchProps> = ({ developerMode, field, ...props }) => {\n const { mapSettings, setMapSettings } = useMapSettings()\n const setting = mapSettings?.[field]\n\n const onLocalChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (setting) {\n setMapSettings?.((previous) => {\n previous[setting.field].value = event.target.checked\n return { ...previous }\n })\n }\n }\n\n if (setting?.devMode && developerMode === false) {\n return null\n }\n\n return setting?.hidden ? null : (\n <FormControlLabel label={setting?.label} control={<Switch checked={setting?.value} onChange={onLocalChange} {...props} />} />\n )\n}\n","import { Paper, Stack } from '@mui/material'\nimport { FlexBoxProps, FlexGrowRow, FlexRow } from '@xylabs/react-flexbox'\nimport { useAppSettings } from '@xyo-network/react-app-settings'\n\nimport { useMapSettings } from '../../Contexts'\nimport { MapSettingSwitch } from './Setting'\n\nexport interface MapSettingsBoxProps extends FlexBoxProps {\n developerMode?: boolean\n}\n\nexport const MapSettingsBox: React.FC<MapSettingsBoxProps> = ({ developerMode, ...props }) => {\n const { mapSettings } = useMapSettings()\n const { developerMode: devModeFromContext } = useAppSettings()\n const resolveDeveloperMode = developerMode ?? devModeFromContext\n\n return mapSettings && resolveDeveloperMode ? (\n <FlexGrowRow bottom={36} left={10} position=\"absolute\" {...props}>\n <FlexRow paddingX={2}>\n <Paper>\n <Stack direction=\"row\" spacing={1} marginX={1}>\n {Object.keys(mapSettings).map((key, index) => {\n return <MapSettingSwitch key={index} field={mapSettings[key].field} developerMode={developerMode} />\n })}\n </Stack>\n </Paper>\n </FlexRow>\n </FlexGrowRow>\n ) : null\n}\n"],"mappings":"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","names":["useEffect","useState","dependenciesReady","createContext","useContext","useContext","useState","useEffect","map","jsx","jsx","jsx"]}
@@ -1,12 +1,205 @@
1
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
1
+ // src/Components/MapBoxPoints.tsx
2
2
  import { Alert } from "@mui/material";
3
3
  import { FlexCol } from "@xylabs/react-flexbox";
4
- import { useCallback, useEffect, useState } from "react";
5
- import { useMapBoxInstance, useMapSettings } from "../Contexts";
6
- import { MapPoints } from "../MapBoxClasses";
7
- import { MapBox } from "./MapBox";
8
- import { MapSettingsBox } from "./MapSettingsComponents";
9
- const MapboxPointsFlexBox = ({
4
+ import { useCallback, useEffect as useEffect3, useState as useState3 } from "react";
5
+
6
+ // src/hooks/useDynamicMapResize.tsx
7
+ import { useEffect, useMemo, useState } from "react";
8
+ var useDynamicMapResize = (mapContainerRef, mapCanvasRef, mapInstance, active = true) => {
9
+ const [dependenciesReady, setDependenciesReady] = useState(false);
10
+ const resizer = useMemo(
11
+ () => new ResizeObserver(() => {
12
+ const width = mapContainerRef.current?.getBoundingClientRect().width;
13
+ if (width && mapCanvasRef.current) {
14
+ mapCanvasRef.current.style.width = `${width}px`;
15
+ setTimeout(() => mapInstance?.resize());
16
+ }
17
+ }),
18
+ [mapCanvasRef, mapContainerRef, mapInstance]
19
+ );
20
+ useEffect(() => {
21
+ const dependenciesReady2 = !!(active && mapInstance && mapContainerRef?.current && mapCanvasRef.current);
22
+ setDependenciesReady(dependenciesReady2);
23
+ }, [active, mapCanvasRef, mapContainerRef, mapInstance]);
24
+ useEffect(() => {
25
+ if (dependenciesReady) {
26
+ if (mapContainerRef.current) {
27
+ resizer.observe(mapContainerRef.current);
28
+ }
29
+ return () => {
30
+ resizer.disconnect();
31
+ };
32
+ }
33
+ }, [active, dependenciesReady, mapCanvasRef, mapContainerRef, mapInstance, resizer]);
34
+ };
35
+
36
+ // src/MapBoxClasses/MapBase.ts
37
+ import { assertEx } from "@xylabs/assert";
38
+ import { GeoJson } from "@xyo-network/sdk-geo";
39
+ var MapBase = class {
40
+ _config;
41
+ constructor(config) {
42
+ this._config = { requestLocation: true, zoom: 2, ...config };
43
+ }
44
+ get isMapReady() {
45
+ return !!this._config.map;
46
+ }
47
+ initializeMapSource(layer) {
48
+ const getSource = () => {
49
+ const featuresCollection = GeoJson.featureCollection(this._config.features);
50
+ return GeoJson.featuresSource(featuresCollection);
51
+ };
52
+ const existingSource = this._config.map.getSource(layer.source);
53
+ const source = getSource();
54
+ if (existingSource) {
55
+ existingSource.setData(assertEx(source.data));
56
+ } else {
57
+ this._config.map.addSource(layer.source, source);
58
+ }
59
+ layer.update(this._config.map, true);
60
+ return this;
61
+ }
62
+ };
63
+
64
+ // src/MapBoxClasses/MapPoints.ts
65
+ import { LngLatBounds } from "mapbox-gl";
66
+ var MapPoints = class extends MapBase {
67
+ config;
68
+ constructor(config) {
69
+ super(config);
70
+ this.config = config;
71
+ }
72
+ initialMapPositioning(options, initialBounds) {
73
+ let bounds;
74
+ if (initialBounds) {
75
+ bounds = initialBounds;
76
+ } else {
77
+ bounds = new LngLatBounds();
78
+ this.config.features.forEach((feature) => {
79
+ bounds.extend(feature.geometry.coordinates);
80
+ });
81
+ }
82
+ this.config.map.setCenter(bounds.getCenter());
83
+ this.config.map.fitBounds(bounds, options);
84
+ return this.config.map;
85
+ }
86
+ };
87
+
88
+ // src/Contexts/MapBoxInstance/Context.ts
89
+ import { createContext } from "react";
90
+ var MapBoxInstanceContext = createContext({});
91
+
92
+ // src/Contexts/MapBoxInstance/useMapBoxInstance.tsx
93
+ import { assertEx as assertEx2 } from "@xylabs/assert";
94
+ import { useContext } from "react";
95
+ var useMapBoxInstance = () => {
96
+ const context = useContext(MapBoxInstanceContext);
97
+ assertEx2("map" in context, "useMapBoxInstance must be used within a MapBoxInstanceContext");
98
+ return context;
99
+ };
100
+
101
+ // src/Contexts/MapSettings/Context.ts
102
+ import { createContext as createContext2 } from "react";
103
+ var MapSettingsContext = createContext2({});
104
+
105
+ // src/Contexts/MapSettings/useMapSettings.tsx
106
+ import { useContext as useContext2 } from "react";
107
+ var useMapSettings = () => {
108
+ const context = useContext2(MapSettingsContext);
109
+ return context;
110
+ };
111
+
112
+ // src/Components/MapBox.tsx
113
+ import "mapbox-gl/dist/mapbox-gl.css";
114
+ import { Map } from "mapbox-gl";
115
+ import { useEffect as useEffect2, useRef, useState as useState2 } from "react";
116
+ import { jsx } from "react/jsx-runtime";
117
+ var MapBox = ({ accessToken, darkMode = false, options, zoom = 2, ...props }) => {
118
+ const [map, setMap] = useState2();
119
+ const mapContainerRef = useRef(null);
120
+ const mapCanvasRef = useRef(null);
121
+ const { setMapBoxInstance, map: mapInstance } = useMapBoxInstance();
122
+ const { mapSettings } = useMapSettings();
123
+ const activeResize = mapSettings?.dynamicMapResize.value;
124
+ useDynamicMapResize(mapContainerRef, mapCanvasRef, mapInstance, activeResize);
125
+ useEffect2(() => {
126
+ if (mapSettings?.preferDark?.value === true) {
127
+ map?.setStyle(`mapbox://styles/${"mapbox/dark-v10" /* Dark */}`);
128
+ } else {
129
+ map?.setStyle(`mapbox://styles/${darkMode ? "mapbox/dark-v10" /* Dark */ : "mapbox/light-v10" /* Light */}`);
130
+ }
131
+ }, [map, darkMode, mapSettings]);
132
+ useEffect2(() => {
133
+ const map2 = new Map({
134
+ accessToken,
135
+ center: [0, 0],
136
+ container: mapContainerRef.current ?? "",
137
+ style: `mapbox://styles/${"mapbox/light-v10" /* Light */}`,
138
+ zoom,
139
+ ...options
140
+ });
141
+ setMapBoxInstance?.(map2);
142
+ setMap(map2);
143
+ mapCanvasRef.current = document.querySelector(".mapboxgl-canvas");
144
+ console.log("Created Map");
145
+ return () => {
146
+ console.log("Removing Map");
147
+ map2.remove();
148
+ };
149
+ }, [mapContainerRef, setMap, options, zoom, setMapBoxInstance, accessToken]);
150
+ return /* @__PURE__ */ jsx(
151
+ "div",
152
+ {
153
+ ref: (el) => mapContainerRef.current = el,
154
+ style: {
155
+ bottom: 0,
156
+ left: 0,
157
+ position: "absolute",
158
+ right: 0,
159
+ top: 0,
160
+ ...props
161
+ }
162
+ }
163
+ );
164
+ };
165
+
166
+ // src/Components/MapSettingsComponents/Setting.tsx
167
+ import { FormControlLabel, Switch } from "@mui/material";
168
+ import { jsx as jsx2 } from "react/jsx-runtime";
169
+ var MapSettingSwitch = ({ developerMode, field, ...props }) => {
170
+ const { mapSettings, setMapSettings } = useMapSettings();
171
+ const setting = mapSettings?.[field];
172
+ const onLocalChange = (event) => {
173
+ if (setting) {
174
+ setMapSettings?.((previous) => {
175
+ previous[setting.field].value = event.target.checked;
176
+ return { ...previous };
177
+ });
178
+ }
179
+ };
180
+ if (setting?.devMode && developerMode === false) {
181
+ return null;
182
+ }
183
+ return setting?.hidden ? null : /* @__PURE__ */ jsx2(FormControlLabel, { label: setting?.label, control: /* @__PURE__ */ jsx2(Switch, { checked: setting?.value, onChange: onLocalChange, ...props }) });
184
+ };
185
+
186
+ // src/Components/MapSettingsComponents/SettingsBox.tsx
187
+ import { Paper, Stack } from "@mui/material";
188
+ import { FlexGrowRow, FlexRow } from "@xylabs/react-flexbox";
189
+ import { useAppSettings } from "@xyo-network/react-app-settings";
190
+ import { jsx as jsx3 } from "react/jsx-runtime";
191
+ var MapSettingsBox = ({ developerMode, ...props }) => {
192
+ const { mapSettings } = useMapSettings();
193
+ const { developerMode: devModeFromContext } = useAppSettings();
194
+ const resolveDeveloperMode = developerMode ?? devModeFromContext;
195
+ return mapSettings && resolveDeveloperMode ? /* @__PURE__ */ jsx3(FlexGrowRow, { bottom: 36, left: 10, position: "absolute", ...props, children: /* @__PURE__ */ jsx3(FlexRow, { paddingX: 2, children: /* @__PURE__ */ jsx3(Paper, { children: /* @__PURE__ */ jsx3(Stack, { direction: "row", spacing: 1, marginX: 1, children: Object.keys(mapSettings).map((key, index) => {
196
+ return /* @__PURE__ */ jsx3(MapSettingSwitch, { field: mapSettings[key].field, developerMode }, index);
197
+ }) }) }) }) }) : null;
198
+ };
199
+
200
+ // src/Components/MapBoxPoints.tsx
201
+ import { Fragment, jsx as jsx4, jsxs } from "react/jsx-runtime";
202
+ var MapboxPointsFlexBox = ({
10
203
  accessToken,
11
204
  features,
12
205
  fitToPointsPadding = 20,
@@ -14,7 +207,7 @@ const MapboxPointsFlexBox = ({
14
207
  zoom,
15
208
  ...props
16
209
  }) => {
17
- const [mapPoints, setMapPoints] = useState();
210
+ const [mapPoints, setMapPoints] = useState3();
18
211
  const { mapSettings } = useMapSettings();
19
212
  const { map, mapInitialized } = useMapBoxInstance();
20
213
  const customFitToBoundsOptions = (zoom2) => {
@@ -44,21 +237,21 @@ const MapboxPointsFlexBox = ({
44
237
  mapPoints?.initialMapPositioning({ padding: fitToPointsPadding, ...customFitToBoundsOptions(zoom) });
45
238
  updateFeatures();
46
239
  }, [mapPoints, fitToPointsPadding, updateFeatures, zoom]);
47
- useEffect(() => {
240
+ useEffect3(() => {
48
241
  if (map && features?.length) {
49
242
  setMapPoints(new MapPoints({ features, map, zoom }));
50
243
  }
51
244
  }, [map, features, zoom]);
52
- useEffect(() => {
245
+ useEffect3(() => {
53
246
  if (mapInitialized) {
54
247
  updateMapSetup();
55
248
  reInitializeMap();
56
249
  }
57
250
  }, [mapInitialized, reInitializeMap, updateMapSetup]);
58
- return /* @__PURE__ */ jsx(FlexCol, { alignItems: "stretch", id: "xyo-mapbox-wrap", ...props, children: features ? /* @__PURE__ */ jsxs(Fragment, { children: [
59
- /* @__PURE__ */ jsx(MapBox, { accessToken, zoom }),
60
- /* @__PURE__ */ jsx(MapSettingsBox, {})
61
- ] }) : /* @__PURE__ */ jsx(Alert, { severity: "error", children: "No data to show" }) });
251
+ return /* @__PURE__ */ jsx4(FlexCol, { alignItems: "stretch", id: "xyo-mapbox-wrap", ...props, children: features ? /* @__PURE__ */ jsxs(Fragment, { children: [
252
+ /* @__PURE__ */ jsx4(MapBox, { accessToken, zoom }),
253
+ /* @__PURE__ */ jsx4(MapSettingsBox, {})
254
+ ] }) : /* @__PURE__ */ jsx4(Alert, { severity: "error", children: "No data to show" }) });
62
255
  };
63
256
  export {
64
257
  MapboxPointsFlexBox
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/Components/MapBoxPoints.tsx"],"sourcesContent":["import { Alert } from '@mui/material'\nimport { FlexCol } from '@xylabs/react-flexbox'\nimport { Feature, Point } from 'geojson'\nimport { FitBoundsOptions } from 'mapbox-gl'\nimport { useCallback, useEffect, useState } from 'react'\n\nimport { useMapBoxInstance, useMapSettings } from '../Contexts'\nimport { MapboxFlexBoxProps } from '../lib'\nimport { MapPoints } from '../MapBoxClasses'\nimport { MapBox } from './MapBox'\nimport { MapSettingsBox } from './MapSettingsComponents'\n\nexport interface MapboxPointsFlexBoxProps extends MapboxFlexBoxProps {\n accessToken: string\n features?: Feature<Point>[]\n}\n\nexport const MapboxPointsFlexBox: React.FC<MapboxPointsFlexBoxProps> = ({\n accessToken,\n features,\n fitToPointsPadding = 20,\n layers,\n zoom,\n ...props\n}) => {\n const [mapPoints, setMapPoints] = useState<MapPoints>()\n const { mapSettings } = useMapSettings()\n const { map, mapInitialized } = useMapBoxInstance()\n\n /**\n * Needed because of a bug in mapbox taking undefined values for the config options of fitToBounds\n * see - https://github.com/mapbox/mapbox-gl-js/issues/10013\n */\n const customFitToBoundsOptions = (zoom?: number): FitBoundsOptions => {\n if (zoom !== undefined) {\n return {\n maxZoom: zoom,\n }\n }\n return {}\n }\n\n const updateFeatures = useCallback(() => {\n if (mapPoints?.isMapReady && features?.length) {\n layers?.forEach((layer) => {\n mapPoints.initializeMapSource(layer)\n })\n }\n }, [mapPoints, features, layers])\n\n const updateMapSetup = useCallback(() => {\n const { fitToPoints } = mapSettings || {}\n\n if (mapPoints && map) {\n if (fitToPoints?.value === true) {\n mapPoints.initialMapPositioning({ padding: fitToPointsPadding, ...customFitToBoundsOptions(zoom) })\n }\n }\n }, [mapSettings, mapPoints, map, fitToPointsPadding, zoom])\n\n const reInitializeMap = useCallback(() => {\n mapPoints?.initialMapPositioning({ padding: fitToPointsPadding, ...customFitToBoundsOptions(zoom) })\n updateFeatures()\n }, [mapPoints, fitToPointsPadding, updateFeatures, zoom])\n\n useEffect(() => {\n if (map && features?.length) {\n setMapPoints(new MapPoints({ features, map, zoom }))\n }\n }, [map, features, zoom])\n\n useEffect(() => {\n if (mapInitialized) {\n updateMapSetup()\n reInitializeMap()\n }\n }, [mapInitialized, reInitializeMap, updateMapSetup])\n\n return (\n <FlexCol alignItems=\"stretch\" id=\"xyo-mapbox-wrap\" {...props}>\n {features ? (\n <>\n <MapBox accessToken={accessToken} zoom={zoom} />\n <MapSettingsBox />\n </>\n ) : (\n <Alert severity=\"error\">No data to show</Alert>\n )}\n </FlexCol>\n )\n}\n"],"mappings":"AAiFQ,mBACE,KADF;AAjFR,SAAS,aAAa;AACtB,SAAS,eAAe;AAGxB,SAAS,aAAa,WAAW,gBAAgB;AAEjD,SAAS,mBAAmB,sBAAsB;AAElD,SAAS,iBAAiB;AAC1B,SAAS,cAAc;AACvB,SAAS,sBAAsB;AAOxB,MAAM,sBAA0D,CAAC;AAAA,EACtE;AAAA,EACA;AAAA,EACA,qBAAqB;AAAA,EACrB;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAM;AACJ,QAAM,CAAC,WAAW,YAAY,IAAI,SAAoB;AACtD,QAAM,EAAE,YAAY,IAAI,eAAe;AACvC,QAAM,EAAE,KAAK,eAAe,IAAI,kBAAkB;AAMlD,QAAM,2BAA2B,CAACA,UAAoC;AACpE,QAAIA,UAAS,QAAW;AACtB,aAAO;AAAA,QACL,SAASA;AAAA,MACX;AAAA,IACF;AACA,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,iBAAiB,YAAY,MAAM;AACvC,QAAI,WAAW,cAAc,UAAU,QAAQ;AAC7C,cAAQ,QAAQ,CAAC,UAAU;AACzB,kBAAU,oBAAoB,KAAK;AAAA,MACrC,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,WAAW,UAAU,MAAM,CAAC;AAEhC,QAAM,iBAAiB,YAAY,MAAM;AACvC,UAAM,EAAE,YAAY,IAAI,eAAe,CAAC;AAExC,QAAI,aAAa,KAAK;AACpB,UAAI,aAAa,UAAU,MAAM;AAC/B,kBAAU,sBAAsB,EAAE,SAAS,oBAAoB,GAAG,yBAAyB,IAAI,EAAE,CAAC;AAAA,MACpG;AAAA,IACF;AAAA,EACF,GAAG,CAAC,aAAa,WAAW,KAAK,oBAAoB,IAAI,CAAC;AAE1D,QAAM,kBAAkB,YAAY,MAAM;AACxC,eAAW,sBAAsB,EAAE,SAAS,oBAAoB,GAAG,yBAAyB,IAAI,EAAE,CAAC;AACnG,mBAAe;AAAA,EACjB,GAAG,CAAC,WAAW,oBAAoB,gBAAgB,IAAI,CAAC;AAExD,YAAU,MAAM;AACd,QAAI,OAAO,UAAU,QAAQ;AAC3B,mBAAa,IAAI,UAAU,EAAE,UAAU,KAAK,KAAK,CAAC,CAAC;AAAA,IACrD;AAAA,EACF,GAAG,CAAC,KAAK,UAAU,IAAI,CAAC;AAExB,YAAU,MAAM;AACd,QAAI,gBAAgB;AAClB,qBAAe;AACf,sBAAgB;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,gBAAgB,iBAAiB,cAAc,CAAC;AAEpD,SACE,oBAAC,WAAQ,YAAW,WAAU,IAAG,mBAAmB,GAAG,OACpD,qBACC,iCACE;AAAA,wBAAC,UAAO,aAA0B,MAAY;AAAA,IAC9C,oBAAC,kBAAe;AAAA,KAClB,IAEA,oBAAC,SAAM,UAAS,SAAQ,6BAAe,GAE3C;AAEJ;","names":["zoom"]}
1
+ {"version":3,"sources":["../../../src/Components/MapBoxPoints.tsx","../../../src/hooks/useDynamicMapResize.tsx","../../../src/MapBoxClasses/MapBase.ts","../../../src/MapBoxClasses/MapPoints.ts","../../../src/Contexts/MapBoxInstance/Context.ts","../../../src/Contexts/MapBoxInstance/useMapBoxInstance.tsx","../../../src/Contexts/MapSettings/Context.ts","../../../src/Contexts/MapSettings/useMapSettings.tsx","../../../src/Components/MapBox.tsx","../../../src/Components/MapSettingsComponents/Setting.tsx","../../../src/Components/MapSettingsComponents/SettingsBox.tsx"],"sourcesContent":["import { Alert } from '@mui/material'\nimport { FlexCol } from '@xylabs/react-flexbox'\nimport { Feature, Point } from 'geojson'\nimport { FitBoundsOptions } from 'mapbox-gl'\nimport { useCallback, useEffect, useState } from 'react'\n\nimport { useMapBoxInstance, useMapSettings } from '../Contexts'\nimport { MapboxFlexBoxProps } from '../lib'\nimport { MapPoints } from '../MapBoxClasses'\nimport { MapBox } from './MapBox'\nimport { MapSettingsBox } from './MapSettingsComponents'\n\nexport interface MapboxPointsFlexBoxProps extends MapboxFlexBoxProps {\n accessToken: string\n features?: Feature<Point>[]\n}\n\nexport const MapboxPointsFlexBox: React.FC<MapboxPointsFlexBoxProps> = ({\n accessToken,\n features,\n fitToPointsPadding = 20,\n layers,\n zoom,\n ...props\n}) => {\n const [mapPoints, setMapPoints] = useState<MapPoints>()\n const { mapSettings } = useMapSettings()\n const { map, mapInitialized } = useMapBoxInstance()\n\n /**\n * Needed because of a bug in mapbox taking undefined values for the config options of fitToBounds\n * see - https://github.com/mapbox/mapbox-gl-js/issues/10013\n */\n const customFitToBoundsOptions = (zoom?: number): FitBoundsOptions => {\n if (zoom !== undefined) {\n return {\n maxZoom: zoom,\n }\n }\n return {}\n }\n\n const updateFeatures = useCallback(() => {\n if (mapPoints?.isMapReady && features?.length) {\n layers?.forEach((layer) => {\n mapPoints.initializeMapSource(layer)\n })\n }\n }, [mapPoints, features, layers])\n\n const updateMapSetup = useCallback(() => {\n const { fitToPoints } = mapSettings || {}\n\n if (mapPoints && map) {\n if (fitToPoints?.value === true) {\n mapPoints.initialMapPositioning({ padding: fitToPointsPadding, ...customFitToBoundsOptions(zoom) })\n }\n }\n }, [mapSettings, mapPoints, map, fitToPointsPadding, zoom])\n\n const reInitializeMap = useCallback(() => {\n mapPoints?.initialMapPositioning({ padding: fitToPointsPadding, ...customFitToBoundsOptions(zoom) })\n updateFeatures()\n }, [mapPoints, fitToPointsPadding, updateFeatures, zoom])\n\n useEffect(() => {\n if (map && features?.length) {\n setMapPoints(new MapPoints({ features, map, zoom }))\n }\n }, [map, features, zoom])\n\n useEffect(() => {\n if (mapInitialized) {\n updateMapSetup()\n reInitializeMap()\n }\n }, [mapInitialized, reInitializeMap, updateMapSetup])\n\n return (\n <FlexCol alignItems=\"stretch\" id=\"xyo-mapbox-wrap\" {...props}>\n {features ? (\n <>\n <MapBox accessToken={accessToken} zoom={zoom} />\n <MapSettingsBox />\n </>\n ) : (\n <Alert severity=\"error\">No data to show</Alert>\n )}\n </FlexCol>\n )\n}\n","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 { 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 { 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 { createContext } from 'react'\n\nimport { MapBoxInstanceState } from './State'\n\nconst MapBoxInstanceContext = createContext<MapBoxInstanceState>({})\n\nexport { MapBoxInstanceContext }\n","import { assertEx } from '@xylabs/assert'\nimport { useContext } from 'react'\n\nimport { MapBoxInstanceContext } from './Context'\n\nconst useMapBoxInstance = () => {\n const context = useContext(MapBoxInstanceContext)\n assertEx('map' in context, 'useMapBoxInstance must be used within a MapBoxInstanceContext')\n\n return context\n}\n\nexport { useMapBoxInstance }\n","import { createContext } from 'react'\n\nimport { MapSettingsState } from './State'\n\nconst MapSettingsContext = createContext<MapSettingsState>({})\n\nexport { MapSettingsContext }\n","import { useContext } from 'react'\n\nimport { MapSettingsContext } from './Context'\n\nconst useMapSettings = () => {\n const context = useContext(MapSettingsContext)\n\n return context\n}\n\nexport { useMapSettings }\n","// eslint-disable-next-line import/no-internal-modules\nimport 'mapbox-gl/dist/mapbox-gl.css'\n\nimport { Map, MapboxOptions } from 'mapbox-gl'\nimport { useEffect, useRef, useState } from 'react'\n\nimport { useMapBoxInstance, useMapSettings } from '../Contexts'\nimport { useDynamicMapResize } from '../hooks'\nimport { MapStyle } from '../lib'\n\nexport interface MapBoxProps {\n accessToken: string\n darkMode?: boolean\n options?: Partial<MapboxOptions>\n zoom?: number\n}\n\nexport const MapBox: React.FC<MapBoxProps> = ({ accessToken, darkMode = false, options, zoom = 2, ...props }) => {\n const [map, setMap] = useState<Map>()\n const mapContainerRef = useRef<HTMLDivElement | null>(null)\n const mapCanvasRef = useRef<HTMLCanvasElement | null>(null)\n const { setMapBoxInstance, map: mapInstance } = useMapBoxInstance()\n const { mapSettings } = useMapSettings()\n\n const activeResize = mapSettings?.dynamicMapResize.value\n useDynamicMapResize(mapContainerRef, mapCanvasRef, mapInstance, activeResize)\n\n useEffect(() => {\n if (mapSettings?.preferDark?.value === true) {\n map?.setStyle(`mapbox://styles/${MapStyle.Dark}`)\n } else {\n map?.setStyle(`mapbox://styles/${darkMode ? MapStyle.Dark : MapStyle.Light}`)\n }\n }, [map, darkMode, mapSettings])\n\n useEffect(() => {\n const map = new Map({\n accessToken,\n center: [0, 0],\n container: mapContainerRef.current ?? '',\n style: `mapbox://styles/${MapStyle.Light}`,\n zoom,\n ...options,\n })\n\n // Allow external components to control the map\n setMapBoxInstance?.(map)\n setMap(map)\n\n // save the map canvas ref to help with resizing\n mapCanvasRef.current = document.querySelector('.mapboxgl-canvas')\n\n console.log('Created Map')\n\n return () => {\n console.log('Removing Map')\n map.remove()\n }\n }, [mapContainerRef, setMap, options, zoom, setMapBoxInstance, accessToken])\n\n return (\n <div\n ref={(el) => (mapContainerRef.current = el)}\n style={{\n bottom: 0,\n left: 0,\n position: 'absolute',\n right: 0,\n top: 0,\n ...props,\n }}\n />\n )\n}\n","import { FormControlLabel, Switch, SwitchProps } from '@mui/material'\n\nimport { useMapSettings } from '../../Contexts'\n\nexport interface MapSettingSwitchProps extends SwitchProps {\n developerMode?: boolean\n field: string\n}\n\nexport const MapSettingSwitch: React.FC<MapSettingSwitchProps> = ({ developerMode, field, ...props }) => {\n const { mapSettings, setMapSettings } = useMapSettings()\n const setting = mapSettings?.[field]\n\n const onLocalChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (setting) {\n setMapSettings?.((previous) => {\n previous[setting.field].value = event.target.checked\n return { ...previous }\n })\n }\n }\n\n if (setting?.devMode && developerMode === false) {\n return null\n }\n\n return setting?.hidden ? null : (\n <FormControlLabel label={setting?.label} control={<Switch checked={setting?.value} onChange={onLocalChange} {...props} />} />\n )\n}\n","import { Paper, Stack } from '@mui/material'\nimport { FlexBoxProps, FlexGrowRow, FlexRow } from '@xylabs/react-flexbox'\nimport { useAppSettings } from '@xyo-network/react-app-settings'\n\nimport { useMapSettings } from '../../Contexts'\nimport { MapSettingSwitch } from './Setting'\n\nexport interface MapSettingsBoxProps extends FlexBoxProps {\n developerMode?: boolean\n}\n\nexport const MapSettingsBox: React.FC<MapSettingsBoxProps> = ({ developerMode, ...props }) => {\n const { mapSettings } = useMapSettings()\n const { developerMode: devModeFromContext } = useAppSettings()\n const resolveDeveloperMode = developerMode ?? devModeFromContext\n\n return mapSettings && resolveDeveloperMode ? (\n <FlexGrowRow bottom={36} left={10} position=\"absolute\" {...props}>\n <FlexRow paddingX={2}>\n <Paper>\n <Stack direction=\"row\" spacing={1} marginX={1}>\n {Object.keys(mapSettings).map((key, index) => {\n return <MapSettingSwitch key={index} field={mapSettings[key].field} developerMode={developerMode} />\n })}\n </Stack>\n </Paper>\n </FlexRow>\n </FlexGrowRow>\n ) : null\n}\n"],"mappings":"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","names":["useEffect","useState","dependenciesReady","assertEx","assertEx","createContext","useContext","useContext","useEffect","useState","useState","useEffect","map","jsx","jsx","jsx","useState","zoom","useEffect"]}
@@ -1,7 +1,20 @@
1
- import { jsx } from "react/jsx-runtime";
1
+ // src/Components/MapSettingsComponents/Setting.tsx
2
2
  import { FormControlLabel, Switch } from "@mui/material";
3
- import { useMapSettings } from "../../Contexts";
4
- const MapSettingSwitch = ({ developerMode, field, ...props }) => {
3
+
4
+ // src/Contexts/MapSettings/Context.ts
5
+ import { createContext } from "react";
6
+ var MapSettingsContext = createContext({});
7
+
8
+ // src/Contexts/MapSettings/useMapSettings.tsx
9
+ import { useContext } from "react";
10
+ var useMapSettings = () => {
11
+ const context = useContext(MapSettingsContext);
12
+ return context;
13
+ };
14
+
15
+ // src/Components/MapSettingsComponents/Setting.tsx
16
+ import { jsx } from "react/jsx-runtime";
17
+ var MapSettingSwitch = ({ developerMode, field, ...props }) => {
5
18
  const { mapSettings, setMapSettings } = useMapSettings();
6
19
  const setting = mapSettings?.[field];
7
20
  const onLocalChange = (event) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/Components/MapSettingsComponents/Setting.tsx"],"sourcesContent":["import { FormControlLabel, Switch, SwitchProps } from '@mui/material'\n\nimport { useMapSettings } from '../../Contexts'\n\nexport interface MapSettingSwitchProps extends SwitchProps {\n developerMode?: boolean\n field: string\n}\n\nexport const MapSettingSwitch: React.FC<MapSettingSwitchProps> = ({ developerMode, field, ...props }) => {\n const { mapSettings, setMapSettings } = useMapSettings()\n const setting = mapSettings?.[field]\n\n const onLocalChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (setting) {\n setMapSettings?.((previous) => {\n previous[setting.field].value = event.target.checked\n return { ...previous }\n })\n }\n }\n\n if (setting?.devMode && developerMode === false) {\n return null\n }\n\n return setting?.hidden ? null : (\n <FormControlLabel label={setting?.label} control={<Switch checked={setting?.value} onChange={onLocalChange} {...props} />} />\n )\n}\n"],"mappings":"AA2BsD;AA3BtD,SAAS,kBAAkB,cAA2B;AAEtD,SAAS,sBAAsB;AAOxB,MAAM,mBAAoD,CAAC,EAAE,eAAe,OAAO,GAAG,MAAM,MAAM;AACvG,QAAM,EAAE,aAAa,eAAe,IAAI,eAAe;AACvD,QAAM,UAAU,cAAc,KAAK;AAEnC,QAAM,gBAAgB,CAAC,UAA+C;AACpE,QAAI,SAAS;AACX,uBAAiB,CAAC,aAAa;AAC7B,iBAAS,QAAQ,KAAK,EAAE,QAAQ,MAAM,OAAO;AAC7C,eAAO,EAAE,GAAG,SAAS;AAAA,MACvB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,SAAS,WAAW,kBAAkB,OAAO;AAC/C,WAAO;AAAA,EACT;AAEA,SAAO,SAAS,SAAS,OACvB,oBAAC,oBAAiB,OAAO,SAAS,OAAO,SAAS,oBAAC,UAAO,SAAS,SAAS,OAAO,UAAU,eAAgB,GAAG,OAAO,GAAI;AAE/H;","names":[]}
1
+ {"version":3,"sources":["../../../../src/Components/MapSettingsComponents/Setting.tsx","../../../../src/Contexts/MapSettings/Context.ts","../../../../src/Contexts/MapSettings/useMapSettings.tsx"],"sourcesContent":["import { FormControlLabel, Switch, SwitchProps } from '@mui/material'\n\nimport { useMapSettings } from '../../Contexts'\n\nexport interface MapSettingSwitchProps extends SwitchProps {\n developerMode?: boolean\n field: string\n}\n\nexport const MapSettingSwitch: React.FC<MapSettingSwitchProps> = ({ developerMode, field, ...props }) => {\n const { mapSettings, setMapSettings } = useMapSettings()\n const setting = mapSettings?.[field]\n\n const onLocalChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (setting) {\n setMapSettings?.((previous) => {\n previous[setting.field].value = event.target.checked\n return { ...previous }\n })\n }\n }\n\n if (setting?.devMode && developerMode === false) {\n return null\n }\n\n return setting?.hidden ? null : (\n <FormControlLabel label={setting?.label} control={<Switch checked={setting?.value} onChange={onLocalChange} {...props} />} />\n )\n}\n","import { createContext } from 'react'\n\nimport { MapSettingsState } from './State'\n\nconst MapSettingsContext = createContext<MapSettingsState>({})\n\nexport { MapSettingsContext }\n","import { useContext } from 'react'\n\nimport { MapSettingsContext } from './Context'\n\nconst useMapSettings = () => {\n const context = useContext(MapSettingsContext)\n\n return context\n}\n\nexport { useMapSettings }\n"],"mappings":";AAAA,SAAS,kBAAkB,cAA2B;;;ACAtD,SAAS,qBAAqB;AAI9B,IAAM,qBAAqB,cAAgC,CAAC,CAAC;;;ACJ7D,SAAS,kBAAkB;AAI3B,IAAM,iBAAiB,MAAM;AAC3B,QAAM,UAAU,WAAW,kBAAkB;AAE7C,SAAO;AACT;;;AFmBsD;AAlB/C,IAAM,mBAAoD,CAAC,EAAE,eAAe,OAAO,GAAG,MAAM,MAAM;AACvG,QAAM,EAAE,aAAa,eAAe,IAAI,eAAe;AACvD,QAAM,UAAU,cAAc,KAAK;AAEnC,QAAM,gBAAgB,CAAC,UAA+C;AACpE,QAAI,SAAS;AACX,uBAAiB,CAAC,aAAa;AAC7B,iBAAS,QAAQ,KAAK,EAAE,QAAQ,MAAM,OAAO;AAC7C,eAAO,EAAE,GAAG,SAAS;AAAA,MACvB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,SAAS,WAAW,kBAAkB,OAAO;AAC/C,WAAO;AAAA,EACT;AAEA,SAAO,SAAS,SAAS,OACvB,oBAAC,oBAAiB,OAAO,SAAS,OAAO,SAAS,oBAAC,UAAO,SAAS,SAAS,OAAO,UAAU,eAAgB,GAAG,OAAO,GAAI;AAE/H;","names":[]}
@@ -1,15 +1,47 @@
1
- import { jsx } from "react/jsx-runtime";
1
+ // src/Components/MapSettingsComponents/SettingsBox.tsx
2
2
  import { Paper, Stack } from "@mui/material";
3
3
  import { FlexGrowRow, FlexRow } from "@xylabs/react-flexbox";
4
4
  import { useAppSettings } from "@xyo-network/react-app-settings";
5
- import { useMapSettings } from "../../Contexts";
6
- import { MapSettingSwitch } from "./Setting";
7
- const MapSettingsBox = ({ developerMode, ...props }) => {
5
+
6
+ // src/Contexts/MapSettings/Context.ts
7
+ import { createContext } from "react";
8
+ var MapSettingsContext = createContext({});
9
+
10
+ // src/Contexts/MapSettings/useMapSettings.tsx
11
+ import { useContext } from "react";
12
+ var useMapSettings = () => {
13
+ const context = useContext(MapSettingsContext);
14
+ return context;
15
+ };
16
+
17
+ // src/Components/MapSettingsComponents/Setting.tsx
18
+ import { FormControlLabel, Switch } from "@mui/material";
19
+ import { jsx } from "react/jsx-runtime";
20
+ var MapSettingSwitch = ({ developerMode, field, ...props }) => {
21
+ const { mapSettings, setMapSettings } = useMapSettings();
22
+ const setting = mapSettings?.[field];
23
+ const onLocalChange = (event) => {
24
+ if (setting) {
25
+ setMapSettings?.((previous) => {
26
+ previous[setting.field].value = event.target.checked;
27
+ return { ...previous };
28
+ });
29
+ }
30
+ };
31
+ if (setting?.devMode && developerMode === false) {
32
+ return null;
33
+ }
34
+ return setting?.hidden ? null : /* @__PURE__ */ jsx(FormControlLabel, { label: setting?.label, control: /* @__PURE__ */ jsx(Switch, { checked: setting?.value, onChange: onLocalChange, ...props }) });
35
+ };
36
+
37
+ // src/Components/MapSettingsComponents/SettingsBox.tsx
38
+ import { jsx as jsx2 } from "react/jsx-runtime";
39
+ var MapSettingsBox = ({ developerMode, ...props }) => {
8
40
  const { mapSettings } = useMapSettings();
9
41
  const { developerMode: devModeFromContext } = useAppSettings();
10
42
  const resolveDeveloperMode = developerMode ?? devModeFromContext;
11
- return mapSettings && resolveDeveloperMode ? /* @__PURE__ */ jsx(FlexGrowRow, { bottom: 36, left: 10, position: "absolute", ...props, children: /* @__PURE__ */ jsx(FlexRow, { paddingX: 2, children: /* @__PURE__ */ jsx(Paper, { children: /* @__PURE__ */ jsx(Stack, { direction: "row", spacing: 1, marginX: 1, children: Object.keys(mapSettings).map((key, index) => {
12
- return /* @__PURE__ */ jsx(MapSettingSwitch, { field: mapSettings[key].field, developerMode }, index);
43
+ return mapSettings && resolveDeveloperMode ? /* @__PURE__ */ jsx2(FlexGrowRow, { bottom: 36, left: 10, position: "absolute", ...props, children: /* @__PURE__ */ jsx2(FlexRow, { paddingX: 2, children: /* @__PURE__ */ jsx2(Paper, { children: /* @__PURE__ */ jsx2(Stack, { direction: "row", spacing: 1, marginX: 1, children: Object.keys(mapSettings).map((key, index) => {
44
+ return /* @__PURE__ */ jsx2(MapSettingSwitch, { field: mapSettings[key].field, developerMode }, index);
13
45
  }) }) }) }) }) : null;
14
46
  };
15
47
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/Components/MapSettingsComponents/SettingsBox.tsx"],"sourcesContent":["import { Paper, Stack } from '@mui/material'\nimport { FlexBoxProps, FlexGrowRow, FlexRow } from '@xylabs/react-flexbox'\nimport { useAppSettings } from '@xyo-network/react-app-settings'\n\nimport { useMapSettings } from '../../Contexts'\nimport { MapSettingSwitch } from './Setting'\n\nexport interface MapSettingsBoxProps extends FlexBoxProps {\n developerMode?: boolean\n}\n\nexport const MapSettingsBox: React.FC<MapSettingsBoxProps> = ({ developerMode, ...props }) => {\n const { mapSettings } = useMapSettings()\n const { developerMode: devModeFromContext } = useAppSettings()\n const resolveDeveloperMode = developerMode ?? devModeFromContext\n\n return mapSettings && resolveDeveloperMode ? (\n <FlexGrowRow bottom={36} left={10} position=\"absolute\" {...props}>\n <FlexRow paddingX={2}>\n <Paper>\n <Stack direction=\"row\" spacing={1} marginX={1}>\n {Object.keys(mapSettings).map((key, index) => {\n return <MapSettingSwitch key={index} field={mapSettings[key].field} developerMode={developerMode} />\n })}\n </Stack>\n </Paper>\n </FlexRow>\n </FlexGrowRow>\n ) : null\n}\n"],"mappings":"AAsBqB;AAtBrB,SAAS,OAAO,aAAa;AAC7B,SAAuB,aAAa,eAAe;AACnD,SAAS,sBAAsB;AAE/B,SAAS,sBAAsB;AAC/B,SAAS,wBAAwB;AAM1B,MAAM,iBAAgD,CAAC,EAAE,eAAe,GAAG,MAAM,MAAM;AAC5F,QAAM,EAAE,YAAY,IAAI,eAAe;AACvC,QAAM,EAAE,eAAe,mBAAmB,IAAI,eAAe;AAC7D,QAAM,uBAAuB,iBAAiB;AAE9C,SAAO,eAAe,uBACpB,oBAAC,eAAY,QAAQ,IAAI,MAAM,IAAI,UAAS,YAAY,GAAG,OACzD,8BAAC,WAAQ,UAAU,GACjB,8BAAC,SACC,8BAAC,SAAM,WAAU,OAAM,SAAS,GAAG,SAAS,GACzC,iBAAO,KAAK,WAAW,EAAE,IAAI,CAAC,KAAK,UAAU;AAC5C,WAAO,oBAAC,oBAA6B,OAAO,YAAY,GAAG,EAAE,OAAO,iBAAtC,KAAoE;AAAA,EACpG,CAAC,GACH,GACF,GACF,GACF,IACE;AACN;","names":[]}
1
+ {"version":3,"sources":["../../../../src/Components/MapSettingsComponents/SettingsBox.tsx","../../../../src/Contexts/MapSettings/Context.ts","../../../../src/Contexts/MapSettings/useMapSettings.tsx","../../../../src/Components/MapSettingsComponents/Setting.tsx"],"sourcesContent":["import { Paper, Stack } from '@mui/material'\nimport { FlexBoxProps, FlexGrowRow, FlexRow } from '@xylabs/react-flexbox'\nimport { useAppSettings } from '@xyo-network/react-app-settings'\n\nimport { useMapSettings } from '../../Contexts'\nimport { MapSettingSwitch } from './Setting'\n\nexport interface MapSettingsBoxProps extends FlexBoxProps {\n developerMode?: boolean\n}\n\nexport const MapSettingsBox: React.FC<MapSettingsBoxProps> = ({ developerMode, ...props }) => {\n const { mapSettings } = useMapSettings()\n const { developerMode: devModeFromContext } = useAppSettings()\n const resolveDeveloperMode = developerMode ?? devModeFromContext\n\n return mapSettings && resolveDeveloperMode ? (\n <FlexGrowRow bottom={36} left={10} position=\"absolute\" {...props}>\n <FlexRow paddingX={2}>\n <Paper>\n <Stack direction=\"row\" spacing={1} marginX={1}>\n {Object.keys(mapSettings).map((key, index) => {\n return <MapSettingSwitch key={index} field={mapSettings[key].field} developerMode={developerMode} />\n })}\n </Stack>\n </Paper>\n </FlexRow>\n </FlexGrowRow>\n ) : null\n}\n","import { createContext } from 'react'\n\nimport { MapSettingsState } from './State'\n\nconst MapSettingsContext = createContext<MapSettingsState>({})\n\nexport { MapSettingsContext }\n","import { useContext } from 'react'\n\nimport { MapSettingsContext } from './Context'\n\nconst useMapSettings = () => {\n const context = useContext(MapSettingsContext)\n\n return context\n}\n\nexport { useMapSettings }\n","import { FormControlLabel, Switch, SwitchProps } from '@mui/material'\n\nimport { useMapSettings } from '../../Contexts'\n\nexport interface MapSettingSwitchProps extends SwitchProps {\n developerMode?: boolean\n field: string\n}\n\nexport const MapSettingSwitch: React.FC<MapSettingSwitchProps> = ({ developerMode, field, ...props }) => {\n const { mapSettings, setMapSettings } = useMapSettings()\n const setting = mapSettings?.[field]\n\n const onLocalChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (setting) {\n setMapSettings?.((previous) => {\n previous[setting.field].value = event.target.checked\n return { ...previous }\n })\n }\n }\n\n if (setting?.devMode && developerMode === false) {\n return null\n }\n\n return setting?.hidden ? null : (\n <FormControlLabel label={setting?.label} control={<Switch checked={setting?.value} onChange={onLocalChange} {...props} />} />\n )\n}\n"],"mappings":";AAAA,SAAS,OAAO,aAAa;AAC7B,SAAuB,aAAa,eAAe;AACnD,SAAS,sBAAsB;;;ACF/B,SAAS,qBAAqB;AAI9B,IAAM,qBAAqB,cAAgC,CAAC,CAAC;;;ACJ7D,SAAS,kBAAkB;AAI3B,IAAM,iBAAiB,MAAM;AAC3B,QAAM,UAAU,WAAW,kBAAkB;AAE7C,SAAO;AACT;;;ACRA,SAAS,kBAAkB,cAA2B;AA2BA;AAlB/C,IAAM,mBAAoD,CAAC,EAAE,eAAe,OAAO,GAAG,MAAM,MAAM;AACvG,QAAM,EAAE,aAAa,eAAe,IAAI,eAAe;AACvD,QAAM,UAAU,cAAc,KAAK;AAEnC,QAAM,gBAAgB,CAAC,UAA+C;AACpE,QAAI,SAAS;AACX,uBAAiB,CAAC,aAAa;AAC7B,iBAAS,QAAQ,KAAK,EAAE,QAAQ,MAAM,OAAO;AAC7C,eAAO,EAAE,GAAG,SAAS;AAAA,MACvB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,SAAS,WAAW,kBAAkB,OAAO;AAC/C,WAAO;AAAA,EACT;AAEA,SAAO,SAAS,SAAS,OACvB,oBAAC,oBAAiB,OAAO,SAAS,OAAO,SAAS,oBAAC,UAAO,SAAS,SAAS,OAAO,UAAU,eAAgB,GAAG,OAAO,GAAI;AAE/H;;;AHPqB,gBAAAA,YAAA;AAXd,IAAM,iBAAgD,CAAC,EAAE,eAAe,GAAG,MAAM,MAAM;AAC5F,QAAM,EAAE,YAAY,IAAI,eAAe;AACvC,QAAM,EAAE,eAAe,mBAAmB,IAAI,eAAe;AAC7D,QAAM,uBAAuB,iBAAiB;AAE9C,SAAO,eAAe,uBACpB,gBAAAA,KAAC,eAAY,QAAQ,IAAI,MAAM,IAAI,UAAS,YAAY,GAAG,OACzD,0BAAAA,KAAC,WAAQ,UAAU,GACjB,0BAAAA,KAAC,SACC,0BAAAA,KAAC,SAAM,WAAU,OAAM,SAAS,GAAG,SAAS,GACzC,iBAAO,KAAK,WAAW,EAAE,IAAI,CAAC,KAAK,UAAU;AAC5C,WAAO,gBAAAA,KAAC,oBAA6B,OAAO,YAAY,GAAG,EAAE,OAAO,iBAAtC,KAAoE;AAAA,EACpG,CAAC,GACH,GACF,GACF,GACF,IACE;AACN;","names":["jsx"]}