11import type { PointLike } from 'maplibre-gl' ;
22import { FC } from 'react' ;
33import { Marker } from 'react-map-gl/maplibre' ;
4- import { ReusableComponentsVehicleModeEnum } from '../../../generated/graphql' ;
4+ import { StopRegistryTransportModeType } from '../../../generated/graphql' ;
55import { theme } from '../../../generated/theme' ;
66import { MapEntityEditorViewState } from '../../../redux' ;
77import { StopMarker } from '../markers' ;
@@ -13,6 +13,38 @@ const { colors } = theme;
1313// Needed to align the stop correctly, when the stop label is or isn't shown.
1414const offset : PointLike = [ - 13 , 0 ] ;
1515
16+ function determineTransportModeColor (
17+ mode : StopRegistryTransportModeType ,
18+ isTrunkLineStop : boolean ,
19+ isSpeedTramStop : boolean ,
20+ ) {
21+ if ( mode === StopRegistryTransportModeType . Bus ) {
22+ return isTrunkLineStop ? colors . hslTrunkLineOrange : colors . tweakedBrand ;
23+ }
24+
25+ if ( mode === StopRegistryTransportModeType . Tram ) {
26+ return isSpeedTramStop
27+ ? colors . hslSpeedTramTurquoise
28+ : colors . hslTramDarkGreen ;
29+ }
30+
31+ if ( mode === StopRegistryTransportModeType . Metro ) {
32+ return colors . hslMetroOrange ;
33+ }
34+
35+ if ( mode === StopRegistryTransportModeType . Water ) {
36+ return colors . hslFerryBlue ;
37+ }
38+
39+ if ( mode === StopRegistryTransportModeType . Rail ) {
40+ return colors . hslFerryBlue ;
41+ }
42+
43+ throw new Error (
44+ `No color specified for StopRegistryTransportModeType(${ mode } )!` ,
45+ ) ;
46+ }
47+
1648/** Stop map markers border color is determined in this function. There are
1749 * different aspects which are affecting this determination. These are
1850 * * isPlaceholder: when moving a stop we have a placeholder for the stop's
@@ -28,7 +60,9 @@ function determineBorderColor(
2860 asMemberStop : boolean ,
2961 isSelected : boolean ,
3062 isPlaceholder : boolean ,
31- stopVehicleMode : ReusableComponentsVehicleModeEnum | undefined ,
63+ activeTransportModes : ReadonlyArray < StopRegistryTransportModeType > ,
64+ isTrunkLineStop : boolean ,
65+ isSpeedTramStop : boolean ,
3266 inSelection : boolean ,
3367) {
3468 if ( inSelection ) {
@@ -51,8 +85,13 @@ function determineBorderColor(
5185 return colors . selectedMapItem ;
5286 }
5387
54- if ( stopVehicleMode ) {
55- return colors . stops [ stopVehicleMode ] ?? colors . hslDark80 ;
88+ const primaryMode = activeTransportModes . at ( 0 ) ;
89+ if ( primaryMode ) {
90+ return determineTransportModeColor (
91+ primaryMode ,
92+ isTrunkLineStop ,
93+ isSpeedTramStop ,
94+ ) ;
5695 }
5796
5897 return colors . hslDark80 ;
@@ -63,18 +102,43 @@ function determineFillColor(
63102 isSelected : boolean ,
64103 inSelection : boolean ,
65104 shouldBeGray : boolean ,
105+ activeTransportModes : ReadonlyArray < StopRegistryTransportModeType > ,
66106) {
67107 if ( isSelected || asMemberStop || inSelection ) {
68108 return 'white' ;
69109 }
70110
71- if ( shouldBeGray ) {
111+ if ( shouldBeGray || activeTransportModes . length === 0 ) {
72112 return colors . lightGrey ;
73113 }
74114
75115 return 'white' ;
76116}
77117
118+ function determineSecondaryFillColor (
119+ asMemberStop : boolean ,
120+ isSelected : boolean ,
121+ inSelection : boolean ,
122+ activeTransportModes : ReadonlyArray < StopRegistryTransportModeType > ,
123+ isTrunkLineStop : boolean ,
124+ isSpeedTramStop : boolean ,
125+ ) {
126+ if ( isSelected || asMemberStop || inSelection ) {
127+ return null ;
128+ }
129+
130+ if ( activeTransportModes . length >= 2 ) {
131+ const secondaryMode = activeTransportModes [ 1 ] ;
132+ return determineTransportModeColor (
133+ secondaryMode ,
134+ isTrunkLineStop ,
135+ isSpeedTramStop ,
136+ ) ;
137+ }
138+
139+ return null ;
140+ }
141+
78142type BaseStopProps = {
79143 readonly longitude : number ;
80144 readonly latitude : number ;
@@ -84,7 +148,9 @@ type BaseStopProps = {
84148 readonly mapStopViewState : MapEntityEditorViewState ;
85149 readonly selected ?: boolean ;
86150 readonly testId ?: string ;
87- readonly vehicleMode ?: ReusableComponentsVehicleModeEnum ;
151+ readonly activeTransportModes : ReadonlyArray < StopRegistryTransportModeType > ;
152+ readonly isTrunkLineStop ?: boolean ;
153+ readonly isSpeedTramStop ?: boolean ;
88154 readonly shouldBeGray ?: boolean ;
89155 readonly showLabel ?: boolean ;
90156} ;
@@ -114,7 +180,9 @@ export const Stop: FC<StopProps> = ({
114180 mapStopViewState,
115181 selected = false ,
116182 testId,
117- vehicleMode,
183+ activeTransportModes,
184+ isTrunkLineStop = false ,
185+ isSpeedTramStop = false ,
118186 shouldBeGray = false ,
119187 onClick,
120188 onResolveTitle,
@@ -130,7 +198,9 @@ export const Stop: FC<StopProps> = ({
130198 asMemberStop ,
131199 selected ,
132200 isPlaceholder ,
133- vehicleMode ,
201+ activeTransportModes ,
202+ isTrunkLineStop ,
203+ isSpeedTramStop ,
134204 inSelection ,
135205 ) ;
136206
@@ -139,6 +209,16 @@ export const Stop: FC<StopProps> = ({
139209 selected ,
140210 inSelection ,
141211 shouldBeGray ,
212+ activeTransportModes ,
213+ ) ;
214+
215+ const secondaryFillColor = determineSecondaryFillColor (
216+ asMemberStop ,
217+ selected ,
218+ inSelection ,
219+ activeTransportModes ,
220+ isTrunkLineStop ,
221+ isSpeedTramStop ,
142222 ) ;
143223
144224 return (
@@ -153,6 +233,7 @@ export const Stop: FC<StopProps> = ({
153233 testId = { testId }
154234 borderColor = { iconBorderColor }
155235 fillColor = { iconFillColor }
236+ secondaryFillColor = { secondaryFillColor }
156237 borderWidth = { 3 }
157238 strokeDashArray = { isPlaceholder ? 2 : 0 }
158239 centerDot = { selected }
0 commit comments