Skip to content

Commit d9d9ff9

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

File tree

10 files changed

+214
-171
lines changed

10 files changed

+214
-171
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/assets/test/abstract_map_controller.test.ts

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class MyMapController extends AbstractMapController {
1616
return { map: 'map', center, zoom, options };
1717
}
1818

19-
doCreateMarker(definition) {
19+
doCreateMarker({ definition }) {
2020
const marker = { marker: 'marker', title: definition.title };
2121

2222
if (definition.infoWindow) {
@@ -26,7 +26,7 @@ class MyMapController extends AbstractMapController {
2626
return marker;
2727
}
2828

29-
doCreatePolygon(definition) {
29+
doCreatePolygon({ definition }) {
3030
const polygon = { polygon: 'polygon', title: definition.title };
3131

3232
if (definition.infoWindow) {
@@ -35,7 +35,7 @@ class MyMapController extends AbstractMapController {
3535
return polygon;
3636
}
3737

38-
doCreatePolyline(definition) {
38+
doCreatePolyline({ definition }) {
3939
const polyline = { polyline: 'polyline', title: definition.title };
4040

4141
if (definition.infoWindow) {
@@ -103,20 +103,18 @@ describe('AbstractMapController', () => {
103103
expect(controller.map).toEqual({ map: 'map', center: { lat: 48.8566, lng: 2.3522 }, zoom: 4, options: {} });
104104
expect(controller.markers).toEqual(
105105
new Map([
106-
['a69f13edd2e571f3', { '@id': 'a69f13edd2e571f3', marker: 'marker', title: 'Paris' }],
107-
['cb9c1a30d562694b', { '@id': 'cb9c1a30d562694b', marker: 'marker', title: 'Lyon' }],
108-
['e6b3acef1325fb52', { '@id': 'e6b3acef1325fb52', marker: 'marker', title: 'Toulouse' }],
106+
['a69f13edd2e571f3', { marker: 'marker', title: 'Paris' }],
107+
['cb9c1a30d562694b', { marker: 'marker', title: 'Lyon' }],
108+
['e6b3acef1325fb52', { marker: 'marker', title: 'Toulouse' }],
109109
])
110110
);
111111
expect(controller.polygons).toEqual(
112112
new Map([
113-
['228ae6f5c1b17cfd', { '@id': '228ae6f5c1b17cfd', polygon: 'polygon', title: null }],
114-
['9874334e4e8caa16', { '@id': '9874334e4e8caa16', polygon: 'polygon', title: null }],
113+
['228ae6f5c1b17cfd', { polygon: 'polygon', title: null }],
114+
['9874334e4e8caa16', { polygon: 'polygon', title: null }],
115115
])
116116
);
117-
expect(controller.polylines).toEqual(
118-
new Map([['0fa955da866c7720', { '@id': '0fa955da866c7720', polyline: 'polyline', title: null }]])
119-
);
117+
expect(controller.polylines).toEqual(new Map([['0fa955da866c7720', { polyline: 'polyline', title: null }]]));
120118
expect(controller.infoWindows).toEqual([
121119
{
122120
headerContent: 'Paris',

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)