Skip to content

Commit b892ff3

Browse files
authored
Merge pull request #2022 from onflow/310/972-ios-create-native-bridge-for-onboarding-workflow
310/972 ios create native bridge for onboarding workflow
2 parents 4c9a970 + f313559 commit b892ff3

25 files changed

+2252
-2173
lines changed

FRW.xcodeproj/project.pbxproj

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1620,6 +1620,8 @@
16201620
4E9182622EB89C63008FD73A /* AdaptiveHostingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E9182612EB89C63008FD73A /* AdaptiveHostingController.swift */; };
16211621
4E9182632EB89C63008FD73A /* AdaptiveHostingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E9182612EB89C63008FD73A /* AdaptiveHostingController.swift */; };
16221622
4E947C922BBEB2E300E87A85 /* web3swift in Frameworks */ = {isa = PBXBuildFile; productRef = 4E947C912BBEB2E300E87A85 /* web3swift */; };
1623+
4E952F4A2EE2B59F00175DAA /* NativeScreenName.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E952F492EE2B59F00175DAA /* NativeScreenName.swift */; };
1624+
4E952F4B2EE2B59F00175DAA /* NativeScreenName.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E952F492EE2B59F00175DAA /* NativeScreenName.swift */; };
16231625
4E95322F2CD2082F00AAECD1 /* AddCustomTokenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E95322E2CD2082F00AAECD1 /* AddCustomTokenView.swift */; };
16241626
4E9532302CD2082F00AAECD1 /* AddCustomTokenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E95322E2CD2082F00AAECD1 /* AddCustomTokenView.swift */; };
16251627
4E9532322CD2089C00AAECD1 /* AddCustomTokenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E9532312CD2089C00AAECD1 /* AddCustomTokenViewModel.swift */; };
@@ -1803,6 +1805,8 @@
18031805
4EC5E06A2BD8B20D003A1A24 /* EVMModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EC5E0682BD8B20D003A1A24 /* EVMModels.swift */; };
18041806
4EC626092AE8A28100318720 /* UUIDManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EC626082AE8A28100318720 /* UUIDManager.swift */; };
18051807
4EC6260A2AE8A28100318720 /* UUIDManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EC626082AE8A28100318720 /* UUIDManager.swift */; };
1808+
4EC758412EEAC17F00B9012E /* TurboModule+Onboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EC758402EEAC16F00B9012E /* TurboModule+Onboard.swift */; };
1809+
4EC758422EEAC17F00B9012E /* TurboModule+Onboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EC758402EEAC16F00B9012E /* TurboModule+Onboard.swift */; };
18061810
4EC8675D2EBAF25400AFD76D /* AuthnAccountsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EC8675C2EBAF25400AFD76D /* AuthnAccountsView.swift */; };
18071811
4EC8675E2EBAF25400AFD76D /* AuthnAccountsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EC8675C2EBAF25400AFD76D /* AuthnAccountsView.swift */; };
18081812
4EC97652286A07060066811D /* NFTCollectionEnableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EC97651286A07060066811D /* NFTCollectionEnableView.swift */; };
@@ -3252,6 +3256,7 @@
32523256
4E8E3F882D8306C7000916A6 /* SearchBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchBar.swift; sourceTree = "<group>"; };
32533257
4E90592E2B1792F10029FC66 /* SyncAddDeviceView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncAddDeviceView.swift; sourceTree = "<group>"; };
32543258
4E9182612EB89C63008FD73A /* AdaptiveHostingController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdaptiveHostingController.swift; sourceTree = "<group>"; };
3259+
4E952F492EE2B59F00175DAA /* NativeScreenName.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NativeScreenName.swift; sourceTree = "<group>"; };
32553260
4E95322E2CD2082F00AAECD1 /* AddCustomTokenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddCustomTokenView.swift; sourceTree = "<group>"; };
32563261
4E9532312CD2089C00AAECD1 /* AddCustomTokenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddCustomTokenViewModel.swift; sourceTree = "<group>"; };
32573262
4E9532342CD2196400AAECD1 /* SectionItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SectionItem.swift; sourceTree = "<group>"; };
@@ -3352,6 +3357,7 @@
33523357
4EC56B2F281FC57900246878 /* FlowQuery.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlowQuery.swift; sourceTree = "<group>"; };
33533358
4EC5E0682BD8B20D003A1A24 /* EVMModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EVMModels.swift; sourceTree = "<group>"; };
33543359
4EC626082AE8A28100318720 /* UUIDManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UUIDManager.swift; sourceTree = "<group>"; };
3360+
4EC758402EEAC16F00B9012E /* TurboModule+Onboard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TurboModule+Onboard.swift"; sourceTree = "<group>"; };
33553361
4EC8675C2EBAF25400AFD76D /* AuthnAccountsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthnAccountsView.swift; sourceTree = "<group>"; };
33563362
4EC97651286A07060066811D /* NFTCollectionEnableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NFTCollectionEnableView.swift; sourceTree = "<group>"; };
33573363
4ECA7E64284371CA0039A210 /* NFTBlurImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NFTBlurImageView.swift; sourceTree = "<group>"; };
@@ -4850,12 +4856,14 @@
48504856
4EECEB202E323F29008E21B6 /* RNEncoder.swift */,
48514857
1575765D2E322E6A00D7D8C4 /* BridgeModels.swift */,
48524858
15A87E902E26D9E100F0E550 /* TurboModuleSwift.swift */,
4859+
4EC758402EEAC16F00B9012E /* TurboModule+Onboard.swift */,
48534860
15A87E8D2E26D9CF00F0E550 /* RCTNativeFRWBridge.mm */,
48544861
1594792C2E282F7000F2B7A6 /* RCTNativeFRWBridge.h */,
48554862
4EECEB1D2E3235AB008E21B6 /* NativeToRNModel.swift */,
48564863
4E7712E02E3B2AD70011C1DA /* RNBridgeError.swift */,
48574864
4E33F7EE2E432F5D00B3D62F /* SendToConfig+Helper.swift */,
48584865
4E77CDFF2ECC84B100C2C628 /* RNBridgeWalletAccount+Helper.swift */,
4866+
4E952F492EE2B59F00175DAA /* NativeScreenName.swift */,
48594867
);
48604868
path = Bridge;
48614869
sourceTree = "<group>";
@@ -8551,6 +8559,7 @@
85518559
15DC21ED27819C57000B187A /* StateColors_OOID.swift in Sources */,
85528560
4E63A57C2B8D6A4100BBD15F /* MoveTokenView.swift in Sources */,
85538561
6A115972288E72CC005EF797 /* Coordinator.swift in Sources */,
8562+
4E952F4B2EE2B59F00175DAA /* NativeScreenName.swift in Sources */,
85548563
6AF2ED9228364BC200F06AD3 /* UIFont.swift in Sources */,
85558564
4E77CE2F2ECEABE000C2C628 /* WalletEmoji.swift in Sources */,
85568565
4ED041F82C7C25DF0016848A /* WalletNewsHandler.swift in Sources */,
@@ -9324,6 +9333,7 @@
93249333
6A95CFB228B7258100267F86 /* NFTTransferView.swift in Sources */,
93259334
15DC207727819C56000B187A /* VText.swift in Sources */,
93269335
4E9059302B1792F10029FC66 /* SyncAddDeviceView.swift in Sources */,
9336+
4EC758412EEAC17F00B9012E /* TurboModule+Onboard.swift in Sources */,
93279337
6A164F642845F1CB0026B31E /* UIView+Extensions.swift in Sources */,
93289338
4EB8223D2C040FFE0014E73D /* AccountSideCell.swift in Sources */,
93299339
15DC1D5D27816F46000B187A /* MoyaAsync.swift in Sources */,
@@ -9645,6 +9655,7 @@
96459655
4E63A57B2B8D6A4100BBD15F /* MoveTokenView.swift in Sources */,
96469656
6A115971288E72CC005EF797 /* Coordinator.swift in Sources */,
96479657
15C58AC42868A4EE00BD4FC6 /* UIFont.swift in Sources */,
9658+
4E952F4A2EE2B59F00175DAA /* NativeScreenName.swift in Sources */,
96489659
4ED041F72C7C25DF0016848A /* WalletNewsHandler.swift in Sources */,
96499660
4E77CE302ECEABE000C2C628 /* WalletEmoji.swift in Sources */,
96509661
4EBDF2B92BFB3A9700E56968 /* FlowModel+NFT.swift in Sources */,
@@ -10418,6 +10429,7 @@
1041810429
15B302B62D9AD51A007C792C /* SideContainerView.swift in Sources */,
1041910430
15C58BDE2868A4EE00BD4FC6 /* VText.swift in Sources */,
1042010431
4E90592F2B1792F10029FC66 /* SyncAddDeviceView.swift in Sources */,
10432+
4EC758422EEAC17F00B9012E /* TurboModule+Onboard.swift in Sources */,
1042110433
15C58BDF2868A4EE00BD4FC6 /* UIView+Extensions.swift in Sources */,
1042210434
15C58BE12868A4EE00BD4FC6 /* MoyaAsync.swift in Sources */,
1042310435
4EB8223C2C040FFE0014E73D /* AccountSideCell.swift in Sources */,

FRW/Foundation/Bridge/BridgeModels.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ enum RNBridge {
2424
}
2525

2626
enum AccountTypeType: String, Codable {
27-
case eoa = "eoa"
28-
case coa = "coa"
27+
case full = "full"
28+
case hardware = "hardware"
2929
case null = "null"
3030
}
3131

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
//
2+
// NativeScreenName.swift
3+
// FRW
4+
//
5+
// Created by cat on 12/5/25.
6+
//
7+
8+
import Foundation
9+
10+
enum NativeScreenName: String {
11+
case deviceBackup
12+
case recoveryPhraseRestore
13+
case keyStoreRestore
14+
case privateKeyRestore
15+
case googleDriveRestore
16+
case multiRestore
17+
case backupOptions
18+
case icloudRestore
19+
}

FRW/Foundation/Bridge/RCTNativeFRWBridge.mm

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,10 @@ - (NSString *)getNetwork {
8888
return [TurboModuleSwift getNetwork];
8989
}
9090

91+
- (void)getCurrentUserUid:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
92+
resolve([TurboModuleSwift getCurrentUserUid]);
93+
}
94+
9195
- (NSString * _Nullable)getSelectedAddress {
9296
return [TurboModuleSwift getCurrentAddress];
9397
}
@@ -203,5 +207,121 @@ - (void)ethSign:(NSString *)hexData resolve:(RCTPromiseResolveBlock)resolve reje
203207
resolve(result);
204208
}
205209
}
210+
//TODO: screenName
211+
- (void)launchNativeScreen:(NSString *)screenName params:(NSString * _Nullable)params {
212+
[TurboModuleSwift launchNativeScreenWithScreen:screenName params:params];
213+
}
214+
215+
// MARK: - Device Info
216+
- (NSString *)getDeviceId {
217+
return [TurboModuleSwift getDeviceId];
218+
}
219+
220+
// MARK: - Notification Permissions
221+
- (void)requestNotificationPermission:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
222+
[TurboModuleSwift requestNotificationPermissionWithCompletionHandler:^(BOOL granted, NSError * _Nullable error) {
223+
if (error) {
224+
reject(@"notification_permission_error", error.localizedDescription, error);
225+
} else {
226+
resolve(@(granted));
227+
}
228+
}];
229+
}
230+
231+
- (void)checkNotificationPermission:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
232+
[TurboModuleSwift checkNotificationPermissionWithCompletionHandler:^(BOOL granted, NSError * _Nullable error) {
233+
if (error) {
234+
reject(@"notification_permission_error", error.localizedDescription, error);
235+
} else {
236+
resolve(@(granted));
237+
}
238+
}];
239+
}
240+
241+
// MARK: - Screen Security
242+
- (void)setScreenSecurityLevel:(NSString *)level {
243+
[TurboModuleSwift setScreenSecurityLevelWithLevel:level];
244+
}
245+
246+
// MARK: - Onboarding Methods
247+
- (void)generateSeedPhrase:(NSNumber *)strength resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
248+
[TurboModuleSwift generateSeedPhraseWithStrength:strength completionHandler:^(NSDictionary<NSString *,id> * _Nullable result, NSError * _Nullable error) {
249+
if (error) {
250+
reject(@"seed_phrase_generation_error", error.localizedDescription, error);
251+
} else {
252+
resolve(result);
253+
}
254+
}];
255+
}
256+
257+
- (void)registerSecureTypeAccount:(NSString *)username resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
258+
[TurboModuleSwift registerSecureTypeAccountWithUsername:username completionHandler:^(NSDictionary<NSString *,id> * _Nullable result, NSError * _Nullable error) {
259+
if (error) {
260+
reject(@"register_account_error", error.localizedDescription, error);
261+
} else {
262+
resolve(result);
263+
}
264+
}];
265+
}
266+
267+
- (void)initSecureEnclaveWallet:(NSString *)txId resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
268+
[TurboModuleSwift initSecureEnclaveWalletWithTxId:txId completionHandler:^(NSDictionary<NSString *,id> * _Nullable result, NSError * _Nullable error) {
269+
if (error) {
270+
reject(@"init_wallet_error", error.localizedDescription, error);
271+
} else {
272+
resolve(result);
273+
}
274+
}];
275+
}
276+
277+
- (void)signInWithCustomToken:(NSString *)customToken resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
278+
[TurboModuleSwift signInWithCustomTokenWithCustomToken:customToken completionHandler:^(NSError * _Nullable error) {
279+
if (error) {
280+
reject(@"sign_in_error", error.localizedDescription, error);
281+
} else {
282+
resolve(nil);
283+
}
284+
}];
285+
}
286+
287+
- (void)saveMnemonic:(NSString *)mnemonic customToken:(NSString *)customToken txId:(NSString *)txId username:(NSString *)username resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
288+
[TurboModuleSwift saveMnemonicWithMnemonic:mnemonic customToken:customToken txId:txId username:username completionHandler:^(NSError * _Nullable error) {
289+
if (error) {
290+
reject(@"save_mnemonic_error", error.localizedDescription, error);
291+
} else {
292+
resolve(nil);
293+
}
294+
}];
295+
}
296+
297+
- (void)getRecoverableProfiles:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
298+
[TurboModuleSwift getRecoverableProfilesWithCompletionHandler:^(NSDictionary<NSString *,id> * _Nullable result, NSError * _Nullable error) {
299+
if (error) {
300+
reject(@"get_recoverable_profiles_error", error.localizedDescription, error);
301+
} else {
302+
resolve(result);
303+
}
304+
}];
305+
}
306+
307+
- (void)switchToProfile:(NSString *)userId resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
308+
[TurboModuleSwift switchToProfileWithUserId:userId completionHandler:^(NSError * _Nullable error) {
309+
if (error) {
310+
reject(@"switch_profile_error", error.localizedDescription, error);
311+
} else {
312+
resolve(nil);
313+
}
314+
}];
315+
}
316+
317+
- (void)shareQRCode:(NSString *)address qrCodeDataUrl:(NSString *)qrCodeDataUrl resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject {
318+
[TurboModuleSwift shareQRCodeWithAddress:address qrCodeDataUrl:qrCodeDataUrl completionHandler:^(NSError * _Nullable error) {
319+
if (error) {
320+
reject(@"share_qr_error", error.localizedDescription, error);
321+
} else {
322+
resolve(nil);
323+
}
324+
}];
325+
}
206326

207327
@end

FRW/Foundation/Bridge/RNBridgeError.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,10 @@ enum RNBridgeError: Error {
1111
case scanInvalidProvider
1212
case invalidParameters
1313
case sendToFlowConfigurationError
14+
case mnemonicGenerationFailed
15+
case mnemonicSaveFailed
16+
case keyGenerationFailed
17+
case invalidMnemonic
18+
case accountCreationFailed
19+
case walletInitializationFailed
1420
}

0 commit comments

Comments
 (0)