@@ -18,15 +18,15 @@ type GoogleMap = google.maps.Map;
18
18
type GoogleMarker = google . maps . Marker ;
19
19
type GooglePolyline = google . maps . Polyline ;
20
20
21
- let lastLine :GooglePolyline ;
22
-
23
21
const Map : React . FC < IMap > = ( { mapType, mapTypeControl = false , setDistanceInKm} ) => {
24
22
25
23
const ref = useRef < HTMLDivElement > ( null ) ;
26
24
const [ map , setMap ] = useState < GoogleMap > ( ) ;
27
25
const [ marker , setMarker ] = useState < IMarker > ( ) ;
28
26
const [ homeMarker , setHomeMarker ] = useState < GoogleMarker > ( ) ;
29
27
const [ googleMarkers , setGoogleMarkers ] = useState < GoogleMarker [ ] > ( [ ] ) ;
28
+ const [ listenerIdArray , setListenerIdArray ] = useState < any [ ] > ( [ ] ) ;
29
+ const [ LastLineHook , setLastLineHook ] = useState < GooglePolyline > ( ) ;
30
30
31
31
const startMap = ( ) : void => {
32
32
if ( ! map ) {
@@ -80,14 +80,18 @@ const Map: React.FC<IMap> = ({ mapType, mapTypeControl = false, setDistanceInKm}
80
80
81
81
setGoogleMarkers ( googleMarkers => [ ...googleMarkers , marker ] ) ;
82
82
83
- marker . addListener ( 'click' , ( ) => {
83
+ const listenerId = marker . addListener ( 'click' , ( ) => {
84
84
const homePos = homeMarker ?. getPosition ( ) ;
85
85
const markerPos = marker . getPosition ( ) ;
86
86
if ( homePos && markerPos ) {
87
87
const distanceInMeters = google . maps . geometry . spherical . computeDistanceBetween ( homePos , markerPos ) ;
88
88
setDistanceInKm ( Math . round ( distanceInMeters / 1000 ) ) ;
89
89
90
- lastLine = new google . maps . Polyline ( {
90
+ if ( LastLineHook ) {
91
+ LastLineHook . setMap ( null ) ;
92
+ }
93
+
94
+ const line = new google . maps . Polyline ( {
91
95
path : [
92
96
{ lat : homePos . lat ( ) , lng : homePos . lng ( ) } ,
93
97
{ lat : markerPos . lat ( ) , lng : markerPos . lng ( ) } ,
@@ -102,10 +106,29 @@ const Map: React.FC<IMap> = ({ mapType, mapTypeControl = false, setDistanceInKm}
102
106
] ,
103
107
map : map ,
104
108
} ) ;
109
+
110
+ setLastLineHook ( line ) ;
105
111
}
106
112
} ) ;
113
+
114
+ setListenerIdArray ( listenerIdArray => [ ...listenerIdArray , listenerId ] ) ;
107
115
} ;
108
116
117
+ useEffect ( ( ) => {
118
+ listenerIdArray . forEach ( ( listenerId ) => {
119
+ google . maps . event . removeListener ( listenerId ) ;
120
+ } ) ;
121
+
122
+ setListenerIdArray ( [ ] ) ;
123
+ setGoogleMarkers ( [ ] ) ;
124
+ googleMarkers . forEach ( ( googleMarker ) => {
125
+ const markerPosition = googleMarker . getPosition ( ) ;
126
+ if ( markerPosition ) {
127
+ addMarker ( markerPosition ) ;
128
+ }
129
+ } ) ;
130
+ } , [ LastLineHook ] ) ;
131
+
109
132
const addHomeMarker = ( location : GoogleLatLng ) : GoogleMarker => {
110
133
const homeMarkerConst :GoogleMarker = new google . maps . Marker ( {
111
134
position : location ,
0 commit comments