diff --git a/android/build.gradle b/android/build.gradle index a3f47a7..803dcca 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -91,12 +91,12 @@ dependencies { implementation "com.facebook.react:react-native:+" implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - implementation 'com.expofp:common:4.6.2' - implementation 'com.expofp:fplan:4.6.2' + implementation 'com.expofp:common:4.9.6' + implementation 'com.expofp:fplan:4.9.6' - implementation 'com.expofp:crowdconnected:4.6.2' - implementation 'net.crowdconnected.android.core:android-core:1.5.1' - implementation 'net.crowdconnected.android.ips:android-ips:1.5.1' - implementation 'net.crowdconnected.android.geo:android-geo:1.5.1' + implementation 'com.expofp:crowdconnected:4.9.6' + implementation 'net.crowdconnected.android.core:android-core:2.0.0' + implementation 'net.crowdconnected.android.ips:android-ips:2.0.0' + implementation 'net.crowdconnected.android.geo:android-geo:2.0.0' } diff --git a/android/src/main/java/com/expofp/ExpofpModule.kt b/android/src/main/java/com/expofp/ExpofpModule.kt new file mode 100644 index 0000000..f0305f6 --- /dev/null +++ b/android/src/main/java/com/expofp/ExpofpModule.kt @@ -0,0 +1,28 @@ +package com.expofp + +import com.facebook.react.bridge.NativeModule +import com.facebook.react.bridge.ReactApplicationContext +import com.facebook.react.bridge.ReactContext +import com.facebook.react.bridge.ReactContextBaseJavaModule +import com.facebook.react.bridge.ReactMethod +import com.facebook.react.bridge.Promise +import com.expofp.fplan.SharedFplanView +import com.expofp.fplan.models.Settings +import com.facebook.react.bridge.UiThreadUtil + +class ExpofpModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) { + override fun getName() = "ExpofpModule" + + @ReactMethod + fun preload(url: String, promise: Promise) { + try { + val context = this.reactApplicationContext.applicationContext + UiThreadUtil.runOnUiThread { + SharedFplanView.preload(url, Settings(), context) + } + promise.resolve(null) + } catch (e: Exception) { + promise.reject("PRELOAD_ERROR", e.message) + } + } +} \ No newline at end of file diff --git a/android/src/main/java/com/expofp/ExpofpPackage.kt b/android/src/main/java/com/expofp/ExpofpPackage.kt index af317c8..735b856 100644 --- a/android/src/main/java/com/expofp/ExpofpPackage.kt +++ b/android/src/main/java/com/expofp/ExpofpPackage.kt @@ -7,7 +7,7 @@ import com.facebook.react.uimanager.ViewManager class ExpofpPackage : ReactPackage { override fun createNativeModules(reactContext: ReactApplicationContext): List { - return emptyList() + return listOf(ExpofpModule(reactContext)).toMutableList() } override fun createViewManagers(reactContext: ReactApplicationContext): List> { diff --git a/android/src/main/java/com/expofp/ExpofpViewManager.kt b/android/src/main/java/com/expofp/ExpofpViewManager.kt index 3d8d4d4..973725b 100644 --- a/android/src/main/java/com/expofp/ExpofpViewManager.kt +++ b/android/src/main/java/com/expofp/ExpofpViewManager.kt @@ -14,13 +14,12 @@ import com.expofp.common.GlobalLocationProvider import com.expofp.crowdconnected.CrowdConnectedProvider import com.expofp.crowdconnected.Mode import com.expofp.crowdconnected.Settings -import com.expofp.fplan.FplanView +import com.expofp.fplan.SharedFplanView import com.facebook.react.bridge.ReadableMap import com.facebook.react.uimanager.SimpleViewManager import com.facebook.react.uimanager.ThemedReactContext import com.facebook.react.uimanager.annotations.ReactProp - class ExpofpViewManager : SimpleViewManager() { private var reactContext: ThemedReactContext? = null @@ -28,13 +27,13 @@ class ExpofpViewManager : SimpleViewManager() { override fun createViewInstance(reactContext: ThemedReactContext): View { this.reactContext = reactContext - var view = FplanView(reactContext) + var view = SharedFplanView(reactContext) return view; } @ReactProp(name = "settings") - fun setSettings(view: FplanView, settingsMap: ReadableMap?) { + fun setSettings(view: SharedFplanView, settingsMap: ReadableMap?) { settingsMap?.let { var appKey = settingsMap.getString("appKey") val token = settingsMap.getString("token") @@ -64,7 +63,7 @@ class ExpofpViewManager : SimpleViewManager() { GlobalLocationProvider.init(locationProvider) GlobalLocationProvider.start() } - view.init(it.getString("url") ?: "", com.expofp.fplan.models.Settings().withGlobalLocationProvider()); + view.load(it.getString("url") ?: "", com.expofp.fplan.models.Settings().withGlobalLocationProvider()); } } } \ No newline at end of file diff --git a/ios/ExpofpModule-Bridging-Header.h b/ios/ExpofpModule-Bridging-Header.h new file mode 100644 index 0000000..5fff35c --- /dev/null +++ b/ios/ExpofpModule-Bridging-Header.h @@ -0,0 +1 @@ +#import diff --git a/ios/ExpofpModule.m b/ios/ExpofpModule.m new file mode 100644 index 0000000..fac0864 --- /dev/null +++ b/ios/ExpofpModule.m @@ -0,0 +1,6 @@ + +#import "React/RCTBridgeModule.h" + +@interface RCT_EXTERN_MODULE(ExpofpModule, NSObject) +RCT_EXTERN_METHOD(preload:(NSString *)url resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) +@end \ No newline at end of file diff --git a/ios/ExpofpModule.swift b/ios/ExpofpModule.swift new file mode 100644 index 0000000..bb55aba --- /dev/null +++ b/ios/ExpofpModule.swift @@ -0,0 +1,16 @@ +import ExpoFpFplan +import ExpoFpCommon +import Foundation + +@objc(ExpofpModule) +class ExpofpModule: NSObject { + + @objc static func requiresMainQueueSetup() -> Bool { + return false + } + + @objc func preload(_ url: String, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) { + SharedFplanView.preload(url, settings: Settings()) + resolve(nil) + } +} \ No newline at end of file diff --git a/ios/ExpofpViewManager.swift b/ios/ExpofpViewManager.swift index 323ad0e..eefd219 100644 --- a/ios/ExpofpViewManager.swift +++ b/ios/ExpofpViewManager.swift @@ -43,12 +43,7 @@ class ExpoFPViewProxy: UIView { if let appKey = settings["appKey"] as? String, let token = settings["token"] as? String, let secret = settings["secret"] as? String { - let ccSettings = Settings( - appKey, - token, - secret, - Mode.IPS_AND_GPS - ); + let ccSettings = Settings(appKey: appKey, token: token, secret: secret, mode: Mode.IPS_AND_GPS) if let onesignalUserId = settings["oneSignalUserId"] as? String { ccSettings.addAlias("onesignal_user_id", onesignalUserId) } @@ -76,7 +71,7 @@ class ExpoFPDataStore: ObservableObject { struct ExpoFP: View { @EnvironmentObject var dataStore: ExpoFPDataStore - var fplanView = FplanView() + var fplanView = SharedFplanView() @State private var loadedUrl: NSString? = nil diff --git a/react-native-expofp.podspec b/react-native-expofp.podspec index 035a88d..650fab5 100644 --- a/react-native-expofp.podspec +++ b/react-native-expofp.podspec @@ -12,12 +12,12 @@ Pod::Spec.new do |s| s.authors = package["author"] s.platforms = { :ios => "15.0" } - s.source = { :git => "https://github.com/artieeg/react-native-expofp.git", :tag => "#{s.version}" } + s.source = { :git => "https://github.com/gitamego/react-native-expofp.git", :tag => "#{s.version}" } s.source_files = "ios/**/*.{h,m,mm,swift}" - s.dependency "ExpoFpFplan", "4.7.1" - s.dependency "ExpoFpCrowdConnected", "4.7.1" + s.dependency "ExpoFpFplan", "4.8.15" + s.dependency "ExpoFpCrowdConnected", "4.8.15" # 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. diff --git a/src/index.tsx b/src/index.tsx index c0714ac..f6ccfb3 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -3,6 +3,9 @@ import { UIManager, Platform, type ViewStyle, + NativeModules, + TurboModuleRegistry, + TurboModule, } from 'react-native'; const LINKING_ERROR = @@ -15,11 +18,11 @@ type ExpofpProps = { style: ViewStyle; settings: { url: string; - oneSignalUserId?: string, - appKey?: string + oneSignalUserId?: string; + appKey?: string; token?: string; secret?: string; - } + }; }; const ComponentName = 'ExpofpView'; @@ -30,3 +33,25 @@ export const ExpofpView = : () => { throw new Error(LINKING_ERROR); }; + +interface ExpofpModule extends TurboModule { + preload(url: string): Promise; +} + +export const preload = async (url: string): Promise => { + if (Platform.OS === 'ios') { + const Module = TurboModuleRegistry.get('ExpofpModule'); + if (!Module) { + throw new Error(LINKING_ERROR); + } + return Module.preload(url); + } + if (Platform.OS === 'android') { + const Module = NativeModules.ExpofpModule; + if (!Module) { + throw new Error(LINKING_ERROR); + } + return Module.preload(url); + } + throw new Error('Unsupported platform'); +};