@granite-js/naver-map 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/GraniteNaverMap.podspec +81 -0
- package/android/build.gradle +160 -0
- package/android/gradle.properties +5 -0
- package/android/src/builtinProvider/java/run/granite/navermap/builtinProvider/BuiltInGraniteNaverMapProvider.kt +549 -0
- package/android/src/main/AndroidManifest.xml +3 -0
- package/android/src/main/java/run/granite/navermap/GraniteNaverMapEvents.kt +91 -0
- package/android/src/main/java/run/granite/navermap/GraniteNaverMapPackage.kt +16 -0
- package/android/src/main/java/run/granite/navermap/GraniteNaverMapProvider.kt +242 -0
- package/android/src/main/java/run/granite/navermap/GraniteNaverMapRegistry.kt +116 -0
- package/android/src/main/java/run/granite/navermap/GraniteNaverMapView.kt +732 -0
- package/android/src/newarch/java/run/granite/navermap/GraniteNaverMapViewManager.kt +446 -0
- package/android/src/oldarch/java/run/granite/navermap/GraniteNaverMapViewManager.kt +249 -0
- package/dist/module/NaverMapView.js +110 -0
- package/dist/module/NaverMapView.js.map +1 -0
- package/dist/module/index.js +6 -0
- package/dist/module/index.js.map +1 -0
- package/dist/module/internals/colorUtils.js +624 -0
- package/dist/module/internals/colorUtils.js.map +1 -0
- package/dist/module/internals/context.js +8 -0
- package/dist/module/internals/context.js.map +1 -0
- package/dist/module/internals/id.js +10 -0
- package/dist/module/internals/id.js.map +1 -0
- package/dist/module/internals/useMapOverlay.js +44 -0
- package/dist/module/internals/useMapOverlay.js.map +1 -0
- package/dist/module/internals/usePreservedReference.js +36 -0
- package/dist/module/internals/usePreservedReference.js.map +1 -0
- package/dist/module/overlays/ArrowheadPath.js +37 -0
- package/dist/module/overlays/ArrowheadPath.js.map +1 -0
- package/dist/module/overlays/Circle.js +35 -0
- package/dist/module/overlays/Circle.js.map +1 -0
- package/dist/module/overlays/GroundOverlay.js +30 -0
- package/dist/module/overlays/GroundOverlay.js.map +1 -0
- package/dist/module/overlays/InfoWindow.js +32 -0
- package/dist/module/overlays/InfoWindow.js.map +1 -0
- package/dist/module/overlays/Marker.js +37 -0
- package/dist/module/overlays/Marker.js.map +1 -0
- package/dist/module/overlays/Path.js +41 -0
- package/dist/module/overlays/Path.js.map +1 -0
- package/dist/module/overlays/Polygon.js +51 -0
- package/dist/module/overlays/Polygon.js.map +1 -0
- package/dist/module/overlays/Polyline.js +60 -0
- package/dist/module/overlays/Polyline.js.map +1 -0
- package/dist/module/overlays/index.js +11 -0
- package/dist/module/overlays/index.js.map +1 -0
- package/dist/module/package.json +1 -0
- package/dist/module/specs/GraniteNaverMapViewNativeComponent.ts +352 -0
- package/dist/module/types/Coord.js +2 -0
- package/dist/module/types/Coord.js.map +1 -0
- package/dist/module/types/index.js +29 -0
- package/dist/module/types/index.js.map +1 -0
- package/dist/typescript/NaverMapView.d.ts +41 -0
- package/dist/typescript/index.d.ts +3 -0
- package/dist/typescript/internals/colorUtils.d.ts +10 -0
- package/dist/typescript/internals/context.d.ts +8 -0
- package/dist/typescript/internals/id.d.ts +1 -0
- package/dist/typescript/internals/useMapOverlay.d.ts +15 -0
- package/dist/typescript/internals/usePreservedReference.d.ts +6 -0
- package/dist/typescript/overlays/ArrowheadPath.d.ts +11 -0
- package/dist/typescript/overlays/Circle.d.ts +10 -0
- package/dist/typescript/overlays/GroundOverlay.d.ts +11 -0
- package/dist/typescript/overlays/InfoWindow.d.ts +14 -0
- package/dist/typescript/overlays/Marker.d.ts +16 -0
- package/dist/typescript/overlays/Path.d.ts +15 -0
- package/dist/typescript/overlays/Polygon.d.ts +10 -0
- package/dist/typescript/overlays/Polyline.d.ts +11 -0
- package/dist/typescript/overlays/index.d.ts +16 -0
- package/dist/typescript/specs/GraniteNaverMapViewNativeComponent.d.ts +92 -0
- package/dist/typescript/types/Coord.d.ts +4 -0
- package/dist/typescript/types/index.d.ts +55 -0
- package/ios/GraniteNaverMap-Bridging-Header.h +20 -0
- package/ios/GraniteNaverMapProvider.swift +312 -0
- package/ios/GraniteNaverMapRegistry.swift +91 -0
- package/ios/GraniteNaverMapView.h +15 -0
- package/ios/GraniteNaverMapView.mm +390 -0
- package/ios/GraniteNaverMapViewImpl.swift +496 -0
- package/ios/GraniteNaverMapViewManager.m +67 -0
- package/ios/GraniteNaverMapViewManager.swift +133 -0
- package/ios/GraniteNaverMapViewWrapper.swift +215 -0
- package/ios/builtinProvider/BuiltInNaverMapProvider.swift +489 -0
- package/ios/builtinProvider/GraniteNaverMapMarkerData.swift +66 -0
- package/ios/builtinProvider/NMFMarker+Extension.swift +65 -0
- package/ios/builtinProvider/RCTConvert+NMFMapView.h +17 -0
- package/ios/builtinProvider/RCTConvert+NMFMapView.m +67 -0
- package/package.json +103 -0
- package/src/NaverMapView.tsx +168 -0
- package/src/index.tsx +3 -0
- package/src/internals/colorUtils.ts +697 -0
- package/src/internals/context.ts +14 -0
- package/src/internals/id.ts +9 -0
- package/src/internals/useMapOverlay.ts +59 -0
- package/src/internals/usePreservedReference.ts +41 -0
- package/src/overlays/ArrowheadPath.ts +71 -0
- package/src/overlays/Circle.ts +68 -0
- package/src/overlays/GroundOverlay.ts +62 -0
- package/src/overlays/InfoWindow.ts +68 -0
- package/src/overlays/Marker.ts +83 -0
- package/src/overlays/Path.ts +87 -0
- package/src/overlays/Polygon.ts +83 -0
- package/src/overlays/Polyline.ts +93 -0
- package/src/overlays/index.ts +23 -0
- package/src/specs/GraniteNaverMapViewNativeComponent.ts +352 -0
- package/src/types/Coord.ts +4 -0
- package/src/types/index.ts +78 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
//
|
|
2
|
+
// GraniteNaverMapMarkerData.swift
|
|
3
|
+
// granite-naver-map
|
|
4
|
+
//
|
|
5
|
+
|
|
6
|
+
import Foundation
|
|
7
|
+
import NMapsMap
|
|
8
|
+
import React
|
|
9
|
+
|
|
10
|
+
struct GraniteNaverMapMarkerData {
|
|
11
|
+
let coordinate: NMGLatLng?
|
|
12
|
+
let width: CGFloat?
|
|
13
|
+
let height: CGFloat?
|
|
14
|
+
let zIndex: Int?
|
|
15
|
+
let image: String?
|
|
16
|
+
let rotation: CGFloat?
|
|
17
|
+
let flat: Bool?
|
|
18
|
+
let alpha: CGFloat?
|
|
19
|
+
let pinColor: UIColor?
|
|
20
|
+
|
|
21
|
+
init(
|
|
22
|
+
coordinate: NMGLatLng? = nil,
|
|
23
|
+
width: CGFloat? = nil,
|
|
24
|
+
height: CGFloat? = nil,
|
|
25
|
+
zIndex: Int? = nil,
|
|
26
|
+
image: String? = nil,
|
|
27
|
+
rotation: CGFloat? = nil,
|
|
28
|
+
flat: Bool? = nil,
|
|
29
|
+
alpha: CGFloat? = nil,
|
|
30
|
+
pinColor: UIColor? = nil
|
|
31
|
+
) {
|
|
32
|
+
self.coordinate = coordinate
|
|
33
|
+
self.width = width
|
|
34
|
+
self.height = height
|
|
35
|
+
self.zIndex = zIndex
|
|
36
|
+
self.image = image
|
|
37
|
+
self.rotation = rotation
|
|
38
|
+
self.flat = flat
|
|
39
|
+
self.alpha = alpha
|
|
40
|
+
self.pinColor = pinColor
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
init(object: [String: Any]) {
|
|
44
|
+
if let coordinate = object["coordinate"] as? [String: Double],
|
|
45
|
+
let lat = coordinate["latitude"],
|
|
46
|
+
let lng = coordinate["longitude"] {
|
|
47
|
+
self.coordinate = NMGLatLng(lat: lat, lng: lng)
|
|
48
|
+
} else {
|
|
49
|
+
self.coordinate = nil
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
self.width = object["width"] as? CGFloat
|
|
53
|
+
self.height = object["height"] as? CGFloat
|
|
54
|
+
self.zIndex = object["zIndex"] as? Int
|
|
55
|
+
self.image = object["image"] as? String
|
|
56
|
+
self.rotation = object["rotation"] as? CGFloat
|
|
57
|
+
self.flat = object["flat"] as? Bool
|
|
58
|
+
self.alpha = object["alpha"] as? CGFloat
|
|
59
|
+
|
|
60
|
+
if let pinColor = object["pinColor"] as? Int {
|
|
61
|
+
self.pinColor = RCTConvert.uiColor(pinColor)
|
|
62
|
+
} else {
|
|
63
|
+
self.pinColor = nil
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
//
|
|
2
|
+
// NMFMarker+Extension.swift
|
|
3
|
+
// react-native-toss-naver-map
|
|
4
|
+
//
|
|
5
|
+
|
|
6
|
+
import Foundation
|
|
7
|
+
import NMapsMap
|
|
8
|
+
|
|
9
|
+
extension NMFMarker {
|
|
10
|
+
|
|
11
|
+
func loadImage(from urlString: String) {
|
|
12
|
+
guard let url = URL(string: urlString) else { return }
|
|
13
|
+
|
|
14
|
+
URLSession.shared.dataTask(with: url) { [weak self] data, _, error in
|
|
15
|
+
guard let data = data,
|
|
16
|
+
error == nil,
|
|
17
|
+
let image = UIImage(data: data) else {
|
|
18
|
+
return
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
DispatchQueue.main.async {
|
|
22
|
+
let overlayImage = NMFOverlayImage(image: image)
|
|
23
|
+
self?.iconImage = overlayImage
|
|
24
|
+
}
|
|
25
|
+
}.resume()
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
func applyMarkerData(_ markerData: GraniteNaverMapMarkerData) {
|
|
29
|
+
if let coordinate = markerData.coordinate {
|
|
30
|
+
self.position = coordinate
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if let width = markerData.width {
|
|
34
|
+
self.width = width
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if let height = markerData.height {
|
|
38
|
+
self.height = height
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if let zIndex = markerData.zIndex {
|
|
42
|
+
self.zIndex = zIndex
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if let imageURL = markerData.image {
|
|
46
|
+
loadImage(from: imageURL)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if let rotation = markerData.rotation {
|
|
50
|
+
self.angle = rotation
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if let flat = markerData.flat {
|
|
54
|
+
self.isFlat = flat
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if let alpha = markerData.alpha {
|
|
58
|
+
self.alpha = alpha
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if let pinColor = markerData.pinColor {
|
|
62
|
+
self.iconTintColor = pinColor
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
//
|
|
2
|
+
// RCTConvert+NMFMapView.h
|
|
3
|
+
// react-native-toss-naver-map
|
|
4
|
+
//
|
|
5
|
+
|
|
6
|
+
#import <React/RCTConvert.h>
|
|
7
|
+
#import <NMapsMap/NMapsMap.h>
|
|
8
|
+
|
|
9
|
+
@interface RCTConvert (NMFMapView)
|
|
10
|
+
|
|
11
|
+
+ (NMFCameraUpdate *)NMFCameraUpdate:(id)json;
|
|
12
|
+
+ (NMFCameraUpdate *)NMFCameraUpdateWith:(id)json;
|
|
13
|
+
+ (NMGLatLng *)NMGLatLng:(id)json;
|
|
14
|
+
+ (NMGLatLngBounds *)NMGLatLngBounds:(id)json;
|
|
15
|
+
+ (NMFAlignType *)NMFAlignType:(id)json;
|
|
16
|
+
|
|
17
|
+
@end
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
//
|
|
2
|
+
// RCTConvert+NMFMapView.m
|
|
3
|
+
// react-native-toss-naver-map
|
|
4
|
+
//
|
|
5
|
+
|
|
6
|
+
#import <NMapsMap/NMFCameraUpdate.h>
|
|
7
|
+
#import <NMapsMap/NMFCameraPosition.h>
|
|
8
|
+
#import <NMapsMap/NMFOverlay.h>
|
|
9
|
+
|
|
10
|
+
#import "RCTConvert+NMFMapView.h"
|
|
11
|
+
|
|
12
|
+
@implementation RCTConvert (NMFMapView)
|
|
13
|
+
|
|
14
|
+
+ (NMFCameraUpdate *)NMFCameraUpdate:(id)json
|
|
15
|
+
{
|
|
16
|
+
json = [self NSDictionary:json];
|
|
17
|
+
return [NMFCameraUpdate cameraUpdateWithScrollTo:NMGLatLngMake([self double:json[@"latitude"]], [self double:json[@"longitude"]])
|
|
18
|
+
zoomTo:[self double:json[@"zoom"]]];
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
+ (NMFCameraUpdate *)NMFCameraUpdateWith:(id)json
|
|
22
|
+
{
|
|
23
|
+
NMGLatLng *position = NMGLatLngMake([self double:json[@"latitude"]], [self double:json[@"longitude"]]);
|
|
24
|
+
double zoom = [self double:json[@"zoom"]];
|
|
25
|
+
double tilt = [self double:json[@"tilt"]];
|
|
26
|
+
double bearing = [self double:json[@"bearing"]];
|
|
27
|
+
|
|
28
|
+
NMFCameraPosition *cameraPosition = [NMFCameraPosition cameraPosition:position zoom:zoom tilt:tilt heading:bearing];
|
|
29
|
+
NMFCameraUpdate *cameraUpdate = [NMFCameraUpdate cameraUpdateWithPosition:cameraPosition];
|
|
30
|
+
cameraUpdate.animation = NMFCameraUpdateAnimationEaseIn;
|
|
31
|
+
return cameraUpdate;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
+ (NMGLatLng *)NMGLatLng:(id)json
|
|
35
|
+
{
|
|
36
|
+
json = [self NSDictionary:json];
|
|
37
|
+
return NMGLatLngMake([self double:json[@"latitude"]], [self double:json[@"longitude"]]);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
+ (NMGLatLngBounds *)NMGLatLngBounds:(id)json
|
|
41
|
+
{
|
|
42
|
+
json = [self NSDictionary:json];
|
|
43
|
+
double lat = [self double:json[@"latitude"]];
|
|
44
|
+
double latDelta = [self double:json[@"latitudeDelta"]];
|
|
45
|
+
double lng = [self double:json[@"longitude"]];
|
|
46
|
+
double lngDelta = [self double:json[@"longitudeDelta"]];
|
|
47
|
+
return NMGLatLngBoundsMake(lat - latDelta / 2, lng - lngDelta / 2, // southwest
|
|
48
|
+
lat + latDelta / 2, lng + lngDelta / 2); // northeast
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
+ (NMFAlignType *)NMFAlignType:(id)json
|
|
52
|
+
{
|
|
53
|
+
json = [self NSNumber:json];
|
|
54
|
+
if ([json isEqual:@(0)]) return NMFAlignType.center;
|
|
55
|
+
if ([json isEqual:@(1)]) return NMFAlignType.left;
|
|
56
|
+
if ([json isEqual:@(2)]) return NMFAlignType.right;
|
|
57
|
+
if ([json isEqual:@(3)]) return NMFAlignType.top;
|
|
58
|
+
if ([json isEqual:@(4)]) return NMFAlignType.bottom;
|
|
59
|
+
if ([json isEqual:@(5)]) return NMFAlignType.topLeft;
|
|
60
|
+
if ([json isEqual:@(6)]) return NMFAlignType.topRight;
|
|
61
|
+
if ([json isEqual:@(7)]) return NMFAlignType.bottomRight;
|
|
62
|
+
if ([json isEqual:@(8)]) return NMFAlignType.bottomLeft;
|
|
63
|
+
|
|
64
|
+
return NMFAlignType.bottom;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
@end
|
package/package.json
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@granite-js/naver-map",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Pluggable Naver Map component for React Native with provider selection",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/module/index.js",
|
|
7
|
+
"types": "./dist/typescript/index.d.ts",
|
|
8
|
+
"react-native": "./src/index.tsx",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/typescript/index.d.ts",
|
|
12
|
+
"react-native": "./src/index.tsx",
|
|
13
|
+
"default": "./dist/module/index.js"
|
|
14
|
+
},
|
|
15
|
+
"./package.json": "./package.json"
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"src",
|
|
19
|
+
"dist",
|
|
20
|
+
"android",
|
|
21
|
+
"ios",
|
|
22
|
+
"*.podspec",
|
|
23
|
+
"react-native.config.js",
|
|
24
|
+
"!example/**",
|
|
25
|
+
"!ios/build",
|
|
26
|
+
"!android/build",
|
|
27
|
+
"!android/gradle",
|
|
28
|
+
"!android/gradlew",
|
|
29
|
+
"!android/gradlew.bat",
|
|
30
|
+
"!android/local.properties",
|
|
31
|
+
"!**/__tests__",
|
|
32
|
+
"!**/__fixtures__",
|
|
33
|
+
"!**/__mocks__",
|
|
34
|
+
"!**/.*"
|
|
35
|
+
],
|
|
36
|
+
"scripts": {
|
|
37
|
+
"prepack": "yarn build",
|
|
38
|
+
"example": "yarn workspace @granite-js/naver-map-example",
|
|
39
|
+
"clean": "del-cli android/build example/android/build example/android/app/build example/ios/build",
|
|
40
|
+
"typecheck": "tsc --noEmit",
|
|
41
|
+
"lint": "eslint .",
|
|
42
|
+
"build": "bob build && tsc --project tsconfig.build.json"
|
|
43
|
+
},
|
|
44
|
+
"keywords": [
|
|
45
|
+
"react-native",
|
|
46
|
+
"ios",
|
|
47
|
+
"android",
|
|
48
|
+
"naver",
|
|
49
|
+
"map",
|
|
50
|
+
"navermap",
|
|
51
|
+
"korea",
|
|
52
|
+
"pluggable",
|
|
53
|
+
"provider",
|
|
54
|
+
"brownfield"
|
|
55
|
+
],
|
|
56
|
+
"repository": {
|
|
57
|
+
"type": "git",
|
|
58
|
+
"url": "git+https://github.com/toss/granite.git",
|
|
59
|
+
"directory": "packages/naver-map"
|
|
60
|
+
},
|
|
61
|
+
"author": "Toss <platform@toss.im>",
|
|
62
|
+
"homepage": "https://github.com/toss/granite/tree/main/packages/naver-map#readme",
|
|
63
|
+
"license": "MIT",
|
|
64
|
+
"devDependencies": {
|
|
65
|
+
"@types/react": "19.2.0",
|
|
66
|
+
"del-cli": "^6.0.0",
|
|
67
|
+
"eslint": "^9.7.0",
|
|
68
|
+
"react": "19.2.3",
|
|
69
|
+
"react-native": "0.84.0-rc.5",
|
|
70
|
+
"react-native-builder-bob": "0.40.17",
|
|
71
|
+
"typescript": "5.9.3"
|
|
72
|
+
},
|
|
73
|
+
"peerDependencies": {
|
|
74
|
+
"react": "*",
|
|
75
|
+
"react-native": "*"
|
|
76
|
+
},
|
|
77
|
+
"codegenConfig": {
|
|
78
|
+
"name": "GraniteNaverMapViewSpec",
|
|
79
|
+
"type": "components",
|
|
80
|
+
"jsSrcsDir": "src/specs",
|
|
81
|
+
"android": {
|
|
82
|
+
"javaPackageName": "run.granite.navermap"
|
|
83
|
+
},
|
|
84
|
+
"ios": {
|
|
85
|
+
"componentProvider": {
|
|
86
|
+
"GraniteNaverMapView": "GraniteNaverMapView"
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
"sideEffects": false,
|
|
91
|
+
"react-native-builder-bob": {
|
|
92
|
+
"source": "src",
|
|
93
|
+
"output": "dist",
|
|
94
|
+
"targets": [
|
|
95
|
+
[
|
|
96
|
+
"module",
|
|
97
|
+
{
|
|
98
|
+
"esm": true
|
|
99
|
+
}
|
|
100
|
+
]
|
|
101
|
+
]
|
|
102
|
+
}
|
|
103
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import React, { useCallback, useMemo, useRef, useState } from 'react';
|
|
2
|
+
import { Platform, View, type NativeSyntheticEvent, type StyleProp, type ViewStyle } from 'react-native';
|
|
3
|
+
import { MapContext } from './internals/context';
|
|
4
|
+
import type { MarkerEventListeners } from './overlays/Marker';
|
|
5
|
+
import GraniteNaverMapViewNativeComponent, {
|
|
6
|
+
OnCameraChangeEvent,
|
|
7
|
+
OnTouchEvent,
|
|
8
|
+
OnMapClickEvent,
|
|
9
|
+
OnMarkerClickEvent,
|
|
10
|
+
} from './specs/GraniteNaverMapViewNativeComponent';
|
|
11
|
+
import type { Coord } from './types';
|
|
12
|
+
|
|
13
|
+
export interface MapViewProps {
|
|
14
|
+
style?: StyleProp<ViewStyle>;
|
|
15
|
+
center?: Coord & {
|
|
16
|
+
zoom?: number;
|
|
17
|
+
tilt?: number;
|
|
18
|
+
bearing?: number;
|
|
19
|
+
};
|
|
20
|
+
showsMyLocationButton?: boolean;
|
|
21
|
+
compass?: boolean;
|
|
22
|
+
scaleBar?: boolean;
|
|
23
|
+
zoomControl?: boolean;
|
|
24
|
+
mapType?: number;
|
|
25
|
+
minZoomLevel?: number;
|
|
26
|
+
maxZoomLevel?: number;
|
|
27
|
+
buildingHeight?: number;
|
|
28
|
+
locationTrackingMode?: number;
|
|
29
|
+
tilt?: number;
|
|
30
|
+
bearing?: number;
|
|
31
|
+
nightMode?: boolean;
|
|
32
|
+
mapPadding?: {
|
|
33
|
+
top?: number;
|
|
34
|
+
left?: number;
|
|
35
|
+
bottom?: number;
|
|
36
|
+
right?: number;
|
|
37
|
+
};
|
|
38
|
+
scrollGesturesEnabled?: boolean;
|
|
39
|
+
zoomGesturesEnabled?: boolean;
|
|
40
|
+
tiltGesturesEnabled?: boolean;
|
|
41
|
+
rotateGesturesEnabled?: boolean;
|
|
42
|
+
stopGesturesEnabled?: boolean;
|
|
43
|
+
onCameraChange?: (event: NativeSyntheticEvent<OnCameraChangeEvent>) => void;
|
|
44
|
+
onTouch?: (event: NativeSyntheticEvent<OnTouchEvent>) => void;
|
|
45
|
+
onMapClick?: (event: NativeSyntheticEvent<OnMapClickEvent>) => void;
|
|
46
|
+
onInitialized?: () => void;
|
|
47
|
+
children?: React.ReactNode;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Avoid View Flattening issue on Android
|
|
52
|
+
*/
|
|
53
|
+
const AvoidViewFlatteningOnAndroid = ({
|
|
54
|
+
style,
|
|
55
|
+
children,
|
|
56
|
+
}: {
|
|
57
|
+
style?: StyleProp<ViewStyle>;
|
|
58
|
+
children: React.ReactNode;
|
|
59
|
+
}) => {
|
|
60
|
+
if (Platform.OS === 'android') {
|
|
61
|
+
return (
|
|
62
|
+
<View style={style} collapsable={false}>
|
|
63
|
+
{children}
|
|
64
|
+
</View>
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
return <>{children}</>;
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
export function NaverMapView({
|
|
71
|
+
style,
|
|
72
|
+
onTouch,
|
|
73
|
+
onMapClick,
|
|
74
|
+
onCameraChange,
|
|
75
|
+
onInitialized,
|
|
76
|
+
children,
|
|
77
|
+
center,
|
|
78
|
+
mapPadding,
|
|
79
|
+
...props
|
|
80
|
+
}: MapViewProps) {
|
|
81
|
+
const mapRef = useRef<React.ElementRef<typeof GraniteNaverMapViewNativeComponent>>(null);
|
|
82
|
+
const [isReady, setIsReady] = useState(false);
|
|
83
|
+
const markersRef = useRef<Map<string, MarkerEventListeners>>(new Map());
|
|
84
|
+
|
|
85
|
+
const onMarkerClick = useCallback((event: NativeSyntheticEvent<OnMarkerClickEvent>) => {
|
|
86
|
+
const marker = markersRef.current.get(event.nativeEvent.id);
|
|
87
|
+
marker?.onPress?.();
|
|
88
|
+
}, []);
|
|
89
|
+
|
|
90
|
+
const handleCameraChange = useCallback(
|
|
91
|
+
(event: NativeSyntheticEvent<OnCameraChangeEvent>) => {
|
|
92
|
+
onCameraChange?.(event);
|
|
93
|
+
},
|
|
94
|
+
[onCameraChange]
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
const handleTouch = useCallback(
|
|
98
|
+
(event: NativeSyntheticEvent<OnTouchEvent>) => {
|
|
99
|
+
onTouch?.(event);
|
|
100
|
+
},
|
|
101
|
+
[onTouch]
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
const handleMapClick = useCallback(
|
|
105
|
+
(event: NativeSyntheticEvent<OnMapClickEvent>) => {
|
|
106
|
+
onMapClick?.(event);
|
|
107
|
+
},
|
|
108
|
+
[onMapClick]
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
const handleInitialized = useCallback(() => {
|
|
112
|
+
console.log('[NaverMapView] handleInitialized called - setting isReady to true');
|
|
113
|
+
setIsReady(true);
|
|
114
|
+
onInitialized?.();
|
|
115
|
+
}, [onInitialized]);
|
|
116
|
+
|
|
117
|
+
const mapContext = useMemo(
|
|
118
|
+
() => (isReady && mapRef.current ? { mapView: mapRef.current, markers: markersRef.current } : null),
|
|
119
|
+
[isReady]
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
// Convert center prop to native format
|
|
123
|
+
const nativeCenter = useMemo(() => {
|
|
124
|
+
if (!center) {
|
|
125
|
+
return undefined;
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
latitude: center.latitude,
|
|
129
|
+
longitude: center.longitude,
|
|
130
|
+
zoom: center.zoom,
|
|
131
|
+
tilt: center.tilt,
|
|
132
|
+
bearing: center.bearing,
|
|
133
|
+
};
|
|
134
|
+
}, [center]);
|
|
135
|
+
|
|
136
|
+
// Convert mapPadding prop to native format
|
|
137
|
+
const nativeMapPadding = useMemo(() => {
|
|
138
|
+
if (!mapPadding) {
|
|
139
|
+
return undefined;
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
top: mapPadding.top,
|
|
143
|
+
left: mapPadding.left,
|
|
144
|
+
bottom: mapPadding.bottom,
|
|
145
|
+
right: mapPadding.right,
|
|
146
|
+
};
|
|
147
|
+
}, [mapPadding]);
|
|
148
|
+
|
|
149
|
+
return (
|
|
150
|
+
<AvoidViewFlatteningOnAndroid style={style}>
|
|
151
|
+
<MapContext.Provider value={mapContext}>
|
|
152
|
+
<GraniteNaverMapViewNativeComponent
|
|
153
|
+
ref={mapRef}
|
|
154
|
+
style={Platform.OS === 'ios' ? style : { flex: 1 }}
|
|
155
|
+
{...props}
|
|
156
|
+
center={nativeCenter}
|
|
157
|
+
mapPadding={nativeMapPadding}
|
|
158
|
+
onInitialized={handleInitialized}
|
|
159
|
+
onMarkerClick={onMarkerClick}
|
|
160
|
+
onCameraChange={handleCameraChange}
|
|
161
|
+
onTouch={handleTouch}
|
|
162
|
+
onMapClick={handleMapClick}
|
|
163
|
+
/>
|
|
164
|
+
{children}
|
|
165
|
+
</MapContext.Provider>
|
|
166
|
+
</AvoidViewFlatteningOnAndroid>
|
|
167
|
+
);
|
|
168
|
+
}
|
package/src/index.tsx
ADDED