Skip to content

Commit bf3992c

Browse files
committed
[Map] Create "createDrawingFactory" to refactor methods "createMarker"/"createPolyline"/"createPolygon" (not identical but follow the same pattern)
1 parent a443ad8 commit bf3992c

File tree

9 files changed

+205
-160
lines changed

9 files changed

+205
-160
lines changed

src/Map/assets/dist/abstract_map_controller.d.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,11 @@ export default abstract class<MapOptions, Map, MarkerOptions, Marker, InfoWindow
6262
protected polylines: globalThis.Map<string, Polyline>;
6363
protected infoWindows: Array<InfoWindow>;
6464
private isConnected;
65+
private createMarker;
66+
private createPolygon;
67+
private createPolyline;
6568
protected abstract dispatchEvent(name: string, payload: Record<string, unknown>): void;
6669
connect(): void;
67-
createMarker(definition: MarkerDefinition<MarkerOptions, InfoWindowOptions>): Marker;
68-
createPolygon(definition: PolygonDefinition<PolygonOptions, InfoWindowOptions>): Polygon;
69-
createPolyline(definition: PolylineDefinition<PolylineOptions, InfoWindowOptions>): Polyline;
7070
createInfoWindow({ definition, element, }: {
7171
definition: InfoWindowWithoutPositionDefinition<InfoWindowOptions>;
7272
element: Marker | Polygon | Polyline;
@@ -82,14 +82,21 @@ export default abstract class<MapOptions, Map, MarkerOptions, Marker, InfoWindow
8282
options: MapOptions;
8383
}): Map;
8484
protected abstract doFitBoundsToMarkers(): void;
85-
protected abstract doCreateMarker(definition: MarkerDefinition<MarkerOptions, InfoWindowOptions>): Marker;
85+
protected abstract doCreateMarker({ definition, }: {
86+
definition: MarkerDefinition<MarkerOptions, InfoWindowOptions>;
87+
}): Marker;
8688
protected abstract doRemoveMarker(marker: Marker): void;
87-
protected abstract doCreatePolygon(definition: PolygonDefinition<PolygonOptions, InfoWindowOptions>): Polygon;
89+
protected abstract doCreatePolygon({ definition, }: {
90+
definition: PolygonDefinition<PolygonOptions, InfoWindowOptions>;
91+
}): Polygon;
8892
protected abstract doRemovePolygon(polygon: Polygon): void;
89-
protected abstract doCreatePolyline(definition: PolylineDefinition<PolylineOptions, InfoWindowOptions>): Polyline;
93+
protected abstract doCreatePolyline({ definition, }: {
94+
definition: PolylineDefinition<PolylineOptions, InfoWindowOptions>;
95+
}): Polyline;
9096
protected abstract doRemovePolyline(polyline: Polyline): void;
9197
protected abstract doCreateInfoWindow({ definition, element, }: {
9298
definition: InfoWindowWithoutPositionDefinition<InfoWindowOptions>;
9399
element: Marker | Polygon | Polyline;
94100
}): InfoWindow;
101+
private createDrawingFactory;
95102
}

src/Map/assets/dist/abstract_map_controller.js

Lines changed: 20 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,13 @@ class default_1 extends Controller {
1212
connect() {
1313
const options = this.optionsValue;
1414
this.dispatchEvent('pre-connect', { options });
15+
this.createMarker = this.createDrawingFactory('marker', this.markers, this.doCreateMarker.bind(this));
16+
this.createPolygon = this.createDrawingFactory('polygon', this.polygons, this.doCreatePolygon.bind(this));
17+
this.createPolyline = this.createDrawingFactory('polyline', this.polylines, this.doCreatePolyline.bind(this));
1518
this.map = this.doCreateMap({ center: this.centerValue, zoom: this.zoomValue, options });
16-
this.markersValue.forEach((marker) => this.createMarker(marker));
17-
this.polygonsValue.forEach((polygon) => this.createPolygon(polygon));
18-
this.polylinesValue.forEach((polyline) => this.createPolyline(polyline));
19+
this.markersValue.forEach((definition) => this.createMarker({ definition }));
20+
this.polygonsValue.forEach((definition) => this.createPolygon({ definition }));
21+
this.polylinesValue.forEach((definition) => this.createPolyline({ definition }));
1922
if (this.fitBoundsToMarkersValue) {
2023
this.doFitBoundsToMarkers();
2124
}
@@ -28,27 +31,6 @@ class default_1 extends Controller {
2831
});
2932
this.isConnected = true;
3033
}
31-
createMarker(definition) {
32-
this.dispatchEvent('marker:before-create', { definition });
33-
const marker = this.doCreateMarker(definition);
34-
this.dispatchEvent('marker:after-create', { marker });
35-
this.markers.set(definition['@id'], marker);
36-
return marker;
37-
}
38-
createPolygon(definition) {
39-
this.dispatchEvent('polygon:before-create', { definition });
40-
const polygon = this.doCreatePolygon(definition);
41-
this.dispatchEvent('polygon:after-create', { polygon });
42-
this.polygons.set(definition['@id'], polygon);
43-
return polygon;
44-
}
45-
createPolyline(definition) {
46-
this.dispatchEvent('polyline:before-create', { definition });
47-
const polyline = this.doCreatePolyline(definition);
48-
this.dispatchEvent('polyline:after-create', { polyline });
49-
this.polylines.set(definition['@id'], polyline);
50-
return polyline;
51-
}
5234
createInfoWindow({ definition, element, }) {
5335
this.dispatchEvent('info-window:before-create', { definition, element });
5436
const infoWindow = this.doCreateInfoWindow({ definition, element });
@@ -71,7 +53,7 @@ class default_1 extends Controller {
7153
});
7254
this.markersValue.forEach((definition) => {
7355
if (!this.markers.has(definition['@id'])) {
74-
this.createMarker(definition);
56+
this.createMarker({ definition });
7557
}
7658
});
7759
if (this.fitBoundsToMarkersValue) {
@@ -93,7 +75,7 @@ class default_1 extends Controller {
9375
});
9476
this.polygonsValue.forEach((definition) => {
9577
if (!this.polygons.has(definition['@id'])) {
96-
this.createPolygon(definition);
78+
this.createPolygon({ definition });
9779
}
9880
});
9981
}
@@ -112,10 +94,21 @@ class default_1 extends Controller {
11294
});
11395
this.polylinesValue.forEach((definition) => {
11496
if (!this.polylines.has(definition['@id'])) {
115-
this.createPolyline(definition);
97+
this.createPolyline({ definition });
11698
}
11799
});
118100
}
101+
createDrawingFactory(type, draws, factory) {
102+
const eventBefore = `${type}:before-create`;
103+
const eventAfter = `${type}:after-create`;
104+
return ({ definition }) => {
105+
this.dispatchEvent(eventBefore, { definition });
106+
const drawing = factory(definition);
107+
this.dispatchEvent(eventAfter, { [type]: drawing });
108+
draws.set(definition['@id'], drawing);
109+
return drawing;
110+
};
111+
}
119112
}
120113
default_1.values = {
121114
providerOptions: Object,

src/Map/assets/src/abstract_map_controller.ts

Lines changed: 74 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,15 @@ export default abstract class<
119119
protected infoWindows: Array<InfoWindow> = [];
120120

121121
private isConnected = false;
122+
private createMarker: ({
123+
definition,
124+
}: { definition: MarkerDefinition<MarkerOptions, InfoWindowOptions> }) => Marker;
125+
private createPolygon: ({
126+
definition,
127+
}: { definition: PolygonDefinition<PolygonOptions, InfoWindowOptions> }) => Polygon;
128+
private createPolyline: ({
129+
definition,
130+
}: { definition: PolylineDefinition<PolylineOptions, InfoWindowOptions> }) => Polyline;
122131

123132
protected abstract dispatchEvent(name: string, payload: Record<string, unknown>): void;
124133

@@ -127,10 +136,14 @@ export default abstract class<
127136

128137
this.dispatchEvent('pre-connect', { options });
129138

139+
this.createMarker = this.createDrawingFactory('marker', this.markers, this.doCreateMarker.bind(this));
140+
this.createPolygon = this.createDrawingFactory('polygon', this.polygons, this.doCreatePolygon.bind(this));
141+
this.createPolyline = this.createDrawingFactory('polyline', this.polylines, this.doCreatePolyline.bind(this));
142+
130143
this.map = this.doCreateMap({ center: this.centerValue, zoom: this.zoomValue, options });
131-
this.markersValue.forEach((marker) => this.createMarker(marker));
132-
this.polygonsValue.forEach((polygon) => this.createPolygon(polygon));
133-
this.polylinesValue.forEach((polyline) => this.createPolyline(polyline));
144+
this.markersValue.forEach((definition) => this.createMarker({ definition }));
145+
this.polygonsValue.forEach((definition) => this.createPolygon({ definition }));
146+
this.polylinesValue.forEach((definition) => this.createPolyline({ definition }));
134147

135148
if (this.fitBoundsToMarkersValue) {
136149
this.doFitBoundsToMarkers();
@@ -148,36 +161,6 @@ export default abstract class<
148161
}
149162

150163
//region Public API
151-
public createMarker(definition: MarkerDefinition<MarkerOptions, InfoWindowOptions>): Marker {
152-
this.dispatchEvent('marker:before-create', { definition });
153-
const marker = this.doCreateMarker(definition);
154-
this.dispatchEvent('marker:after-create', { marker });
155-
156-
this.markers.set(definition['@id'], marker);
157-
158-
return marker;
159-
}
160-
161-
public createPolygon(definition: PolygonDefinition<PolygonOptions, InfoWindowOptions>): Polygon {
162-
this.dispatchEvent('polygon:before-create', { definition });
163-
const polygon = this.doCreatePolygon(definition);
164-
this.dispatchEvent('polygon:after-create', { polygon });
165-
166-
this.polygons.set(definition['@id'], polygon);
167-
168-
return polygon;
169-
}
170-
171-
public createPolyline(definition: PolylineDefinition<PolylineOptions, InfoWindowOptions>): Polyline {
172-
this.dispatchEvent('polyline:before-create', { definition });
173-
const polyline = this.doCreatePolyline(definition);
174-
this.dispatchEvent('polyline:after-create', { polyline });
175-
176-
this.polylines.set(definition['@id'], polyline);
177-
178-
return polyline;
179-
}
180-
181164
public createInfoWindow({
182165
definition,
183166
element,
@@ -219,7 +202,7 @@ export default abstract class<
219202

220203
this.markersValue.forEach((definition) => {
221204
if (!this.markers.has(definition['@id'])) {
222-
this.createMarker(definition);
205+
this.createMarker({ definition });
223206
}
224207
});
225208

@@ -247,7 +230,7 @@ export default abstract class<
247230

248231
this.polygonsValue.forEach((definition) => {
249232
if (!this.polygons.has(definition['@id'])) {
250-
this.createPolygon(definition);
233+
this.createPolygon({ definition });
251234
}
252235
});
253236
}
@@ -271,10 +254,11 @@ export default abstract class<
271254

272255
this.polylinesValue.forEach((definition) => {
273256
if (!this.polylines.has(definition['@id'])) {
274-
this.createPolyline(definition);
257+
this.createPolyline({ definition });
275258
}
276259
});
277260
}
261+
278262
//endregion
279263

280264
//region Abstract factory methods to be implemented by the concrete classes, they are specific to the map provider
@@ -290,13 +274,22 @@ export default abstract class<
290274

291275
protected abstract doFitBoundsToMarkers(): void;
292276

293-
protected abstract doCreateMarker(definition: MarkerDefinition<MarkerOptions, InfoWindowOptions>): Marker;
277+
protected abstract doCreateMarker({
278+
definition,
279+
}: { definition: MarkerDefinition<MarkerOptions, InfoWindowOptions> }): Marker;
280+
294281
protected abstract doRemoveMarker(marker: Marker): void;
295282

296-
protected abstract doCreatePolygon(definition: PolygonDefinition<PolygonOptions, InfoWindowOptions>): Polygon;
283+
protected abstract doCreatePolygon({
284+
definition,
285+
}: { definition: PolygonDefinition<PolygonOptions, InfoWindowOptions> }): Polygon;
286+
297287
protected abstract doRemovePolygon(polygon: Polygon): void;
298288

299-
protected abstract doCreatePolyline(definition: PolylineDefinition<PolylineOptions, InfoWindowOptions>): Polyline;
289+
protected abstract doCreatePolyline({
290+
definition,
291+
}: { definition: PolylineDefinition<PolylineOptions, InfoWindowOptions> }): Polyline;
292+
300293
protected abstract doRemovePolyline(polyline: Polyline): void;
301294

302295
protected abstract doCreateInfoWindow({
@@ -307,4 +300,46 @@ export default abstract class<
307300
element: Marker | Polygon | Polyline;
308301
}): InfoWindow;
309302
//endregion
303+
304+
//region Private APIs
305+
306+
private createDrawingFactory(
307+
type: 'marker',
308+
draws: typeof this.markers,
309+
factory: typeof this.doCreateMarker
310+
): typeof this.doCreateMarker;
311+
private createDrawingFactory(
312+
type: 'polygon',
313+
draws: typeof this.polygons,
314+
factory: typeof this.doCreatePolygon
315+
): typeof this.doCreatePolygon;
316+
private createDrawingFactory(
317+
type: 'polyline',
318+
draws: typeof this.polylines,
319+
factory: typeof this.doCreatePolyline
320+
): typeof this.doCreatePolyline;
321+
private createDrawingFactory<
322+
Factory extends typeof this.doCreateMarker | typeof this.doCreatePolygon | typeof this.doCreatePolyline,
323+
Draw extends ReturnType<Factory>,
324+
>(
325+
type: 'marker' | 'polygon' | 'polyline',
326+
draws: globalThis.Map<WithIdentifier<any>, Draw>,
327+
factory: Factory
328+
): Factory {
329+
const eventBefore = `${type}:before-create`;
330+
const eventAfter = `${type}:after-create`;
331+
332+
// @ts-expect-error IDK what to do with this error
333+
// 'Factory' could be instantiated with an arbitrary type which could be unrelated to '({ definition }: { definition: WithIdentifier<any>; }) => Draw'
334+
return ({ definition }: { definition: WithIdentifier<any> }) => {
335+
this.dispatchEvent(eventBefore, { definition });
336+
const drawing = factory(definition) as Draw;
337+
this.dispatchEvent(eventAfter, { [type]: drawing });
338+
339+
draws.set(definition['@id'], drawing);
340+
341+
return drawing;
342+
};
343+
}
344+
//endregion
310345
}

src/Map/src/Bridge/Google/assets/dist/map_controller.d.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,17 @@ export default class extends AbstractMapController<MapOptions, google.maps.Map,
1414
zoom: number | null;
1515
options: MapOptions;
1616
}): google.maps.Map;
17-
protected doCreateMarker(definition: MarkerDefinition<google.maps.marker.AdvancedMarkerElementOptions, google.maps.InfoWindowOptions>): google.maps.marker.AdvancedMarkerElement;
17+
protected doCreateMarker({ definition, }: {
18+
definition: MarkerDefinition<google.maps.marker.AdvancedMarkerElementOptions, google.maps.InfoWindowOptions>;
19+
}): google.maps.marker.AdvancedMarkerElement;
1820
protected doRemoveMarker(marker: google.maps.marker.AdvancedMarkerElement): void;
19-
protected doCreatePolygon(definition: PolygonDefinition<google.maps.PolygonOptions, google.maps.InfoWindowOptions>): google.maps.Polygon;
21+
protected doCreatePolygon({ definition, }: {
22+
definition: PolygonDefinition<google.maps.PolygonOptions, google.maps.InfoWindowOptions>;
23+
}): google.maps.Polygon;
2024
protected doRemovePolygon(polygon: google.maps.Polygon): void;
21-
protected doCreatePolyline(definition: PolylineDefinition<google.maps.PolylineOptions, google.maps.InfoWindowOptions>): google.maps.Polyline;
25+
protected doCreatePolyline({ definition, }: {
26+
definition: PolylineDefinition<google.maps.PolylineOptions, google.maps.InfoWindowOptions>;
27+
}): google.maps.Polyline;
2228
protected doRemovePolyline(polyline: google.maps.Polyline): void;
2329
protected doCreateInfoWindow({ definition, element, }: {
2430
definition: InfoWindowWithoutPositionDefinition<google.maps.InfoWindowOptions>;

0 commit comments

Comments
 (0)