From 2fa0ab9cf03dc2fd0321dd53ec04c1ae00804474 Mon Sep 17 00:00:00 2001 From: Malte Modrow Date: Mon, 9 Dec 2024 15:01:50 +0100 Subject: [PATCH 1/5] feat(static): first version of static maps component with SSR support --- package.json | 8 +- src/components/static-map.tsx | 21 +++ src/index.ts | 1 + .../assemble-map-type-styles.ts | 48 ++++++ .../assemble-marker-params.ts | 77 ++++++++++ .../assemble-path-params.ts | 79 ++++++++++ .../create-static-maps-url/helpers.ts | 26 ++++ src/libraries/create-static-maps-url/index.ts | 140 ++++++++++++++++++ src/libraries/create-static-maps-url/types.ts | 37 +++++ src/server/index.ts | 3 + 10 files changed, 439 insertions(+), 1 deletion(-) create mode 100644 src/components/static-map.tsx create mode 100644 src/libraries/create-static-maps-url/assemble-map-type-styles.ts create mode 100644 src/libraries/create-static-maps-url/assemble-marker-params.ts create mode 100644 src/libraries/create-static-maps-url/assemble-path-params.ts create mode 100644 src/libraries/create-static-maps-url/helpers.ts create mode 100644 src/libraries/create-static-maps-url/index.ts create mode 100644 src/libraries/create-static-maps-url/types.ts create mode 100644 src/server/index.ts diff --git a/package.json b/package.json index 9698d5f..2ab1cde 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,11 @@ "types": "./dist/index.d.ts", "default": "./dist/index.modern.mjs" }, + "./server": { + "require": "./dist/server/index.umd.js", + "types": "./dist/server/index.d.ts", + "default": "./dist/server/index.modern.mjs" + }, "./examples.css": "./dist/examples.css" }, "types": "dist/index.d.ts", @@ -25,10 +30,11 @@ "license": "MIT", "scripts": { "clean": "rm -rf ./dist && mkdir ./dist", - "build": "npm-run-all clean -p build:*", + "build": "npm-run-all clean -p build:**", "start": "run-p start:*", "build:examples": "cp ./examples/examples.css dist", "build:microbundle": "microbundle -o dist/index.js -f modern,umd --globals react=React,react-dom=ReactDOM --jsx React.createElement --jsxFragment React.Fragment --no-compress --tsconfig tsconfig.build.json", + "build:microbundle:server": "microbundle -o dist/server/index.js -f modern,umd --globals react=React,react-dom=ReactDOM --jsx React.createElement --jsxFragment React.Fragment --no-compress --tsconfig tsconfig.build.json ./src/server/index.ts", "start:microbundle": "microbundle watch -o dist/index.js -f modern,umd --globals react=React,react-dom=ReactDOM --jsx React.createElement --jsxFragment React.Fragment --no-compress --tsconfig tsconfig.build.json", "test:linter": "eslint 'src/**/*.{ts,tsx}'", "test:tsc": "tsc --project tsconfig.test.json --noEmit", diff --git a/src/components/static-map.tsx b/src/components/static-map.tsx new file mode 100644 index 0000000..7813068 --- /dev/null +++ b/src/components/static-map.tsx @@ -0,0 +1,21 @@ +import React from 'react'; + +export {createStaticMapsUrl} from '../libraries/create-static-maps-url'; +export * from '../libraries/create-static-maps-url/types'; + +/** + * Props for the StaticMap component + */ +export type StaticMapProps = { + url: string; +}; + +export const StaticMap = async (props: StaticMapProps) => { + const {url} = props; + + if (!url) { + return null; + } + + return ; +}; diff --git a/src/index.ts b/src/index.ts index 08514a5..2463f30 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,6 +4,7 @@ export * from './components/advanced-marker'; export * from './components/api-provider'; export * from './components/info-window'; export * from './components/map'; +export * from './components/static-map'; export * from './components/map-control'; export * from './components/marker'; export * from './components/pin'; diff --git a/src/libraries/create-static-maps-url/assemble-map-type-styles.ts b/src/libraries/create-static-maps-url/assemble-map-type-styles.ts new file mode 100644 index 0000000..83d016e --- /dev/null +++ b/src/libraries/create-static-maps-url/assemble-map-type-styles.ts @@ -0,0 +1,48 @@ +/** + * Converts an array of Google Maps style objects into an array of style strings + * compatible with the Google Static Maps API. + * + * @param styles - An array of Google Maps MapTypeStyle objects that define the styling rules + * @returns An array of formatted style strings ready to be used with the Static Maps API + * + * @example + * const styles = [{ + * featureType: "road", + * elementType: "geometry", + * stylers: [{color: "#ff0000"}, {weight: 1}] + * }]; + * + * const styleStrings = assembleMapTypeStyles(styles); + * // Returns: ["|feature:road|element:geometry|color:0xff0000|weight:1"] + * + * Each style string follows the format: + * "|feature:{featureType}|element:{elementType}|{stylerName}:{stylerValue}" + * + * Note: Color values with hexadecimal notation (#) are automatically converted + * to the required 0x format for the Static Maps API. + */ +export function assembleMapTypeStyles( + styles: Array +): string[] { + return styles.map((mapTypeStyle: google.maps.MapTypeStyle) => { + const {featureType, elementType, stylers = []} = mapTypeStyle; + + let styleString = ''; + + if (featureType) { + styleString += `|feature:${featureType}`; + } + + if (elementType) { + styleString += `|element:${elementType}`; + } + + for (const styler of stylers) { + Object.entries(styler).forEach(([name, value]) => { + styleString += `|${name}:${String(value).replace('#', '0x')}`; + }); + } + + return styleString; + }); +} diff --git a/src/libraries/create-static-maps-url/assemble-marker-params.ts b/src/libraries/create-static-maps-url/assemble-marker-params.ts new file mode 100644 index 0000000..2b2eb61 --- /dev/null +++ b/src/libraries/create-static-maps-url/assemble-marker-params.ts @@ -0,0 +1,77 @@ +import {StaticMapsMarker} from './types'; + +/** + * Assembles marker parameters for static maps. + * + * This function takes an array of markers and groups them by their style properties. + * It then creates a string representation of these markers, including their styles and locations, + * which can be used as parameters for static map APIs. + * + * @param {StaticMapsMarker[]} [markers=[]] - An array of markers to be processed. Each marker can have properties such as color, label, size, scale, icon, anchor, and location. + * @returns {string[]} An array of strings, each representing a group of markers with their styles and locations. + * + * @example + * const markers = [ + * { color: 'blue', label: 'A', size: 'mid', location: '40.714728,-73.998672' }, + * { color: 'blue', label: 'B', size: 'mid', location: '40.714728,-73.998672' }, + * { icon: 'http://example.com/icon.png', location: { lat: 40.714728, lng: -73.998672 } } + * ]; + * const params = assembleMarkerParams(markers); + * // Params will be an array of strings representing the marker parameters + * Example output: [ + * "|color:blue|label:A|size:mid|40.714728,-73.998672|40.714728,-73.998672", + * "|icon:http://example.com/icon.png|40.714728,-73.998672" + * ] + */ +export function assembleMarkerParams(markers: StaticMapsMarker[] = []) { + const markerParams: Array = []; + + // Group markers by style + const markersByStyle = markers?.reduce( + (styles, marker) => { + const {color = 'red', label, size, scale, icon, anchor} = marker; + + // Create a unique style key based on either icon properties or standard marker properties + const relevantProps = icon ? [icon, anchor, scale] : [color, label, size]; + const key = relevantProps.filter(Boolean).join('-'); + + styles[key] = styles[key] || []; + styles[key].push(marker); + return styles; + }, + {} as Record + ); + + Object.values(markersByStyle ?? {}).forEach(markers => { + let markerParam: string = ''; + + const {icon} = markers[0]; + + // Create marker style from first marker in group since all markers share the same style. + Object.entries(markers[0]).forEach(([key, value]) => { + // Determine which properties to include based on whether marker uses custom icon + const relevantKeys = icon + ? ['icon', 'anchor', 'scale'] + : ['color', 'label', 'size']; + + if (relevantKeys.includes(key)) { + markerParam += `|${key}:${value}`; + } + }); + + // Add location coordinates for each marker in the style group + // Handles both string locations and lat/lng object formats. + for (const marker of markers) { + const location = + typeof marker.location === 'string' + ? marker.location + : `${marker.location.lat},${marker.location.lng}`; + + markerParam += `|${location}`; + } + + markerParams.push(markerParam); + }); + + return markerParams; +} diff --git a/src/libraries/create-static-maps-url/assemble-path-params.ts b/src/libraries/create-static-maps-url/assemble-path-params.ts new file mode 100644 index 0000000..c88fff5 --- /dev/null +++ b/src/libraries/create-static-maps-url/assemble-path-params.ts @@ -0,0 +1,79 @@ +import {formatLocation} from './helpers'; +import {StaticMapsPath} from './types'; + +/** + * Assembles path parameters for the Static Maps Api from an array of paths. + * + * This function groups paths by their style properties (color, weight, fillcolor, geodesic) + * and then constructs a string of path parameters for each group. Each path parameter string + * includes the style properties and the coordinates of the paths. + * + * @param {Array} [paths=[]] - An array of paths to be assembled into path parameters. + * @returns {Array} An array of path parameter strings. + * + * @example + * const paths = [ + * { + * color: 'red', + * weight: 5, + * coordinates: [ + * { lat: 40.714728, lng: -73.998672 }, + * { lat: 40.718217, lng: -73.998284 } + * ] + * } + * ]; + * + * const pathParams = assemblePathParams(paths); + * Output: [ + * '|color:red|weight:5|40.714728,-73.998672|40.718217,-73.998284' + * ] + */ +export function assemblePathParams(paths: Array = []) { + const pathParams: Array = []; + + // Group paths by their style properties (color, weight, fillcolor, geodesic) + // to combine paths with identical styles into single parameter strings + const pathsByStyle = paths?.reduce( + (styles, path) => { + const {color = 'default', weight, fillcolor, geodesic} = path; + + // Create unique key for this style combination + const key = [color, weight, fillcolor, geodesic] + .filter(Boolean) + .join('-'); + + styles[key] = styles[key] || []; + styles[key].push(path); + return styles; + }, + {} as Record> + ); + + // Process each group of paths with identical styles + Object.values(pathsByStyle ?? {}).forEach(paths => { + let pathParam = ''; + + // Build style parameter string using properties from first path in group + // since all paths in this group share the same style + Object.entries(paths[0]).forEach(([key, value]) => { + if (['color', 'weight', 'fillcolor', 'geodesic'].includes(key)) { + pathParam += `|${key}:${value}`; + } + }); + + // Add location for all marker in style group + for (const path of paths) { + if (typeof path.coordinates === 'string') { + pathParam += `|${decodeURIComponent(path.coordinates)}`; + } else { + for (const location of path.coordinates) { + pathParam += `|${formatLocation(location)}`; + } + } + } + + pathParams.push(pathParam); + }); + + return pathParams; +} diff --git a/src/libraries/create-static-maps-url/helpers.ts b/src/libraries/create-static-maps-url/helpers.ts new file mode 100644 index 0000000..192f166 --- /dev/null +++ b/src/libraries/create-static-maps-url/helpers.ts @@ -0,0 +1,26 @@ +import {StaticMapsLocation} from './types'; + +/** + * Formats a location into a string representation suitable for Google Static Maps API. + * + * @param location - The location to format, can be either a string or an object with lat/lng properties + * @returns A string representation of the location in the format "lat,lng" or the original string + * + * @example + * // Returns "40.714728,-73.998672" + * formatLocation({ lat: 40.714728, lng: -73.998672 }) + * + * @example + * // Returns "New York, NY" + * formatLocation("New York, NY") + */ +export function formatLocation(location: StaticMapsLocation): string { + return typeof location === 'string' + ? location + : `${location.lat},${location.lng}`; +} + +// Used for removing the leading pipe from the param string +export function formatParam(string: string) { + return string.slice(1); +} diff --git a/src/libraries/create-static-maps-url/index.ts b/src/libraries/create-static-maps-url/index.ts new file mode 100644 index 0000000..c85420b --- /dev/null +++ b/src/libraries/create-static-maps-url/index.ts @@ -0,0 +1,140 @@ +import {assembleMarkerParams} from './assemble-marker-params'; +import {assemblePathParams} from './assemble-path-params'; +import {formatLocation, formatParam} from './helpers'; + +import {StaticMapsApiOptions} from './types'; +import {assembleMapTypeStyles} from './assemble-map-type-styles'; + +const STATIC_MAPS_BASE = 'https://maps.googleapis.com/maps/api/staticmap'; + +/** + * Creates a URL for the Google Static Maps API with the specified parameters. + * + * @param {Object} options - The configuration options for the static map + * @param {string} options.apiKey - Your Google Maps API key (required) + * @param {number} options.width - The width of the map image in pixels (required) + * @param {number} options.height - The height of the map image in pixels (required) + * @param {StaticMapsLocation} [options.center] - The center point of the map (lat/lng or address) + * @param {number} [options.zoom] - The zoom level of the map (0-21) + * @param {1|2|4} [options.scale] - The resolution of the map (1, 2, or 4) + * @param {string} [options.format] - The image format (png, png8, png32, gif, jpg, jpg-baseline) + * @param {string} [options.mapType] - The type of map (roadmap, satellite, terrain, hybrid) + * @param {string} [options.language] - The language of the map labels + * @param {string} [options.region] - The region code for the map + * @param {string} [options.map_id] - The Cloud-based map style ID + * @param {StaticMapsMarker[]} [options.markers=[]] - Array of markers to display on the map + * @param {StaticMapsPath[]} [options.paths=[]] - Array of paths to display on the map + * @param {StaticMapsLocation[]} [options.visible=[]] - Array of locations that should be visible on the map + * @param {MapTypeStyle[]} [options.style=[]] - Array of style objects to customize the map appearance + * + * @returns {string} The complete Google Static Maps API URL + * + * @throws {Error} If API key is not provided + * @throws {Error} If width or height is not provided + * + * @example + * const url = createStaticMapsUrl({ + * apiKey: 'YOUR_API_KEY', + * width: 600, + * height: 400, + * center: { lat: 40.714728, lng: -73.998672 }, + * zoom: 12, + * markers: [ + * { + * location: { lat: 40.714728, lng: -73.998672 }, + * color: 'red', + * label: 'A' + * } + * ], + * paths: [ + * { + * coordinates: [ + * { lat: 40.714728, lng: -73.998672 }, + * { lat: 40.719728, lng: -73.991672 } + * ], + * color: '0x0000ff', + * weight: 5 + * } + * ], + * style: [ + * { + * featureType: 'road', + * elementType: 'geometry', + * stylers: [{color: '#00ff00'}] + * } + * ] + * }); + * + * // Results in URL similar to: + * // https://maps.googleapis.com/maps/api/staticmap?key=YOUR_API_KEY + * // &size=600x400 + * // ¢er=40.714728,-73.998672&zoom=12 + * // &markers=color:red|label:A|40.714728,-73.998672 + * // &path=color:0x0000ff|weight:5|40.714728,-73.998672|40.719728,-73.991672 + * // &style=feature:road|element:geometry|color:0x00ff00 + */ +export function createStaticMapsUrl({ + apiKey, + width, + height, + center, + zoom, + scale, + format, + mapType, + language, + region, + map_id, + markers = [], + paths = [], + visible = [], + style = [] +}: StaticMapsApiOptions) { + if (!apiKey) throw new Error('API key is required'); + if (!width || !height) throw new Error('Width and height are required'); + + const params: Record = { + key: apiKey, + size: `${width}x${height}`, + ...(center && {center: formatLocation(center)}), + ...(zoom && {zoom}), + ...(scale && {scale}), + ...(format && {format}), + ...(mapType && {mapType}), + ...(language && {language}), + ...(region && {region}), + ...(map_id && {map_id}) + }; + + const url = new URL(STATIC_MAPS_BASE); + + // Params that don't need special handling + Object.entries(params).forEach(([key, value]) => { + url.searchParams.append(key, String(value)); + }); + + // Assemble Markers + for (const markerParam of assembleMarkerParams(markers)) { + url.searchParams.append('markers', formatParam(markerParam)); + } + + // Assemble Paths + for (const pathParam of assemblePathParams(paths)) { + url.searchParams.append('path', formatParam(pathParam)); + } + + // Assemble visible locations + if (visible.length) { + url.searchParams.append( + 'visible', + visible.map(location => formatLocation(location)).join('|') + ); + } + + // Assemble Map Type Styles + for (const styleString of assembleMapTypeStyles(style)) { + url.searchParams.append('style', formatParam(styleString)); + } + + return url.toString(); +} diff --git a/src/libraries/create-static-maps-url/types.ts b/src/libraries/create-static-maps-url/types.ts new file mode 100644 index 0000000..2171bbc --- /dev/null +++ b/src/libraries/create-static-maps-url/types.ts @@ -0,0 +1,37 @@ +export type StaticMapsLocation = google.maps.LatLngLiteral | string; + +export type StaticMapsMarker = { + location: StaticMapsLocation; + color?: string; + size?: 'tiny' | 'mid' | 'small'; + label?: string; + icon?: string; + anchor?: string; + scale?: 1 | 2 | 4; +}; + +export type StaticMapsPath = { + coordinates: Array | string; + weight?: number; + color?: string; + fillcolor?: string; + geodesic?: boolean; +}; + +export type StaticMapsApiOptions = { + apiKey: string; + width: number; + height: number; + center?: StaticMapsLocation; + zoom?: number; + scale?: number; + format?: 'png' | 'png8' | 'png32' | 'gif' | 'jpg' | 'jpg-baseline'; + mapType?: google.maps.MapTypeId; + language?: string; + region?: string; + map_id?: string; + markers?: Array; + paths?: Array; + visible?: Array; + style?: google.maps.MapTypeStyle[]; +}; diff --git a/src/server/index.ts b/src/server/index.ts new file mode 100644 index 0000000..7a152d9 --- /dev/null +++ b/src/server/index.ts @@ -0,0 +1,3 @@ +/// + +export * from '../components/static-map'; From d1e9afa8cfbc986b0cd412f2b64fe8117a58a4ca Mon Sep 17 00:00:00 2001 From: Malte Modrow Date: Mon, 9 Dec 2024 16:41:14 +0100 Subject: [PATCH 2/5] refactor: better consistency --- src/components/static-map.tsx | 4 +--- src/libraries/create-static-maps-url/index.ts | 11 ++++++----- src/libraries/create-static-maps-url/types.ts | 2 +- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/components/static-map.tsx b/src/components/static-map.tsx index 7813068..fc923ba 100644 --- a/src/components/static-map.tsx +++ b/src/components/static-map.tsx @@ -13,9 +13,7 @@ export type StaticMapProps = { export const StaticMap = async (props: StaticMapProps) => { const {url} = props; - if (!url) { - return null; - } + if (!url) throw new Error('URL is required'); return ; }; diff --git a/src/libraries/create-static-maps-url/index.ts b/src/libraries/create-static-maps-url/index.ts index c85420b..4d85da9 100644 --- a/src/libraries/create-static-maps-url/index.ts +++ b/src/libraries/create-static-maps-url/index.ts @@ -14,8 +14,9 @@ const STATIC_MAPS_BASE = 'https://maps.googleapis.com/maps/api/staticmap'; * @param {string} options.apiKey - Your Google Maps API key (required) * @param {number} options.width - The width of the map image in pixels (required) * @param {number} options.height - The height of the map image in pixels (required) - * @param {StaticMapsLocation} [options.center] - The center point of the map (lat/lng or address) - * @param {number} [options.zoom] - The zoom level of the map (0-21) + * @param {StaticMapsLocation} [options.center] - The center point of the map (lat/lng or address). + * Required if no markers or paths or "visible locations" are provided. + * @param {number} [options.zoom] - The zoom level of the map. Required if no markers or paths or "visible locations" are provided. * @param {1|2|4} [options.scale] - The resolution of the map (1, 2, or 4) * @param {string} [options.format] - The image format (png, png8, png32, gif, jpg, jpg-baseline) * @param {string} [options.mapType] - The type of map (roadmap, satellite, terrain, hybrid) @@ -84,7 +85,7 @@ export function createStaticMapsUrl({ mapType, language, region, - map_id, + mapId, markers = [], paths = [], visible = [], @@ -100,10 +101,10 @@ export function createStaticMapsUrl({ ...(zoom && {zoom}), ...(scale && {scale}), ...(format && {format}), - ...(mapType && {mapType}), + ...(mapType && {maptype: mapType}), ...(language && {language}), ...(region && {region}), - ...(map_id && {map_id}) + ...(mapId && {map_id: mapId}) }; const url = new URL(STATIC_MAPS_BASE); diff --git a/src/libraries/create-static-maps-url/types.ts b/src/libraries/create-static-maps-url/types.ts index 2171bbc..1cc056c 100644 --- a/src/libraries/create-static-maps-url/types.ts +++ b/src/libraries/create-static-maps-url/types.ts @@ -29,7 +29,7 @@ export type StaticMapsApiOptions = { mapType?: google.maps.MapTypeId; language?: string; region?: string; - map_id?: string; + mapId?: string; markers?: Array; paths?: Array; visible?: Array; From ae5712b78b90ab3de294b0b965115917e28aa506 Mon Sep 17 00:00:00 2001 From: Malte Modrow Date: Mon, 9 Dec 2024 16:42:21 +0100 Subject: [PATCH 3/5] test: add tests for createStaticMapsUrl --- .../__tests__/create-static-maps-url.test.ts | 231 ++++++++++++++++++ 1 file changed, 231 insertions(+) create mode 100644 src/libraries/__tests__/create-static-maps-url.test.ts diff --git a/src/libraries/__tests__/create-static-maps-url.test.ts b/src/libraries/__tests__/create-static-maps-url.test.ts new file mode 100644 index 0000000..3716caa --- /dev/null +++ b/src/libraries/__tests__/create-static-maps-url.test.ts @@ -0,0 +1,231 @@ +import {initialize} from '@googlemaps/jest-mocks'; + +import {createStaticMapsUrl} from '../create-static-maps-url'; + +const requiredParams = { + apiKey: 'test-api-key', + width: 600, + height: 400 +}; + +beforeEach(() => { + initialize(); +}); + +describe('createStaticMapsUrl', () => { + const API_KEY = 'test-api-key'; + + test('creates basic URL with required parameters', () => { + const url = createStaticMapsUrl({ + ...requiredParams, + center: {lat: 40.714728, lng: -73.998672}, + zoom: 12 + }); + expect(url).toMatch( + /^https:\/\/maps\.googleapis\.com\/maps\/api\/staticmap/ + ); + expect(url).toContain('center=40.714728%2C-73.998672'); + expect(url).toContain('zoom=12'); + expect(url).toContain('size=600x400'); + expect(url).toContain(`key=${API_KEY}`); + }); + + test('includes map type', () => { + const url = createStaticMapsUrl({ + ...requiredParams, + center: {lat: 40.714728, lng: -73.998672}, + zoom: 12, + mapType: google.maps.MapTypeId.SATELLITE + }); + expect(url).toContain('maptype=satellite'); + }); + + test('handles single marker', () => { + const url = createStaticMapsUrl({ + ...requiredParams, + markers: [{location: {lat: 40.714728, lng: -73.998672}}] + }); + + const markerParam = encodeURIComponent('40.714728,-73.998672'); + + expect(url).toContain(`markers=${markerParam}`); + }); + + test('handles multiple markers with same style', () => { + const url = createStaticMapsUrl({ + ...requiredParams, + center: {lat: 40.714728, lng: -73.998672}, + markers: [ + {location: {lat: 40.714728, lng: -73.998672}, color: 'blue'}, + {location: {lat: 41.715728, lng: -72.999672}, color: 'blue'} + ] + }); + + const markerParam = encodeURIComponent( + `color:blue|40.714728,-73.998672|41.715728,-72.999672` + ); + + expect(url).toContain(`markers=${markerParam}`); + }); + + test('handles multiple markers with different style', () => { + const url = createStaticMapsUrl({ + ...requiredParams, + center: {lat: 40.714728, lng: -73.998672}, + markers: [ + {location: {lat: 40.714728, lng: -73.998672}, color: 'blue'}, + {location: {lat: 41.715728, lng: -72.999672}, color: 'red'} + ] + }); + const blueMarkerParam = encodeURIComponent( + `color:blue|40.714728,-73.998672` + ); + const redMarkerParam = encodeURIComponent(`color:red|41.715728,-72.999672`); + + expect(url).toContain(`markers=${blueMarkerParam}`); + expect(url).toContain(`markers=${redMarkerParam}`); + }); + + test('includes custom marker styles', () => { + const url = createStaticMapsUrl({ + ...requiredParams, + center: {lat: 40.714728, lng: -73.998672}, + markers: [ + { + location: {lat: 40.714728, lng: -73.998672}, + color: 'red', + label: 'A', + size: 'mid' + } + ] + }); + expect(url).toContain( + 'markers=color%3Ared%7Clabel%3AA%7Csize%3Amid%7C40.714728%2C-73.998672' + ); + }); + + test('includes scale parameter', () => { + const url = createStaticMapsUrl({ + ...requiredParams, + center: {lat: 40.714728, lng: -73.998672}, + scale: 2 + }); + expect(url).toContain('scale=2'); + }); + + test('includes format parameter', () => { + const url = createStaticMapsUrl({ + ...requiredParams, + center: {lat: 40.714728, lng: -73.998672}, + format: 'png32' + }); + expect(url).toContain('format=png32'); + }); + + test('includes language parameter', () => { + const url = createStaticMapsUrl({ + ...requiredParams, + center: {lat: 40.714728, lng: -73.998672}, + language: 'de' + }); + + expect(url).toContain(`language=de`); + }); + + test('includes region parameter', () => { + const url = createStaticMapsUrl({ + ...requiredParams, + center: {lat: 40.714728, lng: -73.998672}, + region: 'en' + }); + + expect(url).toContain(`region=en`); + }); + + test('includes map_id parameter', () => { + const url = createStaticMapsUrl({ + ...requiredParams, + center: {lat: 40.714728, lng: -73.998672}, + mapId: '8e0a97af9386fef' + }); + const encodedMapId = encodeURIComponent('8e0a97af9386fef'); + expect(url).toContain(`map_id=${encodedMapId}`); + }); + + test('handles single path', () => { + const url = createStaticMapsUrl({ + ...requiredParams, + paths: [ + { + coordinates: [ + {lat: 40.737102, lng: -73.990318}, + {lat: 40.749825, lng: -73.987963} + ], + color: 'blue', + weight: 5 + } + ] + }); + const encodedPath = encodeURIComponent( + 'color:blue|weight:5|40.737102,-73.990318|40.749825,-73.987963' + ); + expect(url).toContain(`path=${encodedPath}`); + }); + + test('handles multiple paths with different styles', () => { + const url = createStaticMapsUrl({ + ...requiredParams, + paths: [ + { + coordinates: [{lat: 40.737102, lng: -73.990318}, 'Hamburg, Germany'], + color: 'blue', + weight: 5 + }, + { + coordinates: [ + {lat: 40.737102, lng: -73.990318}, + {lat: 40.736102, lng: -73.989318} + ], + color: 'red', + weight: 2 + } + ] + }); + const encodedPath1 = encodeURIComponent( + 'color:blue|weight:5|40.737102,-73.990318|Hamburg, Germany' + ).replace(/%20/g, '+'); + const encodedPath2 = encodeURIComponent( + 'color:red|weight:2|40.737102,-73.990318|40.736102,-73.989318' + ); + expect(url).toContain(`path=${encodedPath1}`); + expect(url).toContain(`path=${encodedPath2}`); + }); + + test('includes style parameters', () => { + const url = createStaticMapsUrl({ + ...requiredParams, + center: {lat: 40.714728, lng: -73.998672}, + style: [ + { + featureType: 'road', + elementType: 'geometry', + stylers: [{color: '#00ff00'}] + }, + { + featureType: 'water', + elementType: 'geometry', + stylers: [{color: '#0000ff'}] + } + ] + }); + + const style1 = encodeURIComponent( + 'feature:road|element:geometry|color:0x00ff00' + ); + const style2 = encodeURIComponent( + 'feature:water|element:geometry|color:0x0000ff' + ); + expect(url).toContain(`style=${style1}`); + expect(url).toContain(`style=${style2}`); + }); +}); From 02ad34c016f9b8c1c1e8d360c7b34029c6d009e6 Mon Sep 17 00:00:00 2001 From: Malte Modrow Date: Mon, 9 Dec 2024 16:48:49 +0100 Subject: [PATCH 4/5] refactor: call formatParam in different place --- .../__tests__/create-static-maps-url.test.ts | 6 ++- .../assemble-map-type-styles.ts | 38 ++++++++++--------- .../assemble-marker-params.ts | 7 ++-- .../assemble-path-params.ts | 6 +-- src/libraries/create-static-maps-url/index.ts | 6 +-- 5 files changed, 35 insertions(+), 28 deletions(-) diff --git a/src/libraries/__tests__/create-static-maps-url.test.ts b/src/libraries/__tests__/create-static-maps-url.test.ts index 3716caa..eb61c64 100644 --- a/src/libraries/__tests__/create-static-maps-url.test.ts +++ b/src/libraries/__tests__/create-static-maps-url.test.ts @@ -99,9 +99,11 @@ describe('createStaticMapsUrl', () => { } ] }); - expect(url).toContain( - 'markers=color%3Ared%7Clabel%3AA%7Csize%3Amid%7C40.714728%2C-73.998672' + const markerParam = encodeURIComponent( + 'color:red|label:A|size:mid|40.714728,-73.998672' ); + + expect(url).toContain(`markers=${markerParam}`); }); test('includes scale parameter', () => { diff --git a/src/libraries/create-static-maps-url/assemble-map-type-styles.ts b/src/libraries/create-static-maps-url/assemble-map-type-styles.ts index 83d016e..e997a22 100644 --- a/src/libraries/create-static-maps-url/assemble-map-type-styles.ts +++ b/src/libraries/create-static-maps-url/assemble-map-type-styles.ts @@ -1,3 +1,5 @@ +import {formatParam} from './helpers'; + /** * Converts an array of Google Maps style objects into an array of style strings * compatible with the Google Static Maps API. @@ -16,7 +18,7 @@ * // Returns: ["|feature:road|element:geometry|color:0xff0000|weight:1"] * * Each style string follows the format: - * "|feature:{featureType}|element:{elementType}|{stylerName}:{stylerValue}" + * "feature:{featureType}|element:{elementType}|{stylerName}:{stylerValue}" * * Note: Color values with hexadecimal notation (#) are automatically converted * to the required 0x format for the Static Maps API. @@ -24,25 +26,27 @@ export function assembleMapTypeStyles( styles: Array ): string[] { - return styles.map((mapTypeStyle: google.maps.MapTypeStyle) => { - const {featureType, elementType, stylers = []} = mapTypeStyle; + return styles + .map((mapTypeStyle: google.maps.MapTypeStyle) => { + const {featureType, elementType, stylers = []} = mapTypeStyle; - let styleString = ''; + let styleString = ''; - if (featureType) { - styleString += `|feature:${featureType}`; - } + if (featureType) { + styleString += `|feature:${featureType}`; + } - if (elementType) { - styleString += `|element:${elementType}`; - } + if (elementType) { + styleString += `|element:${elementType}`; + } - for (const styler of stylers) { - Object.entries(styler).forEach(([name, value]) => { - styleString += `|${name}:${String(value).replace('#', '0x')}`; - }); - } + for (const styler of stylers) { + Object.entries(styler).forEach(([name, value]) => { + styleString += `|${name}:${String(value).replace('#', '0x')}`; + }); + } - return styleString; - }); + return styleString; + }) + .map(formatParam); } diff --git a/src/libraries/create-static-maps-url/assemble-marker-params.ts b/src/libraries/create-static-maps-url/assemble-marker-params.ts index 2b2eb61..a37919f 100644 --- a/src/libraries/create-static-maps-url/assemble-marker-params.ts +++ b/src/libraries/create-static-maps-url/assemble-marker-params.ts @@ -1,3 +1,4 @@ +import {formatParam} from './helpers'; import {StaticMapsMarker} from './types'; /** @@ -19,8 +20,8 @@ import {StaticMapsMarker} from './types'; * const params = assembleMarkerParams(markers); * // Params will be an array of strings representing the marker parameters * Example output: [ - * "|color:blue|label:A|size:mid|40.714728,-73.998672|40.714728,-73.998672", - * "|icon:http://example.com/icon.png|40.714728,-73.998672" + * "color:blue|label:A|size:mid|40.714728,-73.998672|40.714728,-73.998672", + * "icon:http://example.com/icon.png|40.714728,-73.998672" * ] */ export function assembleMarkerParams(markers: StaticMapsMarker[] = []) { @@ -73,5 +74,5 @@ export function assembleMarkerParams(markers: StaticMapsMarker[] = []) { markerParams.push(markerParam); }); - return markerParams; + return markerParams.map(formatParam); } diff --git a/src/libraries/create-static-maps-url/assemble-path-params.ts b/src/libraries/create-static-maps-url/assemble-path-params.ts index c88fff5..a24c5fe 100644 --- a/src/libraries/create-static-maps-url/assemble-path-params.ts +++ b/src/libraries/create-static-maps-url/assemble-path-params.ts @@ -1,4 +1,4 @@ -import {formatLocation} from './helpers'; +import {formatLocation, formatParam} from './helpers'; import {StaticMapsPath} from './types'; /** @@ -25,7 +25,7 @@ import {StaticMapsPath} from './types'; * * const pathParams = assemblePathParams(paths); * Output: [ - * '|color:red|weight:5|40.714728,-73.998672|40.718217,-73.998284' + * 'color:red|weight:5|40.714728,-73.998672|40.718217,-73.998284' * ] */ export function assemblePathParams(paths: Array = []) { @@ -75,5 +75,5 @@ export function assemblePathParams(paths: Array = []) { pathParams.push(pathParam); }); - return pathParams; + return pathParams.map(formatParam); } diff --git a/src/libraries/create-static-maps-url/index.ts b/src/libraries/create-static-maps-url/index.ts index 4d85da9..0fb0ca3 100644 --- a/src/libraries/create-static-maps-url/index.ts +++ b/src/libraries/create-static-maps-url/index.ts @@ -116,12 +116,12 @@ export function createStaticMapsUrl({ // Assemble Markers for (const markerParam of assembleMarkerParams(markers)) { - url.searchParams.append('markers', formatParam(markerParam)); + url.searchParams.append('markers', markerParam); } // Assemble Paths for (const pathParam of assemblePathParams(paths)) { - url.searchParams.append('path', formatParam(pathParam)); + url.searchParams.append('path', pathParam); } // Assemble visible locations @@ -134,7 +134,7 @@ export function createStaticMapsUrl({ // Assemble Map Type Styles for (const styleString of assembleMapTypeStyles(style)) { - url.searchParams.append('style', formatParam(styleString)); + url.searchParams.append('style', styleString); } return url.toString(); From 95df99cfd312ed41044f2f9f9926d16a76dc30d7 Mon Sep 17 00:00:00 2001 From: Malte Modrow Date: Thu, 12 Dec 2024 16:24:11 +0100 Subject: [PATCH 5/5] feat(static-map): add example and documentation page --- docs/api-reference/components/static-map.md | 229 ++++++++++++++++++ docs/table-of-contents.json | 3 +- examples/examples.css | 27 +++ examples/static-map/README.md | 35 +++ examples/static-map/index.html | 31 +++ examples/static-map/package.json | 14 ++ examples/static-map/src/app.tsx | 42 ++++ examples/static-map/src/control-panel.tsx | 25 ++ examples/static-map/src/static-map-1.tsx | 19 ++ examples/static-map/src/static-map-2.tsx | 44 ++++ examples/static-map/src/static-map-3.tsx | 32 +++ examples/static-map/src/static-map-4.tsx | 45 ++++ examples/static-map/vite.config.js | 17 ++ src/components/static-map.tsx | 7 +- .../assemble-marker-params.ts | 1 + src/libraries/create-static-maps-url/index.ts | 2 +- website/src/examples-sidebar.js | 3 +- website/src/examples/static-map.mdx | 5 + website/static/images/examples/static-map.jpg | Bin 0 -> 108940 bytes 19 files changed, 575 insertions(+), 6 deletions(-) create mode 100644 docs/api-reference/components/static-map.md create mode 100644 examples/static-map/README.md create mode 100644 examples/static-map/index.html create mode 100644 examples/static-map/package.json create mode 100644 examples/static-map/src/app.tsx create mode 100644 examples/static-map/src/control-panel.tsx create mode 100644 examples/static-map/src/static-map-1.tsx create mode 100644 examples/static-map/src/static-map-2.tsx create mode 100644 examples/static-map/src/static-map-3.tsx create mode 100644 examples/static-map/src/static-map-4.tsx create mode 100644 examples/static-map/vite.config.js create mode 100644 website/src/examples/static-map.mdx create mode 100644 website/static/images/examples/static-map.jpg diff --git a/docs/api-reference/components/static-map.md b/docs/api-reference/components/static-map.md new file mode 100644 index 0000000..f553d22 --- /dev/null +++ b/docs/api-reference/components/static-map.md @@ -0,0 +1,229 @@ +# `` Component + +React component and utility function to create and render [Google Static Maps][gmp-static-map] images. This implementation provides both a React component for rendering and a URL generation utility that supports all Google Static Maps API features. The main purpose of the utility function is to enable 'url-signing' in various +server environments. + +The main parameters to control the map are `center`, +`zoom`, `width` and `height`. With a plain map all of these are required for the map to show. There are cases where `center` and `zoom` can be omitted and the viewport can be automatically be determined from other data. This is the case when having markers, paths or other `visible` locations which can form an automatic bounding box for the map view. + +Parameters that are always required are `apiKey`, `width` and `height`. + +```tsx +import {StaticMap, createStaticMapsUrl} from '@vis.gl/react-google-maps'; + +const App = () => { + let staticMapsUrl = createStaticMapsUrl({ + apiKey: 'YOUR API KEY', + width: 512, + height: 512, + center: {lat: 53.555570296010295, lng: 10.008892744638956}, + zoom: 15 + }); + + // Recommended url-signing when in a server environment. + staticMapsUrl = someServerSigningCode( + staticMapsUrl, + process.env.MAPS_SIGNING_SECRET + ); + + return ; +}; +``` + +More on URL signing and digital signatures [here](#digital-signature). + +## Props + +The `StaticMap` component only has one `url` prop. The recommended way to generate the url is to use the `createStaticMapsUrl` helper function. + +### Required + +#### `url`: string + +An url which can be consumed by the Google Maps Static Api. + +### Optional + +#### `className`: string + +A class name that will be attached to the `img` tag. + +## `createStaticMapsUrl` options + +:::note + +Some explanations and syntax migh differ slighty from the official documentation since the Google documentation focuses on building and URL which has +been abstracted here in the helper function for better developer experience + +::: + +For more details about API options see the [get started][get-started] guide in the Google documentation. + +### Required + +#### `apiKey`: string + +The Google Maps Api key. + +#### `width`: number + +Width of the image. Maps smaller than 180 pixels in width will display a reduced-size Google logo. This parameter is affected by the scale parameter; the final output size is the product of the size and scale values. + +#### `height`: number + +Height of the image. This parameter is affected by the scale parameter; the final output size is the product of the size and scale values. + +### Optional + +#### `center`: [StaticMapsLocation](#staticmapslocation) + +(required if no markers, paths or visible locations are present) Defines the center of the map, equidistant from all edges of the map. This parameter takes a location as either [`google.maps.LatLngLiteral`][gmp-ll] or a string address (e.g. "city hall, new york, ny") identifying a unique location on the face of the earth. + +#### `zoom`: number + +(required if no markers, paths or visible locations are present) Defines the zoom level of the map, which determines the magnification level of the map. This parameter takes a numerical value corresponding to the zoom level of the region desired. + +#### `scale`: number + +Affects the number of pixels that are returned. scale=2 returns twice as many pixels as scale=1 while retaining the same coverage area and level of detail (i.e. the contents of the map don't change). This is useful when developing for high-resolution displays. The default value is 1. Accepted values are 1 and 2 + +#### `format`: 'png' | 'png8' | 'png32' | 'gif' | 'jpg' | 'jpg-baseline' + +Defines the format of the resulting image. By default, the Maps Static API creates PNG images. There are several possible formats including GIF, JPEG and PNG types. Which format you use depends on how you intend to present the image. JPEG typically provides greater compression, while GIF and PNG provide greater detail + +#### `mapType`: [google.maps.MapTypeId][gmp-map-type-id] + +Defines the type of map to construct. There are several possible maptype values, including roadmap, satellite, hybrid, and terrain. + +#### `language`: string + +Defines the language to use for display of labels on map tiles. Note that this parameter is only supported for some country tiles; if the specific language requested is not supported for the tile set, then the default language for that tileset will be used. + +#### `region`: string + +Defines the appropriate borders to display, based on geo-political sensitivities. Accepts a region code specified as a two-character ccTLD ('top-level domain') value + +#### `mapId`: string + +Specifies the identifier for a specific map. The Map ID associates a map with a particular style or feature, and must belong to the same project as the API key used to initialize the map. + +#### `markers`: [StaticMapsMarker[]](#staticmapsmarker) + +Defines markers that should be visible on the map. + +#### `paths`: [StaticMapsPath[]](#staticmapspath) + +Defines paths that should be shown on the map. + +#### `visible`: [StaticMapsLocation[]](#staticmapslocation) + +Specifies one or more locations that should remain visible on the map, though no markers or other indicators will be displayed. Use this parameter to ensure that certain features or map locations are shown on the Maps Static API. + +#### `style`: [google.maps.MapTypeStyle[]][gmp-map-type-style] + +Defines a custom style to alter the presentation of a specific feature (roads, parks, and other features) of the map. This parameter takes feature and element arguments identifying the features to style, and a set of style operations to apply to the selected features. See [style reference][gmp-style-ref] for more information. + +## Digital Signature + +:::warning + +Please only use URL signing on the server and keep your URL signing secret secure. Do not pass it in any requests, store it on any websites, or post it to any public forum. Anyone obtaining your URL signing secret could spoof requests using your identity. + +::: +It is recommended to use a [digital signature][digital-signature] with your Static Maps Api requests. + +Digital signatures are generated using a URL signing secret, which is available on the Google Cloud Console. This secret is essentially a private key, only shared between you and Google, and is unique to your project. + +The signing process uses an encryption algorithm to combine the URL and your shared secret. The resulting unique signature allows our servers to verify that any site generating requests using your API key is authorized to do so. + +- Step 1: [Get your URL signing secret][sign-secret] +- Step 2: Construct an unsigned request with the `createStaticMapUrl` helper. +- Step 3: [Generate the signed request][generate-signed] | [Sample code for URL signing][sample-code] + +Google also provides a package [`@googlemaps/url-signature`][url-signature] for URL signing. Another example could look like this. Here in a Next.js environment. + +```tsx +import 'server-only'; + +import {signUrl} from '@googlemaps/url-signature'; + +export function signStaticMapsUrl(url: string, secret: string): string { + return signUrl(url, secret).toString(); +} +``` + +When the signing process is setup, you can then [limit the unsigned request][limit-unsigned] to prevent abuse of your api key + +## Types + +### StaticMapsLocation + +Reference: [`google.maps.LatLngLiteral`][gmp-ll] + +```tsx +type StaticMapsLocation = google.maps.LatLngLiteral | string; +``` + +### StaticMapsMarker + +- For `color`, `size`, `label` see [marker styles][gmp-marker-styles]. +- For `icon`, `anchor` and `scaling` see [custom icons][gmp-custom-icons]. + +```tsx +type StaticMapsMarker = { + location: google.maps.LatLngLiteral | string; + color?: string; + size?: 'tiny' | 'mid' | 'small'; + label?: string; + icon?: string; + anchor?: string; + scale?: 1 | 2 | 4; +}; +``` + +### StaticMapsPath + +For style options see [Path styles][gmp-path-styles]. + +`coordinates` can either bei an array of locations/addresses or it can be an [encoded polyline][gmp-encoded-polyline]. Note that the encoded polyline needs an `enc:` prefix. + +```tsx +type StaticMapsPath = { + coordinates: Array | string; + weight?: number; + color?: string; + fillcolor?: string; + geodesic?: boolean; +}; +``` + +## Examples + +Usage examples for many of the API options can be found [here][usage-examples] + +## Source + +[`./src/components/static-map`][static-map-source]\ +[`./src/libraries/create-static-maps-url/index`][create-static-map-url-source]\ +[`./src/libraries/create-static-maps-url/types`][create-static-map-url-types] + +[gmp-static-map]: https://developers.google.com/maps/documentation/maps-static +[static-map-source]: https://github.com/visgl/react-google-maps/tree/main/src/components/static-map +[create-static-map-url-source]: https://github.com/visgl/react-google-maps/tree/main/src/libraries/create-static-maps-url/index.ts +[create-static-map-url-types]: https://github.com/visgl/react-google-maps/tree/main/src/libraries/create-static-maps-url/types +[gmp-map-type-id]: https://developers.google.com/maps/documentation/javascript/reference/map#MapTypeId +[gmp-ll]: https://developers.google.com/maps/documentation/javascript/reference/coordinates#LatLngLiteral +[gmp-map-type-style]: https://developers.google.com/maps/documentation/javascript/reference/map#MapTypeStyle +[usage-examples]: https://github.com/visgl/react-google-maps/tree/main/examples/static-map +[get-started]: https://developers.google.com/maps/documentation/maps-static/start +[sign-secret]: https://developers.google.com/maps/documentation/maps-static/digital-signature#get-secret +[gmp-encoded-polyline]: https://developers.google.com/maps/documentation/maps-static/start#EncodedPolylines +[gmp-path-styles]: https://developers.google.com/maps/documentation/maps-static/start#PathStyles +[gmp-marker-styles]: https://developers.google.com/maps/documentation/maps-static/start#MarkerStyles +[gmp-custom-icons]: https://developers.google.com/maps/documentation/maps-static/start#CustomIcons +[limit-unsigned]: https://developers.google.com/maps/documentation/maps-static/digital-signature#limit-unsigned-requests +[url-signature]: https://www.npmjs.com/package/@googlemaps/url-signature +[generate-signed]: https://developers.google.com/maps/documentation/maps-static/digital-signature#generate-signed-request +[sample-code]: https://developers.google.com/maps/documentation/maps-static/digital-signature#sample-code-for-url-signing +[digital-signature]: https://developers.google.com/maps/documentation/maps-static/digital-signature +[gmp-style-ref]: https://developers.google.com/maps/documentation/maps-static/style-reference diff --git a/docs/table-of-contents.json b/docs/table-of-contents.json index dcd020e..07a5ab0 100644 --- a/docs/table-of-contents.json +++ b/docs/table-of-contents.json @@ -39,7 +39,8 @@ "api-reference/components/info-window", "api-reference/components/marker", "api-reference/components/advanced-marker", - "api-reference/components/pin" + "api-reference/components/pin", + "api-reference/components/static-map" ] }, { diff --git a/examples/examples.css b/examples/examples.css index 4aaa6b3..060af36 100644 --- a/examples/examples.css +++ b/examples/examples.css @@ -126,3 +126,30 @@ html[data-theme='dark'] .gm-style { opacity: 0.5; cursor: default; } + +.static-map-grid, +.static-map-grid * { + box-sizing: border-box; +} + +.static-map-grid { + display: grid; + grid-template-rows: 1fr 1fr; + grid-template-columns: 1fr 1fr; + height: 100%; + width: 100%; + gap: 16px; + padding: 16px; + background: darkgray; +} + +.static-map-grid .map-container { + position: relative; +} + +.static-map-grid .map { + object-fit: contain; + position: absolute; + height: 100%; + width: 100%; +} diff --git a/examples/static-map/README.md b/examples/static-map/README.md new file mode 100644 index 0000000..294e7d0 --- /dev/null +++ b/examples/static-map/README.md @@ -0,0 +1,35 @@ +# Static Map Example + +This is an example to show how to use the `Static Map` component. + +## Google Maps Platform API Key + +This example does not come with an API key. Running the examples locally requires a valid API key for the Google Maps Platform. +See [the official documentation][get-api-key] on how to create and configure your own key. + +The API key has to be provided via an environment variable `GOOGLE_MAPS_API_KEY`. This can be done by creating a +file named `.env` in the example directory with the following content: + +```shell title=".env" +GOOGLE_MAPS_API_KEY="" +``` + +If you are on the CodeSandbox playground you can also choose to [provide the API key like this](https://codesandbox.io/docs/learn/environment/secrets) + +## Development + +Go into the example-directory and run + +```shell +npm install +``` + +To start the example with the local library run + +```shell +npm run start-local +``` + +The regular `npm start` task is only used for the standalone versions of the example (CodeSandbox for example) + +[get-api-key]: https://developers.google.com/maps/documentation/javascript/get-api-key diff --git a/examples/static-map/index.html b/examples/static-map/index.html new file mode 100644 index 0000000..72dcb2c --- /dev/null +++ b/examples/static-map/index.html @@ -0,0 +1,31 @@ + + + + + + Static Map Example + + + + +
+ + + diff --git a/examples/static-map/package.json b/examples/static-map/package.json new file mode 100644 index 0000000..05765f9 --- /dev/null +++ b/examples/static-map/package.json @@ -0,0 +1,14 @@ +{ + "type": "module", + "dependencies": { + "@vis.gl/react-google-maps": "latest", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "vite": "^5.0.4" + }, + "scripts": { + "start": "vite", + "start-local": "vite --config ../vite.config.local.js", + "build": "vite build" + } +} diff --git a/examples/static-map/src/app.tsx b/examples/static-map/src/app.tsx new file mode 100644 index 0000000..d40d48b --- /dev/null +++ b/examples/static-map/src/app.tsx @@ -0,0 +1,42 @@ +import React from 'react'; +import {createRoot} from 'react-dom/client'; + +import StaticMap1 from './static-map-1'; +import StaticMap2 from './static-map-2'; +import StaticMap3 from './static-map-3'; +import StaticMap4 from './static-map-4'; + +import ControlPanel from './control-panel'; + +function App() { + return ( +
+
+ +
+
+ +
+
+ +
+
+ +
+ + +
+ ); +} + +export default App; + +export function renderToDom(container: HTMLElement) { + const root = createRoot(container); + + root.render( + + + + ); +} diff --git a/examples/static-map/src/control-panel.tsx b/examples/static-map/src/control-panel.tsx new file mode 100644 index 0000000..9998d65 --- /dev/null +++ b/examples/static-map/src/control-panel.tsx @@ -0,0 +1,25 @@ +import * as React from 'react'; + +function ControlPanel() { + return ( +
+

Static Map

+

Static Map usage examples.

+ +
+ ); +} + +export default React.memo(ControlPanel); diff --git a/examples/static-map/src/static-map-1.tsx b/examples/static-map/src/static-map-1.tsx new file mode 100644 index 0000000..e1f286c --- /dev/null +++ b/examples/static-map/src/static-map-1.tsx @@ -0,0 +1,19 @@ +import React from 'react'; +import {StaticMap, createStaticMapsUrl} from '@vis.gl/react-google-maps'; + +const API_KEY = + globalThis.GOOGLE_MAPS_API_KEY ?? (process.env.GOOGLE_MAPS_API_KEY as string); + +export default function StaticMap1() { + const staticMapsUrl = createStaticMapsUrl({ + apiKey: API_KEY, + scale: 2, + width: 600, + height: 600, + center: {lat: 53.555570296010295, lng: 10.008892744638956}, + zoom: 8, + language: 'en' + }); + + return ; +} diff --git a/examples/static-map/src/static-map-2.tsx b/examples/static-map/src/static-map-2.tsx new file mode 100644 index 0000000..cfafd37 --- /dev/null +++ b/examples/static-map/src/static-map-2.tsx @@ -0,0 +1,44 @@ +import React from 'react'; +import {StaticMap, createStaticMapsUrl} from '@vis.gl/react-google-maps'; + +const API_KEY = + globalThis.GOOGLE_MAPS_API_KEY ?? (process.env.GOOGLE_MAPS_API_KEY as string); + +export default function StaticMap2() { + const staticMapsUrl = createStaticMapsUrl({ + apiKey: API_KEY, + scale: 2, + width: 600, + height: 600, + mapId: '8e0a97af9386fef', + format: 'png', + markers: [ + { + location: 'Hamburg, Germany', + color: '0xff1493', + label: 'H', + size: 'small' + }, + { + location: {lat: 52.5, lng: 10}, + color: 'blue', + label: 'H' + }, + { + location: 'Berlin, Germany', + color: 'orange', + icon: 'http://tinyurl.com/jrhlvu6', + anchor: 'center', + label: 'B', + scale: 2 + }, + { + location: 'Essen, Germany', + color: 'purple' + } + ], + visible: ['Germany'] + }); + + return ; +} diff --git a/examples/static-map/src/static-map-3.tsx b/examples/static-map/src/static-map-3.tsx new file mode 100644 index 0000000..00093c9 --- /dev/null +++ b/examples/static-map/src/static-map-3.tsx @@ -0,0 +1,32 @@ +import React from 'react'; +import {StaticMap, createStaticMapsUrl} from '@vis.gl/react-google-maps'; + +const API_KEY = + globalThis.GOOGLE_MAPS_API_KEY ?? (process.env.GOOGLE_MAPS_API_KEY as string); + +export default function StaticMap3() { + const staticMapsUrl = createStaticMapsUrl({ + apiKey: API_KEY, + scale: 2, + width: 600, + height: 600, + mapType: 'hybrid', + format: 'jpg', + paths: [ + { + color: '0xff1493', + fillcolor: '0xffff00', + coordinates: [ + {lat: 52.5, lng: 10}, + 'Berlin, Germany', + 'Hamburg, Germany' + ] + }, + { + coordinates: [{lat: 52.5, lng: 10}, 'Leipzig, Germany'] + } + ] + }); + + return ; +} diff --git a/examples/static-map/src/static-map-4.tsx b/examples/static-map/src/static-map-4.tsx new file mode 100644 index 0000000..eab2923 --- /dev/null +++ b/examples/static-map/src/static-map-4.tsx @@ -0,0 +1,45 @@ +import React from 'react'; +import {StaticMap, createStaticMapsUrl} from '@vis.gl/react-google-maps'; + +const API_KEY = + globalThis.GOOGLE_MAPS_API_KEY ?? (process.env.GOOGLE_MAPS_API_KEY as string); + +export default function StaticMap4() { + const staticMapsUrl = createStaticMapsUrl({ + apiKey: API_KEY, + scale: 2, + width: 600, + height: 600, + paths: [ + { + color: '0xff00ff', + fillcolor: '0xffff00', + coordinates: + 'enc:}zswFtikbMjJzZ|RdPfZ}DxWvBjWpF~IvJnEvBrMvIvUpGtQpFhOQdKpz@bIx{A|PfYlvApz@bl@tcAdTpGpVwQtX}i@|Gen@lCeAda@bjA`q@v}@rfAbjA|EwBpbAd_@he@hDbu@uIzWcWtZoTdImTdIwu@tDaOXw_@fc@st@~VgQ|[uPzNtA`LlEvHiYyLs^nPhCpG}SzCNwHpz@cEvXg@bWdG`]lL~MdTmEnCwJ[iJhOae@nCm[`Aq]qE_pAaNiyBuDurAuB}}Ay`@|EKv_@?|[qGji@lAhYyH`@Xiw@tBerAs@q]jHohAYkSmW?aNoaAbR}LnPqNtMtIbRyRuDef@eT_z@mW_Nm|B~j@zC~hAyUyJ_U{Z??cPvg@}s@sHsc@_z@cj@kp@YePoNyYyb@_iAyb@gBw^bOokArcA}GwJuzBre@i\\tf@sZnd@oElb@hStW{]vv@??kz@~vAcj@zKa`Atf@uQj_Aee@pU_UrcA' + } + ], + style: [ + { + featureType: 'road.local', + elementType: 'geometry', + stylers: [{color: '#00ff00'}] + }, + { + featureType: 'landscape', + elementType: 'geometry.fill', + stylers: [{color: '#222222'}] + }, + { + elementType: 'labels', + stylers: [{invert_lightness: true}] + }, + { + featureType: 'road.arterial', + elementType: 'labels', + stylers: [{invert_lightness: false}] + } + ] + }); + + return ; +} diff --git a/examples/static-map/vite.config.js b/examples/static-map/vite.config.js new file mode 100644 index 0000000..522c6cb --- /dev/null +++ b/examples/static-map/vite.config.js @@ -0,0 +1,17 @@ +import {defineConfig, loadEnv} from 'vite'; + +export default defineConfig(({mode}) => { + const {GOOGLE_MAPS_API_KEY = ''} = loadEnv(mode, process.cwd(), ''); + + return { + define: { + 'process.env.GOOGLE_MAPS_API_KEY': JSON.stringify(GOOGLE_MAPS_API_KEY) + }, + resolve: { + alias: { + '@vis.gl/react-google-maps/examples.js': + 'https://visgl.github.io/react-google-maps/scripts/examples.js' + } + } + }; +}); diff --git a/src/components/static-map.tsx b/src/components/static-map.tsx index fc923ba..ae57d77 100644 --- a/src/components/static-map.tsx +++ b/src/components/static-map.tsx @@ -8,12 +8,13 @@ export * from '../libraries/create-static-maps-url/types'; */ export type StaticMapProps = { url: string; + className?: string; }; -export const StaticMap = async (props: StaticMapProps) => { - const {url} = props; +export const StaticMap = (props: StaticMapProps) => { + const {url, className} = props; if (!url) throw new Error('URL is required'); - return ; + return ; }; diff --git a/src/libraries/create-static-maps-url/assemble-marker-params.ts b/src/libraries/create-static-maps-url/assemble-marker-params.ts index a37919f..3498afb 100644 --- a/src/libraries/create-static-maps-url/assemble-marker-params.ts +++ b/src/libraries/create-static-maps-url/assemble-marker-params.ts @@ -21,6 +21,7 @@ import {StaticMapsMarker} from './types'; * // Params will be an array of strings representing the marker parameters * Example output: [ * "color:blue|label:A|size:mid|40.714728,-73.998672|40.714728,-73.998672", + * "color:blue|label:B|size:mid|40.714728,-73.998672|40.714728,-73.998672", * "icon:http://example.com/icon.png|40.714728,-73.998672" * ] */ diff --git a/src/libraries/create-static-maps-url/index.ts b/src/libraries/create-static-maps-url/index.ts index 0fb0ca3..e18205d 100644 --- a/src/libraries/create-static-maps-url/index.ts +++ b/src/libraries/create-static-maps-url/index.ts @@ -1,6 +1,6 @@ import {assembleMarkerParams} from './assemble-marker-params'; import {assemblePathParams} from './assemble-path-params'; -import {formatLocation, formatParam} from './helpers'; +import {formatLocation} from './helpers'; import {StaticMapsApiOptions} from './types'; import {assembleMapTypeStyles} from './assemble-map-type-styles'; diff --git a/website/src/examples-sidebar.js b/website/src/examples-sidebar.js index 688283a..a25f989 100644 --- a/website/src/examples-sidebar.js +++ b/website/src/examples-sidebar.js @@ -26,7 +26,8 @@ const sidebars = { 'directions', 'deckgl-overlay', 'map-3d', - 'extended-component-library' + 'extended-component-library', + 'static-map' ] } ] diff --git a/website/src/examples/static-map.mdx b/website/src/examples/static-map.mdx new file mode 100644 index 0000000..91daf33 --- /dev/null +++ b/website/src/examples/static-map.mdx @@ -0,0 +1,5 @@ +# Static Map + +import App from 'website-examples/static-map/src/app'; + + diff --git a/website/static/images/examples/static-map.jpg b/website/static/images/examples/static-map.jpg new file mode 100644 index 0000000000000000000000000000000000000000..603abc694862cff8b1dc2406357e59efa0abd9d7 GIT binary patch literal 108940 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%0Adu=|DUu=iFn(j+ky#{sY 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 M6i@+06i^5M*%F*L)&Kwi literal 0 HcmV?d00001