diff --git a/example/app.json b/example/app.json index e8da504..5c11696 100644 --- a/example/app.json +++ b/example/app.json @@ -49,7 +49,8 @@ "android": { "extraMavenRepos": [ "https://repository.map.naver.com/archive/maven", - "https://devrepo.kakao.com/nexus/content/groups/public/" + "https://devrepo.kakao.com/nexus/content/groups/public/", + "https://devrepo.kakao.com/nexus/repository/kakaomap-releases/" ], "minSdkVerson": 26, "newArchEnabled": true diff --git a/example/package.json b/example/package.json index 62e78d5..78ee016 100644 --- a/example/package.json +++ b/example/package.json @@ -30,7 +30,7 @@ "expo-router": "3.5.4", "expo-status-bar": "1.12.1", "react": "18.2.0", - "react-native": "0.74.1-rc.0", + "react-native": "0.74.1", "react-native-flash-message": "^0.4.2", "react-native-safe-area-context": "^4.10.1", "react-native-screens": "^3.31.1", @@ -40,9 +40,9 @@ "@babel/core": "^7.20.4", "@babel/preset-env": "^7.20.4", "@babel/runtime": "^7.24.4", - "@react-native/babel-preset": "^0.74.81", - "@react-native/metro-config": "^0.74.81", - "@react-native/typescript-config": "^0.74.81", + "@react-native/babel-preset": "0.74.83", + "@react-native/metro-config": "0.74.83", + "@react-native/typescript-config": "0.74.83", "babel-plugin-module-resolver": "^5.0.0", "expo-build-properties": "~0.12.0" }, diff --git a/example/src/app/_layout.tsx b/example/src/app/_layout.tsx index e8d1963..87ef294 100644 --- a/example/src/app/_layout.tsx +++ b/example/src/app/_layout.tsx @@ -3,6 +3,7 @@ import FlashMessage from 'react-native-flash-message'; import { capitalize } from '@mj-studio/js-util'; import { useMount } from '@mj-studio/react-util'; import Core from '@react-native-kakao/core'; +import { KakaoMap } from '@react-native-kakao/map'; import { issueAccessTokenWithCodeWeb, setAccessTokenWeb } from '@react-native-kakao/user'; import { StyledSystemProvider } from '@react-native-styled-system/core'; import { Stack, useGlobalSearchParams } from 'expo-router'; @@ -39,6 +40,7 @@ export default function RootLayout() { restApiKey: '8b32d258f3f3fb553d86cfaa20964077', }, }); + KakaoMap.initializeKakaoMapSDK('fb975c77483d1edbe69467fca6bb2a6e').then(console.log); }); return ( diff --git a/example/src/app/index.tsx b/example/src/app/index.tsx index ab0c199..cb7602f 100644 --- a/example/src/app/index.tsx +++ b/example/src/app/index.tsx @@ -90,6 +90,11 @@ export default function Page() { ); }} /> + + + {'@react-native-kakao/map'} + + {'@react-native-kakao/user'} diff --git a/example/src/app/map.tsx b/example/src/app/map.tsx new file mode 100644 index 0000000..47c5d6b --- /dev/null +++ b/example/src/app/map.tsx @@ -0,0 +1,47 @@ +import { useState } from 'react'; +import KakaoMapView from '@react-native-kakao/map'; +import type { Camera } from '@react-native-kakao/map/src/type/type'; + +import { Box } from '../component/Box'; +import { Btn } from '../component/Btn'; +import { px } from '../util/px'; + +const Cameras = { + Seolleung: { + lat: 37.50497126, + lng: 127.04905021, + zoomLevel: 14, + }, + Gangnam: { + lat: 37.498040483, + lng: 127.02758183, + zoomLevel: 14, + }, + Jeju: { + lat: 33.39530773, + lng: 126.54656715029, + zoomLevel: 8, + }, +} satisfies Record; + +export default function Page() { + const [camera, setCamera] = useState(Cameras.Gangnam); + + return ( + + + + setCamera(Cameras.Gangnam)} /> + setCamera(Cameras.Seolleung)} /> + + + ); +} diff --git a/example/tsconfig.json b/example/tsconfig.json index 00f3ef7..5f88a90 100644 --- a/example/tsconfig.json +++ b/example/tsconfig.json @@ -7,6 +7,7 @@ { "path": "../packages/navi" }, { "path": "../packages/social" }, { "path": "../packages/channel" }, + { "path": "../packages/map" }, ], "compilerOptions": { // Avoid expo-cli auto-generating a tsconfig diff --git a/package.json b/package.json index 02c2f0c..7a18fba 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "lefthook": "^1.6.10", "prettier": "3.2.5", "react": "18.2.0", - "react-native": "0.74.1-rc.0", + "react-native": "0.74.1", "react-native-builder-bob": "^0.20.0", "turbo": "1.13.3", "typescript": "5.3.3", diff --git a/packages/core/package.json b/packages/core/package.json index 9086465..53021f3 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -120,7 +120,8 @@ "user": "2.22.0", "navi": "2.22.0", "friend": "2.22.0", - "talk": "2.22.0" + "talk": "2.22.0", + "map": "2.10.4" }, "android": { "minSdk": 21, @@ -134,7 +135,8 @@ "user": "2.20.1", "navi": "2.20.1", "friend": "2.20.1", - "talk": "2.20.1" + "talk": "2.20.1", + "map": "2.10.3" } }, "gitHead": "57203ed1725b209e814da7cfbb71b36f52d24210", diff --git a/packages/map/LICENSE b/packages/map/LICENSE new file mode 100644 index 0000000..c76e593 --- /dev/null +++ b/packages/map/LICENSE @@ -0,0 +1,20 @@ +MIT License + +Copyright (c) 2024 MJ Studio +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/map/README.md b/packages/map/README.md new file mode 100644 index 0000000..330f3c4 --- /dev/null +++ b/packages/map/README.md @@ -0,0 +1,42 @@ +

+ +
+
+

React Native Kakao Map

+

+ NPM downloads + NPM version + License + License +

Native Kakao SDK All In One Solution

+

+

+Documentation + + +## Documentation + +- [Quick Start](https://rnkakao.dev) + +## Contributing + +- [Contributing](https://github.com/mym0404/react-native-kakao/blob/main/CONTRIBUTING.md) +- [Issues](https://github.com/mym0404/react-native-kakao/issues) +- [PRs](https://github.com/mym0404/react-native-kakao/pulls) +- [Documentation](https://rnkakao.dev) +- [Code of Conduct](https://github.com/mym0404/react-native-kakao/blob/main/CODE_OF_CONDUCT.md) + +## License + +- See [LICENSE](/LICENSE) + +--- + +

+ + + +

+ Built and maintained by MJ Studio. +

+

diff --git a/packages/map/RNCKakaoMap.podspec b/packages/map/RNCKakaoMap.podspec new file mode 100644 index 0000000..c8ccab5 --- /dev/null +++ b/packages/map/RNCKakaoMap.podspec @@ -0,0 +1,56 @@ +require "json" + +package = JSON.parse(File.read(File.join(__dir__, "package.json"))) +corePackage = JSON.parse(File.read(File.join(__dir__, "..", "core", "package.json"))) +sdk_version = corePackage['sdkVersions']['ios']['map'] + +folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32' + +Pod::Spec.new do |s| + s.name = "RNCKakaoMap" + s.version = package["version"] + s.summary = package["description"] + s.homepage = package["homepage"] + s.license = package["license"] + s.authors = package["author"] + + s.platforms = { :ios => min_ios_version_supported } + s.source = { :git => "https://github.com/mym0404/react-native-kakao.git", :tag => "#{s.version}" } + + s.source_files = "ios/**/*.{h,m,mm}" + + # Use install_modules_dependencies helper to install the dependencies if React Native version >=0.71.0. + # See https://github.com/facebook/react-native/blob/febf6b7f33fdb4904669f99d795eba4c0f95d7bf/scripts/cocoapods/new_architecture.rb#L79. + if respond_to?(:install_modules_dependencies, true) + install_modules_dependencies(s) + else + s.dependency "React-Core" + + # Don't install the dependencies when we run `pod install` in the old architecture. + if ENV['RCT_NEW_ARCH_ENABLED'] == '1' then + s.compiler_flags = folly_compiler_flags + " -DRCT_NEW_ARCH_ENABLED=1" + s.pod_target_xcconfig = { + "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\"", + "OTHER_CPLUSPLUSFLAGS" => "-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1", + "CLANG_CXX_LANGUAGE_STANDARD" => "c++17" + } + s.dependency "React-RCTFabric" + s.dependency "React-Codegen" + s.dependency "RCT-Folly" + s.dependency "RCTRequired" + s.dependency "RCTTypeSafety" + s.dependency "ReactCommon/turbomodule/core" + end + end + + # Override Version by User + if defined?($KakaoMapSDKVersion) + Pod::UI.puts "#{s.name}: Using user specified Kakao SDK version '#{$KakaoMapSDKVersion}'" + sdk_version = $KakaoMapSDKVersion + end + + s.dependency 'RNCKakaoCore' + + # Kakao dependencies + s.dependency 'KakaoMapsSDK', sdk_version +end diff --git a/packages/map/android/.editorconfig b/packages/map/android/.editorconfig new file mode 100644 index 0000000..63c5536 --- /dev/null +++ b/packages/map/android/.editorconfig @@ -0,0 +1,11 @@ +# editorconfig +root = true + +[*.{kt,kts}] +ktlint_code_style = ktlint_official +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true diff --git a/packages/map/android/build.gradle b/packages/map/android/build.gradle new file mode 100644 index 0000000..7d3cc37 --- /dev/null +++ b/packages/map/android/build.gradle @@ -0,0 +1,117 @@ +apply from: file('./../../core/android/package-json.gradle') +def Versions = project.ext.RNCKakaoSdkVersions +Project coreProject = project.ext.getWorkspaceProject("core") + +buildscript { + // Buildscript is evaluated before everything else so we can't use getExtOrDefault + def kotlin_version = rootProject.ext.has("kotlinVersion") ? rootProject.ext.get("kotlinVersion") : project.properties["Kakao_kotlinVersion"] + + repositories { + google() + mavenCentral() + } + + dependencies { + classpath "com.android.tools.build:gradle:7.2.1" + // noinspection DifferentKotlinGradleVersion + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +def isNewArchitectureEnabled() { + return rootProject.hasProperty("newArchEnabled") && rootProject.getProperty("newArchEnabled") == "true" +} + +apply plugin: "com.android.library" +apply plugin: "kotlin-android" + +if (isNewArchitectureEnabled()) { + apply plugin: "com.facebook.react" +} + +def supportsNamespace() { + def parsed = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION.tokenize('.') + def major = parsed[0].toInteger() + def minor = parsed[1].toInteger() + + // Namespace support was added in 7.3.0 + return (major == 7 && minor >= 3) || major >= 8 +} + +android { + if (supportsNamespace()) { + namespace "net.mjstudio.rnkakao.map" + + sourceSets { + main { + manifest.srcFile "src/main/AndroidManifestNew.xml" + } + } + } + + compileSdkVersion Versions.compileSdk + + defaultConfig { + minSdkVersion Versions.minSdk + targetSdkVersion Versions.targetSdk + buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString() + } + + buildFeatures { + buildConfig true + } + + buildTypes { + release { + minifyEnabled false + } + } + + lintOptions { + disable "GradleCompatible" + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + + sourceSets { + main { + if (isNewArchitectureEnabled()) { + java.srcDirs += [ + "src/newarch", + // This is needed to build Kotlin project with NewArch enabled + "${project.buildDir}/generated/source/codegen/java" + ] + } else { + java.srcDirs += ["src/oldarch"] + } + } + } +} + +repositories { + mavenCentral() + google() +} + +dependencies { + // For < 0.71, this will be from the local maven repo + // For > 0.71, this will be replaced by `com.facebook.react:react-android:$version` by react gradle plugin + //noinspection GradleDynamicVersion + implementation "com.facebook.react:react-native:+" + implementation "org.jetbrains.kotlin:kotlin-stdlib:${Versions.kotlin}" + + api coreProject + implementation "com.kakao.maps.open:android:${Versions.map}" +} + +if (isNewArchitectureEnabled()) { + react { + jsRootDir = file("../src/") + libraryName = "RNCKakaoMap" + codegenJavaPackageName = "net.mjstudio.rnkakao.map" + } +} \ No newline at end of file diff --git a/packages/map/android/gradle.properties b/packages/map/android/gradle.properties new file mode 100644 index 0000000..1706dea --- /dev/null +++ b/packages/map/android/gradle.properties @@ -0,0 +1 @@ +Kakao_kotlinVersion=1.7.0 diff --git a/packages/map/android/src/main/AndroidManifest.xml b/packages/map/android/src/main/AndroidManifest.xml new file mode 100644 index 0000000..a5f88c0 --- /dev/null +++ b/packages/map/android/src/main/AndroidManifest.xml @@ -0,0 +1 @@ + diff --git a/packages/map/android/src/main/AndroidManifestNew.xml b/packages/map/android/src/main/AndroidManifestNew.xml new file mode 100644 index 0000000..a2f47b6 --- /dev/null +++ b/packages/map/android/src/main/AndroidManifestNew.xml @@ -0,0 +1,2 @@ + + diff --git a/packages/map/android/src/main/java/net/mjstudio/rnkakao/map/RNCKakaoMapModule.kt b/packages/map/android/src/main/java/net/mjstudio/rnkakao/map/RNCKakaoMapModule.kt new file mode 100644 index 0000000..25f3907 --- /dev/null +++ b/packages/map/android/src/main/java/net/mjstudio/rnkakao/map/RNCKakaoMapModule.kt @@ -0,0 +1,24 @@ +package net.mjstudio.rnkakao.map + +import com.facebook.react.bridge.Promise +import com.facebook.react.bridge.ReactApplicationContext +import com.kakao.vectormap.KakaoMapSdk + +class RNCKakaoMapModule internal constructor(context: ReactApplicationContext) : + KakaoMapSpec(context) { + override fun getName(): String { + return NAME + } + + override fun initializeKakaoMapSDK( + appKey: String, + promise: Promise, + ) { + KakaoMapSdk.init(reactApplicationContext, appKey) + promise.resolve(42) + } + + companion object { + const val NAME = "RNCKakaoMap" + } + } diff --git a/packages/map/android/src/main/java/net/mjstudio/rnkakao/map/RNCKakaoMapPackage.kt b/packages/map/android/src/main/java/net/mjstudio/rnkakao/map/RNCKakaoMapPackage.kt new file mode 100644 index 0000000..1ab0ec3 --- /dev/null +++ b/packages/map/android/src/main/java/net/mjstudio/rnkakao/map/RNCKakaoMapPackage.kt @@ -0,0 +1,37 @@ +package net.mjstudio.rnkakao.map + +import com.facebook.react.TurboReactPackage +import com.facebook.react.bridge.NativeModule +import com.facebook.react.bridge.ReactApplicationContext +import com.facebook.react.module.model.ReactModuleInfo +import com.facebook.react.module.model.ReactModuleInfoProvider + +class RNCKakaoMapPackage : TurboReactPackage() { + override fun getModule( + name: String, + reactContext: ReactApplicationContext, + ): NativeModule? { + return if (name == RNCKakaoMapModule.NAME) { + RNCKakaoMapModule(reactContext) + } else { + null + } + } + + override fun getReactModuleInfoProvider(): ReactModuleInfoProvider { + return ReactModuleInfoProvider { + val moduleInfos: MutableMap = HashMap() + val isTurboModule: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED + moduleInfos[RNCKakaoMapModule.NAME] = + ReactModuleInfo( + RNCKakaoMapModule.NAME, + RNCKakaoMapModule.NAME, + false, // canOverrideExistingModule + false, // needsEagerInit + false, // isCxxModule + isTurboModule, // isTurboModule + ) + moduleInfos + } + } +} diff --git a/packages/map/android/src/newarch/KakaoMapSpec.kt b/packages/map/android/src/newarch/KakaoMapSpec.kt new file mode 100644 index 0000000..e7bdfec --- /dev/null +++ b/packages/map/android/src/newarch/KakaoMapSpec.kt @@ -0,0 +1,6 @@ +package net.mjstudio.rnkakao.map + +import com.facebook.react.bridge.ReactApplicationContext + +abstract class KakaoMapSpec internal constructor(context: ReactApplicationContext) : + NativeKakaoMapSpec(context) diff --git a/packages/map/android/src/oldarch/KakaoMapSpec.kt b/packages/map/android/src/oldarch/KakaoMapSpec.kt new file mode 100644 index 0000000..b6f4846 --- /dev/null +++ b/packages/map/android/src/oldarch/KakaoMapSpec.kt @@ -0,0 +1,13 @@ +package net.mjstudio.rnkakao.map + +import com.facebook.react.bridge.Promise +import com.facebook.react.bridge.ReactApplicationContext +import com.facebook.react.bridge.ReactContextBaseJavaModule + +abstract class KakaoMapSpec internal constructor(context: ReactApplicationContext) : + ReactContextBaseJavaModule(context) { + abstract fun initializeKakaoMapSDK( + appKey: String, + promise: Promise, + ) + } diff --git a/packages/map/ios/Component/Map/RNCKakaoMapView.h b/packages/map/ios/Component/Map/RNCKakaoMapView.h new file mode 100644 index 0000000..24892f9 --- /dev/null +++ b/packages/map/ios/Component/Map/RNCKakaoMapView.h @@ -0,0 +1,24 @@ +// +// RNCKakaoMapView.h +// RNCKakaoMap +// +// Created by mj on 5/5/24. +// + +#import "RCTFabricComponentsPlugins.h" +#import "Util.h" +#import +#import +#import +#import +#import +#import +#import +#import +#import + +@interface RNCKakaoMapView : RCTViewComponentView + +@property(nonatomic, assign) double cameraAnimationDuration; + +@end diff --git a/packages/map/ios/Component/Map/RNCKakaoMapView.mm b/packages/map/ios/Component/Map/RNCKakaoMapView.mm new file mode 100644 index 0000000..bcffa7c --- /dev/null +++ b/packages/map/ios/Component/Map/RNCKakaoMapView.mm @@ -0,0 +1,208 @@ +// +// RNCKakaoMapView.m +// RNCKakaoMap +// +// Created by mj on 5/5/24. +// + +#import "RNCKakaoMapView.h" + +using namespace facebook::react; + +NSString* MAP_VIEW_NAME = @"mapview"; +NSString* MAP_VIEW_INFO_SKYVIEW_NAME = @"skyview"; +NSString* MAP_VIEW_INFO_MAP_NAME = @"map"; +NSString* APP_NAME = @"openmap"; + +@interface RNCKakaoMapView () +@end + +@implementation RNCKakaoMapView { + BOOL _isAuthSuccess; + KMViewContainer* _container; + KMController* _controller; + BOOL _shouldForceUpdatePropsForInitialRender; +} + +- (instancetype)initWithFrame:(CGRect)frame { + if (self = [super initWithFrame:frame]) { + static const auto defaultProps = std::make_shared(); + _props = defaultProps; + + _container = [[KMViewContainer alloc] init]; + _controller = [[KMController alloc] initWithViewContainer:_container]; + [_controller clearDiskCache]; + _controller.delegate = self; + + [_controller prepareEngine]; + self.contentView = _container; + } + + return self; +} + +- (void)dealloc { + [_controller pauseEngine]; + [_controller resetEngine]; +} + +- (KakaoMap*)map { + return static_cast([_controller getView:MAP_VIEW_NAME]); +} + +- (void)updateProps:(Props::Shared const&)props oldProps:(Props::Shared const&)oldProps { + BOOL (^check)(BOOL) = ^(BOOL condition) { + if (!self.map) + return NO; + return self->_shouldForceUpdatePropsForInitialRender || condition; + }; + const auto& p = *std::static_pointer_cast(_props); + const auto& n = *std::static_pointer_cast(props); + + _cameraAnimationDuration = n.cameraAnimationDuration; + + if (check(p.baseMapType != n.baseMapType)) + [self.map changeViewInfoWithAppName:APP_NAME viewInfoName:getNsStr(n.baseMapType)]; + if (check(p.overlays != n.overlays)) { + if (has(n.overlays, "hill_shading")) { + [self.map showOverlay:@"hill_shading"]; + } else { + [self.map hideOverlay:@"hill_shading"]; + } + if (has(n.overlays, "roadview_line")) { + [self.map showOverlay:@"roadview_line"]; + } else { + [self.map hideOverlay:@"roadview_line"]; + } + if (has(n.overlays, "bicycle_road")) { + [self.map showOverlay:@"bicycle_road"]; + } else { + [self.map hideOverlay:@"bicycle_road"]; + } + if (has(n.overlays, "hybrid")) { + [self.map showOverlay:@"hybrid"]; + } else { + [self.map hideOverlay:@"hybrid"]; + } + } + + if (check(p.camera != n.camera)) + [self moveCamera:n.camera noAnimation:_shouldForceUpdatePropsForInitialRender]; + if (check(p.cameraMinLevel != n.cameraMinLevel && isValidNumber(n.cameraMinLevel))) + [self.map setCameraMinLevel:n.cameraMinLevel]; + if (check(p.cameraMaxLevel != n.cameraMaxLevel && isValidNumber(n.cameraMaxLevel))) + [self.map setCameraMaxLevel:n.cameraMaxLevel]; + if (check(p.buildingScale != n.buildingScale)) + [self.map setBuildingScale:n.buildingScale]; + if (check(p.poiEnabled != n.poiEnabled)) + [self.map setPoiEnabled:n.poiEnabled]; + if (check(p.poiClickable != n.poiClickable)) + [self.map setPoiClickable:n.poiClickable]; + if (check(p.poiScale != n.poiScale)) + [self.map setPoiScale:n.poiScale == "small" ? PoiScaleTypeSmall + : n.poiScale == "regular" ? PoiScaleTypeRegular + : n.poiScale == "large" ? PoiScaleTypeLarge + : PoiScaleTypeXLarge]; + if (check(p.language != n.language)) + [self.map setLanguage:n.language == "en" ? @"en" : @"ko"]; + + if (check(p.isShowScaleBar != n.isShowScaleBar)) { + if (n.isShowScaleBar) { + [self.map showScaleBar]; + } else { + [self.map hideScaleBar]; + } + } + if (check(p.isShowCompass != n.isShowCompass)) { + if (n.isShowCompass) { + [self.map showCompass]; + } else { + [self.map hideCompass]; + } + } + [super updateProps:props oldProps:oldProps]; + if (self.map && _shouldForceUpdatePropsForInitialRender) { + _shouldForceUpdatePropsForInitialRender = NO; + } +} + +- (void)moveCamera:(const RNCKakaoMapViewCameraStruct&)c noAnimation:(BOOL)noAnimation { + CameraUpdate* update = + [CameraUpdate makeWithTarget:makePoint(c.lat, c.lng) + zoomLevel:getDoubleOrDefault(c.zoomLevel, self.map.zoomLevel) + rotation:getDoubleOrDefault(c.rotation, self.map.rotationAngle) + tilt:getDoubleOrDefault(c.tilt, self.map.tiltAngle) + mapView:self.map]; + + if (self.cameraAnimationDuration != 0 && !noAnimation) { + [self.map animateCameraWithCameraUpdate:update + options:CameraAnimationOptions{ + .autoElevation = YES, + .consecutive = NO, + .durationInMillis = + (NSUInteger)self.cameraAnimationDuration} + callback:^{ + }]; + } else { + [self.map moveCamera:update + callback:^{ + }]; + } +} + +- (void)addViews { + MapviewInfo* info = [[MapviewInfo alloc] initWithViewName:MAP_VIEW_NAME + appName:APP_NAME + viewInfoName:MAP_VIEW_INFO_MAP_NAME + defaultPosition:makePoint(37.402001, 127.108678) + defaultLevel:17 + enabled:YES]; + [_controller addView:info]; +} + +@end + +@implementation RNCKakaoMapView (MapControllerDelegate) +- (void)authenticationSucceeded { + _isAuthSuccess = YES; + if (!_controller.isEngineActive) { + [_controller activateEngine]; + } +} +- (void)authenticationFailed:(NSInteger)errorCode desc:(NSString*)desc { + NSLog(@"[RNCKakaoMapView] authenticationFailed %d, %@ retry...", (int)errorCode, desc); + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), + dispatch_get_main_queue(), ^{ + [self->_controller prepareEngine]; + }); +} + +- (void)addViewSucceeded:(NSString*)viewName viewInfoName:(NSString*)viewInfoName { + if ([viewName isEqualToString:MAP_VIEW_NAME]) { + _shouldForceUpdatePropsForInitialRender = YES; + [self updateProps:_props oldProps:_props]; + } +} +- (void)addViewFailed:(NSString*)viewName viewInfoName:(NSString*)viewInfoName { + NSLog(@"add view failed %@ %@", viewName, viewInfoName); +} +- (void)containerDidResized:(CGSize)size { + self.map.viewRect = CGRectMake(0, 0, size.width, size.height); +} +- (void)viewWillDestroyed:(ViewBase*)view { +} +@end + +@implementation RNCKakaoMapView (ReactNative) + +//- (void)handleCommand:(const NSString *)commandName args:(const NSArray *)args { +//} + +Class RNCKakaoMapViewCls(void) { + return RNCKakaoMapView.class; +} ++ (ComponentDescriptorProvider)componentDescriptorProvider { + return concreteComponentDescriptorProvider(); +} + +@end diff --git a/packages/map/ios/Component/Map/RNCKakaoMapViewManager.mm b/packages/map/ios/Component/Map/RNCKakaoMapViewManager.mm new file mode 100644 index 0000000..cca9d57 --- /dev/null +++ b/packages/map/ios/Component/Map/RNCKakaoMapViewManager.mm @@ -0,0 +1,19 @@ +// +// RNCKakaoMapViewManager.h +// RNCKakaoMap +// +// Created by mj on 5/5/24. +// + +#import +#import +#import + +@interface RNCKakaoMapViewManager : RCTViewManager +@end + +@implementation RNCKakaoMapViewManager + +RCT_EXPORT_MODULE() + +@end diff --git a/packages/map/ios/NativeModule/RNCKakaoMap.h b/packages/map/ios/NativeModule/RNCKakaoMap.h new file mode 100644 index 0000000..45bf3bb --- /dev/null +++ b/packages/map/ios/NativeModule/RNCKakaoMap.h @@ -0,0 +1,7 @@ +#import "RNCKakaoMapSpec.h" +#import +#import + +@interface RNCKakaoMap : NSObject + +@end diff --git a/packages/map/ios/NativeModule/RNCKakaoMap.mm b/packages/map/ios/NativeModule/RNCKakaoMap.mm new file mode 100644 index 0000000..c007163 --- /dev/null +++ b/packages/map/ios/NativeModule/RNCKakaoMap.mm @@ -0,0 +1,19 @@ +#import "RNCKakaoMap.h" + +@implementation RNCKakaoMap + +- (void)initializeKakaoMapSDK:(NSString*)appKey + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + [SDKInitializer InitSDKWithAppKey:appKey]; + resolve(@(42)); +} + +RCT_EXPORT_MODULE() + +- (std::shared_ptr)getTurboModule: + (const facebook::react::ObjCTurboModule::InitParams&)params { + return std::make_shared(params); +} + +@end diff --git a/packages/map/ios/NativeModule/RNCKakaoMapManager.swift b/packages/map/ios/NativeModule/RNCKakaoMapManager.swift new file mode 100644 index 0000000..c516181 --- /dev/null +++ b/packages/map/ios/NativeModule/RNCKakaoMapManager.swift @@ -0,0 +1,7 @@ +// import Foundation +// import React +////import RNCKakaoCore +// +// @objc public class RNCKakaoMapManager: NSObject { +// @objc public static let shared = RNCKakaoMapManager() +// } diff --git a/packages/map/ios/Util/Util.h b/packages/map/ios/Util/Util.h new file mode 100644 index 0000000..a709426 --- /dev/null +++ b/packages/map/ios/Util/Util.h @@ -0,0 +1,97 @@ +// +// Util.h +// RNCKakaoMap +// +// Created by mj on 5/5/24. +// + +#import +#import +#import +#import +#import +#import +#import +#import + +using namespace facebook::react; + +static inline BOOL isValidNumber(NSNumber* value) { + if (!value || [value isKindOfClass:[NSNull class]]) { + return false; + } + + double INVALID = -123123123.0; + + if ([value doubleValue] INVALID - 1) { + return false; + } + + return true; +} + +static inline BOOL isValidNumber(double value) { + return isValidNumber([NSNumber numberWithDouble:value]); +} + +static inline NSNumber* getNumberOrNil(NSNumber* value) { + if (!isValidNumber(value)) { + return nil; + } + + return value; +} + +static inline double getDoubleOrDefault(NSNumber* value, double def) { + if (!isValidNumber(value)) { + return def; + } + + return [value doubleValue]; +} + +static inline double getDoubleOrDefault(double value, double def) { + if (!isValidNumber(value)) { + return def; + } + + return value; +} + +static inline NSString* getNsStr(std::string str) { + return [NSString stringWithUTF8String:str.c_str()]; +} + +static inline BOOL isNotEmptyString(NSString* str) { + return ![str isKindOfClass:[NSNull class]] && str && str.length > 0; +} + +static inline double clamp(double a, double b, double c) { + return MIN(MAX(a, b), c); +} + +static inline UIColor* intToColor(NSInteger intToConvert) { + float alpha = ((intToConvert & 0xFF000000) >> 24) / 255.0; + float red = ((intToConvert & 0xFF0000) >> 16) / 255.0; + float green = ((intToConvert & 0x00FF00) >> 8) / 255.0; + float blue = (intToConvert & 0x0000FF) / 255.0; + return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; +} + +static inline MapPoint* makePoint(double lat, double lng) { + return [[MapPoint alloc] initWithLongitude:lng latitude:lat]; +} + +static inline bool operator==(const RNCKakaoMapViewCameraStruct& c1, + const RNCKakaoMapViewCameraStruct& c2) { + return c1.lat == c2.lat && c1.lng == c2.lng && c1.zoomLevel == c2.zoomLevel && + c1.rotation == c2.rotation && c1.tilt == c2.tilt; +} + +#define all(X) (X).begin(), (X).end() +#define sz(X) (int)(X).size() +#define cntt(X, x) count(all(X), x) +#define has(X, x) (std::find(all((X)), x) != (X).end()) +#define hass(X, x) ((X).find(x) != (X).end()) +#define hasstr(X, x) (!!strstr(&(X)[0], &(x)[0])) +#define uniq(X) std::sort(all(X)), (X).resize(std::unique(all((X))) - (X).begin()) diff --git a/packages/map/package.json b/packages/map/package.json new file mode 100644 index 0000000..4b4d575 --- /dev/null +++ b/packages/map/package.json @@ -0,0 +1,116 @@ +{ + "name": "@react-native-kakao/map", + "description": "React Native Kakao Map SDK", + "version": "2.2.0", + "main": "lib/commonjs/index", + "module": "lib/module/index", + "types": "lib/typescript/src/index.d.ts", + "react-native": "src/index", + "source": "src/index", + "files": [ + "src", + "lib", + "android", + "ios", + "cpp", + "*.podspec", + "!ios/build", + "!android/build", + "!android/gradle", + "!android/gradlew", + "!android/gradlew.bat", + "!android/local.properties", + "!**/__tests__", + "!**/__fixtures__", + "!**/__mocks__", + "!**/.*" + ], + "author": "MJ Studio (https://github.com/mym0404)", + "homepage": "https://rnkakao.dev", + "scripts": { + "test": "jest", + "prepare": "husky", + "release": "./script/release.sh", + "codegen:android": "cd ../../example/android && ./gradlew generateCodegenArtifactsFromSchema", + "codegen:ios": "node ../../example/node_modules/react-native/scripts/generate-codegen-artifacts.js --path example/ --outputPath ../../example/ios", + "codegen": "yarn codegen:android && yarn codegen:ios", + "prepack": "bob build", + "clean": "del-cli android/ lib" + }, + "keywords": [ + "react-native", + "kakao", + "kakao-sdk", + "typescript", + "javascript", + "react", + "expo", + "kakao-navi", + "kakao-navigation", + "kakao-api", + "login", + "auth" + ], + "repository": { + "type": "git", + "url": "https://github.com/mym0404/react-native-kakao.git", + "directory": "packages/navi" + }, + "license": "MIT", + "publishConfig": { + "registry": "https://registry.npmjs.org/", + "access": "public" + }, + "devDependencies": { + "@react-native-kakao/core": "2.2.0", + "@types/invariant": "^2", + "@types/jest": "^29.5.5", + "@types/react": "^18.2.44", + "del-cli": "^5.1.0", + "jest": "^29.7.0", + "react": "18.2.0", + "react-native": "0.74.0", + "react-native-builder-bob": "^0.20.0", + "typescript": "5.1.6" + }, + "peerDependencies": { + "@react-native-kakao/core": "2.2.0", + "react": "*", + "react-native": "*" + }, + "workspaces": [ + "example", + "packages/*" + ], + "jest": { + "preset": "react-native", + "modulePathIgnorePatterns": [ + "/lib/" + ] + }, + "react-native-builder-bob": { + "source": "src", + "output": "lib", + "targets": [ + "commonjs", + "module", + [ + "typescript", + { + "project": "tsconfig.build.json" + } + ] + ] + }, + "codegenConfig": { + "name": "RNCKakaoMapSpec", + "type": "all", + "jsSrcsDir": "src", + "android": { + "javaPackageName": "net.mjstudio.rnkakao.map" + } + }, + "dependencies": { + "@mj-studio/js-util": "1.1.3" + } +} diff --git a/packages/map/src/component/KakaoMapView.tsx b/packages/map/src/component/KakaoMapView.tsx new file mode 100644 index 0000000..53c719e --- /dev/null +++ b/packages/map/src/component/KakaoMapView.tsx @@ -0,0 +1,82 @@ +import { type ForwardedRef, forwardRef, useImperativeHandle, useMemo } from 'react'; +import type { ViewProps } from 'react-native'; +import { kAssert } from '@react-native-kakao/core'; + +import NativeKakaoMapComponent from '../spec/RNCKakaoMapViewNativeComponent'; +import type { Camera } from '../type/type'; +import { Const } from '../util/Const'; +import { nullCamera } from '../util/Util'; + +interface KakaoMapProps extends ViewProps { + baseMapType?: 'map' | 'skyview'; + overlays?: ('hill_shading' | 'roadview_line' | 'bicycle_road' | 'hybrid')[]; + camera?: Camera; + initialCamera?: Camera; + cameraMinLevel?: number; + cameraMaxLevel?: number; + cameraAnimationDuration?: number; + + buildingScale?: number; + poiEnabled?: boolean; + poiClickable?: boolean; + poiScale?: 'small' | 'regular' | 'large' | 'xlarge'; + language?: 'ko' | 'en'; + + isShowScaleBar?: boolean; + isShowCompass?: boolean; +} +interface KakaoMapRef {} + +const KakaoMapView = forwardRef( + ( + { + baseMapType = 'map', + buildingScale = 0.5, + poiEnabled = true, + poiClickable = true, + poiScale = 'regular', + language, + overlays, + camera: cameraProp, + cameraMinLevel = Const.nullNumber, + cameraMaxLevel = Const.nullNumber, + cameraAnimationDuration = 0, + isShowScaleBar = true, + isShowCompass = true, + ...rest + }: KakaoMapProps, + ref: ForwardedRef, + ) => { + kAssert( + buildingScale >= 0 && buildingScale <= 1, + '[KakaoMapView] buildingScale range should be 0..1', + ); + useImperativeHandle(ref, () => ({}), []); + + const camera: Camera = useMemo(() => { + return { ...nullCamera, ...cameraProp }; + }, [cameraProp]); + + return ( + + ); + }, +); + +export { KakaoMapView }; +export type { KakaoMapProps, KakaoMapRef }; diff --git a/packages/map/src/index.ts b/packages/map/src/index.ts new file mode 100644 index 0000000..1cc6a4d --- /dev/null +++ b/packages/map/src/index.ts @@ -0,0 +1,43 @@ +import { Platform } from 'react-native'; + +import type { KakaoMapProps, KakaoMapRef } from './component/KakaoMapView'; +import { KakaoMapView } from './component/KakaoMapView'; +import type { Spec } from './spec/NativeKakaoMap'; + +const LINKING_ERROR = + "The package '@react-native-kakao/map' doesn't seem to be linked. Make sure: \n\n" + + Platform.select({ ios: "- You have run 'pod install'\n", default: '' }) + + '- You rebuilt the app after installing the package\n' + + '- You are not using Expo Go\n'; + +const isTurboModuleEnabled = global.__turboModuleProxy != null; + +if (!isTurboModuleEnabled) { + throw new Error('The package @react-native-kakao/map only supports fabric'); +} + +const Module = require('./spec/NativeKakaoMap').default; + +const Native: Spec = Module + ? Module + : new Proxy( + {}, + { + get() { + throw new Error(LINKING_ERROR); + }, + }, + ); +// todo remove +console.log(Native); + +const KakaoMap = { + initializeKakaoMapSDK: async (appKey: string) => { + return await Native.initializeKakaoMapSDK(appKey); + }, +}; +export default KakaoMapView; +export type KakaoMapAPI = typeof KakaoMap; + +export { KakaoMapView, KakaoMap }; +export type { KakaoMapProps, KakaoMapRef }; diff --git a/packages/map/src/spec/NativeKakaoMap.ts b/packages/map/src/spec/NativeKakaoMap.ts new file mode 100644 index 0000000..06cd790 --- /dev/null +++ b/packages/map/src/spec/NativeKakaoMap.ts @@ -0,0 +1,8 @@ +import type { TurboModule } from 'react-native'; +import { TurboModuleRegistry } from 'react-native'; + +export interface Spec extends TurboModule { + initializeKakaoMapSDK(appKey: string): Promise; +} + +export default TurboModuleRegistry.getEnforcing('RNCKakaoMap'); diff --git a/packages/map/src/spec/RNCKakaoMapViewNativeComponent.ts b/packages/map/src/spec/RNCKakaoMapViewNativeComponent.ts new file mode 100644 index 0000000..85a6f84 --- /dev/null +++ b/packages/map/src/spec/RNCKakaoMapViewNativeComponent.ts @@ -0,0 +1,38 @@ +import type { ViewProps } from 'react-native'; +import type { Double } from 'react-native/Libraries/Types/CodegenTypes'; +import codegenNativeCommands from 'react-native/Libraries/Utilities/codegenNativeCommands'; +import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent'; + +interface Camera { + lat: Double; + lng: Double; + tilt?: Double; + rotation?: Double; + zoomLevel?: Double; +} +interface Props extends ViewProps { + buildingScale?: Double; + overlays?: ReadonlyArray; + poiEnabled?: boolean; + poiClickable?: boolean; + poiScale?: string; + language?: string; + baseMapType?: string; + camera?: Camera; + initialCamera?: Camera; + cameraMinLevel?: Double; + cameraMaxLevel?: Double; + cameraAnimationDuration?: Double; + + isShowScaleBar?: boolean; + isShowCompass?: boolean; +} + +// type ComponentType = HostComponent; + +interface NativeCommands {} + +export default codegenNativeComponent('RNCKakaoMapView'); +export const Commands: NativeCommands = codegenNativeCommands({ + supportedCommands: [], +}); diff --git a/packages/map/src/type/type.ts b/packages/map/src/type/type.ts new file mode 100644 index 0000000..bd55a4d --- /dev/null +++ b/packages/map/src/type/type.ts @@ -0,0 +1,7 @@ +export interface Camera { + lat: number; + lng: number; + tilt?: number; + rotation?: number; + zoomLevel?: number; +} diff --git a/packages/map/src/util/Const.ts b/packages/map/src/util/Const.ts new file mode 100644 index 0000000..eb24892 --- /dev/null +++ b/packages/map/src/util/Const.ts @@ -0,0 +1,7 @@ +export const Const = { + /** + * ios: codegen generate struct number fields with default value zero. + * in some cases, we should check it is invalid value instead of checking is zero. + */ + nullNumber: -123123123, +} satisfies (Record & {}) & {}; diff --git a/packages/map/src/util/Util.ts b/packages/map/src/util/Util.ts new file mode 100644 index 0000000..2234ec4 --- /dev/null +++ b/packages/map/src/util/Util.ts @@ -0,0 +1,11 @@ +import type { Camera } from '../type/type'; + +import { Const } from './Const'; + +export const nullCamera: Required = { + lat: Const.nullNumber, + lng: Const.nullNumber, + tilt: Const.nullNumber, + rotation: Const.nullNumber, + zoomLevel: Const.nullNumber, +}; diff --git a/packages/map/tsconfig.build.json b/packages/map/tsconfig.build.json new file mode 100644 index 0000000..543a787 --- /dev/null +++ b/packages/map/tsconfig.build.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig", + "compilerOptions": { + "paths": {} + } +} diff --git a/packages/map/tsconfig.json b/packages/map/tsconfig.json new file mode 100644 index 0000000..56626c3 --- /dev/null +++ b/packages/map/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "../../tsconfig", + "references": [ + { + "path": "../core" + } + ], + "compilerOptions": { + "rootDir": ".", + "outDir": "./lib/typescript" + } +} diff --git a/yarn.lock b/yarn.lock index 7e2c2b3..73457cf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4390,6 +4390,18 @@ __metadata: languageName: node linkType: hard +"@react-native-community/cli-clean@npm:13.6.6": + version: 13.6.6 + resolution: "@react-native-community/cli-clean@npm:13.6.6" + dependencies: + "@react-native-community/cli-tools": "npm:13.6.6" + chalk: "npm:^4.1.2" + execa: "npm:^5.0.0" + fast-glob: "npm:^3.3.2" + checksum: 10/430d624148d3cb55c340958792ead681bd5d005901b7bc59afc8908d780ebece549475645321a177c427f6e99fe695931af01017e808f03f2b402b55761b2592 + languageName: node + linkType: hard + "@react-native-community/cli-config@npm:12.3.6": version: 12.3.6 resolution: "@react-native-community/cli-config@npm:12.3.6" @@ -4418,6 +4430,20 @@ __metadata: languageName: node linkType: hard +"@react-native-community/cli-config@npm:13.6.6": + version: 13.6.6 + resolution: "@react-native-community/cli-config@npm:13.6.6" + dependencies: + "@react-native-community/cli-tools": "npm:13.6.6" + chalk: "npm:^4.1.2" + cosmiconfig: "npm:^5.1.0" + deepmerge: "npm:^4.3.0" + fast-glob: "npm:^3.3.2" + joi: "npm:^17.2.1" + checksum: 10/66d2b1df2049ab72fc5925926bbffa6ea8e8b5088d67b6a53699c4c2afcc686d2663e7a74e72b0d47d1997a3f72d6076d1d84292204f220d01fa386eeab911f5 + languageName: node + linkType: hard + "@react-native-community/cli-debugger-ui@npm:12.3.6": version: 12.3.6 resolution: "@react-native-community/cli-debugger-ui@npm:12.3.6" @@ -4436,6 +4462,15 @@ __metadata: languageName: node linkType: hard +"@react-native-community/cli-debugger-ui@npm:13.6.6": + version: 13.6.6 + resolution: "@react-native-community/cli-debugger-ui@npm:13.6.6" + dependencies: + serve-static: "npm:^1.13.1" + checksum: 10/90b2cf006b1635abaa4cb7ead1a9784e05bd33bd97eac26c662dfe5934c4fabc4802f94a9c2a1f6ce71f400efad237ec476762e368b9f4505f1d822947821367 + languageName: node + linkType: hard + "@react-native-community/cli-doctor@npm:12.3.6": version: 12.3.6 resolution: "@react-native-community/cli-doctor@npm:12.3.6" @@ -4485,6 +4520,31 @@ __metadata: languageName: node linkType: hard +"@react-native-community/cli-doctor@npm:13.6.6": + version: 13.6.6 + resolution: "@react-native-community/cli-doctor@npm:13.6.6" + dependencies: + "@react-native-community/cli-config": "npm:13.6.6" + "@react-native-community/cli-platform-android": "npm:13.6.6" + "@react-native-community/cli-platform-apple": "npm:13.6.6" + "@react-native-community/cli-platform-ios": "npm:13.6.6" + "@react-native-community/cli-tools": "npm:13.6.6" + chalk: "npm:^4.1.2" + command-exists: "npm:^1.2.8" + deepmerge: "npm:^4.3.0" + envinfo: "npm:^7.10.0" + execa: "npm:^5.0.0" + hermes-profile-transformer: "npm:^0.0.6" + node-stream-zip: "npm:^1.9.1" + ora: "npm:^5.4.1" + semver: "npm:^7.5.2" + strip-ansi: "npm:^5.2.0" + wcwidth: "npm:^1.0.1" + yaml: "npm:^2.2.1" + checksum: 10/d55c51e1ee39bf7fd201a5a0ba22246dee4c0ba00fcf39bacbe682beda1f982ba1dd55b91fb0567eefb37d8ff86a67e622742a538bb89adbd4bdebf40a14a635 + languageName: node + linkType: hard + "@react-native-community/cli-hermes@npm:12.3.6": version: 12.3.6 resolution: "@react-native-community/cli-hermes@npm:12.3.6" @@ -4509,6 +4569,18 @@ __metadata: languageName: node linkType: hard +"@react-native-community/cli-hermes@npm:13.6.6": + version: 13.6.6 + resolution: "@react-native-community/cli-hermes@npm:13.6.6" + dependencies: + "@react-native-community/cli-platform-android": "npm:13.6.6" + "@react-native-community/cli-tools": "npm:13.6.6" + chalk: "npm:^4.1.2" + hermes-profile-transformer: "npm:^0.0.6" + checksum: 10/8c7645e39914491d4490480655255826b5b0083223dd8bc07200eb553d0285b1faf8388820710a83874a0ae830aef581c33a70ec6ec9bc8b11bf3b3da5251f12 + languageName: node + linkType: hard + "@react-native-community/cli-platform-android@npm:12.3.6": version: 12.3.6 resolution: "@react-native-community/cli-platform-android@npm:12.3.6" @@ -4537,6 +4609,20 @@ __metadata: languageName: node linkType: hard +"@react-native-community/cli-platform-android@npm:13.6.6": + version: 13.6.6 + resolution: "@react-native-community/cli-platform-android@npm:13.6.6" + dependencies: + "@react-native-community/cli-tools": "npm:13.6.6" + chalk: "npm:^4.1.2" + execa: "npm:^5.0.0" + fast-glob: "npm:^3.3.2" + fast-xml-parser: "npm:^4.2.4" + logkitty: "npm:^0.7.1" + checksum: 10/4326695026cbc99ab1f55a527f2cf905fc522ed31e5c68cfd03f81ed92746b958df9cad01d050af0bb0d5d557585c0e3b0793f7d7fffe46b99a4c1f64d53556f + languageName: node + linkType: hard + "@react-native-community/cli-platform-apple@npm:13.6.4": version: 13.6.4 resolution: "@react-native-community/cli-platform-apple@npm:13.6.4" @@ -4551,6 +4637,20 @@ __metadata: languageName: node linkType: hard +"@react-native-community/cli-platform-apple@npm:13.6.6": + version: 13.6.6 + resolution: "@react-native-community/cli-platform-apple@npm:13.6.6" + dependencies: + "@react-native-community/cli-tools": "npm:13.6.6" + chalk: "npm:^4.1.2" + execa: "npm:^5.0.0" + fast-glob: "npm:^3.3.2" + fast-xml-parser: "npm:^4.0.12" + ora: "npm:^5.4.1" + checksum: 10/c776ec3583cd75a70c42c16c534e8977ab807d266b8dc1975d345c0f4c24f63cf001f75864c2297ed3234b1b72b55834caa158792b9b1cb0daede88cc9cd1d56 + languageName: node + linkType: hard + "@react-native-community/cli-platform-ios@npm:12.3.6": version: 12.3.6 resolution: "@react-native-community/cli-platform-ios@npm:12.3.6" @@ -4574,6 +4674,15 @@ __metadata: languageName: node linkType: hard +"@react-native-community/cli-platform-ios@npm:13.6.6": + version: 13.6.6 + resolution: "@react-native-community/cli-platform-ios@npm:13.6.6" + dependencies: + "@react-native-community/cli-platform-apple": "npm:13.6.6" + checksum: 10/bcaf4dc06cb330d1538962afbcf1e9046cc0dc09f7fec16c0e68ea5575b9f215ab2dfc98190cf4333f52f647cb960c9593465bd0ab500122dfda03968a40b16c + languageName: node + linkType: hard + "@react-native-community/cli-plugin-metro@npm:12.3.6": version: 12.3.6 resolution: "@react-native-community/cli-plugin-metro@npm:12.3.6" @@ -4615,6 +4724,23 @@ __metadata: languageName: node linkType: hard +"@react-native-community/cli-server-api@npm:13.6.6": + version: 13.6.6 + resolution: "@react-native-community/cli-server-api@npm:13.6.6" + dependencies: + "@react-native-community/cli-debugger-ui": "npm:13.6.6" + "@react-native-community/cli-tools": "npm:13.6.6" + compression: "npm:^1.7.1" + connect: "npm:^3.6.5" + errorhandler: "npm:^1.5.1" + nocache: "npm:^3.0.1" + pretty-format: "npm:^26.6.2" + serve-static: "npm:^1.13.1" + ws: "npm:^6.2.2" + checksum: 10/48256f9b09d7e80e856ed986eeb92ea2ebd0a5b5a87383752283e8444e192ea8b55eb0890ac708a5922982551a05a2cbbf905c1665b155505eb4430a5384ccf1 + languageName: node + linkType: hard + "@react-native-community/cli-tools@npm:12.3.6": version: 12.3.6 resolution: "@react-native-community/cli-tools@npm:12.3.6" @@ -4652,6 +4778,25 @@ __metadata: languageName: node linkType: hard +"@react-native-community/cli-tools@npm:13.6.6": + version: 13.6.6 + resolution: "@react-native-community/cli-tools@npm:13.6.6" + dependencies: + appdirsjs: "npm:^1.2.4" + chalk: "npm:^4.1.2" + execa: "npm:^5.0.0" + find-up: "npm:^5.0.0" + mime: "npm:^2.4.1" + node-fetch: "npm:^2.6.0" + open: "npm:^6.2.0" + ora: "npm:^5.4.1" + semver: "npm:^7.5.2" + shell-quote: "npm:^1.7.3" + sudo-prompt: "npm:^9.0.0" + checksum: 10/fe82639e00b46406f410c85fb9a67e6120e22996e66b819f62f9e0f2e10e9407d6736536374d82be7b3f17a9468cbeab995e7c57961540441a96394d437fa0ea + languageName: node + linkType: hard + "@react-native-community/cli-types@npm:12.3.6": version: 12.3.6 resolution: "@react-native-community/cli-types@npm:12.3.6" @@ -4670,6 +4815,15 @@ __metadata: languageName: node linkType: hard +"@react-native-community/cli-types@npm:13.6.6": + version: 13.6.6 + resolution: "@react-native-community/cli-types@npm:13.6.6" + dependencies: + joi: "npm:^17.2.1" + checksum: 10/f2c8ffcd2e68df552687d687cab663b5c6bf9c2b807ba156eecde109ffd08cad5aa179aeb482d6922a8adce59e14deba67e7916ed077da8986a0ab7a0a9a49c9 + languageName: node + linkType: hard + "@react-native-community/cli@npm:12.3.6": version: 12.3.6 resolution: "@react-native-community/cli@npm:12.3.6" @@ -4725,6 +4879,33 @@ __metadata: languageName: node linkType: hard +"@react-native-community/cli@npm:13.6.6": + version: 13.6.6 + resolution: "@react-native-community/cli@npm:13.6.6" + dependencies: + "@react-native-community/cli-clean": "npm:13.6.6" + "@react-native-community/cli-config": "npm:13.6.6" + "@react-native-community/cli-debugger-ui": "npm:13.6.6" + "@react-native-community/cli-doctor": "npm:13.6.6" + "@react-native-community/cli-hermes": "npm:13.6.6" + "@react-native-community/cli-server-api": "npm:13.6.6" + "@react-native-community/cli-tools": "npm:13.6.6" + "@react-native-community/cli-types": "npm:13.6.6" + chalk: "npm:^4.1.2" + commander: "npm:^9.4.1" + deepmerge: "npm:^4.3.0" + execa: "npm:^5.0.0" + find-up: "npm:^4.1.0" + fs-extra: "npm:^8.1.0" + graceful-fs: "npm:^4.1.3" + prompts: "npm:^2.4.2" + semver: "npm:^7.5.2" + bin: + react-native: build/bin.js + checksum: 10/a0a27bb471107a818f56a41969bf4298b9bcba5054ac5a6258c2d6b698797f3acfbef7d9c18960706bcce39f751adcae5a8d7a3ac908d22eefa4b88de82db46d + languageName: node + linkType: hard + "@react-native-kakao/channel@workspace:packages/channel": version: 0.0.0-use.local resolution: "@react-native-kakao/channel@workspace:packages/channel" @@ -4770,6 +4951,28 @@ __metadata: languageName: unknown linkType: soft +"@react-native-kakao/map@workspace:packages/map": + version: 0.0.0-use.local + resolution: "@react-native-kakao/map@workspace:packages/map" + dependencies: + "@mj-studio/js-util": "npm:1.1.3" + "@react-native-kakao/core": "npm:2.2.0" + "@types/invariant": "npm:^2" + "@types/jest": "npm:^29.5.5" + "@types/react": "npm:^18.2.44" + del-cli: "npm:^5.1.0" + jest: "npm:^29.7.0" + react: "npm:18.2.0" + react-native: "npm:0.74.0" + react-native-builder-bob: "npm:^0.20.0" + typescript: "npm:5.1.6" + peerDependencies: + "@react-native-kakao/core": 2.2.0 + react: "*" + react-native: "*" + languageName: unknown + linkType: soft + "@react-native-kakao/navi@workspace:packages/navi": version: 0.0.0-use.local resolution: "@react-native-kakao/navi@workspace:packages/navi" @@ -4887,7 +5090,14 @@ __metadata: languageName: node linkType: hard -"@react-native/assets-registry@npm:0.74.82, @react-native/assets-registry@npm:~0.74.82": +"@react-native/assets-registry@npm:0.74.83": + version: 0.74.83 + resolution: "@react-native/assets-registry@npm:0.74.83" + checksum: 10/930d97c5c595d63810cda11f87125bfc11e91337a6f98cd33f72fcf1279fb016491b86232ed0523e2432d2a17f7a9f2abbe28547e70da42c6b341768a399defd + languageName: node + linkType: hard + +"@react-native/assets-registry@npm:~0.74.82": version: 0.74.82 resolution: "@react-native/assets-registry@npm:0.74.82" checksum: 10/507175b593a90cb881ae730d69247e1942f066f11efa0aba33c5f59ba85f41f0a9bb6af64fad2d38dec22dc340bad42df6bb9c2f54c6f05dcd9ab848b7a582e7 @@ -4921,6 +5131,15 @@ __metadata: languageName: node linkType: hard +"@react-native/babel-plugin-codegen@npm:0.74.83": + version: 0.74.83 + resolution: "@react-native/babel-plugin-codegen@npm:0.74.83" + dependencies: + "@react-native/codegen": "npm:0.74.83" + checksum: 10/c82bf76611e479723c7722a1aa7aa244f8e496c500bbd3894ce182a898173671b3443e528eb843b5a77320fdcf8798cc66e4ad025dc5ac98be3b4ab680a31c6c + languageName: node + linkType: hard + "@react-native/babel-preset@npm:0.73.21": version: 0.73.21 resolution: "@react-native/babel-preset@npm:0.73.21" @@ -4973,7 +5192,7 @@ __metadata: languageName: node linkType: hard -"@react-native/babel-preset@npm:0.74.81, @react-native/babel-preset@npm:^0.74.81": +"@react-native/babel-preset@npm:0.74.81": version: 0.74.81 resolution: "@react-native/babel-preset@npm:0.74.81" dependencies: @@ -5026,7 +5245,60 @@ __metadata: languageName: node linkType: hard -"@react-native/babel-preset@npm:0.74.82, @react-native/babel-preset@npm:~0.74.82": +"@react-native/babel-preset@npm:0.74.83": + version: 0.74.83 + resolution: "@react-native/babel-preset@npm:0.74.83" + dependencies: + "@babel/core": "npm:^7.20.0" + "@babel/plugin-proposal-async-generator-functions": "npm:^7.0.0" + "@babel/plugin-proposal-class-properties": "npm:^7.18.0" + "@babel/plugin-proposal-export-default-from": "npm:^7.0.0" + "@babel/plugin-proposal-logical-assignment-operators": "npm:^7.18.0" + "@babel/plugin-proposal-nullish-coalescing-operator": "npm:^7.18.0" + "@babel/plugin-proposal-numeric-separator": "npm:^7.0.0" + "@babel/plugin-proposal-object-rest-spread": "npm:^7.20.0" + "@babel/plugin-proposal-optional-catch-binding": "npm:^7.0.0" + "@babel/plugin-proposal-optional-chaining": "npm:^7.20.0" + "@babel/plugin-syntax-dynamic-import": "npm:^7.8.0" + "@babel/plugin-syntax-export-default-from": "npm:^7.0.0" + "@babel/plugin-syntax-flow": "npm:^7.18.0" + "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.0.0" + "@babel/plugin-syntax-optional-chaining": "npm:^7.0.0" + "@babel/plugin-transform-arrow-functions": "npm:^7.0.0" + "@babel/plugin-transform-async-to-generator": "npm:^7.20.0" + "@babel/plugin-transform-block-scoping": "npm:^7.0.0" + "@babel/plugin-transform-classes": "npm:^7.0.0" + "@babel/plugin-transform-computed-properties": "npm:^7.0.0" + "@babel/plugin-transform-destructuring": "npm:^7.20.0" + "@babel/plugin-transform-flow-strip-types": "npm:^7.20.0" + "@babel/plugin-transform-function-name": "npm:^7.0.0" + "@babel/plugin-transform-literals": "npm:^7.0.0" + "@babel/plugin-transform-modules-commonjs": "npm:^7.0.0" + "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.0.0" + "@babel/plugin-transform-parameters": "npm:^7.0.0" + "@babel/plugin-transform-private-methods": "npm:^7.22.5" + "@babel/plugin-transform-private-property-in-object": "npm:^7.22.11" + "@babel/plugin-transform-react-display-name": "npm:^7.0.0" + "@babel/plugin-transform-react-jsx": "npm:^7.0.0" + "@babel/plugin-transform-react-jsx-self": "npm:^7.0.0" + "@babel/plugin-transform-react-jsx-source": "npm:^7.0.0" + "@babel/plugin-transform-runtime": "npm:^7.0.0" + "@babel/plugin-transform-shorthand-properties": "npm:^7.0.0" + "@babel/plugin-transform-spread": "npm:^7.0.0" + "@babel/plugin-transform-sticky-regex": "npm:^7.0.0" + "@babel/plugin-transform-typescript": "npm:^7.5.0" + "@babel/plugin-transform-unicode-regex": "npm:^7.0.0" + "@babel/template": "npm:^7.0.0" + "@react-native/babel-plugin-codegen": "npm:0.74.83" + babel-plugin-transform-flow-enums: "npm:^0.0.2" + react-refresh: "npm:^0.14.0" + peerDependencies: + "@babel/core": "*" + checksum: 10/3f8fb2ebddb52201c5be64550f811f161cdab4e3416c9d411715414a38ea706e8d1587aee1909bf2ee7293c59e171f22ad90472d1a26b76ac7042695e23fa813 + languageName: node + linkType: hard + +"@react-native/babel-preset@npm:~0.74.82": version: 0.74.82 resolution: "@react-native/babel-preset@npm:0.74.82" dependencies: @@ -5130,6 +5402,23 @@ __metadata: languageName: node linkType: hard +"@react-native/codegen@npm:0.74.83": + version: 0.74.83 + resolution: "@react-native/codegen@npm:0.74.83" + dependencies: + "@babel/parser": "npm:^7.20.0" + glob: "npm:^7.1.1" + hermes-parser: "npm:0.19.1" + invariant: "npm:^2.2.4" + jscodeshift: "npm:^0.14.0" + mkdirp: "npm:^0.5.1" + nullthrows: "npm:^1.1.1" + peerDependencies: + "@babel/preset-env": ^7.1.6 + checksum: 10/8f8e546a67786b92c86b17f411f3304ef6e13616abf1b0362f1bcce0bb79dc4f0cd5f65901f6eddb9dff517c2aac5a96cafb70385940a585540242e40be1af40 + languageName: node + linkType: hard + "@react-native/community-cli-plugin@npm:0.73.17": version: 0.73.17 resolution: "@react-native/community-cli-plugin@npm:0.73.17" @@ -5169,14 +5458,14 @@ __metadata: languageName: node linkType: hard -"@react-native/community-cli-plugin@npm:0.74.82": - version: 0.74.82 - resolution: "@react-native/community-cli-plugin@npm:0.74.82" +"@react-native/community-cli-plugin@npm:0.74.83": + version: 0.74.83 + resolution: "@react-native/community-cli-plugin@npm:0.74.83" dependencies: - "@react-native-community/cli-server-api": "npm:13.6.4" - "@react-native-community/cli-tools": "npm:13.6.4" - "@react-native/dev-middleware": "npm:0.74.82" - "@react-native/metro-babel-transformer": "npm:0.74.82" + "@react-native-community/cli-server-api": "npm:13.6.6" + "@react-native-community/cli-tools": "npm:13.6.6" + "@react-native/dev-middleware": "npm:0.74.83" + "@react-native/metro-babel-transformer": "npm:0.74.83" chalk: "npm:^4.0.0" execa: "npm:^5.1.1" metro: "npm:^0.80.3" @@ -5185,7 +5474,7 @@ __metadata: node-fetch: "npm:^2.2.0" querystring: "npm:^0.2.1" readline: "npm:^1.3.0" - checksum: 10/13023e7844d9c7fef494769ee9f477c6ecbeae9ec8a20851609a3af9bbaae9c0286040e69fde9880f1e30b0db23e8f4b7fc3129c4506940f8643559dd5e4c9ac + checksum: 10/8fb00b974b400246d15047df456d0c651d5ee2a94e3b81809de538b81b6ca9e9f290a69db8daa602161b0264f269d74296615943dc41078a1cbbc2c9627efd15 languageName: node linkType: hard @@ -5203,10 +5492,10 @@ __metadata: languageName: node linkType: hard -"@react-native/debugger-frontend@npm:0.74.82": - version: 0.74.82 - resolution: "@react-native/debugger-frontend@npm:0.74.82" - checksum: 10/0787301f7df4f59e5f964ca0b83c0bfe52656cb059bbcf86564387607cfb510114ed8412c0021600c2f7edb9d7fe772de952e363872e36c83a2869dc1d94813e +"@react-native/debugger-frontend@npm:0.74.83": + version: 0.74.83 + resolution: "@react-native/debugger-frontend@npm:0.74.83" + checksum: 10/16a82c9e2170379ee94a143c5f64347abe3b03678bc4077512296f8ea2fa2d86197beb829b7c9bdece5784709d504972be15b20e6ab856e1b0e91193e06d7121 languageName: node linkType: hard @@ -5250,12 +5539,12 @@ __metadata: languageName: node linkType: hard -"@react-native/dev-middleware@npm:0.74.82": - version: 0.74.82 - resolution: "@react-native/dev-middleware@npm:0.74.82" +"@react-native/dev-middleware@npm:0.74.83": + version: 0.74.83 + resolution: "@react-native/dev-middleware@npm:0.74.83" dependencies: "@isaacs/ttlcache": "npm:^1.4.1" - "@react-native/debugger-frontend": "npm:0.74.82" + "@react-native/debugger-frontend": "npm:0.74.83" "@rnx-kit/chromium-edge-launcher": "npm:^1.0.0" chrome-launcher: "npm:^0.15.2" connect: "npm:^3.6.5" @@ -5267,7 +5556,7 @@ __metadata: serve-static: "npm:^1.13.1" temp-dir: "npm:^2.0.0" ws: "npm:^6.2.2" - checksum: 10/8fa66342f9a06c32ebcc702e3eeeadf704fe0cf52afb04477b381c56ae2b8489dc285d0ab13b5e1c9e24a56e090c1915f72e42a249725234194ca98bbaf971d9 + checksum: 10/1c69f40dab2729d38adca0a80af5dee942322f667025541cb11222e1d3e8071933b3f48d5a9765be4502a056d9b51502fabfeac1092543781e1c6106c3e202a6 languageName: node linkType: hard @@ -5316,10 +5605,10 @@ __metadata: languageName: node linkType: hard -"@react-native/gradle-plugin@npm:0.74.82": - version: 0.74.82 - resolution: "@react-native/gradle-plugin@npm:0.74.82" - checksum: 10/9a02680b7ac14f0a9b101c59048dc20aedffca9cb89409da8bbb7ada9ac595bc4b48abc4adfb7ebbab3251d59e60fcd962cb9bde28eb5b3e0038c872cb3c8bb5 +"@react-native/gradle-plugin@npm:0.74.83": + version: 0.74.83 + resolution: "@react-native/gradle-plugin@npm:0.74.83" + checksum: 10/377c2b14dd33845515f8c44d80c12ca20fc8d84ad30671ad141ce4b014f84c175f4ea958d0adf634a6579912e99d406a6e0fdd6f2cd7b1a4c640ed75c9aeed45 languageName: node linkType: hard @@ -5337,10 +5626,10 @@ __metadata: languageName: node linkType: hard -"@react-native/js-polyfills@npm:0.74.82": - version: 0.74.82 - resolution: "@react-native/js-polyfills@npm:0.74.82" - checksum: 10/50d24a42203689e47eb7c15ff5f4fa0b34d9c75c08d9b2baf852ad486b5699b467f82a3f79c21262f724eabab53c01b7d4033ceba21bc78e99eaa649f2c88f0c +"@react-native/js-polyfills@npm:0.74.83": + version: 0.74.83 + resolution: "@react-native/js-polyfills@npm:0.74.83" + checksum: 10/1918ae0f17d4bc7feea532e56b055a0f3bc7d97e0090f70850f1ecc5f92093a5433e9d9bb6ada308acf9d6695764c84fccd657d2fd6feb538b972af25e241aa6 languageName: node linkType: hard @@ -5372,29 +5661,29 @@ __metadata: languageName: node linkType: hard -"@react-native/metro-babel-transformer@npm:0.74.82": - version: 0.74.82 - resolution: "@react-native/metro-babel-transformer@npm:0.74.82" +"@react-native/metro-babel-transformer@npm:0.74.83": + version: 0.74.83 + resolution: "@react-native/metro-babel-transformer@npm:0.74.83" dependencies: "@babel/core": "npm:^7.20.0" - "@react-native/babel-preset": "npm:0.74.82" + "@react-native/babel-preset": "npm:0.74.83" hermes-parser: "npm:0.19.1" nullthrows: "npm:^1.1.1" peerDependencies: "@babel/core": "*" - checksum: 10/bb8e6c25e01a4c6c74ae329fdf0b2660548e913986f53abc7033cc805526087ea0b9ec14963e17b8d52d6479f275c2053f9bfa9c12101d523871c6ade799d724 + checksum: 10/40b392eb90de8267ecf983a53752e37a57f93fdf9e384a09c8b0ff5ec8cbf4393bd8093608222e4850d746376c3ea48f2983bfa82d0696ceb9815fd25c5fe394 languageName: node linkType: hard -"@react-native/metro-config@npm:^0.74.81": - version: 0.74.81 - resolution: "@react-native/metro-config@npm:0.74.81" +"@react-native/metro-config@npm:0.74.83": + version: 0.74.83 + resolution: "@react-native/metro-config@npm:0.74.83" dependencies: - "@react-native/js-polyfills": "npm:0.74.81" - "@react-native/metro-babel-transformer": "npm:0.74.81" + "@react-native/js-polyfills": "npm:0.74.83" + "@react-native/metro-babel-transformer": "npm:0.74.83" metro-config: "npm:^0.80.3" metro-runtime: "npm:^0.80.3" - checksum: 10/268221229071320714689186ef27c982fcafe23ad4345633e94a8fcecedf5266f84647cab25da8f8a34d6f469f12222a922c94853fa8e3c9352806f05326f712 + checksum: 10/547f879453fa16b0c07f098c9639b62d20b662b84c46eb0d76f82241ec8d88c54e07fcfaeb4ca20340f5697480866bb904929cd38cd3d6684ef2b5455c82aff7 languageName: node linkType: hard @@ -5419,17 +5708,24 @@ __metadata: languageName: node linkType: hard -"@react-native/normalize-colors@npm:0.74.82, @react-native/normalize-colors@npm:^0.74.1": +"@react-native/normalize-colors@npm:0.74.83": + version: 0.74.83 + resolution: "@react-native/normalize-colors@npm:0.74.83" + checksum: 10/2784c3b119cc022a342530027f891a158e965291d79cc990a22b67c9e5f2a4f28043e19086a6ec9351e8df09173072104cad84c84a3de32ec94be99cc59c2cb1 + languageName: node + linkType: hard + +"@react-native/normalize-colors@npm:^0.74.1": version: 0.74.82 resolution: "@react-native/normalize-colors@npm:0.74.82" checksum: 10/023fa7ea0cad668ac9966e76b48e85eeadcba844dd2db313676dff6f26005c11edd36cf635e202ae6a081f1fcf1b3f4d02ed7acabd8e46d6d539a15e1009be91 languageName: node linkType: hard -"@react-native/typescript-config@npm:^0.74.81": - version: 0.74.81 - resolution: "@react-native/typescript-config@npm:0.74.81" - checksum: 10/8ff757deced1270181e7b9015066b87b178d5a7cc8cd735c5bcc17bae91fec9548900d6d6d0e806a9ca0ec683e898f2a2927b77b5e77548c6826d956e0f23068 +"@react-native/typescript-config@npm:0.74.83": + version: 0.74.83 + resolution: "@react-native/typescript-config@npm:0.74.83" + checksum: 10/318ef304611bc7e42415327916bce358df1c7bc9e971e129d263166edf1179c42d64e5b91784fa28db13d5218ae2c87dc3e2214582673ba2b0f52e8f8615695b languageName: node linkType: hard @@ -5462,9 +5758,9 @@ __metadata: languageName: node linkType: hard -"@react-native/virtualized-lists@npm:0.74.82": - version: 0.74.82 - resolution: "@react-native/virtualized-lists@npm:0.74.82" +"@react-native/virtualized-lists@npm:0.74.83": + version: 0.74.83 + resolution: "@react-native/virtualized-lists@npm:0.74.83" dependencies: invariant: "npm:^2.2.4" nullthrows: "npm:^1.1.1" @@ -5475,7 +5771,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10/33119b7c9d98d907570415e72a4cedbd4a5c5637990f015fb6ccb53a7a1fd1f1653eaf697db17a30a858f6a992fe362cf7de998f3846ca407d03f563da6ca6ef + checksum: 10/aedc098372a303845e5f13f1c8745499ca17f26676a84deee9cdc07fb61027ba37036bb99431ab4af796986645d1acaf3570e43b0bacc52ff763eefcf76edb66 languageName: node linkType: hard @@ -15281,9 +15577,9 @@ __metadata: "@mj-studio/js-util": "npm:^1.0.34" "@mj-studio/react-util": "npm:^0.0.20" "@react-native-styled-system/core": "npm:~1.2.1" - "@react-native/babel-preset": "npm:^0.74.81" - "@react-native/metro-config": "npm:^0.74.81" - "@react-native/typescript-config": "npm:^0.74.81" + "@react-native/babel-preset": "npm:0.74.83" + "@react-native/metro-config": "npm:0.74.83" + "@react-native/typescript-config": "npm:0.74.83" babel-plugin-module-resolver: "npm:^5.0.0" expo: "npm:51.0.0-preview.10" expo-build-properties: "npm:~0.12.0" @@ -15293,7 +15589,7 @@ __metadata: expo-router: "npm:3.5.4" expo-status-bar: "npm:1.12.1" react: "npm:18.2.0" - react-native: "npm:0.74.1-rc.0" + react-native: "npm:0.74.1" react-native-flash-message: "npm:^0.4.2" react-native-safe-area-context: "npm:^4.10.1" react-native-screens: "npm:^3.31.1" @@ -19959,21 +20255,21 @@ __metadata: languageName: node linkType: hard -"react-native@npm:0.74.1-rc.0": - version: 0.74.1-rc.0 - resolution: "react-native@npm:0.74.1-rc.0" +"react-native@npm:0.74.1": + version: 0.74.1 + resolution: "react-native@npm:0.74.1" dependencies: "@jest/create-cache-key-function": "npm:^29.6.3" - "@react-native-community/cli": "npm:13.6.4" - "@react-native-community/cli-platform-android": "npm:13.6.4" - "@react-native-community/cli-platform-ios": "npm:13.6.4" - "@react-native/assets-registry": "npm:0.74.82" - "@react-native/codegen": "npm:0.74.82" - "@react-native/community-cli-plugin": "npm:0.74.82" - "@react-native/gradle-plugin": "npm:0.74.82" - "@react-native/js-polyfills": "npm:0.74.82" - "@react-native/normalize-colors": "npm:0.74.82" - "@react-native/virtualized-lists": "npm:0.74.82" + "@react-native-community/cli": "npm:13.6.6" + "@react-native-community/cli-platform-android": "npm:13.6.6" + "@react-native-community/cli-platform-ios": "npm:13.6.6" + "@react-native/assets-registry": "npm:0.74.83" + "@react-native/codegen": "npm:0.74.83" + "@react-native/community-cli-plugin": "npm:0.74.83" + "@react-native/gradle-plugin": "npm:0.74.83" + "@react-native/js-polyfills": "npm:0.74.83" + "@react-native/normalize-colors": "npm:0.74.83" + "@react-native/virtualized-lists": "npm:0.74.83" abort-controller: "npm:^3.0.0" anser: "npm:^1.4.9" ansi-regex: "npm:^5.0.0" @@ -20008,7 +20304,7 @@ __metadata: optional: true bin: react-native: cli.js - checksum: 10/1e51e442ce6ca8d1034b5b9b4dabe59569c4b2f970d6502023a91f954d6ba60a3379fe67eebb48c36228918f738a5996006e86b91e5119d0f785e9ade5874ac5 + checksum: 10/4c70df351f021c7fe2978626dd223feabd483d95a9312b6cd76b8ea9467426c630ee6aea5ad692da37ecb4388c065c68072355e743fb87621b62d520a18943d5 languageName: node linkType: hard @@ -20850,7 +21146,7 @@ __metadata: lefthook: "npm:^1.6.10" prettier: "npm:3.2.5" react: "npm:18.2.0" - react-native: "npm:0.74.1-rc.0" + react-native: "npm:0.74.1" react-native-builder-bob: "npm:^0.20.0" turbo: "npm:1.13.3" typescript: "npm:5.3.3"