@geops/rvf-mobility-web-component 0.1.56 → 0.1.57

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 (123) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/docutils.js +1 -1
  3. package/global.d.ts +1 -0
  4. package/iframe.html +15 -0
  5. package/index.html +2 -1
  6. package/index.js +278 -330
  7. package/package.json +16 -17
  8. package/src/{RvfExportMenu/RvfExportMenu.tsx → ExportMenu/ExportMenu.tsx} +11 -11
  9. package/src/ExportMenu/index.tsx +1 -0
  10. package/src/{RvfExportMenuButton/RvfExportMenuButton.tsx → ExportMenuButton/ExportMenuButton.tsx} +5 -5
  11. package/src/ExportMenuButton/index.tsx +1 -0
  12. package/src/FeatureDetails/FeatureDetails.tsx +57 -0
  13. package/src/FeatureDetails/index.ts +1 -0
  14. package/src/FeaturesInfosListener/FeaturesInfosListener.tsx +73 -0
  15. package/src/FeaturesInfosListener/index.tsx +1 -0
  16. package/src/GeolocationButton/GeolocationButton.tsx +0 -1
  17. package/src/LayerTree/LayerTree.tsx +58 -0
  18. package/src/LayerTree/TreeItem/TreeItem.tsx +151 -0
  19. package/src/LayerTree/TreeItem/index.tsx +1 -0
  20. package/src/LayerTree/index.tsx +1 -0
  21. package/src/LayerTree/layersTreeContext.ts +4 -0
  22. package/src/LayerTree/layersTreeReducer.ts +158 -0
  23. package/src/{RvfLayerTreeButton/RvfLayerTreeButton.tsx → LayerTreeButton/LayerTreeButton.tsx} +5 -5
  24. package/src/LayerTreeButton/index.tsx +1 -0
  25. package/src/{RvfTopics/RvfTopics.tsx → LayerTreeMenu/LayerTreeMenu.tsx} +17 -13
  26. package/src/LayerTreeMenu/index.tsx +1 -0
  27. package/src/LayoutState/LayoutState.tsx +277 -0
  28. package/src/LayoutState/index.tsx +1 -0
  29. package/src/LinesNetworkPlanDetails/LinesNetworkPlanDetails.tsx +292 -0
  30. package/src/LinesNetworkPlanDetails/index.tsx +1 -0
  31. package/src/{RvfLineNetworkPlanLayer/RvfLineNetworkPlanLayer.tsx → LinesNetworkPlanLayer/LinesNetworkPlanLayer.tsx} +7 -9
  32. package/src/LinesNetworkPlanLayer/index.tsx +1 -0
  33. package/src/MobilityMap/MobilityMap.tsx +274 -60
  34. package/src/MobilityMap/MobilityMapAttributes.ts +27 -43
  35. package/src/NotificationDetails/NotificationDetails.tsx +468 -0
  36. package/src/NotificationDetails/index.ts +1 -0
  37. package/src/{NotificationLayer/NotificationLayer.tsx → NotificationsLayer/NotificationsLayer.tsx} +9 -4
  38. package/src/NotificationsLayer/index.tsx +1 -0
  39. package/src/Overlay/Overlay.tsx +1 -6
  40. package/src/OverlayContent/OverlayContent.tsx +87 -0
  41. package/src/OverlayContent/index.ts +1 -0
  42. package/src/OverlayDetails/OverlayDetails.tsx +47 -0
  43. package/src/OverlayDetails/index.ts +1 -0
  44. package/src/OverlayDetailsFooter/OverlayDetailsFooter.tsx +51 -0
  45. package/src/OverlayDetailsFooter/index.tsx +1 -0
  46. package/src/OverlayDetailsHeader/OverlayDetailsHeader.tsx +35 -0
  47. package/src/OverlayDetailsHeader/index.ts +1 -0
  48. package/src/OverlayFooter/OverlayFooter.tsx +41 -0
  49. package/src/OverlayFooter/index.tsx +1 -0
  50. package/src/OverlayHeader/OverlayHeader.tsx +44 -0
  51. package/src/OverlayHeader/index.tsx +1 -0
  52. package/src/PermalinkInput/PermalinkInput.tsx +28 -0
  53. package/src/PermalinkInput/index.tsx +1 -0
  54. package/src/RouteSchedule/RouteSchedule.tsx +22 -18
  55. package/src/RvfFeatureDetails/RvfFeatureDetails.tsx +22 -50
  56. package/src/RvfFeatureDetails/RvfLineNetworkDetails/RvfLineNetworkDetails.tsx +108 -104
  57. package/src/RvfFeatureDetails/RvfNotificationDetails/RvfNotificationDetails.tsx +189 -154
  58. package/src/RvfFeatureDetails/RvfSharedMobilityDetail/RvfSharedMobilityDetails.tsx +12 -14
  59. package/src/RvfFeatureDetailsTitle/RvfFeatureDetailsTitle.tsx +5 -5
  60. package/src/RvfMainLinkButton/RvfMainLinkButton.tsx +65 -0
  61. package/src/RvfMainLinkButton/index.tsx +1 -0
  62. package/src/RvfMobilityMap/RvfMobilityMap.tsx +182 -394
  63. package/src/RvfOverlayContent/RvfOverlayContent.tsx +2 -2
  64. package/src/RvfPoisLayer/RvfPoisLayer.tsx +2 -2
  65. package/src/RvfSearch/RvfSearch.tsx +1 -1
  66. package/src/RvfSellingPointsLayer/RvfSellingPointsLayer.tsx +2 -2
  67. package/src/RvfSharedMobilityLayerGroup/RvfSharedMobilityLayerGroup.tsx +23 -23
  68. package/src/RvfTarifZonenLayer/RvfTarifZonenLayer.tsx +2 -2
  69. package/src/Search/Search.tsx +11 -2
  70. package/src/{RvfSearchButton/RvfSearchButton.tsx → SearchButton/SearchButton.tsx} +5 -5
  71. package/src/SearchButton/index.tsx +1 -0
  72. package/src/ShadowOverflow/ShadowOverflow.tsx +20 -0
  73. package/src/ShadowOverflow/index.tsx +1 -0
  74. package/src/{RvfShare/RvfPermalinkButton/RvfPermalinkButton.tsx → ShareMenu/PermalinkButton/PermalinkButton.tsx} +4 -4
  75. package/src/ShareMenu/PermalinkButton/index.tsx +1 -0
  76. package/src/{RvfShare/RvfShare.tsx → ShareMenu/ShareMenu.tsx} +9 -11
  77. package/src/ShareMenu/index.tsx +1 -0
  78. package/src/{RvfShareMenuButton/RvfShareMenuButton.tsx → ShareMenuButton/ShareMenuButton.tsx} +6 -6
  79. package/src/ShareMenuButton/index.tsx +1 -0
  80. package/src/SingleClickListener/SingleClickListener.tsx +55 -113
  81. package/src/SingleClickListener/index.tsx +1 -1
  82. package/src/Station/Station.tsx +10 -3
  83. package/src/StationsLayer/StationsLayer.tsx +0 -1
  84. package/src/StopsSearch/StopsSearch.tsx +3 -4
  85. package/src/StopsSearch/index.tsx +2 -1
  86. package/src/WindowMessageListener/WindowMessageListener.tsx +7 -1
  87. package/src/{RvfZoomButtons/RvfZoomButtons.tsx → ZoomButtons/ZoomButtons.tsx} +9 -12
  88. package/src/ZoomButtons/index.tsx +1 -0
  89. package/src/icons/Geolocation/airport-14-svgrepo-com.svg +41 -0
  90. package/src/ui/Button/Button.tsx +9 -2
  91. package/src/ui/Checkbox/Checkbox.tsx +32 -0
  92. package/src/ui/Checkbox/index.tsx +1 -0
  93. package/src/ui/IconButton/IconButton.tsx +24 -4
  94. package/src/ui/Input/Input.tsx +17 -0
  95. package/src/ui/Input/index.tsx +1 -0
  96. package/src/ui/InputCopy/InputCopy.tsx +86 -0
  97. package/src/ui/InputCopy/index.tsx +1 -0
  98. package/src/ui/Select/Select.tsx +24 -0
  99. package/src/ui/Select/index.tsx +1 -0
  100. package/src/utils/constants.ts +43 -42
  101. package/src/utils/hooks/useInitialLayersVisiblity.tsx +1 -1
  102. package/src/utils/hooks/useLayerConfig.tsx +2 -2
  103. package/src/utils/hooks/useLayersConfig.tsx +3 -3
  104. package/src/utils/hooks/useMapContext.tsx +67 -8
  105. package/src/utils/hooks/useRvfContext.tsx +0 -44
  106. package/src/NotificationLayer/index.tsx +0 -1
  107. package/src/RvfEmbedNavigation/DragPanWarning.ts +0 -124
  108. package/src/RvfEmbedNavigation/RvfEmbedNavigation.tsx +0 -51
  109. package/src/RvfEmbedNavigation/index.js +0 -1
  110. package/src/RvfExportMenu/index.tsx +0 -1
  111. package/src/RvfExportMenuButton/index.tsx +0 -1
  112. package/src/RvfFloatingMenu/RvfFloatingMenu.tsx +0 -44
  113. package/src/RvfFloatingMenu/index.tsx +0 -1
  114. package/src/RvfLayerTreeButton/index.tsx +0 -1
  115. package/src/RvfLineNetworkPlanLayer/index.tsx +0 -1
  116. package/src/RvfPermalink/RvfPermalink.tsx +0 -18
  117. package/src/RvfPermalink/index.tsx +0 -1
  118. package/src/RvfSearchButton/index.tsx +0 -1
  119. package/src/RvfShare/RvfPermalinkButton/index.tsx +0 -1
  120. package/src/RvfShare/index.tsx +0 -1
  121. package/src/RvfShareMenuButton/index.tsx +0 -1
  122. package/src/RvfTopics/index.tsx +0 -1
  123. package/src/RvfZoomButtons/index.tsx +0 -1
@@ -0,0 +1,158 @@
1
+ import { SelectionType } from "./TreeItem/TreeItem";
2
+
3
+ const ROOT = {
4
+ childItems: [],
5
+ parent: null,
6
+ };
7
+
8
+ const mapNode = (childItems, parent) => {
9
+ for (const child of childItems) {
10
+ child.parent = parent;
11
+
12
+ if (child.childItems.length) {
13
+ mapNode(child.childItems, child);
14
+ }
15
+ }
16
+ };
17
+
18
+ const initTree = (tree) => {
19
+ const initializedTree = { ...ROOT };
20
+ initializedTree.childItems = tree;
21
+ mapNode(initializedTree.childItems, initializedTree);
22
+
23
+ return initializedTree;
24
+ };
25
+
26
+ const findNodeInTree = (node, nodeToFind) => {
27
+ if (node.id === nodeToFind.id) {
28
+ return node;
29
+ }
30
+
31
+ if (node.childItems.length) {
32
+ for (const child of node.childItems) {
33
+ const res = findNodeInTree(child, nodeToFind);
34
+ if (res) {
35
+ return res;
36
+ }
37
+ }
38
+ }
39
+ };
40
+
41
+ const updateCheckedControlStatus = (currentItem, newItem, isParentUpdate) => {
42
+ if (newItem.isControlChecked) {
43
+ if (newItem.selectionType === SelectionType.CHECKBOX) {
44
+ currentItem.isControlChecked = newItem.isControlChecked;
45
+ currentItem.layer.setVisible(currentItem.isControlChecked);
46
+ } else {
47
+ for (const child of currentItem.parent.childItems) {
48
+ child.isControlChecked = child.id === currentItem.id;
49
+
50
+ if (!child.isControlChecked) {
51
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
52
+ updateRadioChildNodes(child);
53
+ }
54
+ }
55
+ }
56
+ } else {
57
+ if (newItem.selectionType === SelectionType.CHECKBOX) {
58
+ currentItem.isControlChecked = newItem.isControlChecked;
59
+ currentItem.layer.setVisible(currentItem.isControlChecked);
60
+ }
61
+ }
62
+
63
+ // check all children
64
+ if (currentItem.childItems.length && !isParentUpdate) {
65
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
66
+ updateChildNodes(currentItem);
67
+ }
68
+
69
+ // check all parents
70
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
71
+ updateParentNodes(currentItem);
72
+ };
73
+
74
+ const setNewControlCheckedStatus = (tree, newItem) => {
75
+ const currentItem = findNodeInTree(tree, newItem);
76
+
77
+ if (currentItem) {
78
+ updateCheckedControlStatus(currentItem, newItem, false);
79
+ }
80
+
81
+ return { ...tree };
82
+ };
83
+
84
+ const updateChildNodes = (node) => {
85
+ if (node.childItems[0].selectionType === SelectionType.RADIO) {
86
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
87
+ updateRadioChildNodes(node);
88
+ } else {
89
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
90
+ updateCheckboxChildNodes(node);
91
+ }
92
+ };
93
+
94
+ const updateRadioChildNodes = (parent) => {
95
+ if (parent.isControlChecked) {
96
+ for (let i = 0; i < parent.childItems.length; i++) {
97
+ parent.childItems[i].isControlChecked = i === 0;
98
+ }
99
+ } else {
100
+ for (const child of parent.childItems) {
101
+ child.isControlChecked = false;
102
+ }
103
+ }
104
+
105
+ if (parent.childItems.length) {
106
+ if (parent.childItems[0].childItems.length) {
107
+ updateChildNodes(parent.childItems[0]);
108
+ }
109
+ }
110
+ };
111
+
112
+ const updateCheckboxChildNodes = (parent) => {
113
+ for (const child of parent.childItems) {
114
+ child.isControlChecked = parent.isControlChecked;
115
+ child.layer.setVisible(child.isControlChecked);
116
+
117
+ if (child.childItems.length) {
118
+ updateChildNodes(child);
119
+ }
120
+ }
121
+ };
122
+
123
+ const updateParentNodes = (node) => {
124
+ if (node.parent) {
125
+ if (node.parent.selectionType === SelectionType.CHECKBOX) {
126
+ const newItem = {
127
+ ...node.parent,
128
+ isControlChecked: node.parent.childItems.some((child) => {
129
+ return child.isControlChecked;
130
+ }),
131
+ };
132
+ updateCheckedControlStatus(node.parent, newItem, true);
133
+ } else {
134
+ if (node?.parent?.parent) {
135
+ const newItem = {
136
+ ...node.parent,
137
+ isControlChecked: node.parent.childItems.some((child) => {
138
+ return child.isControlChecked;
139
+ }),
140
+ };
141
+ updateCheckedControlStatus(node.parent, newItem, true);
142
+ }
143
+ }
144
+ }
145
+ };
146
+
147
+ function layersTreeReducer(state = ROOT, action) {
148
+ switch (action.type) {
149
+ case "INIT":
150
+ return initTree(action.payload);
151
+ case "SELECT_ITEM":
152
+ return setNewControlCheckedStatus(state, action.payload);
153
+ default:
154
+ return state;
155
+ }
156
+ }
157
+
158
+ export default layersTreeReducer;
@@ -3,15 +3,15 @@ import { useCallback } from "preact/hooks";
3
3
 
4
4
  import Stack from "../icons/Stack";
5
5
  import IconButton from "../ui/IconButton";
6
- import useRvfContext from "../utils/hooks/useRvfContext";
6
+ import useMapContext from "../utils/hooks/useMapContext";
7
7
 
8
8
  import type { HTMLAttributes, PreactDOMAttributes } from "preact";
9
9
 
10
- export type RvfLayerTreeButtonProps = HTMLAttributes<HTMLButtonElement> &
10
+ export type LayerTreeButtonProps = HTMLAttributes<HTMLButtonElement> &
11
11
  PreactDOMAttributes;
12
12
 
13
- function RvfLayerTreeButton({ ...props }: RvfLayerTreeButtonProps) {
14
- const { isLayerTreeOpen, setIsLayerTreeOpen } = useRvfContext();
13
+ function LayerTreeButton({ ...props }: LayerTreeButtonProps) {
14
+ const { isLayerTreeOpen, setIsLayerTreeOpen } = useMapContext();
15
15
 
16
16
  const onClick = useCallback(() => {
17
17
  setIsLayerTreeOpen(!isLayerTreeOpen);
@@ -24,4 +24,4 @@ function RvfLayerTreeButton({ ...props }: RvfLayerTreeButtonProps) {
24
24
  );
25
25
  }
26
26
 
27
- export default memo(RvfLayerTreeButton);
27
+ export default memo(LayerTreeButton);
@@ -0,0 +1 @@
1
+ export { default } from "./LayerTreeButton";
@@ -1,18 +1,21 @@
1
+ import { getLayersAsFlatArray } from "mobility-toolbox-js/ol";
1
2
  import { getUid } from "ol";
2
3
  import { unByKey } from "ol/Observable";
3
4
  import { memo, useEffect, useMemo, useState } from "preact/compat";
4
5
 
5
- import RvfLayerTree from "../RvfLayerTree";
6
- import { SelectionType } from "../RvfLayerTree/TreeItem/TreeItem";
7
- import getLayersAsFlatArray from "../utils/getLayersAsFlatArray";
6
+ import LayerTree from "../LayerTree";
7
+ import { SelectionType } from "../LayerTree/TreeItem";
8
+ import { LAYERS_TITLES } from "../utils/constants";
8
9
  import useMapContext from "../utils/hooks/useMapContext";
9
10
 
10
11
  import type { Group } from "ol/layer";
11
12
  import type BaseLayer from "ol/layer/Base";
12
- import type { JSX, PreactDOMAttributes } from "preact";
13
+ import type { HTMLAttributes, PreactDOMAttributes } from "preact";
13
14
 
14
- export interface RvfLayerTreeConfig {
15
- childItems: RvfLayerTreeConfig[];
15
+ import type { LayerTreeProps } from "../LayerTree/LayerTree";
16
+
17
+ export interface LayerTreeConfig {
18
+ childItems: LayerTreeConfig[];
16
19
  id: string;
17
20
  isControlChecked: boolean;
18
21
  layer: BaseLayer;
@@ -21,13 +24,14 @@ export interface RvfLayerTreeConfig {
21
24
  title: string;
22
25
  }
23
26
 
24
- export type RvfTopicsProps = {} & JSX.HTMLAttributes<HTMLDivElement> &
27
+ export type LayerTreeMenuProps = HTMLAttributes<HTMLDivElement> &
28
+ Partial<LayerTreeProps> &
25
29
  PreactDOMAttributes;
26
30
 
27
31
  const getConfigForLayer = (
28
32
  layer: BaseLayer,
29
33
  revision: number,
30
- ): RvfLayerTreeConfig => {
34
+ ): LayerTreeConfig => {
31
35
  return {
32
36
  childItems:
33
37
  (layer as Group)
@@ -41,15 +45,15 @@ const getConfigForLayer = (
41
45
  layer,
42
46
  revision,
43
47
  selectionType: SelectionType.CHECKBOX,
44
- title: layer.get("title"),
48
+ title: layer.get("title") || LAYERS_TITLES[layer.get("name")],
45
49
  };
46
50
  };
47
51
 
48
- function RvfTopics(props: RvfTopicsProps) {
52
+ function LayerTreeMenu(props: LayerTreeMenuProps) {
49
53
  const { map } = useMapContext();
50
54
  const [revision, setRevision] = useState(0);
51
55
 
52
- const layers: RvfLayerTreeConfig[] = useMemo(() => {
56
+ const layers: LayerTreeConfig[] = useMemo(() => {
53
57
  const config =
54
58
  map
55
59
  ?.getLayers()
@@ -95,7 +99,7 @@ function RvfTopics(props: RvfTopicsProps) {
95
99
  };
96
100
  }, [map]);
97
101
 
98
- return <RvfLayerTree layers={layers} {...props} />;
102
+ return <LayerTree layers={layers} {...props} />;
99
103
  }
100
104
 
101
- export default memo(RvfTopics);
105
+ export default memo(LayerTreeMenu);
@@ -0,0 +1 @@
1
+ export { default } from "./LayerTreeMenu";
@@ -0,0 +1,277 @@
1
+ import { useEffect } from "preact/hooks";
2
+
3
+ import useMapContext from "../utils/hooks/useMapContext";
4
+
5
+ /**
6
+ * This component is responsible for updating the layout state in the context.
7
+ */
8
+ function LayoutState() {
9
+ const {
10
+ details,
11
+ embed,
12
+ geolocation,
13
+ hasDetails,
14
+ hasLayerTree,
15
+ hasPrint,
16
+ hasRealtime,
17
+ hasShare,
18
+ isExportMenuOpen,
19
+ isLayerTreeOpen,
20
+ isSearchOpen,
21
+ isShareMenuOpen,
22
+ layertree,
23
+ lnp,
24
+ notification,
25
+ permalink,
26
+ previewNotifications,
27
+ print,
28
+ realtime,
29
+ search,
30
+ selectedFeature,
31
+ setFeaturesInfos,
32
+ setHasDetails,
33
+ setHasGeolocation,
34
+ setHasLayerTree,
35
+ setHasLnp,
36
+ setHasNotification,
37
+ setHasPermalink,
38
+ setHasPrint,
39
+ setHasRealtime,
40
+ setHasSearch,
41
+ setHasShare,
42
+ setHasStations,
43
+ setHasToolbar,
44
+ setIsEmbed,
45
+ setIsExportMenuOpen,
46
+ setIsLayerTreeOpen,
47
+ setIsOverlayOpen,
48
+ setIsSearchOpen,
49
+ setIsShareMenuOpen,
50
+ setStationId,
51
+ setTrainId,
52
+ share,
53
+ stationId,
54
+ tenant,
55
+ toolbar,
56
+ trainId,
57
+ } = useMapContext();
58
+
59
+ useEffect(() => {
60
+ setHasStations(!!tenant);
61
+ }, [setHasStations, tenant]);
62
+
63
+ useEffect(() => {
64
+ setHasRealtime(realtime === "true");
65
+ }, [realtime, setHasRealtime]);
66
+
67
+ useEffect(() => {
68
+ setHasNotification(notification === "true" || !!previewNotifications);
69
+ }, [notification, previewNotifications, setHasNotification]);
70
+
71
+ useEffect(() => {
72
+ setHasGeolocation(geolocation === "true");
73
+ }, [geolocation, setHasGeolocation]);
74
+
75
+ useEffect(() => {
76
+ setHasPermalink(permalink === "true");
77
+ }, [permalink, setHasPermalink]);
78
+
79
+ useEffect(() => {
80
+ setHasSearch(search === "true");
81
+ }, [search, setHasSearch]);
82
+
83
+ useEffect(() => {
84
+ setIsEmbed(embed === "true");
85
+ }, [embed, setIsEmbed]);
86
+
87
+ useEffect(() => {
88
+ setHasLnp(lnp === "true");
89
+ }, [lnp, setHasLnp]);
90
+
91
+ useEffect(() => {
92
+ setHasShare(share === "true");
93
+ }, [share, setHasShare]);
94
+
95
+ useEffect(() => {
96
+ setHasPrint(print === "true");
97
+ }, [print, setHasPrint]);
98
+
99
+ useEffect(() => {
100
+ setHasDetails(details === "true");
101
+ }, [details, setHasDetails]);
102
+
103
+ useEffect(() => {
104
+ setHasToolbar(toolbar === "true");
105
+ }, [toolbar, setHasToolbar]);
106
+
107
+ useEffect(() => {
108
+ setHasLayerTree(layertree === "true");
109
+ }, [layertree, setHasLayerTree]);
110
+
111
+ useEffect(() => {
112
+ if (isSearchOpen) {
113
+ setIsLayerTreeOpen(false);
114
+ setIsExportMenuOpen(false);
115
+ setIsShareMenuOpen(false);
116
+ setStationId(null);
117
+ setTrainId(null);
118
+ setFeaturesInfos(null);
119
+ }
120
+ }, [
121
+ isSearchOpen,
122
+ setFeaturesInfos,
123
+ setIsExportMenuOpen,
124
+ setIsLayerTreeOpen,
125
+ setIsShareMenuOpen,
126
+ setStationId,
127
+ setTrainId,
128
+ ]);
129
+
130
+ useEffect(() => {
131
+ if (isShareMenuOpen) {
132
+ setIsLayerTreeOpen(false);
133
+ setIsExportMenuOpen(false);
134
+ setIsSearchOpen(false);
135
+ setStationId(null);
136
+ setTrainId(null);
137
+ setFeaturesInfos(null);
138
+ }
139
+ }, [
140
+ isShareMenuOpen,
141
+ setFeaturesInfos,
142
+ setIsExportMenuOpen,
143
+ setIsLayerTreeOpen,
144
+ setIsSearchOpen,
145
+ setStationId,
146
+ setTrainId,
147
+ ]);
148
+
149
+ useEffect(() => {
150
+ if (isLayerTreeOpen) {
151
+ setIsExportMenuOpen(false);
152
+ setIsLayerTreeOpen(isLayerTreeOpen);
153
+ setIsSearchOpen(false);
154
+ setFeaturesInfos(null);
155
+ setTrainId(null);
156
+ setStationId(null);
157
+ setIsShareMenuOpen(false);
158
+ }
159
+ }, [
160
+ isLayerTreeOpen,
161
+ setFeaturesInfos,
162
+ setIsExportMenuOpen,
163
+ setIsLayerTreeOpen,
164
+ setIsSearchOpen,
165
+ setIsShareMenuOpen,
166
+ setStationId,
167
+ setTrainId,
168
+ ]);
169
+
170
+ useEffect(() => {
171
+ if (isExportMenuOpen) {
172
+ setIsLayerTreeOpen(false);
173
+ setIsExportMenuOpen(isExportMenuOpen);
174
+ setIsSearchOpen(false);
175
+ setFeaturesInfos(null);
176
+ setTrainId(null);
177
+ setIsShareMenuOpen(false);
178
+ setStationId(null);
179
+ }
180
+ }, [
181
+ isExportMenuOpen,
182
+ setFeaturesInfos,
183
+ setIsExportMenuOpen,
184
+ setIsLayerTreeOpen,
185
+ setIsSearchOpen,
186
+ setIsShareMenuOpen,
187
+ setStationId,
188
+ setTrainId,
189
+ ]);
190
+
191
+ useEffect(() => {
192
+ if (selectedFeature) {
193
+ setIsLayerTreeOpen(false);
194
+ setIsSearchOpen(false);
195
+ setIsExportMenuOpen(false);
196
+ setIsShareMenuOpen(false);
197
+ setTrainId(selectedFeature?.get("train_id") || null);
198
+ setStationId(selectedFeature?.get("uid") || null);
199
+ } else if (!selectedFeature) {
200
+ setTrainId(null);
201
+ setStationId(null);
202
+ }
203
+ }, [
204
+ selectedFeature,
205
+ setIsExportMenuOpen,
206
+ setIsLayerTreeOpen,
207
+ setIsSearchOpen,
208
+ setIsShareMenuOpen,
209
+ setStationId,
210
+ setTrainId,
211
+ ]);
212
+
213
+ useEffect(() => {
214
+ if (stationId) {
215
+ setIsLayerTreeOpen(false);
216
+ setIsExportMenuOpen(false);
217
+ setIsSearchOpen(false);
218
+ setTrainId(null);
219
+ setIsShareMenuOpen(false);
220
+ }
221
+ }, [
222
+ setFeaturesInfos,
223
+ setIsExportMenuOpen,
224
+ setIsLayerTreeOpen,
225
+ setIsSearchOpen,
226
+ setIsShareMenuOpen,
227
+ setTrainId,
228
+ stationId,
229
+ ]);
230
+
231
+ useEffect(() => {
232
+ if (trainId) {
233
+ setIsLayerTreeOpen(false);
234
+ setIsExportMenuOpen(false);
235
+ setIsSearchOpen(false);
236
+ setStationId(null);
237
+ setIsShareMenuOpen(false);
238
+ }
239
+ }, [
240
+ setFeaturesInfos,
241
+ setIsExportMenuOpen,
242
+ setIsLayerTreeOpen,
243
+ setIsSearchOpen,
244
+ setIsShareMenuOpen,
245
+ setStationId,
246
+ trainId,
247
+ ]);
248
+
249
+ useEffect(() => {
250
+ setIsOverlayOpen(
251
+ (hasDetails && !!selectedFeature) ||
252
+ (hasPrint && isExportMenuOpen) ||
253
+ (hasLayerTree && isLayerTreeOpen) ||
254
+ (hasShare && isShareMenuOpen) ||
255
+ (hasRealtime && !!trainId) ||
256
+ (tenant && !!stationId),
257
+ );
258
+ }, [
259
+ hasDetails,
260
+ selectedFeature,
261
+ hasPrint,
262
+ isExportMenuOpen,
263
+ hasLayerTree,
264
+ isLayerTreeOpen,
265
+ hasShare,
266
+ isShareMenuOpen,
267
+ hasRealtime,
268
+ trainId,
269
+ tenant,
270
+ stationId,
271
+ setIsOverlayOpen,
272
+ ]);
273
+
274
+ return null;
275
+ }
276
+
277
+ export default LayoutState;
@@ -0,0 +1 @@
1
+ export { default } from "./LayoutState";