From 35098bd4c75b825f96f58696cbb37a4fcdebbdb8 Mon Sep 17 00:00:00 2001 From: pinpong Date: Wed, 8 Oct 2025 23:22:04 +0700 Subject: [PATCH 1/8] feat: add kml layer support --- .../rngooglemapsplus/GoogleMapsViewImpl.kt | 57 ++++++++++++++ .../rngooglemapsplus/RNGoogleMapsPlusView.kt | 14 ++++ example/ios/Podfile.lock | 4 +- example/src/App.tsx | 75 +++++++++++++++++++ ios/GoogleMapViewImpl.swift | 44 +++++++++++ ios/RNGoogleMapsPlusView.swift | 21 ++++++ src/RNGoogleMapsPlusView.nitro.ts | 2 + src/types.ts | 5 ++ 8 files changed, 220 insertions(+), 2 deletions(-) diff --git a/android/src/main/java/com/rngooglemapsplus/GoogleMapsViewImpl.kt b/android/src/main/java/com/rngooglemapsplus/GoogleMapsViewImpl.kt index 5979c6a..5a0486d 100644 --- a/android/src/main/java/com/rngooglemapsplus/GoogleMapsViewImpl.kt +++ b/android/src/main/java/com/rngooglemapsplus/GoogleMapsViewImpl.kt @@ -27,8 +27,11 @@ import com.google.android.gms.maps.model.Polyline import com.google.android.gms.maps.model.PolylineOptions import com.google.android.gms.maps.model.TileOverlay import com.google.android.gms.maps.model.TileOverlayOptions +import com.google.maps.android.data.kml.KmlLayer import com.rngooglemapsplus.extensions.toGooglePriority import com.rngooglemapsplus.extensions.toLocationErrorCode +import java.io.ByteArrayInputStream +import java.nio.charset.StandardCharsets class GoogleMapsViewImpl( val reactContext: ThemedReactContext, @@ -55,12 +58,14 @@ class GoogleMapsViewImpl( private val pendingPolygons = mutableListOf>() private val pendingCircles = mutableListOf>() private val pendingHeatmaps = mutableListOf>() + private val pendingKmlLayers = mutableListOf>() private val markersById = mutableMapOf() private val polylinesById = mutableMapOf() private val polygonsById = mutableMapOf() private val circlesById = mutableMapOf() private val heatmapsById = mutableMapOf() + private val kmlLayersById = mutableMapOf() private var cameraMoveReason = -1 private var lastSubmittedLocation: Location? = null @@ -343,6 +348,13 @@ class GoogleMapsViewImpl( } pendingHeatmaps.clear() } + + if (pendingKmlLayers.isNotEmpty()) { + pendingKmlLayers.forEach { (id, string) -> + internalAddKmlLayer(id, string) + } + pendingKmlLayers.clear() + } } var uiSettings: RNMapUiSettings? = null @@ -825,6 +837,50 @@ class GoogleMapsViewImpl( pendingHeatmaps.clear() } + fun addKmlLayer( + id: String, + kmlString: String, + ) { + if (googleMap == null) { + pendingKmlLayers.add(id to kmlString) + return + } + onUi { + kmlLayersById.remove(id)?.removeLayerFromMap() + } + internalAddKmlLayer(id, kmlString) + } + + private fun internalAddKmlLayer( + id: String, + kmlString: String, + ) { + onUi { + try { + val inputStream = ByteArrayInputStream(kmlString.toByteArray(StandardCharsets.UTF_8)) + val layer = KmlLayer(googleMap, inputStream, context) + kmlLayersById[id] = layer + layer.addLayerToMap() + } catch (e: Exception) { + // / ignore + } + } + } + + fun removeKmlLayer(id: String) { + onUi { + kmlLayersById.remove(id)?.removeLayerFromMap() + } + } + + fun clearKmlLayer() { + onUi { + kmlLayersById.values.forEach { it.removeLayerFromMap() } + } + kmlLayersById.clear() + pendingKmlLayers.clear() + } + fun destroyInternal() { onUi { markerBuilder.cancelAllJobs() @@ -833,6 +889,7 @@ class GoogleMapsViewImpl( clearPolygons() clearCircles() clearHeatmaps() + clearKmlLayer() locationHandler.stop() googleMap?.apply { setOnCameraMoveStartedListener(null) diff --git a/android/src/main/java/com/rngooglemapsplus/RNGoogleMapsPlusView.kt b/android/src/main/java/com/rngooglemapsplus/RNGoogleMapsPlusView.kt index 40ed111..ede216d 100644 --- a/android/src/main/java/com/rngooglemapsplus/RNGoogleMapsPlusView.kt +++ b/android/src/main/java/com/rngooglemapsplus/RNGoogleMapsPlusView.kt @@ -234,6 +234,20 @@ class RNGoogleMapsPlusView( } } + override var kmlLayers: Array? = null + set(value) { + if (field.contentEquals(value)) return + val prevById = field?.associateBy { it.id } ?: emptyMap() + val nextById = value?.associateBy { it.id } ?: emptyMap() + field = value + (prevById.keys - nextById.keys).forEach { id -> + view.removeKmlLayer(id) + } + nextById.forEach { (id, next) -> + view.addKmlLayer(id, next.kmlString) + } + } + override var locationConfig: RNLocationConfig? = null set(value) { if (field == value) return diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 7755d98..60981f1 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -2358,7 +2358,7 @@ PODS: - React-perflogger (= 0.82.0) - React-utils (= 0.82.0) - SocketRocket - - RNGoogleMapsPlus (1.1.0-dev.2): + - RNGoogleMapsPlus (1.1.0-dev.5): - boost - DoubleConversion - fast_float @@ -2713,7 +2713,7 @@ SPEC CHECKSUMS: ReactAppDependencyProvider: c5c4f5280e4ae0f9f4a739c64c4260fe0b3edaf1 ReactCodegen: 3873d7ac09960375f7845384ff47d53e478462dc ReactCommon: f5527f5d97a9957ab46eb5db78875d3579e03b97 - RNGoogleMapsPlus: 9b638ea84ab0231430a8b5a109a20130ad4a722a + RNGoogleMapsPlus: cdea400ea1e69740d91e07dbb5882d93be4c0a77 SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 SVGKit: 1ad7513f8c74d9652f94ed64ddecda1a23864dea Yoga: ce55ebb197c21e22b6700cd36e3f36b7ec26e6f8 diff --git a/example/src/App.tsx b/example/src/App.tsx index 4597e37..619f913 100644 --- a/example/src/App.tsx +++ b/example/src/App.tsx @@ -178,6 +178,78 @@ const silverMapStyle: RNMapStyleElement[] = [ }, ]; +const kmlString = ` + + + + Example KML Data + Example with marker, polygon and circle shifted further northeast of San Francisco + + + Center Point + + -122.4156,37.7781,0 + + + + + Example Polygon + + + + + + -122.4206,37.7826,0 + -122.4106,37.7826,0 + -122.4106,37.7746,0 + -122.4206,37.7746,0 + -122.4206,37.7826,0 + + + + + + + + Approximate Circle + + + + + + -122.4156,37.7801,0 + -122.4136,37.7801,0 + -122.4136,37.7761,0 + -122.4156,37.7761,0 + -122.4176,37.7761,0 + -122.4176,37.7801,0 + -122.4156,37.7801,0 + + + + + + + + +`.trim(); + function makeSvgIcon(width: number, height: number): string { const color = randomColor(); return ` @@ -369,6 +441,8 @@ export default function App() { Array.from({ length: 1 }, (_, i) => makeHeatmap(i + 1)) ); + const [kmlLayers] = useState([{ id: '21', zIndex: 1, kmlString }]); + useEffect(() => { if (!stressTest) return; @@ -543,6 +617,7 @@ export default function App() { polylines={polylines} circles={circles} heatmaps={heatmaps} + kmlLayers={kmlLayers} /> diff --git a/ios/GoogleMapViewImpl.swift b/ios/GoogleMapViewImpl.swift index 91387f2..a800ebe 100644 --- a/ios/GoogleMapViewImpl.swift +++ b/ios/GoogleMapViewImpl.swift @@ -16,12 +16,14 @@ final class GoogleMapsViewImpl: UIView, GMSMapViewDelegate { private var pendingPolygons: [(id: String, polygon: GMSPolygon)] = [] private var pendingCircles: [(id: String, circle: GMSCircle)] = [] private var pendingHeatmaps: [(id: String, heatmap: GMUHeatmapTileLayer)] = [] + private var pendingKmlLayers: [(id: String, kmlString: String)] = [] private var markersById: [String: GMSMarker] = [:] private var polylinesById: [String: GMSPolyline] = [:] private var polygonsById: [String: GMSPolygon] = [:] private var circlesById: [String: GMSCircle] = [:] private var heatmapsById: [String: GMUHeatmapTileLayer] = [:] + private var kmlLayerById: [String: GMUGeometryRenderer] = [:] private var cameraMoveReasonIsGesture: Bool = false private var lastSubmittedCameraPosition: GMSCameraPosition? @@ -177,6 +179,12 @@ final class GoogleMapsViewImpl: UIView, GMSMapViewDelegate { } pendingHeatmaps.removeAll() } + if !pendingKmlLayers.isEmpty { + pendingKmlLayers.forEach { + addKmlLayerInternal(id: $0.id, kmlString: $0.kmlString) + } + pendingKmlLayers.removeAll() + } } var currentCamera: GMSCameraPosition? { @@ -524,6 +532,42 @@ final class GoogleMapsViewImpl: UIView, GMSMapViewDelegate { pendingHeatmaps.removeAll() } + @MainActor + func addKmlLayer(id: String, kmlString: String) { + if mapView == nil { + pendingKmlLayers.append((id, kmlString)) + return + } + kmlLayerById.removeValue(forKey: id).map { $0.clear() } + addKmlLayerInternal(id: id, kmlString: kmlString) + } + + @MainActor + private func addKmlLayerInternal(id: String, kmlString: String) { + guard let data = kmlString.data(using: .utf8) else { return } + let parser = GMUKMLParser(data: data) + parser.parse() + mapView.map { mapView in + let renderer = GMUGeometryRenderer( + map: mapView, + geometries: parser.placemarks + ) + renderer.render() + } + } + + @MainActor + func removeKmlLayer(id: String) { + kmlLayerById.removeValue(forKey: id).map { $0.clear() } + } + + @MainActor + func clearKmlLayers() { + kmlLayerById.values.forEach { $0.clear() } + kmlLayerById.removeAll() + pendingKmlLayers.removeAll() + } + func deinitInternal() { markerBuilder.cancelAllIconTasks() clearMarkers() diff --git a/ios/RNGoogleMapsPlusView.swift b/ios/RNGoogleMapsPlusView.swift index 47edfd3..49c498f 100644 --- a/ios/RNGoogleMapsPlusView.swift +++ b/ios/RNGoogleMapsPlusView.swift @@ -256,6 +256,27 @@ final class RNGoogleMapsPlusView: HybridRNGoogleMapsPlusViewSpec { } } + @MainActor + var kmlLayers: [RNKMLayer]? { + didSet { + let prevById = Dictionary( + (oldValue ?? []).map { ($0.id, $0) }, + uniquingKeysWith: { _, new in new } + ) + let nextById = Dictionary( + (kmlLayers ?? []).map { ($0.id, $0) }, + uniquingKeysWith: { _, new in new } + ) + + let removed = Set(prevById.keys).subtracting(nextById.keys) + removed.forEach { impl.removeKmlLayer(id: $0) } + + for (id, next) in nextById { + impl.addKmlLayer(id: id, kmlString: next.kmlString) + } + } + } + @MainActor var locationConfig: RNLocationConfig? { didSet { impl.locationConfig = locationConfig diff --git a/src/RNGoogleMapsPlusView.nitro.ts b/src/RNGoogleMapsPlusView.nitro.ts index dc29a66..07f104f 100644 --- a/src/RNGoogleMapsPlusView.nitro.ts +++ b/src/RNGoogleMapsPlusView.nitro.ts @@ -23,6 +23,7 @@ import type { RNLocationConfig, RNMapZoomConfig, RNHeatmap, + RNKMLayer, } from './types'; export interface RNGoogleMapsPlusViewProps extends HybridViewProps { @@ -42,6 +43,7 @@ export interface RNGoogleMapsPlusViewProps extends HybridViewProps { polylines?: RNPolyline[]; circles?: RNCircle[]; heatmaps?: RNHeatmap[]; + kmlLayers?: RNKMLayer[]; locationConfig?: RNLocationConfig; onMapError?: (error: RNMapErrorCode) => void; onMapReady?: (ready: boolean) => void; diff --git a/src/types.ts b/src/types.ts index 5a6d9e5..fedb7b8 100644 --- a/src/types.ts +++ b/src/types.ts @@ -199,6 +199,11 @@ export type RNHeatmapGradient = { colorMapSize: number; }; +export type RNKMLayer = { + id: string; + kmlString: string; +}; + export type RNLocationConfig = { android?: RNAndroidLocationConfig; ios?: RNIOSLocationConfig; From 03e8a8438b0d5edab80fcdf2f2c8abf3372288c2 Mon Sep 17 00:00:00 2001 From: pinpong Date: Wed, 8 Oct 2025 23:30:16 +0700 Subject: [PATCH 2/8] chore(ci): move PR template to root for auto-apply --- .github/{PULL_REQUEST_TEMPLATE => }/pull_request_template.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/{PULL_REQUEST_TEMPLATE => }/pull_request_template.md (100%) diff --git a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md b/.github/pull_request_template.md similarity index 100% rename from .github/PULL_REQUEST_TEMPLATE/pull_request_template.md rename to .github/pull_request_template.md From dcb542e0f7897f0d16a59f781d6c7f67b9f1be9c Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 9 Oct 2025 01:37:34 +0000 Subject: [PATCH 3/8] =?UTF-8?q?=F0=9F=94=96=20release:=201.1.0-dev.6=20[sk?= =?UTF-8?q?ip=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## [1.1.0-dev.6](https://github.com/pinpong/react-native-google-maps-plus/compare/v1.1.0-dev.5...v1.1.0-dev.6) (2025-10-09) ### ✨ Features * add kml layer support ([4faf558](https://github.com/pinpong/react-native-google-maps-plus/commit/4faf558425831cc18a6e9c9e2d20ef0c4f42e702)) * add kml layer support ([35098bd](https://github.com/pinpong/react-native-google-maps-plus/commit/35098bd4c75b825f96f58696cbb37a4fcdebbdb8)) ### πŸ› οΈ Other changes * **ci:** move PR template to root for auto-apply ([03e8a84](https://github.com/pinpong/react-native-google-maps-plus/commit/03e8a8438b0d5edab80fcdf2f2c8abf3372288c2)) --- CHANGELOG.md | 11 +++++++++++ package.json | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ee477fa..9bcb7d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ +## [1.1.0-dev.6](https://github.com/pinpong/react-native-google-maps-plus/compare/v1.1.0-dev.5...v1.1.0-dev.6) (2025-10-09) + +### ✨ Features + +* add kml layer support ([4faf558](https://github.com/pinpong/react-native-google-maps-plus/commit/4faf558425831cc18a6e9c9e2d20ef0c4f42e702)) +* add kml layer support ([35098bd](https://github.com/pinpong/react-native-google-maps-plus/commit/35098bd4c75b825f96f58696cbb37a4fcdebbdb8)) + +### πŸ› οΈ Other changes + +* **ci:** move PR template to root for auto-apply ([03e8a84](https://github.com/pinpong/react-native-google-maps-plus/commit/03e8a8438b0d5edab80fcdf2f2c8abf3372288c2)) + ## [1.1.0-dev.5](https://github.com/pinpong/react-native-google-maps-plus/compare/v1.1.0-dev.4...v1.1.0-dev.5) (2025-10-08) ### πŸ› Bug Fixes diff --git a/package.json b/package.json index 085e59d..5bb24b5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-google-maps-plus", - "version": "1.1.0-dev.5", + "version": "1.1.0-dev.6", "description": "React-native wrapper for android & IOS google maps sdk", "main": "./lib/module/index.js", "module": "./lib/module/index.js", From 2f2bb2c617260166551abbc07dfa9a8ae27cf31e Mon Sep 17 00:00:00 2001 From: pinpong Date: Thu, 9 Oct 2025 21:15:17 +0700 Subject: [PATCH 4/8] chore: fix CHANGELOG.md --- CHANGELOG.md | 203 ++++++++++++++------------------------------------- 1 file changed, 53 insertions(+), 150 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9bcb7d2..f6acb15 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,176 +1,79 @@ -## [1.1.0-dev.6](https://github.com/pinpong/react-native-google-maps-plus/compare/v1.1.0-dev.5...v1.1.0-dev.6) (2025-10-09) +## [1.1.0](https://github.com/pinpong/react-native-google-maps-plus/compare/v1.0.2...v1.1.0) (2025-10-08) ### ✨ Features -* add kml layer support ([4faf558](https://github.com/pinpong/react-native-google-maps-plus/commit/4faf558425831cc18a6e9c9e2d20ef0c4f42e702)) -* add kml layer support ([35098bd](https://github.com/pinpong/react-native-google-maps-plus/commit/35098bd4c75b825f96f58696cbb37a4fcdebbdb8)) - -### πŸ› οΈ Other changes - -* **ci:** move PR template to root for auto-apply ([03e8a84](https://github.com/pinpong/react-native-google-maps-plus/commit/03e8a8438b0d5edab80fcdf2f2c8abf3372288c2)) - -## [1.1.0-dev.5](https://github.com/pinpong/react-native-google-maps-plus/compare/v1.1.0-dev.4...v1.1.0-dev.5) (2025-10-08) +* add heatmap support ([ddcfccf](https://github.com/pinpong/react-native-google-maps-plus/commit/ddcfccf4cbb08b2756c20ca7215a8fe45e30befb)) +* add heatmap support ([96a3a08](https://github.com/pinpong/react-native-google-maps-plus/commit/96a3a08696e38f77db356d9e0e71a6e6b98a589f)) +* add map ui settings support ([7921f49](https://github.com/pinpong/react-native-google-maps-plus/commit/7921f4941f6656fe9c588d4f5e9d1f5594632598)) +* add mapCircle support ([8e32d14](https://github.com/pinpong/react-native-google-maps-plus/commit/8e32d14ae6d3e8254a46ffbb19fd3eb26575f46d)) +* add mapId support ([75f73fa](https://github.com/pinpong/react-native-google-maps-plus/commit/75f73fac949f8e2a5112e1456226e60de8540474)) +* add mapType ([754df51](https://github.com/pinpong/react-native-google-maps-plus/commit/754df51a8819ce5475d29262bbf95d8f0586393f)) +* add mapType ([300614f](https://github.com/pinpong/react-native-google-maps-plus/commit/300614f22419f166c2482025f66b761145e75394)) +* add mapType ([e32a3f5](https://github.com/pinpong/react-native-google-maps-plus/commit/e32a3f59fc1128b6a4c295d4e5d74d8afa7aa3cd)) +* more map features ([796be0b](https://github.com/pinpong/react-native-google-maps-plus/commit/796be0b0976926f72b5d95b1ba5d2406988f4d9e)) +* optional marker svg ([d9bd19d](https://github.com/pinpong/react-native-google-maps-plus/commit/d9bd19d72916ec697acc9cecc58219a3df8c5d54)) +* optional marker svg ([#30](https://github.com/pinpong/react-native-google-maps-plus/issues/30)) ([5f8852c](https://github.com/pinpong/react-native-google-maps-plus/commit/5f8852c85741b75959f1d1e16240704cca042bb5)) ### πŸ› Bug Fixes -* build script ([d1f11f2](https://github.com/pinpong/react-native-google-maps-plus/commit/d1f11f237900f929689b72dfb41054dac0790a37)) -* release ([#18](https://github.com/pinpong/react-native-google-maps-plus/issues/18)) ([b271ccc](https://github.com/pinpong/react-native-google-maps-plus/commit/b271ccc69f9cb3e48c865801bdd104fd6065b557)) - -# react-native-google-maps-plus - -[![npm version](https://img.shields.io/npm/v/react-native-google-maps-plus.svg?logo=npm&color=cb0000)](https://www.npmjs.com/package/react-native-google-maps-plus) -[![Dev Release](https://img.shields.io/npm/v/react-native-google-maps-plus/dev.svg?label=dev%20release&color=orange&logo=githubactions)](https://www.npmjs.com/package/react-native-google-maps-plus) -[![Release](https://github.com/pinpong/react-native-google-maps-plus/actions/workflows/release.yml/badge.svg)](https://github.com/pinpong/react-native-google-maps-plus/actions/workflows/release.yml) -[![Issues](https://img.shields.io/github/issues/pinpong/react-native-google-maps-plus?logo=github)](https://github.com/pinpong/react-native-google-maps-plus/issues) -[![License](https://img.shields.io/github/license/pinpong/react-native-google-maps-plus?logo=open-source-initiative&logoColor=green)](./LICENSE) -[![Code Style: Prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?logo=prettier&logoColor=white)](https://prettier.io/) -[![TypeScript](https://img.shields.io/badge/%3C/%3E-TypeScript-blue.svg?logo=typescript)](https://www.typescriptlang.org/) -[![Lint](https://img.shields.io/badge/lint-eslint-green.svg?logo=eslint&logoColor=white)](https://eslint.org/) -[![React Native](https://img.shields.io/badge/react--native-%3E%3D0.81.0-61dafb.svg?logo=react)](https://reactnative.dev/) -[![Platform: Android](https://img.shields.io/badge/platform-android-green.svg?logo=android&logoColor=white)](https://developer.android.com/) -[![Platform: iOS](https://img.shields.io/badge/platform-iOS-lightgrey.svg?logo=apple&logoColor=black)](https://developer.apple.com/ios/) - -React-native wrapper for android & IOS google maps sdk - -## Installation - -`react-native-nitro-modules` is required as this library relies on [Nitro Modules](https://nitro.margelo.com/). - -```sh -yarn add react-native-google-maps-plus react-native-nitro-modules -``` - -### Dependencies - -This package builds on native libraries for SVG rendering and Google Maps integration: - -- **iOS**: [SVGKit](https://github.com/SVGKit/SVGKit) -- **Android**: [AndroidSVG](https://bigbadaboom.github.io/androidsvg/) -- **iOS Maps SDK**: [Google Maps SDK for iOS](https://developers.google.com/maps/documentation/ios-sdk) -- **Android Maps SDK**: [Google Maps SDK for Android](https://developers.google.com/maps/documentation/android-sdk) -- **Maps Utility Libraries**: [Google Maps Utils for iOS](https://developers.google.com/maps/documentation/ios-sdk/utility) and [Google Maps Utils for Android](https://developers.google.com/maps/documentation/android-sdk/utility) - -These are automatically linked when you install the package, but you may need to clean/rebuild your native projects after first install. - -## Setup API Key - -You will need a valid **Google Maps API Key** from the [Google Cloud Console](https://console.cloud.google.com/). - -### Android - -It's recommend to use [Secrets Gradle Plugin](https://developers.google.com/maps/documentation/android-sdk/secrets-gradle-plugin) to securely manage your Google Maps API Key. +* add ios privacy manifest ([175bfdf](https://github.com/pinpong/react-native-google-maps-plus/commit/175bfdf0a932aa7dcc789ac9287eb2e91a9d0bf6)) +* add ios privacy manifest ([#31](https://github.com/pinpong/react-native-google-maps-plus/issues/31)) ([acc394e](https://github.com/pinpong/react-native-google-maps-plus/commit/acc394e49ca5bc9eaa5e67942fd2ed645dc2332c)) +* dev package version ([ab9b581](https://github.com/pinpong/react-native-google-maps-plus/commit/ab9b581e7f571d09ffbe597cf8834234b43ee3a1)) +* dev package version ([1317f23](https://github.com/pinpong/react-native-google-maps-plus/commit/1317f234d832a623c6e5dbce4dafd9154da73857)) +* **example:** update Podfile.lock ([0eb9a09](https://github.com/pinpong/react-native-google-maps-plus/commit/0eb9a09bca8b13241b13851c4af0857545284229)) ---- +### πŸ”„ Code Refactors -### iOS +* **map:** unify update logic and defaults across Android and iOS ([cdaa01a](https://github.com/pinpong/react-native-google-maps-plus/commit/cdaa01af77ae93f9e9652dd018fe18f0ca6309b4)) +* **map:** unify update logic and defaults across Android and iOS ([f15d638](https://github.com/pinpong/react-native-google-maps-plus/commit/f15d6388911943b5abdfd9d5f61e3423af33f064)) +* nitrogen-patch.js ([20fbb0d](https://github.com/pinpong/react-native-google-maps-plus/commit/20fbb0d7bea58bd54ade53119dc510d0ce9b18f9)) +* optional props ([9faa702](https://github.com/pinpong/react-native-google-maps-plus/commit/9faa7024c2bea0818734cb5831b93c4d360da0bd)) -See the official [Google Maps iOS SDK configuration guide](https://developers.google.com/maps/documentation/ios-sdk/config#get-key) for more details. +### πŸ“š Documentation -1. Create a `Secrets.xcconfig` file inside the **ios/** folder: +* **readme:** update setup instructions ([9f88702](https://github.com/pinpong/react-native-google-maps-plus/commit/9f88702b187fde5c2e3d852f1d0aeeac48f8222b)) - ```properties - MAPS_API_KEY=YOUR_IOS_MAPS_API_KEY - ``` - - Include it in your project configuration file: - - ```xcconfig - #include? "Secrets.xcconfig" - ``` - -2. Reference the API key in your **Info.plist**: - - ```xml - MAPS_API_KEY - $(MAPS_API_KEY) - ``` - -3. Provide the key programmatically in **AppDelegate.swift**: - - ```swift - import GoogleMaps - - @UIApplicationMain - class AppDelegate: UIResponder, UIApplicationDelegate { - func application(_ application: UIApplication, - didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - if let apiKey = Bundle.main.object(forInfoDictionaryKey: "MAPS_API_KEY") as? String { - GMSServices.provideAPIKey(apiKey) - } - return true - } - } - ``` - ---- - -## Usage - -Checkout the example app in the [example](./example) folder. - -# Troubleshooting - -## Android +### πŸ› οΈ Other changes -- **API key not found** - Make sure `secrets.properties` exists under `android/` and contains your `MAPS_API_KEY`. - Run `./gradlew clean` and rebuild. +* add dev badge ([c8660b7](https://github.com/pinpong/react-native-google-maps-plus/commit/c8660b75581f447953fba6c9ec440146fcf8f48d)) +* merge dev into main ([f851047](https://github.com/pinpong/react-native-google-maps-plus/commit/f8510472835ad5a861341652c6541477df205508)) +* update .gitignore ([c15be5e](https://github.com/pinpong/react-native-google-maps-plus/commit/c15be5eb436d05f1f5a25fe7c8249e7c23eea3b2)) +* update to react-native 0.82.0 ([31d5ff5](https://github.com/pinpong/react-native-google-maps-plus/commit/31d5ff5157ec8357b9d699d4dcc09bda09e11afb)) +* update to react-native 0.82.0 ([8c8e8ae](https://github.com/pinpong/react-native-google-maps-plus/commit/8c8e8ae1c4fcf97e04059d873461f083e4c346cf)) +* ## [1.0.2](https://github.com/pinpong/react-native-google-maps-plus/compare/v1.0.1...v1.0.2) (2025-10-02) -## iOS +### πŸ› Bug Fixes -- **`GMSServices must be configured before use`** - Ensure your key is in `Info.plist` and/or provided via `GMSServices.provideAPIKey(...)` in `AppDelegate.swift`. +* build script ([d1f11f2](https://github.com/pinpong/react-native-google-maps-plus/commit/d1f11f237900f929689b72dfb41054dac0790a37)) +* build script ([98e194e](https://github.com/pinpong/react-native-google-maps-plus/commit/98e194e61d08af96ce75e156a6f5e3a5378c1b4c)) +* name conflict ([faf8d5e](https://github.com/pinpong/react-native-google-maps-plus/commit/faf8d5e7a0f79bfceb8454510e8e5ad3771fdbd2)) +* name conflict ([7217c11](https://github.com/pinpong/react-native-google-maps-plus/commit/7217c113bc2e5742bbc4b119eec7672c0b240cba)) +* react type ([36e22d5](https://github.com/pinpong/react-native-google-maps-plus/commit/36e22d59f0746ad9759799465eefed8f66a19049)) -- **Build fails with `Node.h` import error from SVGKit** - SVGKit uses a header `Node.h` which can conflict with iOS system headers. - You can patch it automatically in your **Podfile** inside the `post_install` hook: +## [1.0.1](https://github.com/pinpong/react-native-google-maps-plus/compare/v1.0.0...v1.0.1) (2025-10-02) - ```ruby - post_install do |installer| - react_native_post_install( - installer, - config[:reactNativePath], - :mac_catalyst_enabled => false, - ) - # Force iOS 16+ to avoid deployment target warnings - installer.pods_project.targets.each do |target| - target.build_configurations.each do |config| - config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '16.0' - end - end +### πŸ› Bug Fixes - # Patch SVGKit includes to avoid Node.h conflicts - require 'fileutils' - svgkit_path = File.join(installer.sandbox.pod_dir('SVGKit'), 'Source') - Dir.glob(File.join(svgkit_path, '**', '*.{h,m}')).each do |file| - FileUtils.chmod("u+w", file) - text = File.read(file) - new_contents = text.gsub('#import "Node.h"', '#import "SVGKit/Node.h"') - File.open(file, 'w') { |f| f.write(new_contents) } - end - end - ``` +* release ([afbb9cd](https://github.com/pinpong/react-native-google-maps-plus/commit/afbb9cdf0261c35fcd4c6423096fbecaa482f704)) +* release ([#18](https://github.com/pinpong/react-native-google-maps-plus/issues/18)) ([b271ccc](https://github.com/pinpong/react-native-google-maps-plus/commit/b271ccc69f9cb3e48c865801bdd104fd6065b557)) - After applying this, run: +### πŸ› οΈ Other changes - ```sh - cd ios && pod install --repo-update - ``` +* format ([e67d939](https://github.com/pinpong/react-native-google-maps-plus/commit/e67d939e23a8db82432334c767f780ebe2320d6c)) -- **Maps not rendering** - - Check that your API key has **Maps SDK for Android/iOS** enabled in Google Cloud Console. - - Make sure the key is not restricted to wrong bundle IDs or SHA1 fingerprints. +## 1.0.0 (2025-10-02) -## Contributing +### πŸ› Bug Fixes -- [Development workflow](CONTRIBUTING.md#development-workflow) -- [Sending a pull request](CONTRIBUTING.md#sending-a-pull-request) -- [Code of conduct](CODE_OF_CONDUCT.md) +* set npm publish to true ([ed7544b](https://github.com/pinpong/react-native-google-maps-plus/commit/ed7544b5c0b39cec418a83842e215253ac7b6eef)) -## License +### πŸ“š Documentation -MIT +* update README.md ([60936c9](https://github.com/pinpong/react-native-google-maps-plus/commit/60936c9351f95e590b779883d161aad1272f4a1b)) +* update README.md ([00d3f65](https://github.com/pinpong/react-native-google-maps-plus/commit/00d3f656679415a8105fff2ae52fd0bd3106e472)) +* update README.md ([7354d38](https://github.com/pinpong/react-native-google-maps-plus/commit/7354d3822298b75ad28024f5488cc25e70891b9c)) +* update README.md ([bb2bf47](https://github.com/pinpong/react-native-google-maps-plus/commit/bb2bf47d7b273e1dd02a44425713ebe7c9bfb612)) ---- +### πŸ› οΈ Other changes -Made with [create-react-native-library](https://github.com/callstack/react-native-builder-bob) +* initial commit ([d240a87](https://github.com/pinpong/react-native-google-maps-plus/commit/d240a870fa08e5a01ef8b3e981f7e78c7e113fef)) From 73c997c69f23deeb48eb9b2be5df76a36ff0afea Mon Sep 17 00:00:00 2001 From: pinpong Date: Thu, 9 Oct 2025 22:11:38 +0700 Subject: [PATCH 5/8] chore(example): beautify example app UI --- README.md | 30 +- android/build.gradle | 6 +- example/babel.config.js | 1 + example/ios/Podfile.lock | 376 +++++++++++ example/package.json | 13 +- example/src/App.tsx | 772 +++------------------- example/src/components/ControlPanel.tsx | 176 +++++ example/src/components/MapWrapper.tsx | 192 ++++++ example/src/screens/BasicMapScreen.tsx | 14 + example/src/screens/CirclesScreen.tsx | 10 + example/src/screens/CustomStyleScreen.tsx | 31 + example/src/screens/HeatmapScreen.tsx | 10 + example/src/screens/HomeScreen.tsx | 74 +++ example/src/screens/KmlLayerScreen.tsx | 11 + example/src/screens/LocationScreen.tsx | 14 + example/src/screens/MarkersScreen.tsx | 47 ++ example/src/screens/PolygonsScreen.tsx | 11 + example/src/screens/PolylinesScreen.tsx | 10 + example/src/screens/StressTestScreen.tsx | 64 ++ example/src/theme.ts | 26 + example/src/utils/kmlData.ts | 53 ++ example/src/utils/mapGenerators.ts | 122 ++++ example/src/utils/mapStyles.ts | 41 ++ example/tsconfig.json | 10 + package.json | 2 +- yarn.lock | 512 +++++++++++--- 26 files changed, 1853 insertions(+), 775 deletions(-) create mode 100644 example/src/components/ControlPanel.tsx create mode 100644 example/src/components/MapWrapper.tsx create mode 100644 example/src/screens/BasicMapScreen.tsx create mode 100644 example/src/screens/CirclesScreen.tsx create mode 100644 example/src/screens/CustomStyleScreen.tsx create mode 100644 example/src/screens/HeatmapScreen.tsx create mode 100644 example/src/screens/HomeScreen.tsx create mode 100644 example/src/screens/KmlLayerScreen.tsx create mode 100644 example/src/screens/LocationScreen.tsx create mode 100644 example/src/screens/MarkersScreen.tsx create mode 100644 example/src/screens/PolygonsScreen.tsx create mode 100644 example/src/screens/PolylinesScreen.tsx create mode 100644 example/src/screens/StressTestScreen.tsx create mode 100644 example/src/theme.ts create mode 100644 example/src/utils/kmlData.ts create mode 100644 example/src/utils/mapGenerators.ts create mode 100644 example/src/utils/mapStyles.ts create mode 100644 example/tsconfig.json diff --git a/README.md b/README.md index 5fd0c0c..23dffcc 100644 --- a/README.md +++ b/README.md @@ -103,9 +103,10 @@ Checkout the example app in the [example](./example) folder. - **`GMSServices must be configured before use`** Ensure your key is in `Info.plist` and/or provided via `GMSServices.provideAPIKey(...)` in `AppDelegate.swift`. -- **Build fails with `Node.h` import error from SVGKit** - SVGKit uses a header `Node.h` which can conflict with iOS system headers. - You can patch it automatically in your **Podfile** inside the `post_install` hook: +- **Build fails with `Node.h`, `CSSValue.h`, or `SVGLength.h` import errors from SVGKit** + SVGKit includes headers (`Node.h`, `CSSValue.h`, `SVGLength.h`) that can conflict with + iOS system headers and React Native Reanimated’s internal types. + You can patch them automatically in your **Podfile** inside the `post_install` ```ruby post_install do |installer| @@ -121,14 +122,35 @@ Checkout the example app in the [example](./example) folder. end end - # Patch SVGKit includes to avoid Node.h conflicts + # --- SVGKit Patch --- require 'fileutils' svgkit_path = File.join(installer.sandbox.pod_dir('SVGKit'), 'Source') + + # node fix Dir.glob(File.join(svgkit_path, '**', '*.{h,m}')).each do |file| FileUtils.chmod("u+w", file) text = File.read(file) new_contents = text.gsub('#import "Node.h"', '#import "SVGKit/Node.h"') File.open(file, 'w') { |f| f.write(new_contents) } + # puts "Patched Node import in: #{file}" + end + + # import CSSValue.h + Dir.glob(File.join(svgkit_path, '**', '*.{h,m}')).each do |file| + FileUtils.chmod("u+w", file) + text = File.read(file) + new_contents = text.gsub('#import "CSSValue.h"', '#import "SVGKit/CSSValue.h"') + File.open(file, 'w') { |f| f.write(new_contents) } + # puts "Patched CSSValue import in: #{file}" + end + + # import SVGLength.h + Dir.glob(File.join(svgkit_path, '**', '*.{h,m}')).each do |file| + FileUtils.chmod("u+w", file) + text = File.read(file) + new_contents = text.gsub('#import "SVGLength.h"', '#import "SVGKit/SVGLength.h"') + File.open(file, 'w') { |f| f.write(new_contents) } + # puts "Patched SVGLength import in: #{file}" end end ``` diff --git a/android/build.gradle b/android/build.gradle index 0ab758e..ad78c0e 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -25,7 +25,11 @@ apply plugin: "kotlin-android" apply from: '../nitrogen/generated/android/RNGoogleMapsPlus+autolinking.gradle' apply from: "./fix-prefab.gradle" -apply plugin: "com.facebook.react" +if (rootProject.name != "rngooglemapsplus.example") { + apply plugin: "com.facebook.react" +} else { + println("\u001B[33m⚠️ Skipping React Native Gradle plugin in library (example build detected)\u001B[0m") +} def getExtOrIntegerDefault(name) { return rootProject.ext.has(name) ? rootProject.ext.get(name) : (project.properties["RNGoogleMapsPlus_" + name]).toInteger() diff --git a/example/babel.config.js b/example/babel.config.js index 486a093..4f18b89 100644 --- a/example/babel.config.js +++ b/example/babel.config.js @@ -7,6 +7,7 @@ const root = path.resolve(__dirname, '..'); module.exports = getConfig( { presets: ['module:@react-native/babel-preset'], + plugins: ['react-native-worklets/plugin'], }, { root, pkg } ); diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 60981f1..9894838 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -1819,6 +1819,93 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon/turbomodule/core - SocketRocket + - react-native-safe-area-context (5.6.1): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - react-native-safe-area-context/common (= 5.6.1) + - react-native-safe-area-context/fabric (= 5.6.1) + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - react-native-safe-area-context/common (5.6.1): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - react-native-safe-area-context/fabric (5.6.1): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - react-native-safe-area-context/common + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga - React-NativeModulesApple (0.82.0): - boost - DoubleConversion @@ -2358,6 +2445,35 @@ PODS: - React-perflogger (= 0.82.0) - React-utils (= 0.82.0) - SocketRocket + - RNGestureHandler (2.28.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-FabricComponents + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga - RNGoogleMapsPlus (1.1.0-dev.5): - boost - DoubleConversion @@ -2391,6 +2507,246 @@ PODS: - SocketRocket - SVGKit (= 3.0.0) - Yoga + - RNReanimated (4.1.3): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNReanimated/reanimated (= 4.1.3) + - RNWorklets + - SocketRocket + - Yoga + - RNReanimated/reanimated (4.1.3): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNReanimated/reanimated/apple (= 4.1.3) + - RNWorklets + - SocketRocket + - Yoga + - RNReanimated/reanimated/apple (4.1.3): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNWorklets + - SocketRocket + - Yoga + - RNScreens (4.16.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-RCTImage + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNScreens/common (= 4.16.0) + - SocketRocket + - Yoga + - RNScreens/common (4.16.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-RCTImage + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - RNWorklets (0.6.1): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNWorklets/worklets (= 0.6.1) + - SocketRocket + - Yoga + - RNWorklets/worklets (0.6.1): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNWorklets/worklets/apple (= 0.6.1) + - SocketRocket + - Yoga + - RNWorklets/worklets/apple (0.6.1): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga - SocketRocket (0.7.1) - SVGKit (3.0.0): - CocoaLumberjack (~> 3.0) @@ -2439,6 +2795,7 @@ DEPENDENCIES: - React-logger (from `../node_modules/react-native/ReactCommon/logger`) - React-Mapbuffer (from `../node_modules/react-native/ReactCommon`) - React-microtasksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/microtasks`) + - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`) - React-NativeModulesApple (from `../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`) - React-oscompat (from `../node_modules/react-native/ReactCommon/oscompat`) - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) @@ -2471,7 +2828,11 @@ DEPENDENCIES: - ReactAppDependencyProvider (from `build/generated/ios`) - ReactCodegen (from `build/generated/ios`) - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) + - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) - RNGoogleMapsPlus (from `../..`) + - RNReanimated (from `../node_modules/react-native-reanimated`) + - RNScreens (from `../node_modules/react-native-screens`) + - RNWorklets (from `../node_modules/react-native-worklets`) - SocketRocket (~> 0.7.1) - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) @@ -2567,6 +2928,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon" React-microtasksnativemodule: :path: "../node_modules/react-native/ReactCommon/react/nativemodule/microtasks" + react-native-safe-area-context: + :path: "../node_modules/react-native-safe-area-context" React-NativeModulesApple: :path: "../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" React-oscompat: @@ -2631,8 +2994,16 @@ EXTERNAL SOURCES: :path: build/generated/ios ReactCommon: :path: "../node_modules/react-native/ReactCommon" + RNGestureHandler: + :path: "../node_modules/react-native-gesture-handler" RNGoogleMapsPlus: :path: "../.." + RNReanimated: + :path: "../node_modules/react-native-reanimated" + RNScreens: + :path: "../node_modules/react-native-screens" + RNWorklets: + :path: "../node_modules/react-native-worklets" Yoga: :path: "../node_modules/react-native/ReactCommon/yoga" @@ -2681,6 +3052,7 @@ SPEC CHECKSUMS: React-logger: 30adf849117e87cf86e88dca1824bb0f18f87e10 React-Mapbuffer: 2a5edca6905cb1b3a40fb7ed3f4496df4f1bc60e React-microtasksnativemodule: 6d775fdf71445f58dbedbd66ed9cb08b48ae2797 + react-native-safe-area-context: ee1e8e2a7abf737a8d4d9d1a5686a7f2e7466236 React-NativeModulesApple: b2ee5b48020439fd81d1fd9cba40ebf0c3af5636 React-oscompat: 80ca388c4831481cd03a6b45ecfc82739ca9a95e React-perflogger: 9725c8b401ca406f52e4bb59bf0b22ef9354f96a @@ -2713,7 +3085,11 @@ SPEC CHECKSUMS: ReactAppDependencyProvider: c5c4f5280e4ae0f9f4a739c64c4260fe0b3edaf1 ReactCodegen: 3873d7ac09960375f7845384ff47d53e478462dc ReactCommon: f5527f5d97a9957ab46eb5db78875d3579e03b97 + RNGestureHandler: e1cc4de7646eb557ad62d1271d8eac73c304a896 RNGoogleMapsPlus: cdea400ea1e69740d91e07dbb5882d93be4c0a77 + RNReanimated: 8f0185df21f0dea34ee8c9611ba88c17a290ed9a + RNScreens: 2e9c41cd099b1ca50136af8d57c3594214d0086a + RNWorklets: ab618bf7d1c7fd2cb793b9f0f39c3e29274b3ebf SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 SVGKit: 1ad7513f8c74d9652f94ed64ddecda1a23864dea Yoga: ce55ebb197c21e22b6700cd36e3f36b7ec26e6f8 diff --git a/example/package.json b/example/package.json index 3f14cb6..ccbb59e 100644 --- a/example/package.json +++ b/example/package.json @@ -5,15 +5,24 @@ "scripts": { "android": "react-native run-android", "ios": "react-native run-ios", - "start": "react-native start", + "start": "watchman watch-del-all && react-native start", "ios:pods": "bundle install && bundle exec pod repo update --verbose && bundle exec pod install --repo-update --project-directory=ios", "build:android": "react-native build-android", "build:ios": "react-native build-ios --mode Debug --extra-params 'CODE_SIGNING_ALLOWED=NO CODE_SIGNING_REQUIRED=NO CODE_SIGN_IDENTITY=\"\" EXPANDED_CODE_SIGN_IDENTITY=\"\" DEVELOPMENT_TEAM=\"\" COCOAPODS_PARALLEL_CODE_SIGN=false'" }, "dependencies": { + "@react-navigation/native": "7.1.18", + "@react-navigation/native-stack": "7.3.27", + "@react-navigation/stack": "7.4.9", "react": "19.1.1", "react-native": "0.82.0", - "react-native-nitro-modules": "0.29.8" + "react-native-gesture-handler": "2.28.0", + "react-native-google-maps-plus": "workspace:*", + "react-native-nitro-modules": "0.29.8", + "react-native-reanimated": "4.1.3", + "react-native-safe-area-context": "5.6.1", + "react-native-screens": "4.16.0", + "react-native-worklets": "0.6.1" }, "devDependencies": { "@babel/core": "7.28.4", diff --git a/example/src/App.tsx b/example/src/App.tsx index 619f913..f44ddd3 100644 --- a/example/src/App.tsx +++ b/example/src/App.tsx @@ -1,688 +1,100 @@ import React from 'react'; import { - View, - StyleSheet, - ScrollView, - TouchableOpacity, - Text, -} from 'react-native'; -import { useEffect, useMemo, useRef, useState } from 'react'; -import { RNAndroidLocationPriority, RNIOSLocationAccuracy } from '../../src'; -import type { - RNCamera, - RNMapStyleElement, - RNMarker, - RNPolygon, - RNPolyline, - RNLocation, - GoogleMapsViewRef, - RNRegion, - RNLatLng, - RNCircle, - RNHeatmap, -} from '../../src'; -import { GoogleMapsView, GoogleMapsModule } from '../../src'; -import { callback } from 'react-native-nitro-modules'; - -const standardMapStyle: RNMapStyleElement[] = [ - { - featureType: 'poi.attraction', - stylers: [ - { - visibility: 'off', - }, - ], - }, - { - featureType: 'poi.business', - stylers: [ - { - visibility: 'off', - }, - ], - }, - { - featureType: 'poi.government', - stylers: [ - { - visibility: 'off', - }, - ], - }, - { - featureType: 'poi.medical', - stylers: [ - { - visibility: 'off', - }, - ], - }, - { - featureType: 'poi.park', - elementType: 'labels.icon', - stylers: [ - { - visibility: 'off', - }, - ], - }, - { - featureType: 'poi.place_of_worship', - stylers: [ - { - visibility: 'off', - }, - ], - }, - { - featureType: 'poi.school', - stylers: [ - { - visibility: 'off', - }, - ], - }, - { - featureType: 'poi.sports_complex', - stylers: [ - { - visibility: 'off', - }, - ], - }, -]; - -const silverMapStyle: RNMapStyleElement[] = [ - { - featureType: 'poi.attraction', - stylers: [ - { - visibility: 'off', - }, - ], - }, - { - featureType: 'poi.business', - stylers: [ - { - visibility: 'off', - }, - ], - }, - { - featureType: 'poi.government', - stylers: [ - { - visibility: 'off', - }, - ], - }, - { - featureType: 'poi.medical', - stylers: [ - { - visibility: 'off', - }, - ], - }, - { - featureType: 'poi.park', - elementType: 'labels.icon', - stylers: [ - { - visibility: 'off', - }, - ], - }, - { - featureType: 'poi.place_of_worship', - stylers: [ - { - visibility: 'off', - }, - ], - }, - { - featureType: 'poi.school', - stylers: [ - { - visibility: 'off', - }, - ], - }, - { - featureType: 'poi.sports_complex', - stylers: [ - { - visibility: 'off', - }, - ], - }, - { - featureType: 'water', - elementType: 'geometry', - stylers: [ - { - color: '#ff0000', - }, - ], - }, - { - featureType: 'water', - elementType: 'labels.text.fill', - stylers: [ - { - color: '#ff0000', - }, - ], - }, -]; - -const kmlString = ` - - - - Example KML Data - Example with marker, polygon and circle shifted further northeast of San Francisco - - - Center Point - - -122.4156,37.7781,0 - - - - - Example Polygon - - - - - - -122.4206,37.7826,0 - -122.4106,37.7826,0 - -122.4106,37.7746,0 - -122.4206,37.7746,0 - -122.4206,37.7826,0 - - - - - - - - Approximate Circle - - - - - - -122.4156,37.7801,0 - -122.4136,37.7801,0 - -122.4136,37.7761,0 - -122.4156,37.7761,0 - -122.4176,37.7761,0 - -122.4176,37.7801,0 - -122.4156,37.7801,0 - - - - - - - - -`.trim(); - -function makeSvgIcon(width: number, height: number): string { - const color = randomColor(); - return ` - - - - - - `; -} - -function randomColor() { - return '#' + Math.floor(Math.random() * 16777215).toString(16); -} - -const randomCoordinates = ( - baseLat: number, - baseLng: number, - offset = 0.01 -) => ({ - latitude: baseLat + (Math.random() - 0.5) * offset, - longitude: baseLng + (Math.random() - 0.5) * offset, -}); - -const randomWeightedCoordinates = ( - baseLat: number, - baseLng: number, - offset = 0.01 -) => ({ - latitude: baseLat + (Math.random() - 0.5) * offset, - longitude: baseLng + (Math.random() - 0.5) * offset, - weight: Math.floor(Math.random() * (100 - 10 + 1)) + 10, -}); - -const makePolygon = (id: number): RNPolygon => ({ - id: id.toString(), - zIndex: id, - pressable: true, - coordinates: [ - randomCoordinates(37.7749, -122.4194, 0.01), - randomCoordinates(37.7749, -122.4194, 0.01), - randomCoordinates(37.7749, -122.4194, 0.01), - randomCoordinates(37.7749, -122.4194, 0.01), - ], - fillColor: '#0000ff', - strokeColor: '#ff0000', - strokeWidth: 1 + (id % 5), -}); - -const makePolyline = (id: number): RNPolyline => ({ - id: id.toString(), - zIndex: id, - pressable: true, - coordinates: [ - randomCoordinates(37.7749, -122.4194, 0.02), - randomCoordinates(37.7749, -122.4194, 0.02), - randomCoordinates(37.7749, -122.4194, 0.02), - ], - - lineCap: id % 2 === 0 ? 'round' : 'square', - lineJoin: id % 3 === 0 ? 'bevel' : 'round', - color: id % 2 === 0 ? '#00ff00' : '#ff0000', - width: 2 + (id % 4), -}); - -const makeCircle = (id: number): RNCircle => ({ - id: id.toString(), - zIndex: id, - pressable: true, - center: randomCoordinates(37.7749, -122.4194, 0.02), - radius: 100 + (id % 5), - strokeWidth: 1 + (id % 5), - strokeColor: '#ff0000', - fillColor: '#0000ff', -}); - -const makeHeatmap = (id: number): RNHeatmap => ({ - id: id.toString(), - zIndex: id, - weightedData: [ - randomWeightedCoordinates(37.7749, -122.4194, 0.02), - randomWeightedCoordinates(37.7749, -122.4194, 0.03), - randomWeightedCoordinates(37.7749, -122.4194, 0.05), - randomWeightedCoordinates(37.7749, -122.4194, 0.01), - randomWeightedCoordinates(37.7749, -122.4194, 0.08), - randomWeightedCoordinates(37.7749, -122.4194, 0.03), - randomWeightedCoordinates(37.7749, -122.4194, 0.09), - ], - gradient: { - colors: ['#00f', '#0ff', '#0f0', '#ff0', '#f00'], - startPoints: [0.1, 0.3, 0.5, 0.7, 1], - colorMapSize: 256, - }, - radius: 100, - opacity: 1, -}); - -export const makeMarker = (id: number): RNMarker => ({ - id: id.toString(), - zIndex: id, - coordinate: randomCoordinates(37.7749, -122.4194, 0.2), - anchor: { x: 0.5, y: 1.0 }, - iconSvg: - id % 2 === 0 - ? { - width: (64 / 100) * 50, - height: (88 / 100) * 50, - svgString: makeSvgIcon(64, 88), - } - : undefined, -}); + NavigationContainer, + DefaultTheme, + DarkTheme, +} from '@react-navigation/native'; +import { createStackNavigator } from '@react-navigation/stack'; + +import HomeScreen from './screens/HomeScreen'; +import BasicMapScreen from './screens/BasicMapScreen'; +import MarkersScreen from './screens/MarkersScreen'; +import PolygonsScreen from './screens/PolygonsScreen'; +import PolylinesScreen from './screens/PolylinesScreen'; +import CirclesScreen from './screens/CirclesScreen'; +import HeatmapScreen from './screens/HeatmapScreen'; +import KmlLayerScreen from './screens/KmlLayerScreen'; +import LocationScreen from './screens/LocationScreen'; +import CustomStyleScreen from './screens/CustomStyleScreen'; +import StressTestScreen from './screens/StressTestScreen'; +import { GestureHandlerRootView } from 'react-native-gesture-handler'; +import { useColorScheme } from 'react-native'; + +const Stack = createStackNavigator(); export default function App() { - const mapRef = useRef(null); - const [stressTest, setStressTest] = useState(false); - const [normalStyle, setNormalStyle] = useState(true); - const [controlButtonsExpanded, setControlButtonsExpanded] = useState(false); - - const [initialProps] = useState({ - /// mapStyle not working with mapId - /// mapId: '111', - camera: { - center: { - latitude: 37.7749, - longitude: -122.4194, - }, - zoom: 15, - }, - }); - - const [uiSettings] = useState({ - allGesturesEnabled: true, - compassEnabled: true, - indoorLevelPickerEnabled: true, - mapToolbarEnabled: true, - myLocationButtonEnabled: true, - rotateEnabled: true, - scrollEnabled: true, - scrollDuringRotateOrZoomEnabled: true, - tiltEnabled: true, - zoomControlsEnabled: true, - zoomGesturesEnabled: true, - }); - - const [mapPadding] = useState({ - top: 20, - left: 20, - bottom: 20, - right: 20, - }); - - const [mapZoomConfig] = useState({ - min: 0, - max: 20, - }); - - const [locationConfig] = useState({ - android: { - priority: RNAndroidLocationPriority.PRIORITY_BALANCED_POWER_ACCURACY, - interval: 5000, - minUpdateInterval: 5000, - }, - ios: { - desiredAccuracy: RNIOSLocationAccuracy.ACCURACY_BEST, - distanceFilterMeters: 10, - }, - }); - - const [markers, setMaker] = useState( - Array.from({ length: 0 }, (_, i) => makeMarker(i + 1)) - ); - - const [polygons] = useState( - Array.from({ length: 1 }, (_, i) => makePolygon(i + 1)) - ); - - const [polylines] = useState( - Array.from({ length: 1 }, (_, i) => makePolyline(i + 1)) - ); - - const [circles] = useState( - Array.from({ length: 1 }, (_, i) => makeCircle(i + 1)) - ); - - const [heatmaps] = useState( - Array.from({ length: 1 }, (_, i) => makeHeatmap(i + 1)) - ); - - const [kmlLayers] = useState([{ id: '21', zIndex: 1, kmlString }]); - - useEffect(() => { - if (!stressTest) return; - - const interval = setInterval(() => { - setMaker((m) => { - const newMarkers = [...m]; - while (newMarkers.length > 100) { - newMarkers.shift(); - } - for (let i = 0; i < 500; i++) { - newMarkers.push(makeMarker(newMarkers.length + 1)); - } - - return newMarkers; - }); - }, 100); - - return () => clearInterval(interval); - }, [stressTest]); - - const mapStyle = useMemo( - () => JSON.stringify(normalStyle ? standardMapStyle : silverMapStyle), - [normalStyle] - ); - - const buttons = useMemo(() => { - return [ - { - title: 'Set Camera', - onPress: () => { - const camera = { - center: { latitude: 37.7749, longitude: -122.4194 }, - zoom: 15, - }; - mapRef.current?.setCamera(camera, true, 350); - }, - }, - { - title: 'Set Camera to coordinates', - onPress: () => { - mapRef.current?.setCameraToCoordinates( - markers.map((e) => e.coordinate), - { top: 0, left: 0, bottom: 0, right: 0 }, - true, - 350 - ); - }, - }, - { - title: `${stressTest ? 'Stop' : 'Start'} stress test`, - onPress: () => setStressTest(!stressTest), - }, - { - title: 'request location permission', - onPress: async () => { - const permission = await mapRef.current?.requestLocationPermission(); - console.log('Permission request result', permission); - }, - }, - { - title: 'Test Nitro module', - onPress: () => { - GoogleMapsModule.openLocationSettings(); - }, - }, - { - title: `Style: ${normalStyle ? 'Normal' : 'Standard'}`, - onPress: () => setNormalStyle(!normalStyle), - }, - { - title: 'Marker -1', - onPress: () => setMaker(markers.slice(0, markers.length - 1)), - }, - { - title: 'Marker +1', - onPress: () => setMaker([...markers, makeMarker(markers.length + 1)]), - }, - { - title: 'isGooglePlayServicesAvailable', - onPress: () => - console.log(mapRef.current?.isGooglePlayServicesAvailable()), - }, - ]; - }, [markers, normalStyle, stressTest]); - + const scheme = useColorScheme(); return ( - - { - mapRef.current = ref; - }, - }} - initialProps={initialProps} - uiSettings={uiSettings} - onMapReady={callback((ready) => console.log('Map is ready! ' + ready))} - style={styles.map} - myLocationEnabled={true} - buildingEnabled={true} - trafficEnabled={true} - indoorEnabled={true} - customMapStyle={mapStyle} - userInterfaceStyle={'light'} - mapType={'normal'} - mapZoomConfig={mapZoomConfig} - mapPadding={mapPadding} - locationConfig={locationConfig} - onMapPress={{ - f: function (coordinate: RNLatLng): void { - console.log('Map pressed', coordinate); - }, - }} - onMarkerPress={{ - f: function (id: string): void { - console.log('Marker pressed', id); - }, - }} - onPolylinePress={{ - f: function (id: string): void { - console.log('Polyline pressed', id); - }, - }} - onPolygonPress={{ - f: function (id: string): void { - console.log('Polygon pressed', id); - }, - }} - onCirclePress={{ - f: function (id: string): void { - console.log('Circle pressed', id); - }, - }} - onCameraChangeStart={{ - f: function ( - region: RNRegion, - camera: RNCamera, - isGesture: boolean - ): void { - console.log('Camera change started:', region, camera, isGesture); - }, - }} - onCameraChange={{ - f: function ( - region: RNRegion, - camera: RNCamera, - isGesture: boolean - ): void { - console.log('Camera change:', region, camera, isGesture); - }, - }} - onCameraChangeComplete={{ - f: function ( - region: RNRegion, - camera: RNCamera, - isGesture: boolean - ): void { - console.log('Camera change completed:', region, camera, isGesture); - }, - }} - onLocationUpdate={{ - f: function (l: RNLocation): void { - console.log('Location updated:', l); - }, - }} - onLocationError={{ - f: function (error): void { - console.log('Location error:', error); - }, - }} - markers={markers} - polygons={polygons} - polylines={polylines} - circles={circles} - heatmaps={heatmaps} - kmlLayers={kmlLayers} - /> - - - setControlButtonsExpanded(!controlButtonsExpanded)} - activeOpacity={0.8} + + + ({ + headerShown: true, + headerTitleAlign: 'center', + headerStyle: { backgroundColor: theme.colors.card }, + headerTintColor: theme.colors.text, + contentStyle: { backgroundColor: theme.colors.background }, + })} > - - {controlButtonsExpanded ? 'Hide Controls' : 'Show Controls'} - - - - {controlButtonsExpanded && ( - - {buttons.map((btn, i) => ( - - {btn.title} - - ))} - - )} - - + + + + + + + + + + + + + + + ); } - -const styles = StyleSheet.create({ - container: { - flex: 1, - alignItems: 'center', - justifyContent: 'center', - }, - map: { - position: 'absolute', - left: 0, - right: 0, - top: 0, - bottom: 0, - }, - scrollView: { position: 'absolute', bottom: 0, padding: 10 }, - header: { - padding: 10, - backgroundColor: 'red', - borderRadius: 8, - marginBottom: 10, - }, - headerText: { fontWeight: '600', fontSize: 16 }, - buttonList: { gap: 5 }, - button: { - backgroundColor: 'blue', - paddingVertical: 12, - paddingHorizontal: 16, - borderRadius: 12, - marginBottom: 10, - alignItems: 'center', - shadowColor: '#000', - shadowOffset: { width: 0, height: 2 }, - shadowOpacity: 0.15, - shadowRadius: 4, - elevation: 3, - }, - buttonText: { color: '#fff', fontWeight: '600', fontSize: 15 }, -}); diff --git a/example/src/components/ControlPanel.tsx b/example/src/components/ControlPanel.tsx new file mode 100644 index 0000000..ef81b1f --- /dev/null +++ b/example/src/components/ControlPanel.tsx @@ -0,0 +1,176 @@ +import React, { useMemo } from 'react'; +import { + View, + Text, + TouchableOpacity, + ScrollView, + StyleSheet, +} from 'react-native'; +import Animated, { + useSharedValue, + useAnimatedStyle, + withTiming, + interpolate, + Extrapolation, +} from 'react-native-reanimated'; +import type { GoogleMapsViewRef } from 'react-native-google-maps-plus'; +import { useAppTheme } from '../theme'; + +export type ButtonItem = { title: string; onPress: () => void }; + +type Props = { + mapRef: React.RefObject; + buttons: ButtonItem[]; +}; + +export default function ControlPanel({ mapRef, buttons }: Props) { + const theme = useAppTheme(); + const progress = useSharedValue(0); + + const toggle = () => { + progress.value = withTiming(progress.value === 1 ? 0 : 1, { + duration: 280, + }); + }; + + const finalButtons = useMemo( + () => [ + ...buttons, + { + title: 'Request location permission', + onPress: async () => { + const res = await mapRef.current?.requestLocationPermission(); + console.log('Permission result', res); + }, + }, + { + title: 'Show location dialog', + onPress: () => console.log(mapRef.current?.showLocationDialog()), + }, + { + title: 'Open location settings', + onPress: () => console.log(mapRef.current?.openLocationSettings()), + }, + { + title: 'Check Google Play Services', + onPress: () => + console.log(mapRef.current?.isGooglePlayServicesAvailable()), + }, + ], + [buttons, mapRef] + ); + + const buttonHeight = 52; + const maxHeight = finalButtons.length * buttonHeight; + + const containerStyle = useAnimatedStyle(() => ({ + height: interpolate( + progress.value, + [0, 1], + [0, maxHeight], + Extrapolation.CLAMP + ), + opacity: progress.value, + })); + + const arrowStyle = useAnimatedStyle(() => ({ + transform: [ + { + rotate: `${interpolate(progress.value, [0, 1], [0, 180])}deg`, + }, + ], + })); + + return ( + + + + Controls + + + β–Ό + + + + + + {finalButtons.map((btn, i) => ( + + + {btn.title} + + + ))} + + + + ); +} + +const styles = StyleSheet.create({ + scrollView: { + position: 'absolute', + bottom: 0, + left: 0, + right: 0, + paddingHorizontal: 12, + paddingTop: 12, + }, + scrollContent: { + paddingBottom: 40, + }, + header: { + borderRadius: 10, + paddingVertical: 12, + alignItems: 'center', + marginBottom: 10, + flexDirection: 'row', + justifyContent: 'center', + }, + headerText: { + fontWeight: '600', + fontSize: 16, + marginRight: 6, + }, + arrow: { + fontSize: 14, + fontWeight: '600', + }, + animatedContainer: { + overflow: 'hidden', + }, + buttonList: { + gap: 8, + }, + button: { + paddingVertical: 12, + borderRadius: 10, + alignItems: 'center', + justifyContent: 'center', + shadowOffset: { width: 0, height: 2 }, + shadowOpacity: 0.25, + shadowRadius: 4, + elevation: 1, + }, + buttonText: { + fontWeight: '600', + fontSize: 15, + }, +}); diff --git a/example/src/components/MapWrapper.tsx b/example/src/components/MapWrapper.tsx new file mode 100644 index 0000000..d6075fd --- /dev/null +++ b/example/src/components/MapWrapper.tsx @@ -0,0 +1,192 @@ +import React, { useMemo } from 'react'; +import { StyleSheet, useColorScheme, View } from 'react-native'; +import { GoogleMapsView } from 'react-native-google-maps-plus'; +import type { + GoogleMapsViewRef, + RNGoogleMapsPlusViewProps, + RNCamera, + RNLocation, + RNRegion, + RNLatLng, +} from 'react-native-google-maps-plus'; +import { + RNAndroidLocationPriority, + RNIOSLocationAccuracy, +} from 'react-native-google-maps-plus'; +import type { ViewProps } from 'react-native'; +import { useSafeAreaInsets } from 'react-native-safe-area-context'; + +type Props = ViewProps & + RNGoogleMapsPlusViewProps & { + mapRef: React.RefObject; + children?: React.ReactNode; + }; + +export default function MapWrapper(props: Props) { + const { children, ...rest } = props; + const scheme = useColorScheme(); + const layout = useSafeAreaInsets(); + const initialProps = useMemo( + () => ({ + camera: { + center: { latitude: 37.7749, longitude: -122.4194 }, + zoom: 12, + }, + }), + [] + ); + + const uiSettings = useMemo( + () => ({ + allGesturesEnabled: true, + compassEnabled: true, + indoorLevelPickerEnabled: true, + mapToolbarEnabled: true, + myLocationButtonEnabled: true, + rotateEnabled: true, + scrollEnabled: true, + scrollDuringRotateOrZoomEnabled: true, + tiltEnabled: true, + zoomControlsEnabled: true, + zoomGesturesEnabled: true, + }), + [] + ); + + const mapPadding = useMemo( + () => ({ top: 20, left: 20, bottom: layout.bottom + 80, right: 20 }), + [layout.bottom] + ); + + const mapZoomConfig = useMemo(() => ({ min: 0, max: 20 }), []); + + const locationConfig = useMemo( + () => ({ + android: { + priority: RNAndroidLocationPriority.PRIORITY_BALANCED_POWER_ACCURACY, + interval: 5000, + minUpdateInterval: 5000, + }, + ios: { + desiredAccuracy: RNIOSLocationAccuracy.ACCURACY_BEST, + distanceFilterMeters: 10, + }, + }), + [] + ); + + return ( + + { + props.mapRef.current = ref; + }, + }} + initialProps={props.initialProps ?? initialProps} + uiSettings={props.uiSettings ?? uiSettings} + style={[styles.map, props.style]} + userInterfaceStyle={ + (props.userInterfaceStyle ?? scheme === 'dark') ? 'dark' : 'light' + } + mapType={props.mapType ?? 'normal'} + mapZoomConfig={props.mapZoomConfig ?? mapZoomConfig} + mapPadding={props.mapPadding ?? mapPadding} + locationConfig={props.locationConfig ?? locationConfig} + onMapReady={ + props.onMapReady + ? { + f: (ready: boolean) => console.log('Map is ready! ' + ready), + } + : undefined + } + onMapPress={ + props.onMapPress + ? { + f: (c: RNLatLng) => console.log('Map press:', c), + } + : undefined + } + onMarkerPress={ + props.onMarkerPress + ? { + f: (id: string) => console.log('Marker press:', id), + } + : undefined + } + onPolylinePress={ + props.onPolylinePress + ? { + f: (id: string) => console.log('Polyline press:', id), + } + : undefined + } + onPolygonPress={ + props.onPolygonPress + ? { + f: (id: string) => console.log('Polygon press:', id), + } + : undefined + } + onCirclePress={ + props.onCirclePress + ? { + f: (id: string) => console.log('Circle press:', id), + } + : undefined + } + onCameraChangeStart={ + props.onCameraChangeStart + ? { + f: (r: RNRegion, cam: RNCamera, g: boolean) => + console.log('Cam start', r, cam, g), + } + : undefined + } + onCameraChange={ + props.onCameraChange + ? { + f: (r: RNRegion, cam: RNCamera, g: boolean) => + console.log('Cam', r, cam, g), + } + : undefined + } + onCameraChangeComplete={ + props.onCameraChangeComplete + ? { + f: (r: RNRegion, cam: RNCamera, g: boolean) => + console.log('Cam complete', r, cam, g), + } + : undefined + } + onLocationUpdate={ + props.onLocationUpdate + ? { + f: (l: RNLocation) => console.log('Location', l), + } + : undefined + } + onLocationError={ + props.onLocationError + ? { + f: (e: any) => console.log('Location error', e), + } + : undefined + } + /> + {children} + + ); +} + +const styles = StyleSheet.create({ + container: { flex: 1 }, + map: { + position: 'absolute', + left: 0, + right: 0, + top: 0, + bottom: 0, + }, +}); diff --git a/example/src/screens/BasicMapScreen.tsx b/example/src/screens/BasicMapScreen.tsx new file mode 100644 index 0000000..7a8048b --- /dev/null +++ b/example/src/screens/BasicMapScreen.tsx @@ -0,0 +1,14 @@ +import React, { useRef } from 'react'; +import MapWrapper from '../components/MapWrapper'; +import type { GoogleMapsViewRef } from 'react-native-google-maps-plus'; +import ControlPanel from '../components/ControlPanel'; + +export default function BasicMapScreen() { + const mapRef = useRef(null); + + return ( + + + + ); +} diff --git a/example/src/screens/CirclesScreen.tsx b/example/src/screens/CirclesScreen.tsx new file mode 100644 index 0000000..a215fa6 --- /dev/null +++ b/example/src/screens/CirclesScreen.tsx @@ -0,0 +1,10 @@ +import React, { useRef } from 'react'; +import MapWrapper from '../components/MapWrapper'; +import { makeCircle } from '../utils/mapGenerators'; +import type { GoogleMapsViewRef } from 'react-native-google-maps-plus'; + +export default function CirclesScreen() { + const mapRef = useRef(null); + const circles = [makeCircle(1)]; + return ; +} diff --git a/example/src/screens/CustomStyleScreen.tsx b/example/src/screens/CustomStyleScreen.tsx new file mode 100644 index 0000000..0141db6 --- /dev/null +++ b/example/src/screens/CustomStyleScreen.tsx @@ -0,0 +1,31 @@ +import React, { useMemo, useRef, useState } from 'react'; +import MapWrapper from '../components/MapWrapper'; +import ControlPanel from '../components/ControlPanel'; +import { standardMapStyle, silverMapStyle } from '../utils/mapStyles'; +import type { GoogleMapsViewRef } from 'react-native-google-maps-plus'; + +export default function CustomStyleScreen() { + const mapRef = useRef(null); + + const [normalStyle, setNormalStyle] = useState(true); + const customMapStyle = useMemo( + () => JSON.stringify(normalStyle ? standardMapStyle : silverMapStyle), + [normalStyle] + ); + + const buttons = useMemo( + () => [ + { + title: `Style: ${normalStyle ? 'Normal' : 'Standard'}`, + onPress: () => setNormalStyle(!normalStyle), + }, + ], + [normalStyle] + ); + + return ( + + + + ); +} diff --git a/example/src/screens/HeatmapScreen.tsx b/example/src/screens/HeatmapScreen.tsx new file mode 100644 index 0000000..7f9fa7e --- /dev/null +++ b/example/src/screens/HeatmapScreen.tsx @@ -0,0 +1,10 @@ +import React, { useRef } from 'react'; +import MapWrapper from '../components/MapWrapper'; +import { makeHeatmap } from '../utils/mapGenerators'; +import type { GoogleMapsViewRef } from 'react-native-google-maps-plus'; + +export default function HeatmapScreen() { + const mapRef = useRef(null); + const heatmaps = [makeHeatmap(1)]; + return ; +} diff --git a/example/src/screens/HomeScreen.tsx b/example/src/screens/HomeScreen.tsx new file mode 100644 index 0000000..fb721b1 --- /dev/null +++ b/example/src/screens/HomeScreen.tsx @@ -0,0 +1,74 @@ +import React from 'react'; +import { Text, TouchableOpacity, StyleSheet, ScrollView } from 'react-native'; +import type { StackNavigationProp } from '@react-navigation/stack'; +import { useNavigation } from '@react-navigation/native'; +import { useAppTheme } from '../theme'; + +const screens = [ + { name: 'BasicMap', title: 'Basic Map' }, + { name: 'Markers', title: 'Markers' }, + { name: 'Polygons', title: 'Polygons' }, + { name: 'Polylines', title: 'Polylines' }, + { name: 'Circles', title: 'Circles' }, + { name: 'Heatmap', title: 'Heatmap' }, + { name: 'KmlLayer', title: 'KML Layer' }, + { name: 'Location', title: 'Location & Permissions' }, + { name: 'CustomStyle', title: 'Custom Map Style' }, + { name: 'StressTest', title: 'Stress Test' }, +]; + +export default function HomeScreen() { + const navigation = useNavigation>(); + const theme = useAppTheme(); + + return ( + + + React Native Google Maps Plus Examples + + {screens.map((s) => ( + navigation.navigate(s.name)} + activeOpacity={0.85} + > + + {s.title} + + + ))} + + ); +} + +const styles = StyleSheet.create({ + container: { + flexGrow: 1, + alignItems: 'center', + justifyContent: 'center', + paddingVertical: 40, + }, + title: { + fontSize: 18, + fontWeight: '600', + marginBottom: 20, + }, + button: { + paddingVertical: 14, + paddingHorizontal: 24, + borderRadius: 10, + marginVertical: 6, + width: '80%', + alignItems: 'center', + }, + buttonText: { + fontSize: 16, + fontWeight: '600', + }, +}); diff --git a/example/src/screens/KmlLayerScreen.tsx b/example/src/screens/KmlLayerScreen.tsx new file mode 100644 index 0000000..66602ed --- /dev/null +++ b/example/src/screens/KmlLayerScreen.tsx @@ -0,0 +1,11 @@ +import React, { useRef } from 'react'; +import MapWrapper from '../components/MapWrapper'; +import { kmlString } from '../utils/kmlData'; +import type { GoogleMapsViewRef } from 'react-native-google-maps-plus'; + +export default function KmlLayerScreen() { + const mapRef = useRef(null); + + const kmlLayers = [{ id: '21', zIndex: 1, kmlString }]; + return ; +} diff --git a/example/src/screens/LocationScreen.tsx b/example/src/screens/LocationScreen.tsx new file mode 100644 index 0000000..7f5242e --- /dev/null +++ b/example/src/screens/LocationScreen.tsx @@ -0,0 +1,14 @@ +import React, { useRef } from 'react'; +import MapWrapper from '../components/MapWrapper'; +import ControlPanel from '../components/ControlPanel'; +import type { GoogleMapsViewRef } from 'react-native-google-maps-plus'; + +export default function LocationScreen() { + const mapRef = useRef(null); + + return ( + + + + ); +} diff --git a/example/src/screens/MarkersScreen.tsx b/example/src/screens/MarkersScreen.tsx new file mode 100644 index 0000000..bccaf57 --- /dev/null +++ b/example/src/screens/MarkersScreen.tsx @@ -0,0 +1,47 @@ +import React, { useMemo, useRef, useState } from 'react'; +import MapWrapper from '../components/MapWrapper'; +import ControlPanel from '../components/ControlPanel'; +import { makeMarker } from '../utils/mapGenerators'; +import type { + GoogleMapsViewRef, + RNMarker, +} from 'react-native-google-maps-plus'; + +export default function MarkersScreen() { + const mapRef = useRef(null); + const [markers, setMarkers] = useState( + Array.from({ length: 2 }, (_, i) => makeMarker(i + 1)) + ); + + const buttons = useMemo( + () => [ + { + title: 'Marker +1', + onPress: () => setMarkers((m) => [...m, makeMarker(m.length + 1)]), + }, + { + title: 'Marker -1', + onPress: () => setMarkers((m) => m.slice(0, Math.max(0, m.length - 1))), + }, + { + title: 'Fit to markers', + onPress: () => { + const coords = markers.map((m) => m.coordinate); + mapRef.current?.setCameraToCoordinates( + coords, + { top: 0, left: 0, bottom: 0, right: 0 }, + true, + 300 + ); + }, + }, + ], + [markers] + ); + + return ( + + + + ); +} diff --git a/example/src/screens/PolygonsScreen.tsx b/example/src/screens/PolygonsScreen.tsx new file mode 100644 index 0000000..8f2df34 --- /dev/null +++ b/example/src/screens/PolygonsScreen.tsx @@ -0,0 +1,11 @@ +import React, { useRef } from 'react'; +import MapWrapper from '../components/MapWrapper'; +import { makePolygon } from '../utils/mapGenerators'; +import type { GoogleMapsViewRef } from 'react-native-google-maps-plus'; + +export default function PolygonsScreen() { + const mapRef = useRef(null); + + const polygons = [makePolygon(1)]; + return ; +} diff --git a/example/src/screens/PolylinesScreen.tsx b/example/src/screens/PolylinesScreen.tsx new file mode 100644 index 0000000..fa3aaff --- /dev/null +++ b/example/src/screens/PolylinesScreen.tsx @@ -0,0 +1,10 @@ +import React, { useRef } from 'react'; +import MapWrapper from '../components/MapWrapper'; +import { makePolyline } from '../utils/mapGenerators'; +import type { GoogleMapsViewRef } from 'react-native-google-maps-plus'; + +export default function PolylinesScreen() { + const mapRef = useRef(null); + const polylines = [makePolyline(1)]; + return ; +} diff --git a/example/src/screens/StressTestScreen.tsx b/example/src/screens/StressTestScreen.tsx new file mode 100644 index 0000000..f33ecc6 --- /dev/null +++ b/example/src/screens/StressTestScreen.tsx @@ -0,0 +1,64 @@ +import React, { useEffect, useMemo, useRef, useState } from 'react'; +import MapWrapper from '../components/MapWrapper'; +import ControlPanel from '../components/ControlPanel'; +import { makeMarker } from '../utils/mapGenerators'; +import type { + GoogleMapsViewRef, + RNMarker, +} from 'react-native-google-maps-plus'; + +export default function StressTestScreen() { + const mapRef = useRef(null); + const [stressTest, setStressTest] = useState(false); + const [markers, setMarkers] = useState([]); + + useEffect(() => { + if (!stressTest) return; + const interval = setInterval(() => { + setMarkers((m) => { + const next = [...m]; + while (next.length > 100) next.shift(); + for (let i = 0; i < 500; i++) next.push(makeMarker(next.length + 1)); + return next; + }); + }, 100); + return () => clearInterval(interval); + }, [stressTest]); + + const buttons = useMemo( + () => [ + { + title: stressTest ? 'Stop stress test' : 'Start stress test', + onPress: () => setStressTest(!stressTest), + }, + { + title: 'Fit to markers', + onPress: () => { + const coords = markers.map((m) => m.coordinate); + if (coords.length) + mapRef.current?.setCameraToCoordinates( + coords, + { top: 0, left: 0, bottom: 0, right: 0 }, + true, + 300 + ); + }, + }, + { + title: 'Marker +1', + onPress: () => setMarkers((m) => [...m, makeMarker(m.length + 1)]), + }, + { + title: 'Marker -1', + onPress: () => setMarkers((m) => m.slice(0, Math.max(0, m.length - 1))), + }, + ], + [markers, stressTest] + ); + + return ( + + + + ); +} diff --git a/example/src/theme.ts b/example/src/theme.ts new file mode 100644 index 0000000..c881ee3 --- /dev/null +++ b/example/src/theme.ts @@ -0,0 +1,26 @@ +import { useColorScheme } from 'react-native'; + +export const lightTheme = { + bgPrimary: '#FFFFFF', + bgAccent: '#3B82F6', + bgHeader: '#E5E7EB', + textPrimary: '#111827', + textOnAccent: '#FFFFFF', + shadow: '#000000', +}; + +export const darkTheme = { + bgPrimary: '#1E1E1E', + bgAccent: '#2D6BE9', + bgHeader: '#2C2C2E', + textPrimary: '#FFFFFF', + textOnAccent: '#FFFFFF', + shadow: '#000000', +}; + +export type AppTheme = typeof lightTheme; + +export function useAppTheme(): AppTheme { + const scheme = useColorScheme(); + return scheme === 'dark' ? darkTheme : lightTheme; +} diff --git a/example/src/utils/kmlData.ts b/example/src/utils/kmlData.ts new file mode 100644 index 0000000..b9ea623 --- /dev/null +++ b/example/src/utils/kmlData.ts @@ -0,0 +1,53 @@ +export const kmlString = ` + + + Example KML Data + Example with marker, polygon and circle near San Francisco center + + Center Point + -122.4194,37.7749,0 + + + Example Polygon + + + + + + -122.4244,37.7784,0 + -122.4144,37.7784,0 + -122.4144,37.7714,0 + -122.4244,37.7714,0 + -122.4244,37.7784,0 + + + + + + + Approximate Circle + + + + + + -122.4194,37.7770,0 + -122.4174,37.7770,0 + -122.4174,37.7730,0 + -122.4194,37.7730,0 + -122.4214,37.7730,0 + -122.4214,37.7770,0 + -122.4194,37.7770,0 + + + + + + +;`; diff --git a/example/src/utils/mapGenerators.ts b/example/src/utils/mapGenerators.ts new file mode 100644 index 0000000..f83e01b --- /dev/null +++ b/example/src/utils/mapGenerators.ts @@ -0,0 +1,122 @@ +import type { + RNMarker, + RNPolygon, + RNPolyline, + RNCircle, + RNHeatmap, +} from 'react-native-google-maps-plus'; + +export function randomColor() { + return ( + '#' + + Math.floor(Math.random() * 16777215) + .toString(16) + .padStart(6, '0') + ); +} + +export function makeSvgIcon(width: number, height: number): string { + const color = randomColor(); + return ` + + + + +`; +} + +export const randomCoordinates = ( + baseLat: number, + baseLng: number, + offset = 0.01 +) => ({ + latitude: baseLat + (Math.random() - 0.5) * offset, + longitude: baseLng + (Math.random() - 0.5) * offset, +}); + +export const randomWeightedCoordinates = ( + baseLat: number, + baseLng: number, + offset = 0.01 +) => ({ + latitude: baseLat + (Math.random() - 0.5) * offset, + longitude: baseLng + (Math.random() - 0.5) * offset, + weight: Math.floor(Math.random() * (100 - 10 + 1)) + 10, +}); + +export const makePolygon = (id: number): RNPolygon => ({ + id: id.toString(), + zIndex: id, + pressable: true, + coordinates: [ + randomCoordinates(37.7749, -122.4194, 0.01), + randomCoordinates(37.7749, -122.4194, 0.01), + randomCoordinates(37.7749, -122.4194, 0.01), + randomCoordinates(37.7749, -122.4194, 0.01), + ], + fillColor: '#0000ff', + strokeColor: '#ff0000', + strokeWidth: 1 + (id % 5), +}); + +export const makePolyline = (id: number): RNPolyline => ({ + id: id.toString(), + zIndex: id, + pressable: true, + coordinates: [ + randomCoordinates(37.7749, -122.4194, 0.02), + randomCoordinates(37.7749, -122.4194, 0.02), + randomCoordinates(37.7749, -122.4194, 0.02), + ], + lineCap: id % 2 === 0 ? 'round' : 'square', + lineJoin: id % 3 === 0 ? 'bevel' : 'round', + color: id % 2 === 0 ? '#00ff00' : '#ff0000', + width: 2 + (id % 4), +}); + +export const makeCircle = (id: number): RNCircle => ({ + id: id.toString(), + zIndex: id, + pressable: true, + center: randomCoordinates(37.7749, -122.4194, 0.02), + radius: 100 + (id % 5), + strokeWidth: 1 + (id % 5), + strokeColor: '#ff0000', + fillColor: '#0000ff', +}); + +export const makeHeatmap = (id: number): RNHeatmap => ({ + id: id.toString(), + zIndex: id, + weightedData: [ + randomWeightedCoordinates(37.7749, -122.4194, 0.02), + randomWeightedCoordinates(37.7749, -122.4194, 0.03), + randomWeightedCoordinates(37.7749, -122.4194, 0.05), + randomWeightedCoordinates(37.7749, -122.4194, 0.01), + randomWeightedCoordinates(37.7749, -122.4194, 0.08), + randomWeightedCoordinates(37.7749, -122.4194, 0.03), + randomWeightedCoordinates(37.7749, -122.4194, 0.09), + ], + gradient: { + colors: ['#00f', '#0ff', '#0f0', '#ff0', '#f00'], + startPoints: [0.1, 0.3, 0.5, 0.7, 1], + colorMapSize: 256, + }, + radius: 100, + opacity: 1, +}); + +export const makeMarker = (id: number): RNMarker => ({ + id: id.toString(), + zIndex: id, + coordinate: randomCoordinates(37.7749, -122.4194, 0.2), + anchor: { x: 0.5, y: 1.0 }, + iconSvg: + id % 2 === 0 + ? { + width: (64 / 100) * 50, + height: (88 / 100) * 50, + svgString: makeSvgIcon(64, 88), + } + : undefined, +}); diff --git a/example/src/utils/mapStyles.ts b/example/src/utils/mapStyles.ts new file mode 100644 index 0000000..2983969 --- /dev/null +++ b/example/src/utils/mapStyles.ts @@ -0,0 +1,41 @@ +import type { RNMapStyleElement } from 'react-native-google-maps-plus'; + +export const standardMapStyle: RNMapStyleElement[] = [ + { featureType: 'poi.attraction', stylers: [{ visibility: 'off' }] }, + { featureType: 'poi.business', stylers: [{ visibility: 'off' }] }, + { featureType: 'poi.government', stylers: [{ visibility: 'off' }] }, + { featureType: 'poi.medical', stylers: [{ visibility: 'off' }] }, + { + featureType: 'poi.park', + elementType: 'labels.icon', + stylers: [{ visibility: 'off' }], + }, + { featureType: 'poi.place_of_worship', stylers: [{ visibility: 'off' }] }, + { featureType: 'poi.school', stylers: [{ visibility: 'off' }] }, + { featureType: 'poi.sports_complex', stylers: [{ visibility: 'off' }] }, +]; + +export const silverMapStyle: RNMapStyleElement[] = [ + { featureType: 'poi.attraction', stylers: [{ visibility: 'off' }] }, + { featureType: 'poi.business', stylers: [{ visibility: 'off' }] }, + { featureType: 'poi.government', stylers: [{ visibility: 'off' }] }, + { featureType: 'poi.medical', stylers: [{ visibility: 'off' }] }, + { + featureType: 'poi.park', + elementType: 'labels.icon', + stylers: [{ visibility: 'off' }], + }, + { featureType: 'poi.place_of_worship', stylers: [{ visibility: 'off' }] }, + { featureType: 'poi.school', stylers: [{ visibility: 'off' }] }, + { featureType: 'poi.sports_complex', stylers: [{ visibility: 'off' }] }, + { + featureType: 'water', + elementType: 'geometry', + stylers: [{ color: '#ff0000' }], + }, + { + featureType: 'water', + elementType: 'labels.text.fill', + stylers: [{ color: '#ff0000' }], + }, +]; diff --git a/example/tsconfig.json b/example/tsconfig.json new file mode 100644 index 0000000..28026a9 --- /dev/null +++ b/example/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "react-native-google-maps-plus": ["../src"] + } + }, + "include": ["src", "../src"] +} diff --git a/package.json b/package.json index 5bb24b5..085e59d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-google-maps-plus", - "version": "1.1.0-dev.6", + "version": "1.1.0-dev.5", "description": "React-native wrapper for android & IOS google maps sdk", "main": "./lib/module/index.js", "module": "./lib/module/index.js", diff --git a/yarn.lock b/yarn.lock index d2c4e1e..c55103b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -659,7 +659,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-arrow-functions@npm:^7.24.7, @babel/plugin-transform-arrow-functions@npm:^7.27.1": +"@babel/plugin-transform-arrow-functions@npm:^7.0.0-0, @babel/plugin-transform-arrow-functions@npm:^7.24.7, @babel/plugin-transform-arrow-functions@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-arrow-functions@npm:7.27.1" dependencies: @@ -718,7 +718,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-class-properties@npm:^7.25.4, @babel/plugin-transform-class-properties@npm:^7.27.1": +"@babel/plugin-transform-class-properties@npm:^7.0.0-0, @babel/plugin-transform-class-properties@npm:^7.25.4, @babel/plugin-transform-class-properties@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-class-properties@npm:7.27.1" dependencies: @@ -742,7 +742,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.25.4, @babel/plugin-transform-classes@npm:^7.28.3": +"@babel/plugin-transform-classes@npm:^7.0.0-0, @babel/plugin-transform-classes@npm:^7.25.4, @babel/plugin-transform-classes@npm:^7.28.3": version: 7.28.4 resolution: "@babel/plugin-transform-classes@npm:7.28.4" dependencies: @@ -1016,7 +1016,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.24.7, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.27.1": +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.0.0-0, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.24.7, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.27.1" dependencies: @@ -1076,7 +1076,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-optional-chaining@npm:^7.24.8, @babel/plugin-transform-optional-chaining@npm:^7.27.1": +"@babel/plugin-transform-optional-chaining@npm:^7.0.0-0, @babel/plugin-transform-optional-chaining@npm:^7.24.8, @babel/plugin-transform-optional-chaining@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-optional-chaining@npm:7.27.1" dependencies: @@ -1256,7 +1256,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-shorthand-properties@npm:^7.24.7, @babel/plugin-transform-shorthand-properties@npm:^7.27.1": +"@babel/plugin-transform-shorthand-properties@npm:^7.0.0-0, @babel/plugin-transform-shorthand-properties@npm:^7.24.7, @babel/plugin-transform-shorthand-properties@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-shorthand-properties@npm:7.27.1" dependencies: @@ -1301,7 +1301,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-template-literals@npm:^7.27.1": +"@babel/plugin-transform-template-literals@npm:^7.0.0-0, @babel/plugin-transform-template-literals@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-template-literals@npm:7.27.1" dependencies: @@ -1361,7 +1361,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-unicode-regex@npm:^7.24.7, @babel/plugin-transform-unicode-regex@npm:^7.27.1": +"@babel/plugin-transform-unicode-regex@npm:^7.0.0-0, @babel/plugin-transform-unicode-regex@npm:^7.24.7, @babel/plugin-transform-unicode-regex@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-unicode-regex@npm:7.27.1" dependencies: @@ -1494,7 +1494,7 @@ __metadata: languageName: node linkType: hard -"@babel/preset-typescript@npm:^7.24.7": +"@babel/preset-typescript@npm:^7.16.7, @babel/preset-typescript@npm:^7.24.7": version: 7.27.1 resolution: "@babel/preset-typescript@npm:7.27.1" dependencies: @@ -1757,6 +1757,15 @@ __metadata: languageName: node linkType: hard +"@egjs/hammerjs@npm:^2.0.17": + version: 2.0.17 + resolution: "@egjs/hammerjs@npm:2.0.17" + dependencies: + "@types/hammerjs": ^2.0.36 + checksum: 8945137cec5837edd70af3f2e0ea621543eb0aa3b667e6269ec6485350f4d120c2434b37c7c30b1cf42a65275dd61c1f24626749c616696d3956ac0c008c4766 + languageName: node + linkType: hard + "@emnapi/core@npm:^1.4.3": version: 1.5.0 resolution: "@emnapi/core@npm:1.5.0" @@ -2497,9 +2506,9 @@ __metadata: languageName: node linkType: hard -"@npmcli/arborist@npm:^9.1.5": - version: 9.1.5 - resolution: "@npmcli/arborist@npm:9.1.5" +"@npmcli/arborist@npm:^9.1.6": + version: 9.1.6 + resolution: "@npmcli/arborist@npm:9.1.6" dependencies: "@isaacs/string-locale-compare": ^1.1.0 "@npmcli/fs": ^4.0.0 @@ -2536,13 +2545,13 @@ __metadata: walk-up-path: ^4.0.0 bin: arborist: bin/index.js - checksum: 7d0c7abd89de1d863164ae3b548fb21f5f95df09c334cf78cf7389eea4da0de6590943065545c7031483d9b688bbf197bed647cf6a4aa292f478ec3d6c350346 + checksum: 03f4bdc4fb4a290e464f27ee275b4f6b02d0206817596b9d8ee8b81f64ca59a6cc580a37e7efb065124df458fb75a957bb14cc1d640d617de013c0b0b29fec4f languageName: node linkType: hard -"@npmcli/config@npm:^10.4.1": - version: 10.4.1 - resolution: "@npmcli/config@npm:10.4.1" +"@npmcli/config@npm:^10.4.2": + version: 10.4.2 + resolution: "@npmcli/config@npm:10.4.2" dependencies: "@npmcli/map-workspaces": ^5.0.0 "@npmcli/package-json": ^7.0.0 @@ -2552,7 +2561,7 @@ __metadata: proc-log: ^5.0.0 semver: ^7.3.5 walk-up-path: ^4.0.0 - checksum: 6f3487dc72365b9d968996599183e18e4c463bbdbeb5b03117b23c1fd54fd53909248a6b9a4f81a852ed5f69c3c3bd58a7ef1586bcd760ffcfc73654e4f5186f + checksum: d2eba0233fd28db12f80fdf4b94813e1fdc6f0347a60fc2bdefbd51cda3ef04e28896caa5f44a3c1f3f5e439f3e54f99a334be64fb5a5d307bc456c12589e24b languageName: node linkType: hard @@ -3272,6 +3281,101 @@ __metadata: languageName: node linkType: hard +"@react-navigation/core@npm:^7.12.4": + version: 7.12.4 + resolution: "@react-navigation/core@npm:7.12.4" + dependencies: + "@react-navigation/routers": ^7.5.1 + escape-string-regexp: ^4.0.0 + nanoid: ^3.3.11 + query-string: ^7.1.3 + react-is: ^19.1.0 + use-latest-callback: ^0.2.4 + use-sync-external-store: ^1.5.0 + peerDependencies: + react: ">= 18.2.0" + checksum: 84eb6d003d09c271e9e5e8f34c4a440447a82d81df7bd2f87dc4d56f851a5c74b1ec6e488cc2702cf16fde7d33bb55a58fe1dbd14e6cbdd513583b33227c2471 + languageName: node + linkType: hard + +"@react-navigation/elements@npm:^2.6.5": + version: 2.6.5 + resolution: "@react-navigation/elements@npm:2.6.5" + dependencies: + color: ^4.2.3 + use-latest-callback: ^0.2.4 + use-sync-external-store: ^1.5.0 + peerDependencies: + "@react-native-masked-view/masked-view": ">= 0.2.0" + "@react-navigation/native": ^7.1.18 + react: ">= 18.2.0" + react-native: "*" + react-native-safe-area-context: ">= 4.0.0" + peerDependenciesMeta: + "@react-native-masked-view/masked-view": + optional: true + checksum: ed6542b9dfaf04693445bb847651cc6bfdac5c2ffb687c1a5dcc473a05d12cd5e951c3ef5df854978aa93b6ced0bab1bbe94390df10cf24f2e3f9b72688661fb + languageName: node + linkType: hard + +"@react-navigation/native-stack@npm:7.3.27": + version: 7.3.27 + resolution: "@react-navigation/native-stack@npm:7.3.27" + dependencies: + "@react-navigation/elements": ^2.6.5 + warn-once: ^0.1.1 + peerDependencies: + "@react-navigation/native": ^7.1.18 + react: ">= 18.2.0" + react-native: "*" + react-native-safe-area-context: ">= 4.0.0" + react-native-screens: ">= 4.0.0" + checksum: 7719e78b86e3465a8a51ef302a54c059aa0e7ff38d671c898f71e91265a71843f6fc17ef783ff08e80b00c4f16902cba58f41fdd06efbc735b11a090d7f371d0 + languageName: node + linkType: hard + +"@react-navigation/native@npm:7.1.18": + version: 7.1.18 + resolution: "@react-navigation/native@npm:7.1.18" + dependencies: + "@react-navigation/core": ^7.12.4 + escape-string-regexp: ^4.0.0 + fast-deep-equal: ^3.1.3 + nanoid: ^3.3.11 + use-latest-callback: ^0.2.4 + peerDependencies: + react: ">= 18.2.0" + react-native: "*" + checksum: c7f0f6ae439a4d74cc7f42fe693aa014acdaaf3205c07cf40448eac5ef0417a307a08da0b8ad79516028182e3377c77332e40697874ceee3bd8ec52be7f8d459 + languageName: node + linkType: hard + +"@react-navigation/routers@npm:^7.5.1": + version: 7.5.1 + resolution: "@react-navigation/routers@npm:7.5.1" + dependencies: + nanoid: ^3.3.11 + checksum: 49f04894f7e8b8e2c16abb96bbc1a9775a02341bb00fb9c0d9ce97f8d82613c27570921f2b854f8fd1639c29309df05345aa734124d48bdbcb5a934055b8af12 + languageName: node + linkType: hard + +"@react-navigation/stack@npm:7.4.9": + version: 7.4.9 + resolution: "@react-navigation/stack@npm:7.4.9" + dependencies: + "@react-navigation/elements": ^2.6.5 + color: ^4.2.3 + peerDependencies: + "@react-navigation/native": ^7.1.18 + react: ">= 18.2.0" + react-native: "*" + react-native-gesture-handler: ">= 2.0.0" + react-native-safe-area-context: ">= 4.0.0" + react-native-screens: ">= 4.0.0" + checksum: 2efe2b33cea7a789d47f4721441d3cd66036b8425dbb1abbb4551560b34b8b83e852e9a8b5747d2a6fc4d3ef8ee41c24726e3205731534bf1445e6f77736b4ce + languageName: node + linkType: hard + "@sec-ant/readable-stream@npm:^0.4.1": version: 0.4.1 resolution: "@sec-ant/readable-stream@npm:0.4.1" @@ -3658,6 +3762,13 @@ __metadata: languageName: node linkType: hard +"@types/hammerjs@npm:^2.0.36": + version: 2.0.46 + resolution: "@types/hammerjs@npm:2.0.46" + checksum: caba6ec788d19905c71092670b58514b3d1f5eee5382bf9205e8df688d51e7857b7994e2dd7aed57fac8977bdf0e456d67fbaf23440a4385b8ce25fe2af1ec39 + languageName: node + linkType: hard + "@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1, @types/istanbul-lib-coverage@npm:^2.0.6": version: 2.0.6 resolution: "@types/istanbul-lib-coverage@npm:2.0.6" @@ -4668,11 +4779,11 @@ __metadata: linkType: hard "baseline-browser-mapping@npm:^2.8.9": - version: 2.8.13 - resolution: "baseline-browser-mapping@npm:2.8.13" + version: 2.8.14 + resolution: "baseline-browser-mapping@npm:2.8.14" bin: baseline-browser-mapping: dist/cli.js - checksum: 62c08d1b9c119c4796e82a65a7d3efd7d4b12abe4495b1112ff629dba0a7994da5359209f3f77618402f4f6f554d12b667252389fa6b5a08cbc8b9c3a137a009 + checksum: 422a3c25169ef6ffb89d2fab297f92c72496e0e87bcff6c7af3fbe917a9ee4ca3092ea8bd0ca128d915b2c1b2a0c7921edacdefb701e347d87158f2fa5b2bb1a languageName: node linkType: hard @@ -5000,7 +5111,7 @@ __metadata: languageName: node linkType: hard -"ci-info@npm:^4.0.0, ci-info@npm:^4.2.0, ci-info@npm:^4.3.0": +"ci-info@npm:^4.0.0, ci-info@npm:^4.2.0, ci-info@npm:^4.3.1": version: 4.3.1 resolution: "ci-info@npm:4.3.1" checksum: 66c159d92648e8a07acab0a3a0681bff6ccc39aa44916263208c4d97bbbeedbbc886d7611fd30c21df1aa624ce3c6fcdfde982e74689e3e014e064e1d0805f94 @@ -5208,13 +5319,33 @@ __metadata: languageName: node linkType: hard -"color-name@npm:~1.1.4": +"color-name@npm:^1.0.0, color-name@npm:~1.1.4": version: 1.1.4 resolution: "color-name@npm:1.1.4" checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 languageName: node linkType: hard +"color-string@npm:^1.9.0": + version: 1.9.1 + resolution: "color-string@npm:1.9.1" + dependencies: + color-name: ^1.0.0 + simple-swizzle: ^0.2.2 + checksum: c13fe7cff7885f603f49105827d621ce87f4571d78ba28ef4a3f1a104304748f620615e6bf065ecd2145d0d9dad83a3553f52bb25ede7239d18e9f81622f1cc5 + languageName: node + linkType: hard + +"color@npm:^4.2.3": + version: 4.2.3 + resolution: "color@npm:4.2.3" + dependencies: + color-convert: ^2.0.1 + color-string: ^1.9.0 + checksum: 0579629c02c631b426780038da929cca8e8d80a40158b09811a0112a107c62e10e4aad719843b791b1e658ab4e800558f2e87ca4522c8b32349d497ecb6adeb4 + languageName: node + linkType: hard + "colorette@npm:^1.0.7": version: 1.4.0 resolution: "colorette@npm:1.4.0" @@ -5580,6 +5711,13 @@ __metadata: languageName: node linkType: hard +"decode-uri-component@npm:^0.2.2": + version: 0.2.2 + resolution: "decode-uri-component@npm:0.2.2" + checksum: 95476a7d28f267292ce745eac3524a9079058bbb35767b76e3ee87d42e34cd0275d2eb19d9d08c3e167f97556e8a2872747f5e65cbebcac8b0c98d83e285f139 + languageName: node + linkType: hard + "dedent@npm:^0.7.0": version: 0.7.0 resolution: "dedent@npm:0.7.0" @@ -6675,6 +6813,13 @@ __metadata: languageName: node linkType: hard +"filter-obj@npm:^1.1.0": + version: 1.1.0 + resolution: "filter-obj@npm:1.1.0" + checksum: cf2104a7c45ff48e7f505b78a3991c8f7f30f28bd8106ef582721f321f1c6277f7751aacd5d83026cb079d9d5091082f588d14a72e7c5d720ece79118fa61e10 + languageName: node + linkType: hard + "finalhandler@npm:1.1.2": version: 1.1.2 resolution: "finalhandler@npm:1.1.2" @@ -7341,6 +7486,15 @@ __metadata: languageName: node linkType: hard +"hoist-non-react-statics@npm:^3.3.0": + version: 3.3.2 + resolution: "hoist-non-react-statics@npm:3.3.2" + dependencies: + react-is: ^16.7.0 + checksum: b1538270429b13901ee586aa44f4cc3ecd8831c061d06cb8322e50ea17b3f5ce4d0e2e66394761e6c8e152cd8c34fb3b4b690116c6ce2bd45b18c746516cb9e8 + languageName: node + linkType: hard + "hook-std@npm:^3.0.0": version: 3.0.0 resolution: "hook-std@npm:3.0.0" @@ -7357,12 +7511,12 @@ __metadata: languageName: node linkType: hard -"hosted-git-info@npm:^9.0.0": - version: 9.0.1 - resolution: "hosted-git-info@npm:9.0.1" +"hosted-git-info@npm:^9.0.0, hosted-git-info@npm:^9.0.2": + version: 9.0.2 + resolution: "hosted-git-info@npm:9.0.2" dependencies: lru-cache: ^11.1.0 - checksum: 7079026b3ae80868452817be8c32014f24f9cd4166bd9cc115af4e4cf2620f35a2d02ccee5ac5c2fc7901a7fc00029fd50e8136f22e45519a20e69f19a572b65 + checksum: 01687a41925189ab10dfd6c5b295d9186366faf22f74face5f83c6ac8e9927f25d5d91fad3352ee6833a3130e35d5fd71c9037a2d684e307cfd321724a90a689 languageName: node linkType: hard @@ -7692,6 +7846,13 @@ __metadata: languageName: node linkType: hard +"is-arrayish@npm:^0.3.1": + version: 0.3.4 + resolution: "is-arrayish@npm:0.3.4" + checksum: 09816634eb7b6e357067f6b49c7656b4aff6d8b25486553d086bab53ce0f929c0293906539503b2a317f3137b5a5cd7e9ea01305f6090c0037c4340d9121420d + languageName: node + linkType: hard + "is-async-function@npm:^2.0.0": version: 2.1.1 resolution: "is-async-function@npm:2.1.1" @@ -7731,7 +7892,7 @@ __metadata: languageName: node linkType: hard -"is-cidr@npm:^6.0.0": +"is-cidr@npm:^6.0.1": version: 6.0.1 resolution: "is-cidr@npm:6.0.1" dependencies: @@ -9165,21 +9326,21 @@ __metadata: languageName: node linkType: hard -"libnpmaccess@npm:^10.0.2": - version: 10.0.2 - resolution: "libnpmaccess@npm:10.0.2" +"libnpmaccess@npm:^10.0.3": + version: 10.0.3 + resolution: "libnpmaccess@npm:10.0.3" dependencies: npm-package-arg: ^13.0.0 npm-registry-fetch: ^19.0.0 - checksum: 0bed58951b72d61866de54a88302aa5d365df984a127e304005b6df37635f11a8779291d1429a30ceafd057bd9194c268a96327c77ce87f83a1b7126f131127c + checksum: 8bcd40e89bcec85250f3fe38049e14bc2fb0bd1769a7c3e2c82fd72c35730b322af30a031f6de85434651ce08731461c7beac752ed80e49df3fb689a5fdcc0b2 languageName: node linkType: hard -"libnpmdiff@npm:^8.0.8": - version: 8.0.8 - resolution: "libnpmdiff@npm:8.0.8" +"libnpmdiff@npm:^8.0.9": + version: 8.0.9 + resolution: "libnpmdiff@npm:8.0.9" dependencies: - "@npmcli/arborist": ^9.1.5 + "@npmcli/arborist": ^9.1.6 "@npmcli/installed-package-contents": ^3.0.0 binary-extensions: ^3.0.0 diff: ^8.0.2 @@ -9187,15 +9348,15 @@ __metadata: npm-package-arg: ^13.0.0 pacote: ^21.0.2 tar: ^7.5.1 - checksum: 5287ac6554988674e1cdf74b963a39f7aa73b09946ad1650c4019e349b03b9c47c15e65f2540d6bb1d88fb5fc678c7298d87531d63902a37dc0c690c5a0cfaa8 + checksum: d5119df0f8be2b57be02c88c58cf005176801e400bf027908e2920a6aec16b88698bb2f71c6ac305b936bc4006bee3a8d2f3e6faf2cd81f2eedcfda1bb8bc6a7 languageName: node linkType: hard -"libnpmexec@npm:^10.1.7": - version: 10.1.7 - resolution: "libnpmexec@npm:10.1.7" +"libnpmexec@npm:^10.1.8": + version: 10.1.8 + resolution: "libnpmexec@npm:10.1.8" dependencies: - "@npmcli/arborist": ^9.1.5 + "@npmcli/arborist": ^9.1.6 "@npmcli/package-json": ^7.0.0 "@npmcli/run-script": ^10.0.0 ci-info: ^4.0.0 @@ -9207,16 +9368,16 @@ __metadata: semver: ^7.3.7 signal-exit: ^4.1.0 walk-up-path: ^4.0.0 - checksum: 0592b0bbd620fe2e3ecf859366b83557bb23084a9118656516ea1cacdb3469fd58a30d3713ae648c1358c20b08421a3cb1208bd58045de61c23e6b0e8e64ae05 + checksum: d42ef697c4d1c51b96797a7118f637aa755ddb924d06202d96c2edab4cfe3f2acf0d78559c31794ac817c896c65ecdeb6f6d9f70da09e9ff6eb6a0c448b8398d languageName: node linkType: hard -"libnpmfund@npm:^7.0.8": - version: 7.0.8 - resolution: "libnpmfund@npm:7.0.8" +"libnpmfund@npm:^7.0.9": + version: 7.0.9 + resolution: "libnpmfund@npm:7.0.9" dependencies: - "@npmcli/arborist": ^9.1.5 - checksum: fac40554ae60b558e49579e0cf374794595142aa856fe09bfa1c55cccd3db73efec0559e8b35373d942511e946cf438bbe4fa62df1f000914183297d93a2f95a + "@npmcli/arborist": ^9.1.6 + checksum: ec0398f03321b7ab4568ff58167db3d4a3f937ecd2f418bb91b8fadaf8686646e26fb05225996b6d700dffc5880f3a525555a6eb904d4f971408ce986d537321 languageName: node linkType: hard @@ -9230,21 +9391,21 @@ __metadata: languageName: node linkType: hard -"libnpmpack@npm:^9.0.8": - version: 9.0.8 - resolution: "libnpmpack@npm:9.0.8" +"libnpmpack@npm:^9.0.9": + version: 9.0.9 + resolution: "libnpmpack@npm:9.0.9" dependencies: - "@npmcli/arborist": ^9.1.5 + "@npmcli/arborist": ^9.1.6 "@npmcli/run-script": ^10.0.0 npm-package-arg: ^13.0.0 pacote: ^21.0.2 - checksum: 7a061d316f007879a9bae161edcbfdbfb3534fcbde3070dd8c3b40d04a8f129c5c7ad9a010fb50df2078b21f00877c811ccae64358eb793b2b23af826722af83 + checksum: 3812fb9abbf4f4f39dde3370c1aacbfc2c568c87f6148fba791119234cd132cc5de8a80a93367656fb2733bc2dadfae76cb6d81f6f5ac7cfb3eb3e6d4d01007f languageName: node linkType: hard -"libnpmpublish@npm:^11.1.1": - version: 11.1.1 - resolution: "libnpmpublish@npm:11.1.1" +"libnpmpublish@npm:^11.1.2": + version: 11.1.2 + resolution: "libnpmpublish@npm:11.1.2" dependencies: "@npmcli/package-json": ^7.0.0 ci-info: ^4.0.0 @@ -9254,7 +9415,7 @@ __metadata: semver: ^7.3.7 sigstore: ^4.0.0 ssri: ^12.0.0 - checksum: 38007dea14befcaf6b8482808472e14a9b35db3a3d774c98199de86c9d97bd293ba94f88170a71051825e996d6d61ccc2b627b9aee95d9e50e5637553841ad06 + checksum: e9e21ed63339b5c54c373dda4915c82e24a4f17d86336d541a57891984fc4259b077a380eac60a8d943375d02908d885978f4a981bf966fa92d31f498bde6d3c languageName: node linkType: hard @@ -10136,6 +10297,15 @@ __metadata: languageName: node linkType: hard +"nanoid@npm:^3.3.11": + version: 3.3.11 + resolution: "nanoid@npm:3.3.11" + bin: + nanoid: bin/nanoid.cjs + checksum: 3be20d8866a57a6b6d218e82549711c8352ed969f9ab3c45379da28f405363ad4c9aeb0b39e9abc101a529ca65a72ff9502b00bf74a912c4b64a9d62dfd26c29 + languageName: node + linkType: hard + "napi-postinstall@npm:^0.3.0": version: 0.3.4 resolution: "napi-postinstall@npm:0.3.4" @@ -10284,17 +10454,6 @@ __metadata: languageName: node linkType: hard -"normalize-package-data@npm:^8.0.0": - version: 8.0.0 - resolution: "normalize-package-data@npm:8.0.0" - dependencies: - hosted-git-info: ^9.0.0 - semver: ^7.3.5 - validate-npm-package-license: ^3.0.4 - checksum: 226ef14e168caeeeb0ae21f70f0296d8c29cc55a484e1561d1f1771156f049f5896cd50f38b9a8b4bbe30f2fea32fb9e5491449249137faecb3fd169b3db8118 - languageName: node - linkType: hard - "normalize-path@npm:^3.0.0": version: 3.0.0 resolution: "normalize-path@npm:3.0.0" @@ -10341,7 +10500,7 @@ __metadata: languageName: node linkType: hard -"npm-package-arg@npm:^13.0.0": +"npm-package-arg@npm:^13.0.0, npm-package-arg@npm:^13.0.1": version: 13.0.1 resolution: "npm-package-arg@npm:13.0.1" dependencies: @@ -10437,12 +10596,12 @@ __metadata: linkType: hard "npm@npm:^11.4.2": - version: 11.6.1 - resolution: "npm@npm:11.6.1" + version: 11.6.2 + resolution: "npm@npm:11.6.2" dependencies: "@isaacs/string-locale-compare": ^1.1.0 - "@npmcli/arborist": ^9.1.5 - "@npmcli/config": ^10.4.1 + "@npmcli/arborist": ^9.1.6 + "@npmcli/config": ^10.4.2 "@npmcli/fs": ^4.0.0 "@npmcli/map-workspaces": ^5.0.0 "@npmcli/package-json": ^7.0.1 @@ -10454,24 +10613,24 @@ __metadata: archy: ~1.0.0 cacache: ^20.0.1 chalk: ^5.6.2 - ci-info: ^4.3.0 + ci-info: ^4.3.1 cli-columns: ^4.0.0 fastest-levenshtein: ^1.0.16 fs-minipass: ^3.0.3 glob: ^11.0.3 graceful-fs: ^4.2.11 - hosted-git-info: ^9.0.0 + hosted-git-info: ^9.0.2 ini: ^5.0.0 init-package-json: ^8.2.2 - is-cidr: ^6.0.0 + is-cidr: ^6.0.1 json-parse-even-better-errors: ^4.0.0 - libnpmaccess: ^10.0.2 - libnpmdiff: ^8.0.8 - libnpmexec: ^10.1.7 - libnpmfund: ^7.0.8 + libnpmaccess: ^10.0.3 + libnpmdiff: ^8.0.9 + libnpmexec: ^10.1.8 + libnpmfund: ^7.0.9 libnpmorg: ^8.0.1 - libnpmpack: ^9.0.8 - libnpmpublish: ^11.1.1 + libnpmpack: ^9.0.9 + libnpmpublish: ^11.1.2 libnpmsearch: ^9.0.1 libnpmteam: ^8.0.2 libnpmversion: ^8.0.2 @@ -10482,10 +10641,9 @@ __metadata: ms: ^2.1.2 node-gyp: ^11.4.2 nopt: ^8.1.0 - normalize-package-data: ^8.0.0 npm-audit-report: ^6.0.0 npm-install-checks: ^7.1.2 - npm-package-arg: ^13.0.0 + npm-package-arg: ^13.0.1 npm-pick-manifest: ^11.0.1 npm-profile: ^12.0.0 npm-registry-fetch: ^19.0.0 @@ -10496,7 +10654,7 @@ __metadata: proc-log: ^5.0.0 qrcode-terminal: ^0.12.0 read: ^4.1.0 - semver: ^7.7.2 + semver: ^7.7.3 spdx-expression-parse: ^4.0.0 ssri: ^12.0.0 supports-color: ^10.2.2 @@ -10509,7 +10667,7 @@ __metadata: bin: npm: bin/npm-cli.js npx: bin/npx-cli.js - checksum: 1580294580afdad62584e31b794e9e78d7324e5978b0611cb8b4bd30a39ea52cb26f930273bf0547526dfe824c1e0b7e80fe06886fec3a8d5e0d944c30c1d11b + checksum: 1ac92eb3a6d87a5d0f9431d992fb3bddbe34c2a44584ad350b3e1376c06104984198414241a27be74077dddc37f56d8847ee053d44e8e2e7a6159df388859d05 languageName: node linkType: hard @@ -11333,6 +11491,18 @@ __metadata: languageName: node linkType: hard +"query-string@npm:^7.1.3": + version: 7.1.3 + resolution: "query-string@npm:7.1.3" + dependencies: + decode-uri-component: ^0.2.2 + filter-obj: ^1.1.0 + split-on-first: ^1.0.0 + strict-uri-encode: ^2.0.0 + checksum: 91af02dcd9cc9227a052841d5c2eecb80a0d6489d05625df506a097ef1c59037cfb5e907f39b84643cbfd535c955abec3e553d0130a7b510120c37d06e0f4346 + languageName: node + linkType: hard + "queue-microtask@npm:^1.2.2": version: 1.2.3 resolution: "queue-microtask@npm:1.2.3" @@ -11392,7 +11562,16 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^16.13.1": +"react-freeze@npm:^1.0.0": + version: 1.0.4 + resolution: "react-freeze@npm:1.0.4" + peerDependencies: + react: ">=17.0.0" + checksum: 6b4d93209dff04a1f25d9f8e0c56a9a8a80e7889e8e8267299f34449c7e41a9ab90cad24569d03dd7173b56b7496576dba68f71f1d4e5c8be72f0633023668bc + languageName: node + linkType: hard + +"react-is@npm:^16.13.1, react-is@npm:^16.7.0": version: 16.13.1 resolution: "react-is@npm:16.13.1" checksum: f7a19ac3496de32ca9ae12aa030f00f14a3d45374f1ceca0af707c831b2a6098ef0d6bdae51bd437b0a306d7f01d4677fcc8de7c0d331eb47ad0f46130e53c5f @@ -11406,6 +11585,13 @@ __metadata: languageName: node linkType: hard +"react-is@npm:^19.1.0": + version: 19.2.0 + resolution: "react-is@npm:19.2.0" + checksum: 9a23e1c2d0bbc13b383bc59a05f54e6eb95dd87e01aec8aa92a88618364b7b0ee8a5b057ad813cf61e2f7ae7d24503b624706acb609d07c54754e5ad2c522568 + languageName: node + linkType: hard + "react-native-builder-bob@npm:0.40.13": version: 0.40.13 resolution: "react-native-builder-bob@npm:0.40.13" @@ -11438,6 +11624,20 @@ __metadata: languageName: node linkType: hard +"react-native-gesture-handler@npm:2.28.0": + version: 2.28.0 + resolution: "react-native-gesture-handler@npm:2.28.0" + dependencies: + "@egjs/hammerjs": ^2.0.17 + hoist-non-react-statics: ^3.3.0 + invariant: ^2.2.4 + peerDependencies: + react: "*" + react-native: "*" + checksum: 7bcd7db784b12565fdd5916bbebc2d3511a63159ca553d33e430008940ba7d209f1e85ef02968a920ed19c414fabe7d2c18cc0e967dd4889aae266788562d1e9 + languageName: node + linkType: hard + "react-native-google-maps-plus-example@workspace:example": version: 0.0.0-use.local resolution: "react-native-google-maps-plus-example@workspace:example" @@ -11451,16 +11651,25 @@ __metadata: "@react-native/babel-preset": 0.82.0 "@react-native/metro-config": 0.82.0 "@react-native/typescript-config": 0.82.0 + "@react-navigation/native": 7.1.18 + "@react-navigation/native-stack": 7.3.27 + "@react-navigation/stack": 7.4.9 "@types/react": 19.1.1 react: 19.1.1 react-native: 0.82.0 react-native-builder-bob: 0.40.13 + react-native-gesture-handler: 2.28.0 + react-native-google-maps-plus: "workspace:*" react-native-monorepo-config: 0.2.1 react-native-nitro-modules: 0.29.8 + react-native-reanimated: 4.1.3 + react-native-safe-area-context: 5.6.1 + react-native-screens: 4.16.0 + react-native-worklets: 0.6.1 languageName: unknown linkType: soft -"react-native-google-maps-plus@workspace:.": +"react-native-google-maps-plus@workspace:*, react-native-google-maps-plus@workspace:.": version: 0.0.0-use.local resolution: "react-native-google-maps-plus@workspace:." dependencies: @@ -11501,6 +11710,16 @@ __metadata: languageName: unknown linkType: soft +"react-native-is-edge-to-edge@npm:^1.2.1": + version: 1.2.1 + resolution: "react-native-is-edge-to-edge@npm:1.2.1" + peerDependencies: + react: "*" + react-native: "*" + checksum: 8fb6d8ab7b953c7d7cec8c987cef24f1c5348a293a85cb49c7c53b54ef110c0ca746736ae730e297603c8c76020df912e93915fb17518c4f2f91143757177aba + languageName: node + linkType: hard + "react-native-monorepo-config@npm:0.2.1": version: 0.2.1 resolution: "react-native-monorepo-config@npm:0.2.1" @@ -11531,6 +11750,68 @@ __metadata: languageName: node linkType: hard +"react-native-reanimated@npm:4.1.3": + version: 4.1.3 + resolution: "react-native-reanimated@npm:4.1.3" + dependencies: + react-native-is-edge-to-edge: ^1.2.1 + semver: 7.7.2 + peerDependencies: + "@babel/core": ^7.0.0-0 + react: "*" + react-native: "*" + react-native-worklets: ">=0.5.0" + checksum: 5f3b7298dd721b5da7f8bab64c557624d08b8715502f4ba2ff9118f31d852e3d9734ffbfaacd1302468ba68d4790689eead39605645a80f737802c8de0008064 + languageName: node + linkType: hard + +"react-native-safe-area-context@npm:5.6.1": + version: 5.6.1 + resolution: "react-native-safe-area-context@npm:5.6.1" + peerDependencies: + react: "*" + react-native: "*" + checksum: f346615d5f8f26c0c8459d29c149ea3f66684b8ae79cea6fd48d118d039851a69a92955d67b455d0e7ab46639155c4357ebf58ec1859b2377ee459e2a04b602b + languageName: node + linkType: hard + +"react-native-screens@npm:4.16.0": + version: 4.16.0 + resolution: "react-native-screens@npm:4.16.0" + dependencies: + react-freeze: ^1.0.0 + react-native-is-edge-to-edge: ^1.2.1 + warn-once: ^0.1.0 + peerDependencies: + react: "*" + react-native: "*" + checksum: 71bebbead1d8f886b80b70cf9d69b0179e035fb425fae84fbcbb2930167220cb90c2ee70b26d3fd94f940fa3e6ce325b0ec2e283d039d5abb29bf6898c58e485 + languageName: node + linkType: hard + +"react-native-worklets@npm:0.6.1": + version: 0.6.1 + resolution: "react-native-worklets@npm:0.6.1" + dependencies: + "@babel/plugin-transform-arrow-functions": ^7.0.0-0 + "@babel/plugin-transform-class-properties": ^7.0.0-0 + "@babel/plugin-transform-classes": ^7.0.0-0 + "@babel/plugin-transform-nullish-coalescing-operator": ^7.0.0-0 + "@babel/plugin-transform-optional-chaining": ^7.0.0-0 + "@babel/plugin-transform-shorthand-properties": ^7.0.0-0 + "@babel/plugin-transform-template-literals": ^7.0.0-0 + "@babel/plugin-transform-unicode-regex": ^7.0.0-0 + "@babel/preset-typescript": ^7.16.7 + convert-source-map: ^2.0.0 + semver: 7.7.2 + peerDependencies: + "@babel/core": ^7.0.0-0 + react: "*" + react-native: "*" + checksum: fee8de844ef2286dee9f81a53f9cf309424d26251953c8524204342c8531fef403c625a23632a6bb65ea57409d6f8522a60e02de772322bebb5ff4aa4cccf569 + languageName: node + linkType: hard + "react-native@npm:0.82.0": version: 0.82.0 resolution: "react-native@npm:0.82.0" @@ -12020,6 +12301,15 @@ __metadata: languageName: node linkType: hard +"semver@npm:7.7.2": + version: 7.7.2 + resolution: "semver@npm:7.7.2" + bin: + semver: bin/semver.js + checksum: dd94ba8f1cbc903d8eeb4dd8bf19f46b3deb14262b6717d0de3c804b594058ae785ef2e4b46c5c3b58733c99c83339068203002f9e37cfe44f7e2cc5e3d2f621 + languageName: node + linkType: hard + "semver@npm:^6.3.0, semver@npm:^6.3.1": version: 6.3.1 resolution: "semver@npm:6.3.1" @@ -12029,7 +12319,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.1.1, semver@npm:^7.1.2, semver@npm:^7.1.3, semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.7.2": +"semver@npm:^7.1.1, semver@npm:^7.1.2, semver@npm:^7.1.3, semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.7.2, semver@npm:^7.7.3": version: 7.7.3 resolution: "semver@npm:7.7.3" bin: @@ -12239,6 +12529,15 @@ __metadata: languageName: node linkType: hard +"simple-swizzle@npm:^0.2.2": + version: 0.2.4 + resolution: "simple-swizzle@npm:0.2.4" + dependencies: + is-arrayish: ^0.3.1 + checksum: 9a2f6f39a6b9fab68f96903523bf19953ec21e5e843108154cf47a9cc0f78955dd44f64499ffb71a849ac10c758d9fab7533627c7ca3ab40b5c177117acfdc1b + languageName: node + linkType: hard + "sisteransi@npm:^1.0.5": version: 1.0.5 resolution: "sisteransi@npm:1.0.5" @@ -12393,6 +12692,13 @@ __metadata: languageName: node linkType: hard +"split-on-first@npm:^1.0.0": + version: 1.1.0 + resolution: "split-on-first@npm:1.1.0" + checksum: 16ff85b54ddcf17f9147210a4022529b343edbcbea4ce977c8f30e38408b8d6e0f25f92cd35b86a524d4797f455e29ab89eb8db787f3c10708e0b47ebf528d30 + languageName: node + linkType: hard + "split2@npm:^4.0.0": version: 4.2.0 resolution: "split2@npm:4.2.0" @@ -12484,6 +12790,13 @@ __metadata: languageName: node linkType: hard +"strict-uri-encode@npm:^2.0.0": + version: 2.0.0 + resolution: "strict-uri-encode@npm:2.0.0" + checksum: eaac4cf978b6fbd480f1092cab8b233c9b949bcabfc9b598dd79a758f7243c28765ef7639c876fa72940dac687181b35486ea01ff7df3e65ce3848c64822c581 + languageName: node + linkType: hard + "string-length@npm:^4.0.2": version: 4.0.2 resolution: "string-length@npm:4.0.2" @@ -13383,6 +13696,24 @@ __metadata: languageName: node linkType: hard +"use-latest-callback@npm:^0.2.4": + version: 0.2.5 + resolution: "use-latest-callback@npm:0.2.5" + peerDependencies: + react: ">=16.8" + checksum: 8008a9c6635fa107ea3e84aba53c8f5334ea81bfe25a6866d76294045f53a34f9ad81ea7e2db595ceb1acf75064050b9cb7e800adee02e8a833b2f17ccdef88e + languageName: node + linkType: hard + +"use-sync-external-store@npm:^1.5.0": + version: 1.6.0 + resolution: "use-sync-external-store@npm:1.6.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 61a62e910713adfaf91bdb72ff2cd30e5ba83687accaf3b6e75a903b45bf635f5722e3694af30d83a03e92cb533c0a5c699298d2fef639a03ffc86b469f4eee2 + languageName: node + linkType: hard + "util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" @@ -13455,6 +13786,13 @@ __metadata: languageName: node linkType: hard +"warn-once@npm:^0.1.0, warn-once@npm:^0.1.1": + version: 0.1.1 + resolution: "warn-once@npm:0.1.1" + checksum: e6a5a1f5a8dba7744399743d3cfb571db4c3947897875d4962a7c5b1bf2195ab4518c838cb4cea652e71729f21bba2e98dc75686f5fccde0fabbd894e2ed0c0d + languageName: node + linkType: hard + "wcwidth@npm:^1.0.1": version: 1.0.1 resolution: "wcwidth@npm:1.0.1" From cee0708dfdee185ee4c8bb2836abd2a3c022fc93 Mon Sep 17 00:00:00 2001 From: pinpong Date: Thu, 9 Oct 2025 23:10:14 +0700 Subject: [PATCH 6/8] fix(example): build issues --- example/android/app/build.gradle | 1 + example/ios/Podfile | 39 +++++++++++++++++++++++++------- example/ios/Podfile.lock | 2 +- 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle index 0193f09..a054502 100644 --- a/example/android/app/build.gradle +++ b/example/android/app/build.gradle @@ -85,6 +85,7 @@ android { targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 versionName "1.0" + multiDexEnabled true } signingConfigs { debug { diff --git a/example/ios/Podfile b/example/ios/Podfile index d19430f..e535fec 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -33,13 +33,36 @@ target 'GoogleMapsPlusExample' do config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '16.0' end end - require 'fileutils' - svgkit_path = File.join(installer.sandbox.pod_dir('SVGKit'), 'Source') - Dir.glob(File.join(svgkit_path, '**', '*.{h,m}')).each do |file| - FileUtils.chmod("u+w", file) - text = File.read(file) - new_contents = text.gsub('#import "Node.h"', '#import "SVGKit/Node.h"') - File.open(file, 'w') { |f| f.write(new_contents) } - end + + # --- SVGKit Patch --- + require 'fileutils' + svgkit_path = File.join(installer.sandbox.pod_dir('SVGKit'), 'Source') + + # node fix + Dir.glob(File.join(svgkit_path, '**', '*.{h,m}')).each do |file| + FileUtils.chmod("u+w", file) + text = File.read(file) + new_contents = text.gsub('#import "Node.h"', '#import "SVGKit/Node.h"') + File.open(file, 'w') { |f| f.write(new_contents) } + # puts "Patched Node import in: #{file}" + end + + # import CSSValue.h + Dir.glob(File.join(svgkit_path, '**', '*.{h,m}')).each do |file| + FileUtils.chmod("u+w", file) + text = File.read(file) + new_contents = text.gsub('#import "CSSValue.h"', '#import "SVGKit/CSSValue.h"') + File.open(file, 'w') { |f| f.write(new_contents) } + # puts "Patched CSSValue import in: #{file}" + end + + # import SVGLength.h + Dir.glob(File.join(svgkit_path, '**', '*.{h,m}')).each do |file| + FileUtils.chmod("u+w", file) + text = File.read(file) + new_contents = text.gsub('#import "SVGLength.h"', '#import "SVGKit/SVGLength.h"') + File.open(file, 'w') { |f| f.write(new_contents) } + # puts "Patched SVGLength import in: #{file}" + end end end diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 9894838..413288b 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -3094,6 +3094,6 @@ SPEC CHECKSUMS: SVGKit: 1ad7513f8c74d9652f94ed64ddecda1a23864dea Yoga: ce55ebb197c21e22b6700cd36e3f36b7ec26e6f8 -PODFILE CHECKSUM: ada9cd8bbcd5ad8a6a2eae598262b8f8bce77633 +PODFILE CHECKSUM: 246331f3f9b61838ac0bd43aa0f04db450c4bd52 COCOAPODS: 1.15.2 From 286fb0dd736d27b795088c40022831df05544327 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 9 Oct 2025 16:53:27 +0000 Subject: [PATCH 7/8] =?UTF-8?q?=F0=9F=94=96=20release:=201.1.0-dev.7=20[sk?= =?UTF-8?q?ip=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## [1.1.0-dev.7](https://github.com/pinpong/react-native-google-maps-plus/compare/v1.1.0-dev.6...v1.1.0-dev.7) (2025-10-09) ### πŸ› Bug Fixes * **example:** build issues ([cee0708](https://github.com/pinpong/react-native-google-maps-plus/commit/cee0708dfdee185ee4c8bb2836abd2a3c022fc93)) ### πŸ› οΈ Other changes * **example:** beautify example app UI ([4f390ec](https://github.com/pinpong/react-native-google-maps-plus/commit/4f390ecd9ebc2f3e559913882ac56d33a30ac45b)) * **example:** beautify example app UI ([73c997c](https://github.com/pinpong/react-native-google-maps-plus/commit/73c997c69f23deeb48eb9b2be5df76a36ff0afea)) * fix CHANGELOG.md ([2f2bb2c](https://github.com/pinpong/react-native-google-maps-plus/commit/2f2bb2c617260166551abbc07dfa9a8ae27cf31e)) --- CHANGELOG.md | 12 ++++++++++++ package.json | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f6acb15..2752395 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +## [1.1.0-dev.7](https://github.com/pinpong/react-native-google-maps-plus/compare/v1.1.0-dev.6...v1.1.0-dev.7) (2025-10-09) + +### πŸ› Bug Fixes + +* **example:** build issues ([cee0708](https://github.com/pinpong/react-native-google-maps-plus/commit/cee0708dfdee185ee4c8bb2836abd2a3c022fc93)) + +### πŸ› οΈ Other changes + +* **example:** beautify example app UI ([4f390ec](https://github.com/pinpong/react-native-google-maps-plus/commit/4f390ecd9ebc2f3e559913882ac56d33a30ac45b)) +* **example:** beautify example app UI ([73c997c](https://github.com/pinpong/react-native-google-maps-plus/commit/73c997c69f23deeb48eb9b2be5df76a36ff0afea)) +* fix CHANGELOG.md ([2f2bb2c](https://github.com/pinpong/react-native-google-maps-plus/commit/2f2bb2c617260166551abbc07dfa9a8ae27cf31e)) + ## [1.1.0](https://github.com/pinpong/react-native-google-maps-plus/compare/v1.0.2...v1.1.0) (2025-10-08) ### ✨ Features diff --git a/package.json b/package.json index 085e59d..40aa462 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-google-maps-plus", - "version": "1.1.0-dev.5", + "version": "1.1.0-dev.7", "description": "React-native wrapper for android & IOS google maps sdk", "main": "./lib/module/index.js", "module": "./lib/module/index.js", From 4ee5afa5d45e2826e77d07b05266feb516bd2a3e Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 9 Oct 2025 17:00:36 +0000 Subject: [PATCH 8/8] =?UTF-8?q?=F0=9F=94=96=20release:=201.2.0-dev.1=20[sk?= =?UTF-8?q?ip=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## [1.2.0-dev.1](https://github.com/pinpong/react-native-google-maps-plus/compare/v1.1.0...v1.2.0-dev.1) (2025-10-09) ### ✨ Features * add kml layer support ([4faf558](https://github.com/pinpong/react-native-google-maps-plus/commit/4faf558425831cc18a6e9c9e2d20ef0c4f42e702)) * add kml layer support ([35098bd](https://github.com/pinpong/react-native-google-maps-plus/commit/35098bd4c75b825f96f58696cbb37a4fcdebbdb8)) ### πŸ› Bug Fixes * **example:** build issues ([cee0708](https://github.com/pinpong/react-native-google-maps-plus/commit/cee0708dfdee185ee4c8bb2836abd2a3c022fc93)) ### πŸ› οΈ Other changes * **ci:** move PR template to root for auto-apply ([03e8a84](https://github.com/pinpong/react-native-google-maps-plus/commit/03e8a8438b0d5edab80fcdf2f2c8abf3372288c2)) * **example:** beautify example app UI ([4f390ec](https://github.com/pinpong/react-native-google-maps-plus/commit/4f390ecd9ebc2f3e559913882ac56d33a30ac45b)) * **example:** beautify example app UI ([73c997c](https://github.com/pinpong/react-native-google-maps-plus/commit/73c997c69f23deeb48eb9b2be5df76a36ff0afea)) * fix CHANGELOG.md ([2f2bb2c](https://github.com/pinpong/react-native-google-maps-plus/commit/2f2bb2c617260166551abbc07dfa9a8ae27cf31e)) --- CHANGELOG.md | 18 ++++++++++++++++++ package.json | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d33974..a5ddab3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,21 @@ +## [1.2.0-dev.1](https://github.com/pinpong/react-native-google-maps-plus/compare/v1.1.0...v1.2.0-dev.1) (2025-10-09) + +### ✨ Features + +* add kml layer support ([4faf558](https://github.com/pinpong/react-native-google-maps-plus/commit/4faf558425831cc18a6e9c9e2d20ef0c4f42e702)) +* add kml layer support ([35098bd](https://github.com/pinpong/react-native-google-maps-plus/commit/35098bd4c75b825f96f58696cbb37a4fcdebbdb8)) + +### πŸ› Bug Fixes + +* **example:** build issues ([cee0708](https://github.com/pinpong/react-native-google-maps-plus/commit/cee0708dfdee185ee4c8bb2836abd2a3c022fc93)) + +### πŸ› οΈ Other changes + +* **ci:** move PR template to root for auto-apply ([03e8a84](https://github.com/pinpong/react-native-google-maps-plus/commit/03e8a8438b0d5edab80fcdf2f2c8abf3372288c2)) +* **example:** beautify example app UI ([4f390ec](https://github.com/pinpong/react-native-google-maps-plus/commit/4f390ecd9ebc2f3e559913882ac56d33a30ac45b)) +* **example:** beautify example app UI ([73c997c](https://github.com/pinpong/react-native-google-maps-plus/commit/73c997c69f23deeb48eb9b2be5df76a36ff0afea)) +* fix CHANGELOG.md ([2f2bb2c](https://github.com/pinpong/react-native-google-maps-plus/commit/2f2bb2c617260166551abbc07dfa9a8ae27cf31e)) + ## [1.1.0](https://github.com/pinpong/react-native-google-maps-plus/compare/v1.0.2...v1.1.0) (2025-10-08) ### ✨ Features diff --git a/package.json b/package.json index 60ab004..e0e7b97 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-google-maps-plus", - "version": "1.1.0", + "version": "1.2.0-dev.1", "description": "React-native wrapper for android & IOS google maps sdk", "main": "./lib/module/index.js", "module": "./lib/module/index.js",