diff --git a/packages/pages-components/CHANGELOG.md b/packages/pages-components/CHANGELOG.md index e748b4b9..e4ee8031 100644 --- a/packages/pages-components/CHANGELOG.md +++ b/packages/pages-components/CHANGELOG.md @@ -2,7 +2,7 @@ ##### Bug Fixes -* **pages-components:** strip empty destinationUrl (#105) (fc95a5d5) +- **pages-components:** strip empty destinationUrl (#105) (fc95a5d5) #### 1.1.11 (2025-08-22) diff --git a/packages/pages-components/src/components/map/map.tsx b/packages/pages-components/src/components/map/map.tsx index e3eb2d2e..37afe4fa 100644 --- a/packages/pages-components/src/components/map/map.tsx +++ b/packages/pages-components/src/components/map/map.tsx @@ -11,6 +11,7 @@ import { Map as MapType, MapOptions } from "../../map/map.js"; import { GeoBounds } from "../../map/geoBounds.js"; import { Coordinate } from "../../map/coordinate.js"; import type { MapProps, MapContextType } from "./types.js"; +import { MapProvider } from "../../map/mapProvider.js"; export const MapContext = createContext(null); @@ -40,6 +41,7 @@ export const Map = ({ provider = GoogleMaps, providerOptions = {}, singleZoom = 14, + iframeWindow, }: MapProps) => { const wrapper = useRef(null); @@ -107,12 +109,15 @@ export const Map = ({ return; } - provider - .load(apiKey, { - ...providerOptions, - ...(clientKey && { client: clientKey }), - }) - .then(() => setLoaded(true)); + if (provider instanceof MapProvider) { + provider + .load(apiKey, { + ...providerOptions, + iframeWindow: iframeWindow, + ...(clientKey && { client: clientKey }), + }) + .then(() => setLoaded(true)); + } }, []); return ( diff --git a/packages/pages-components/src/components/map/types.ts b/packages/pages-components/src/components/map/types.ts index 214e1835..ee55a640 100644 --- a/packages/pages-components/src/components/map/types.ts +++ b/packages/pages-components/src/components/map/types.ts @@ -39,6 +39,7 @@ export interface MapProps { provider?: MapProvider; providerOptions?: { [key: string]: any }; singleZoom?: number; + iframeWindow?: Window; } // Marker diff --git a/packages/pages-components/src/map/providerMap.ts b/packages/pages-components/src/map/providerMap.ts index 5f7e6455..e4740bf1 100644 --- a/packages/pages-components/src/map/providerMap.ts +++ b/packages/pages-components/src/map/providerMap.ts @@ -16,6 +16,7 @@ class ProviderMapOptions { panHandler: PanHandler; panStartHandler: PanStartHandler; providerOptions: { [key: string]: any }; + iframeWindow?: Window; constructor(provider: MapProvider, wrapper: HTMLElement | null) { assertInstance(provider, MapProvider); diff --git a/packages/pages-components/src/map/providers/mapbox.ts b/packages/pages-components/src/map/providers/mapbox.ts index dc05bb4d..12eda241 100644 --- a/packages/pages-components/src/map/providers/mapbox.ts +++ b/packages/pages-components/src/map/providers/mapbox.ts @@ -4,18 +4,27 @@ import { ProviderMap, ProviderMapOptions } from "../providerMap.js"; import { HTMLProviderPin, ProviderPinOptions } from "../providerPin.js"; import { Map } from "../map.js"; import type { Map as MapType, Marker as MarkerType } from "mapbox-gl"; +import mapboxgl from "mapbox-gl"; // GENERATOR TODO: call map resize method when hidden/shown (CoreBev, used to be done in Core.js) // Map Class class MapboxMap extends ProviderMap { + instance: mapboxgl; map?: MapType; constructor(options: ProviderMapOptions) { super(options); + this.instance = + ( + options.iframeWindow as Window & { + mapboxgl?: typeof mapboxgl; + } + )?.mapboxgl ?? mapboxgl; + if (options.wrapper) { - this.map = new mapboxgl.Map({ + this.map = new this.instance.Map({ container: options.wrapper, interactive: options.controlEnabled, style: "mapbox://styles/mapbox/streets-v9", @@ -25,7 +34,7 @@ class MapboxMap extends ProviderMap { // Add the zoom control if (options.controlEnabled) { - const zoomControl = new mapboxgl.NavigationControl({ + const zoomControl = new this.instance.NavigationControl({ showCompass: false, }); this.map?.addControl(zoomControl); @@ -55,7 +64,7 @@ class MapboxMap extends ProviderMap { * {@inheritDoc ProviderMap.setCenter} */ setCenter(coordinate: Coordinate, animated: boolean) { - const center = new mapboxgl.LngLat( + const center = new this.instance.LngLat( coordinate.longitude, coordinate.latitude ); @@ -80,7 +89,7 @@ class MapboxMap extends ProviderMap { * {@inheritDoc ProviderMap.zetZoomCenter} */ setZoomCenter(zoom: number, coordinate: Coordinate, animated: boolean) { - const center = new mapboxgl.LngLat( + const center = new this.instance.LngLat( coordinate.longitude, coordinate.latitude ); @@ -96,13 +105,21 @@ class MapboxMap extends ProviderMap { // Pin Class class MapboxPin extends HTMLProviderPin { + instance: mapboxgl; pin?: MarkerType; constructor(options: ProviderPinOptions) { super(options); + this.instance = + ( + options?.iframeWindow as Window & { + mapboxgl?: typeof mapboxgl; + } + )?.mapboxgl ?? mapboxgl; + if (this._wrapper) { this._wrapper.style.position = "relative"; - this.pin = new mapboxgl.Marker({ + this.pin = new this.instance.Marker({ anchor: "top-left", element: this._wrapper, }); @@ -149,10 +166,15 @@ function load( resolve: () => void, _: () => void, apiKey: string, + options: any, { version = "v1.13.0" } = {} ) { const baseUrl = `https://api.mapbox.com/mapbox-gl-js/${version}/mapbox-gl`; + const mapboxInstance = + (options?.iframeWindow as Window & { mapboxgl?: typeof mapboxgl }) + ?.mapboxgl ?? mapboxgl; + const mapStyle = document.createElement("link"); mapStyle.rel = "stylesheet"; mapStyle.href = baseUrl + ".css"; @@ -160,7 +182,7 @@ function load( const mapScript = document.createElement("script"); mapScript.src = baseUrl + ".js"; mapScript.onload = () => { - (mapboxgl as any).accessToken = apiKey; + mapboxInstance.accessToken = apiKey; resolve(); };