@react-native-kakao/map 2.2.7 → 3.1.0-next.2
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 +14 -0
- package/README.md +5 -38
- package/RNCKakaoMap.podspec +16 -52
- package/android/build.gradle +12 -107
- package/android/consumer-rules.pro +2 -0
- package/android/src/main/AndroidManifest.xml +3 -1
- package/android/src/main/java/net/mjstudio/rnkakao/map/CameraOptions.kt +61 -0
- package/android/src/main/java/net/mjstudio/rnkakao/map/KakaoMapModule.kt +131 -0
- package/android/src/main/java/net/mjstudio/rnkakao/map/KakaoMapView.kt +1257 -0
- package/android/src/main/java/net/mjstudio/rnkakao/map/MapCameraCommands.kt +306 -0
- package/android/src/main/java/net/mjstudio/rnkakao/map/MapDimScreen.kt +431 -0
- package/android/src/main/java/net/mjstudio/rnkakao/map/MapGui.kt +899 -0
- package/android/src/main/java/net/mjstudio/rnkakao/map/MapImageLoader.kt +232 -0
- package/android/src/main/java/net/mjstudio/rnkakao/map/MapLabels.kt +1572 -0
- package/android/src/main/java/net/mjstudio/rnkakao/map/MapOptions.kt +360 -0
- package/android/src/main/java/net/mjstudio/rnkakao/map/MapRoutes.kt +805 -0
- package/android/src/main/java/net/mjstudio/rnkakao/map/MapShapes.kt +1096 -0
- package/android/src/main/java/net/mjstudio/rnkakao/map/MapUtilities.kt +495 -0
- package/expo-module.config.json +5 -0
- package/ios/CameraOptions.swift +41 -0
- package/ios/KakaoMapModule.swift +204 -0
- package/ios/KakaoMapView.swift +1018 -0
- package/ios/MapCameraCommands.swift +451 -0
- package/ios/MapDimScreen.swift +463 -0
- package/ios/MapGui.swift +1099 -0
- package/ios/MapImageLoader.swift +177 -0
- package/ios/MapLabels.swift +1676 -0
- package/ios/MapOptions.swift +374 -0
- package/ios/MapRoutes.swift +903 -0
- package/ios/MapShapes.swift +1294 -0
- package/ios/MapUnits.swift +20 -0
- package/ios/MapUtilities.swift +365 -0
- package/lib/commonjs/index.js +180 -29
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/index.web.js +18 -0
- package/lib/commonjs/index.web.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/types-assets.js +2 -0
- package/lib/commonjs/types-assets.js.map +1 -0
- package/lib/commonjs/types-camera.js +6 -0
- package/lib/commonjs/types-camera.js.map +1 -0
- package/lib/commonjs/types-dim.js +6 -0
- package/lib/commonjs/types-dim.js.map +1 -0
- package/lib/commonjs/types-gui.js +6 -0
- package/lib/commonjs/types-gui.js.map +1 -0
- package/lib/commonjs/types-labels.js +6 -0
- package/lib/commonjs/types-labels.js.map +1 -0
- package/lib/commonjs/types-routes.js +6 -0
- package/lib/commonjs/types-routes.js.map +1 -0
- package/lib/commonjs/types-shapes.js +6 -0
- package/lib/commonjs/types-shapes.js.map +1 -0
- package/lib/commonjs/types-utilities.js +6 -0
- package/lib/commonjs/types-utilities.js.map +1 -0
- package/lib/commonjs/types.js +6 -0
- package/lib/commonjs/types.js.map +1 -0
- package/lib/module/index.js +180 -22
- package/lib/module/index.js.map +1 -1
- package/lib/module/index.web.js +13 -0
- package/lib/module/index.web.js.map +1 -0
- package/lib/module/types-assets.js +2 -0
- package/lib/module/types-assets.js.map +1 -0
- package/lib/module/types-camera.js +4 -0
- package/lib/module/types-camera.js.map +1 -0
- package/lib/module/types-dim.js +4 -0
- package/lib/module/types-dim.js.map +1 -0
- package/lib/module/types-gui.js +4 -0
- package/lib/module/types-gui.js.map +1 -0
- package/lib/module/types-labels.js +4 -0
- package/lib/module/types-labels.js.map +1 -0
- package/lib/module/types-routes.js +4 -0
- package/lib/module/types-routes.js.map +1 -0
- package/lib/module/types-shapes.js +4 -0
- package/lib/module/types-shapes.js.map +1 -0
- package/lib/module/types-utilities.js +4 -0
- package/lib/module/types-utilities.js.map +1 -0
- package/lib/module/types.js +4 -0
- package/lib/module/types.js.map +1 -0
- package/lib/typescript/src/index.d.ts +59 -9
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/types-assets.d.ts +9 -0
- package/lib/typescript/src/types-assets.d.ts.map +1 -0
- package/lib/typescript/src/types-camera.d.ts +123 -0
- package/lib/typescript/src/types-camera.d.ts.map +1 -0
- package/lib/typescript/src/types-dim.d.ts +54 -0
- package/lib/typescript/src/types-dim.d.ts.map +1 -0
- package/lib/typescript/src/types-gui.d.ts +189 -0
- package/lib/typescript/src/types-gui.d.ts.map +1 -0
- package/lib/typescript/src/types-labels.d.ts +246 -0
- package/lib/typescript/src/types-labels.d.ts.map +1 -0
- package/lib/typescript/src/types-routes.d.ts +162 -0
- package/lib/typescript/src/types-routes.d.ts.map +1 -0
- package/lib/typescript/src/types-shapes.d.ts +253 -0
- package/lib/typescript/src/types-shapes.d.ts.map +1 -0
- package/lib/typescript/src/types-utilities.d.ts +130 -0
- package/lib/typescript/src/types-utilities.d.ts.map +1 -0
- package/lib/typescript/src/types.d.ts +222 -0
- package/lib/typescript/src/types.d.ts.map +1 -0
- package/package.json +24 -77
- package/src/index.tsx +322 -0
- package/src/index.web.tsx +46 -0
- package/src/types-assets.ts +8 -0
- package/src/types-camera.ts +97 -0
- package/src/types-dim.ts +54 -0
- package/src/types-gui.ts +171 -0
- package/src/types-labels.ts +207 -0
- package/src/types-routes.ts +118 -0
- package/src/types-shapes.ts +244 -0
- package/src/types-utilities.ts +115 -0
- package/src/types.ts +223 -0
- package/android/gradle.properties +0 -1
- package/android/src/main/AndroidManifestNew.xml +0 -2
- package/android/src/main/java/net/mjstudio/rnkakao/map/RNCKakaoMapModule.kt +0 -25
- package/android/src/main/java/net/mjstudio/rnkakao/map/RNCKakaoMapPackage.kt +0 -35
- package/android/src/newarch/KakaoMapSpec.kt +0 -7
- package/android/src/oldarch/KakaoMapSpec.kt +0 -14
- package/ios/Component/Map/RNCKakaoMapView.h +0 -23
- package/ios/Component/Map/RNCKakaoMapView.mm +0 -209
- package/ios/Component/Map/RNCKakaoMapViewManager.mm +0 -19
- package/ios/NativeModule/RNCKakaoMap.h +0 -7
- package/ios/NativeModule/RNCKakaoMap.mm +0 -19
- package/ios/NativeModule/RNCKakaoMapManager.swift +0 -7
- package/ios/Util/Util.h +0 -97
- package/lib/commonjs/component/KakaoMapView.js +0 -54
- package/lib/commonjs/component/KakaoMapView.js.map +0 -1
- package/lib/commonjs/spec/NativeKakaoMap.js +0 -9
- package/lib/commonjs/spec/NativeKakaoMap.js.map +0 -1
- package/lib/commonjs/spec/RNCKakaoMapViewNativeComponent.js +0 -15
- package/lib/commonjs/spec/RNCKakaoMapViewNativeComponent.js.map +0 -1
- package/lib/commonjs/type/type.js +0 -2
- package/lib/commonjs/type/type.js.map +0 -1
- package/lib/commonjs/util/Const.js +0 -14
- package/lib/commonjs/util/Const.js.map +0 -1
- package/lib/commonjs/util/Util.js +0 -15
- package/lib/commonjs/util/Util.js.map +0 -1
- package/lib/module/component/KakaoMapView.js +0 -48
- package/lib/module/component/KakaoMapView.js.map +0 -1
- package/lib/module/spec/NativeKakaoMap.js +0 -3
- package/lib/module/spec/NativeKakaoMap.js.map +0 -1
- package/lib/module/spec/RNCKakaoMapViewNativeComponent.js +0 -10
- package/lib/module/spec/RNCKakaoMapViewNativeComponent.js.map +0 -1
- package/lib/module/type/type.js +0 -2
- package/lib/module/type/type.js.map +0 -1
- package/lib/module/util/Const.js +0 -8
- package/lib/module/util/Const.js.map +0 -1
- package/lib/module/util/Util.js +0 -9
- package/lib/module/util/Util.js.map +0 -1
- package/lib/typescript/src/component/KakaoMapView.d.ts +0 -25
- package/lib/typescript/src/component/KakaoMapView.d.ts.map +0 -1
- package/lib/typescript/src/spec/NativeKakaoMap.d.ts +0 -7
- package/lib/typescript/src/spec/NativeKakaoMap.d.ts.map +0 -1
- package/lib/typescript/src/spec/RNCKakaoMapViewNativeComponent.d.ts +0 -32
- package/lib/typescript/src/spec/RNCKakaoMapViewNativeComponent.d.ts.map +0 -1
- package/lib/typescript/src/type/type.d.ts +0 -8
- package/lib/typescript/src/type/type.d.ts.map +0 -1
- package/lib/typescript/src/util/Const.d.ts +0 -8
- package/lib/typescript/src/util/Const.d.ts.map +0 -1
- package/lib/typescript/src/util/Util.d.ts +0 -3
- package/lib/typescript/src/util/Util.d.ts.map +0 -1
- package/src/component/KakaoMapView.tsx +0 -82
- package/src/index.ts +0 -43
- package/src/spec/NativeKakaoMap.ts +0 -8
- package/src/spec/RNCKakaoMapViewNativeComponent.ts +0 -38
- package/src/type/type.ts +0 -7
- package/src/util/Const.ts +0 -7
- package/src/util/Util.ts +0 -11
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
import ExpoModulesCore
|
|
2
|
+
import KakaoMapsSDK
|
|
3
|
+
|
|
4
|
+
struct MapCoordinate: Record {
|
|
5
|
+
@Field(.required) var latitude: Double = .nan
|
|
6
|
+
@Field(.required) var longitude: Double = .nan
|
|
7
|
+
|
|
8
|
+
func mapPoint() throws -> MapPoint {
|
|
9
|
+
guard latitude.isFinite, longitude.isFinite,
|
|
10
|
+
(-90 ... 90).contains(latitude), (-180 ... 180).contains(longitude)
|
|
11
|
+
else {
|
|
12
|
+
throw KakaoMapException(invalidCameraArgument, "Invalid map coordinate.")
|
|
13
|
+
}
|
|
14
|
+
return MapPoint(longitude: longitude, latitude: latitude)
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
struct MapScreenPoint: Record {
|
|
19
|
+
@Field(.required) var x: Double = .nan
|
|
20
|
+
@Field(.required) var y: Double = .nan
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
struct MapPaddingOptions: Record {
|
|
24
|
+
@Field(.required) var top: Double = .nan
|
|
25
|
+
@Field(.required) var right: Double = .nan
|
|
26
|
+
@Field(.required) var bottom: Double = .nan
|
|
27
|
+
@Field(.required) var left: Double = .nan
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
struct MapViewInfoOptions: Record {
|
|
31
|
+
@Field(.required) var name: String = ""
|
|
32
|
+
@Field var appName: String?
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
struct MapPoiOptions: Record {
|
|
36
|
+
@Field var visible: Bool?
|
|
37
|
+
@Field var clickable: Bool?
|
|
38
|
+
@Field var scale: String?
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
struct MapZoomRangeOptions: Record {
|
|
42
|
+
@Field(.required) var min: Double = .nan
|
|
43
|
+
@Field(.required) var max: Double = .nan
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
struct MapWidgetPositionOptions: Record {
|
|
47
|
+
@Field(.required) var x: Double = .nan
|
|
48
|
+
@Field(.required) var y: Double = .nan
|
|
49
|
+
@Field(.required) var gravity: String = ""
|
|
50
|
+
|
|
51
|
+
func values() throws -> (GuiAlignment, CGPoint) {
|
|
52
|
+
guard x.isFinite, y.isFinite else {
|
|
53
|
+
throw KakaoMapException(invalidCameraArgument, "Widget offsets must be finite numbers.")
|
|
54
|
+
}
|
|
55
|
+
let vertical: VerticalAlign
|
|
56
|
+
let horizontal: HorizontalAlign
|
|
57
|
+
switch gravity {
|
|
58
|
+
case "topLeft":
|
|
59
|
+
vertical = .top
|
|
60
|
+
horizontal = .left
|
|
61
|
+
case "topCenter":
|
|
62
|
+
vertical = .top
|
|
63
|
+
horizontal = .center
|
|
64
|
+
case "topRight":
|
|
65
|
+
vertical = .top
|
|
66
|
+
horizontal = .right
|
|
67
|
+
case "centerLeft":
|
|
68
|
+
vertical = .middle
|
|
69
|
+
horizontal = .left
|
|
70
|
+
case "center":
|
|
71
|
+
vertical = .middle
|
|
72
|
+
horizontal = .center
|
|
73
|
+
case "centerRight":
|
|
74
|
+
vertical = .middle
|
|
75
|
+
horizontal = .right
|
|
76
|
+
case "bottomLeft":
|
|
77
|
+
vertical = .bottom
|
|
78
|
+
horizontal = .left
|
|
79
|
+
case "bottomCenter":
|
|
80
|
+
vertical = .bottom
|
|
81
|
+
horizontal = .center
|
|
82
|
+
case "bottomRight":
|
|
83
|
+
vertical = .bottom
|
|
84
|
+
horizontal = .right
|
|
85
|
+
default:
|
|
86
|
+
throw KakaoMapException(invalidCameraArgument, "Invalid map widget gravity.")
|
|
87
|
+
}
|
|
88
|
+
return (
|
|
89
|
+
GuiAlignment(vAlign: vertical, hAlign: horizontal),
|
|
90
|
+
CGPoint(x: x, y: y)
|
|
91
|
+
)
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
struct MapCompassOptions: Record {
|
|
96
|
+
@Field var visible: Bool?
|
|
97
|
+
@Field var position: MapWidgetPositionOptions?
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
struct MapScaleBarOptions: Record {
|
|
101
|
+
@Field var visible: Bool?
|
|
102
|
+
@Field var position: MapWidgetPositionOptions?
|
|
103
|
+
@Field var autoHide: Bool?
|
|
104
|
+
@Field var fade: MapScaleBarFadeOptions?
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
struct MapScaleBarFadeOptions: Record {
|
|
108
|
+
@Field(.required) var inDuration: Double = .nan
|
|
109
|
+
@Field(.required) var outDuration: Double = .nan
|
|
110
|
+
@Field(.required) var retentionDuration: Double = .nan
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
struct KakaoMapViewOptions: Record {
|
|
114
|
+
@Field var mapType: String?
|
|
115
|
+
@Field var viewInfo: MapViewInfoOptions?
|
|
116
|
+
@Field var overlays: [String]?
|
|
117
|
+
@Field var customOverlays: [String]?
|
|
118
|
+
@Field var language: String?
|
|
119
|
+
@Field var poi: MapPoiOptions?
|
|
120
|
+
@Field var buildingScale: Double?
|
|
121
|
+
@Field var padding: MapPaddingOptions?
|
|
122
|
+
@Field var zoomRange: MapZoomRangeOptions?
|
|
123
|
+
@Field var gestures: [String: Bool]?
|
|
124
|
+
@Field var compass: MapCompassOptions?
|
|
125
|
+
@Field var scaleBar: MapScaleBarOptions?
|
|
126
|
+
@Field var logo: MapWidgetPositionOptions?
|
|
127
|
+
|
|
128
|
+
func merge(_ update: KakaoMapViewOptions) {
|
|
129
|
+
if let mapType = update.mapType {
|
|
130
|
+
self.mapType = mapType
|
|
131
|
+
viewInfo = nil
|
|
132
|
+
}
|
|
133
|
+
if let viewInfo = update.viewInfo {
|
|
134
|
+
self.viewInfo = viewInfo
|
|
135
|
+
mapType = nil
|
|
136
|
+
}
|
|
137
|
+
overlays = update.overlays ?? overlays
|
|
138
|
+
customOverlays = update.customOverlays ?? customOverlays
|
|
139
|
+
language = update.language ?? language
|
|
140
|
+
if let updatePoi = update.poi {
|
|
141
|
+
let value = MapPoiOptions()
|
|
142
|
+
value.visible = updatePoi.visible ?? poi?.visible
|
|
143
|
+
value.clickable = updatePoi.clickable ?? poi?.clickable
|
|
144
|
+
value.scale = updatePoi.scale ?? poi?.scale
|
|
145
|
+
poi = value
|
|
146
|
+
}
|
|
147
|
+
buildingScale = update.buildingScale ?? buildingScale
|
|
148
|
+
padding = update.padding ?? padding
|
|
149
|
+
zoomRange = update.zoomRange ?? zoomRange
|
|
150
|
+
if let updateGestures = update.gestures {
|
|
151
|
+
var value = gestures ?? [:]
|
|
152
|
+
value.merge(updateGestures) { _, new in new }
|
|
153
|
+
gestures = value
|
|
154
|
+
}
|
|
155
|
+
if let updateCompass = update.compass {
|
|
156
|
+
let value = MapCompassOptions()
|
|
157
|
+
value.visible = updateCompass.visible ?? compass?.visible
|
|
158
|
+
value.position = updateCompass.position ?? compass?.position
|
|
159
|
+
compass = value
|
|
160
|
+
}
|
|
161
|
+
if let updateScaleBar = update.scaleBar {
|
|
162
|
+
let value = MapScaleBarOptions()
|
|
163
|
+
value.visible = updateScaleBar.visible ?? scaleBar?.visible
|
|
164
|
+
value.position = updateScaleBar.position ?? scaleBar?.position
|
|
165
|
+
value.autoHide = updateScaleBar.autoHide ?? scaleBar?.autoHide
|
|
166
|
+
value.fade = updateScaleBar.fade ?? scaleBar?.fade
|
|
167
|
+
scaleBar = value
|
|
168
|
+
}
|
|
169
|
+
logo = update.logo ?? logo
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
func copy() -> KakaoMapViewOptions {
|
|
173
|
+
let result = KakaoMapViewOptions()
|
|
174
|
+
result.mapType = mapType
|
|
175
|
+
result.viewInfo = viewInfo
|
|
176
|
+
result.overlays = overlays
|
|
177
|
+
result.customOverlays = customOverlays
|
|
178
|
+
result.language = language
|
|
179
|
+
if let poi {
|
|
180
|
+
let value = MapPoiOptions()
|
|
181
|
+
value.visible = poi.visible
|
|
182
|
+
value.clickable = poi.clickable
|
|
183
|
+
value.scale = poi.scale
|
|
184
|
+
result.poi = value
|
|
185
|
+
}
|
|
186
|
+
result.buildingScale = buildingScale
|
|
187
|
+
result.padding = padding
|
|
188
|
+
result.zoomRange = zoomRange
|
|
189
|
+
result.gestures = gestures
|
|
190
|
+
if let compass {
|
|
191
|
+
let value = MapCompassOptions()
|
|
192
|
+
value.visible = compass.visible
|
|
193
|
+
value.position = compass.position
|
|
194
|
+
result.compass = value
|
|
195
|
+
}
|
|
196
|
+
if let scaleBar {
|
|
197
|
+
let value = MapScaleBarOptions()
|
|
198
|
+
value.visible = scaleBar.visible
|
|
199
|
+
value.position = scaleBar.position
|
|
200
|
+
value.autoHide = scaleBar.autoHide
|
|
201
|
+
value.fade = scaleBar.fade
|
|
202
|
+
result.scaleBar = value
|
|
203
|
+
}
|
|
204
|
+
result.logo = logo
|
|
205
|
+
return result
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
func difference(from previous: KakaoMapViewOptions) -> KakaoMapViewOptions {
|
|
209
|
+
let result = KakaoMapViewOptions()
|
|
210
|
+
if mapType != previous.mapType {
|
|
211
|
+
result.mapType = mapType
|
|
212
|
+
}
|
|
213
|
+
if !same(viewInfo, previous.viewInfo) {
|
|
214
|
+
result.viewInfo = viewInfo
|
|
215
|
+
}
|
|
216
|
+
if overlays != previous.overlays {
|
|
217
|
+
result.overlays = overlays
|
|
218
|
+
}
|
|
219
|
+
if customOverlays != previous.customOverlays {
|
|
220
|
+
result.customOverlays = customOverlays
|
|
221
|
+
}
|
|
222
|
+
if language != previous.language {
|
|
223
|
+
result.language = language
|
|
224
|
+
}
|
|
225
|
+
result.poi = poiDifference(from: previous.poi)
|
|
226
|
+
if buildingScale != previous.buildingScale {
|
|
227
|
+
result.buildingScale = buildingScale
|
|
228
|
+
}
|
|
229
|
+
if !same(padding, previous.padding) {
|
|
230
|
+
result.padding = padding
|
|
231
|
+
}
|
|
232
|
+
if !same(zoomRange, previous.zoomRange) {
|
|
233
|
+
result.zoomRange = zoomRange
|
|
234
|
+
}
|
|
235
|
+
if let gestures {
|
|
236
|
+
let changed = gestures.filter { previous.gestures?[$0.key] != $0.value }
|
|
237
|
+
if !changed.isEmpty {
|
|
238
|
+
result.gestures = changed
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
result.compass = compassDifference(from: previous.compass)
|
|
242
|
+
result.scaleBar = scaleBarDifference(from: previous.scaleBar)
|
|
243
|
+
if !same(logo, previous.logo) {
|
|
244
|
+
result.logo = logo
|
|
245
|
+
}
|
|
246
|
+
return result
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
private func poiDifference(from previous: MapPoiOptions?) -> MapPoiOptions? {
|
|
250
|
+
guard let poi else { return nil }
|
|
251
|
+
let result = MapPoiOptions()
|
|
252
|
+
if poi.visible != previous?.visible {
|
|
253
|
+
result.visible = poi.visible
|
|
254
|
+
}
|
|
255
|
+
if poi.clickable != previous?.clickable {
|
|
256
|
+
result.clickable = poi.clickable
|
|
257
|
+
}
|
|
258
|
+
if poi.scale != previous?.scale {
|
|
259
|
+
result.scale = poi.scale
|
|
260
|
+
}
|
|
261
|
+
return result.visible == nil && result.clickable == nil && result.scale == nil ? nil : result
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
private func compassDifference(from previous: MapCompassOptions?) -> MapCompassOptions? {
|
|
265
|
+
guard let compass else { return nil }
|
|
266
|
+
let result = MapCompassOptions()
|
|
267
|
+
if compass.visible != previous?.visible {
|
|
268
|
+
result.visible = compass.visible
|
|
269
|
+
}
|
|
270
|
+
if !same(compass.position, previous?.position) {
|
|
271
|
+
result.position = compass.position
|
|
272
|
+
}
|
|
273
|
+
return result.visible == nil && result.position == nil ? nil : result
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
private func scaleBarDifference(from previous: MapScaleBarOptions?) -> MapScaleBarOptions? {
|
|
277
|
+
guard let scaleBar else { return nil }
|
|
278
|
+
let result = MapScaleBarOptions()
|
|
279
|
+
if scaleBar.visible != previous?.visible {
|
|
280
|
+
result.visible = scaleBar.visible
|
|
281
|
+
}
|
|
282
|
+
if !same(scaleBar.position, previous?.position) {
|
|
283
|
+
result.position = scaleBar.position
|
|
284
|
+
}
|
|
285
|
+
if scaleBar.autoHide != previous?.autoHide {
|
|
286
|
+
result.autoHide = scaleBar.autoHide
|
|
287
|
+
}
|
|
288
|
+
if !same(scaleBar.fade, previous?.fade) {
|
|
289
|
+
result.fade = scaleBar.fade
|
|
290
|
+
}
|
|
291
|
+
return result.visible == nil && result.position == nil && result.autoHide == nil &&
|
|
292
|
+
result.fade == nil ? nil : result
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
private func same(_ lhs: MapViewInfoOptions?, _ rhs: MapViewInfoOptions?) -> Bool {
|
|
296
|
+
lhs?.name == rhs?.name && lhs?.appName == rhs?.appName
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
private func same(_ lhs: MapPaddingOptions?, _ rhs: MapPaddingOptions?) -> Bool {
|
|
300
|
+
lhs?.top == rhs?.top && lhs?.right == rhs?.right && lhs?.bottom == rhs?.bottom &&
|
|
301
|
+
lhs?.left == rhs?.left
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
private func same(_ lhs: MapZoomRangeOptions?, _ rhs: MapZoomRangeOptions?) -> Bool {
|
|
305
|
+
lhs?.min == rhs?.min && lhs?.max == rhs?.max
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
private func same(
|
|
309
|
+
_ lhs: MapWidgetPositionOptions?,
|
|
310
|
+
_ rhs: MapWidgetPositionOptions?
|
|
311
|
+
) -> Bool {
|
|
312
|
+
lhs?.x == rhs?.x && lhs?.y == rhs?.y && lhs?.gravity == rhs?.gravity
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
private func same(_ lhs: MapScaleBarFadeOptions?, _ rhs: MapScaleBarFadeOptions?) -> Bool {
|
|
316
|
+
lhs?.inDuration == rhs?.inDuration && lhs?.outDuration == rhs?.outDuration &&
|
|
317
|
+
lhs?.retentionDuration == rhs?.retentionDuration
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
struct CameraUpdateOptions: Record {
|
|
322
|
+
@Field(.required) var type: String = ""
|
|
323
|
+
@Field var position: MapCoordinate?
|
|
324
|
+
@Field var zoomLevel: Double?
|
|
325
|
+
@Field var rotation: Double?
|
|
326
|
+
@Field var tilt: Double?
|
|
327
|
+
@Field var coordinates: [MapCoordinate]?
|
|
328
|
+
|
|
329
|
+
func update(for map: KakaoMap) throws -> CameraUpdate {
|
|
330
|
+
switch type {
|
|
331
|
+
case "position":
|
|
332
|
+
guard let position else {
|
|
333
|
+
throw KakaoMapException(
|
|
334
|
+
invalidCameraArgument,
|
|
335
|
+
"A position camera update requires position."
|
|
336
|
+
)
|
|
337
|
+
}
|
|
338
|
+
return try CameraUpdate.make(target: position.mapPoint(), mapView: map)
|
|
339
|
+
case "zoom":
|
|
340
|
+
guard let zoomLevel, zoomLevel.isFinite, zoomLevel.rounded() == zoomLevel,
|
|
341
|
+
zoomLevel >= Double(map.cameraMinLevel), zoomLevel <= Double(map.cameraMaxLevel)
|
|
342
|
+
else {
|
|
343
|
+
throw KakaoMapException(
|
|
344
|
+
invalidCameraArgument,
|
|
345
|
+
"A zoom camera update requires a valid zoom level."
|
|
346
|
+
)
|
|
347
|
+
}
|
|
348
|
+
return CameraUpdate.make(zoomLevel: Int(zoomLevel), mapView: map)
|
|
349
|
+
case "orientation":
|
|
350
|
+
guard let rotation, let tilt, rotation.isFinite, tilt.isFinite, (0 ... 90).contains(tilt)
|
|
351
|
+
else {
|
|
352
|
+
throw KakaoMapException(
|
|
353
|
+
invalidCameraArgument,
|
|
354
|
+
"An orientation camera update requires valid rotation and tilt values."
|
|
355
|
+
)
|
|
356
|
+
}
|
|
357
|
+
return CameraUpdate.make(
|
|
358
|
+
rotation: rotation.truncatingRemainder(dividingBy: 360) * .pi / 180,
|
|
359
|
+
tilt: tilt * .pi / 180,
|
|
360
|
+
mapView: map
|
|
361
|
+
)
|
|
362
|
+
case "fit":
|
|
363
|
+
guard let coordinates, !coordinates.isEmpty else {
|
|
364
|
+
throw KakaoMapException(
|
|
365
|
+
invalidCameraArgument,
|
|
366
|
+
"A fit camera update requires at least one coordinate."
|
|
367
|
+
)
|
|
368
|
+
}
|
|
369
|
+
return try CameraUpdate.make(area: AreaRect(points: coordinates.map { try $0.mapPoint() }))
|
|
370
|
+
default:
|
|
371
|
+
throw KakaoMapException(invalidCameraArgument, "Invalid camera update type.")
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|