diff --git a/mobile/lib/features/welcome/loading_screen.dart b/mobile/lib/features/welcome/loading_screen.dart index 0b0c19b5f..946461fa5 100644 --- a/mobile/lib/features/welcome/loading_screen.dart +++ b/mobile/lib/features/welcome/loading_screen.dart @@ -9,6 +9,7 @@ import 'package:get_10101/features/welcome/error_screen.dart'; import 'package:get_10101/features/welcome/onboarding.dart'; import 'package:get_10101/features/trade/trade_screen.dart'; import 'package:get_10101/features/wallet/wallet_screen.dart'; +import 'package:get_10101/features/welcome/welcome_screen.dart'; import 'package:get_10101/logger/logger.dart'; import 'package:get_10101/util/preferences.dart'; import 'package:get_10101/util/file.dart'; @@ -41,7 +42,6 @@ class _LoadingScreenState extends State { final task = widget.task!; logger.e(task.errorTitle, error: error, stackTrace: stackTrace); - // TODO why does this still not trigger onboarding flow after failing here? await showDialog( context: rootNavigatorKey.currentContext!, builder: (context) => @@ -58,14 +58,22 @@ class _LoadingScreenState extends State { return; } - final [position, seedPresent, backupRequired] = await Future.wait([ + final [position, seedPresent, backupRequired, registeredForBeta] = await Future.wait([ Preferences.instance.getOpenPosition(), isSeedFilePresent(), Preferences.instance.isFullBackupRequired(), + Preferences.instance.isRegisteredForBeta(), ]); FlutterNativeSplash.remove(); if (seedPresent) { + if (!registeredForBeta) { + logger.w("Registering for beta program despite having a seed; " + "onboarding flow was probably previously interrupted"); + setState(() => message = "Registering for beta program"); + await resumeRegisterForBeta(); + } + if (backupRequired) { setState(() => message = "Creating initial backup!"); fullBackup().then((value) { diff --git a/mobile/lib/features/welcome/welcome_screen.dart b/mobile/lib/features/welcome/welcome_screen.dart index 02a4a3d69..0737b2050 100644 --- a/mobile/lib/features/welcome/welcome_screen.dart +++ b/mobile/lib/features/welcome/welcome_screen.dart @@ -262,7 +262,10 @@ class _WelcomeScreenState extends State { logger.i("Successfully stored the contact: $_contact ."); await api.initNewMnemonic(targetSeedFilePath: seedPath); logger.d("Registering user with $_contact & $_referralCode"); + + await Preferences.instance.setReferralCode(_referralCode); await api.registerBeta(contact: _contact, referralCode: _referralCode); + await Preferences.instance.setRegisteredForBeta(); } @override @@ -280,3 +283,11 @@ class _WelcomeScreenState extends State { })); } } + +/// Resume a previously incomplete onboarding flow by registering for beta +Future resumeRegisterForBeta() async { + await api.registerBeta( + contact: await Preferences.instance.getContactDetails(), + referralCode: await Preferences.instance.getReferralCode()); + await Preferences.instance.setRegisteredForBeta(); +} diff --git a/mobile/lib/util/preferences.dart b/mobile/lib/util/preferences.dart index 4d15c02d2..4a268b90c 100644 --- a/mobile/lib/util/preferences.dart +++ b/mobile/lib/util/preferences.dart @@ -13,6 +13,10 @@ class Preferences { static const fullBackup = "fullBackup"; static const logLevelTrace = "logLevelTrace"; static const _hasSeenReferralDialogTimePassed = "hasSeenReferralDialogTimePassed"; + static const registeredForBeta = "registeredForBeta"; + + /// The referral code that the user signed up with + static const referralCode = "referralCode"; Future setLogLevelTrace(bool trace) async { SharedPreferences preferences = await SharedPreferences.getInstance(); @@ -54,6 +58,26 @@ class Preferences { preferences.remove(openPosition); } + Future setRegisteredForBeta() async { + SharedPreferences preferences = await SharedPreferences.getInstance(); + return preferences.setBool(registeredForBeta, true); + } + + Future isRegisteredForBeta() async { + SharedPreferences preferences = await SharedPreferences.getInstance(); + return preferences.getBool(registeredForBeta) ?? false; + } + + Future setReferralCode(String code) async { + SharedPreferences preferences = await SharedPreferences.getInstance(); + return preferences.setString(referralCode, code); + } + + Future getReferralCode() async { + SharedPreferences preferences = await SharedPreferences.getInstance(); + return preferences.getString(referralCode) ?? ""; + } + Future setContactDetails(String value) async { SharedPreferences preferences = await SharedPreferences.getInstance(); return preferences.setString(contactDetails, value);