From 8d969b8ee1d160602b64add68c65ee7b40ccf937 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 17 Nov 2024 12:32:45 +0200 Subject: [PATCH 01/10] Add delete endpoint on the backend --- backend/database.py | 8 ++++++++ backend/routes/users.py | 22 ++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/backend/database.py b/backend/database.py index 718a1db9..c95b6afb 100644 --- a/backend/database.py +++ b/backend/database.py @@ -632,6 +632,14 @@ def update_user(double_name, field, value): except Error as e: print(e) +def delete_user(double_name): + delete_sql = f'DELETE FROM users WHERE double_name =?' + try: + cursor = conn.cursor() + cursor.execute(delete_sql, (double_name)) + conn.commit() + except Error as e: + print(e) def create_db(conn): diff --git a/backend/routes/users.py b/backend/routes/users.py index 2a0c2962..d71c4622 100644 --- a/backend/routes/users.py +++ b/backend/routes/users.py @@ -229,3 +229,25 @@ def update_user(): except Exception as e: print(e) return Response("Something went wrong", status=402) + +@ api_users.route("/", methods=["DELETE"]) +def delete_user(username): + logger.debug(f"delete {username}") + user = db.get_user_by_double_name(username) + + if user is None: + return Response(f"Username '{username}' does not exists", status=404) + + try: + signed_data_verification_response = verify_signed_data(username, request.headers.get('Jimber-Authorization')) + + if isinstance(signed_data_verification_response, Response): + logger.debug("Response of verification is of instance Response, Failed to Verify.") + return signed_data_verification_response + + db.delete_user(username) + return Response(f"user '{username}' has been deleted successfully", status=204) + + except Exception as e: + print(e) + return Response(f"Something went wrong while deleting user '{username}'", status=402) From 6177df305631a3db82f28d0f349b58c33e8342c6 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 17 Nov 2024 12:34:37 +0200 Subject: [PATCH 02/10] Restore the minimum version --- backend/routes/misc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/routes/misc.py b/backend/routes/misc.py index 542847a2..63f21251 100644 --- a/backend/routes/misc.py +++ b/backend/routes/misc.py @@ -10,7 +10,7 @@ @api_misc.route("/minimumversion", methods=["get"]) def minimum_version_handler(): response = Response( - response=json.dumps({"android": 182, "ios": 182}), mimetype="application/json" + response=json.dumps({"android": 178, "ios": 178}), mimetype="application/json" ) return response From 3a6fcdf58b4c8acb693fe3b5cefc1b48c11a020d Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 17 Nov 2024 12:39:57 +0200 Subject: [PATCH 03/10] Restore change email endpoint to not break the current app version --- backend/routes/users.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/backend/routes/users.py b/backend/routes/users.py index d71c4622..27a00e1b 100644 --- a/backend/routes/users.py +++ b/backend/routes/users.py @@ -251,3 +251,36 @@ def delete_user(username): except Exception as e: print(e) return Response(f"Something went wrong while deleting user '{username}'", status=402) + +# TODO: remove this endpoint after releasing 4.0.0 of the app +@ api_users.route("/change-email", methods=["POST"]) +def change_email_for_user(): + body = request.get_json() + + if body is None: + return Response('Body cannot be empty', status=404) + + username = body.get('username') + email = body.get('email') + if username is None or email is None: + return Response("Username is empty or Email is empty", status=404) + + logger.debug("Change email for user %s", username) + user = db.get_user_by_double_name(username) + + if user is None: + return Response("Username does not exists", status=404) + + try: + signed_data_verification_response = verify_signed_data(username, request.headers.get('Jimber-Authorization')) + + if isinstance(signed_data_verification_response, Response): + logger.debug("Response of verification is of instance Response, Failed to Verify.") + return signed_data_verification_response + + db.update_user_email(username, email) + return Response("Successfully updated email address", status=200) + + except Exception as e: + print(e) + return Response("Something went wrong", status=402) From 9b17f4796ae16c223332dad13a810877546836bf Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 17 Nov 2024 13:59:27 +0200 Subject: [PATCH 04/10] Support deleting account in the app --- app/lib/screens/preference_screen.dart | 81 +++++++++++++++++++++++--- app/lib/services/open_kyc_service.dart | 24 +++++++- app/lib/services/wallet_service.dart | 8 +-- 3 files changed, 99 insertions(+), 14 deletions(-) diff --git a/app/lib/screens/preference_screen.dart b/app/lib/screens/preference_screen.dart index 4af8f5a0..ac0d301c 100644 --- a/app/lib/screens/preference_screen.dart +++ b/app/lib/screens/preference_screen.dart @@ -1,7 +1,11 @@ +import 'dart:io'; + import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:flutter/services.dart'; +import 'package:flutter_pkid/flutter_pkid.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:http/http.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:threebotlogin/app_config.dart'; import 'package:threebotlogin/apps/free_flow_pages/ffp_events.dart'; @@ -15,7 +19,10 @@ import 'package:threebotlogin/screens/authentication_screen.dart'; import 'package:threebotlogin/screens/change_pin_screen.dart'; import 'package:threebotlogin/screens/main_screen.dart'; import 'package:threebotlogin/services/fingerprint_service.dart'; +import 'package:threebotlogin/services/open_kyc_service.dart'; +import 'package:threebotlogin/services/pkid_service.dart'; import 'package:threebotlogin/services/shared_preference_service.dart'; +import 'package:threebotlogin/services/wallet_service.dart'; import 'package:threebotlogin/widgets/custom_dialog.dart'; import 'package:threebotlogin/widgets/layout_drawer.dart'; import 'package:threebotlogin/providers/theme_provider.dart'; @@ -249,7 +256,7 @@ class _PreferenceScreenState extends ConsumerState { ListTile( leading: const Icon(Icons.person), title: Text( - 'Remove Account From Device', + 'Deactivate Account', style: Theme.of(context) .textTheme .bodyLarge! @@ -261,6 +268,23 @@ class _PreferenceScreenState extends ConsumerState { ), onTap: _showDialog, ), + ListTile( + leading: const Icon(Icons.person), + title: Text( + 'Delete Account', + style: Theme.of(context) + .textTheme + .bodyLarge! + .copyWith(color: Theme.of(context).colorScheme.error), + ), + trailing: Icon( + Icons.remove_circle, + color: Theme.of(context).colorScheme.error, + ), + onTap: () { + _showDialog(delete: true); + }, + ), ], ), ], @@ -311,15 +335,20 @@ class _PreferenceScreenState extends ConsumerState { ); } - void _showDialog() { + void _showDialog({delete = false}) { + String message = + 'If you confirm, your account will be deactivated. You can always recover your account with your username and phrase.'; + if (delete) { + message = + "If you confirm, your account will be deleted. You won't be able to recover your account."; + } showDialog( context: context, builder: (BuildContext context) => CustomDialog( type: DialogType.Warning, image: Icons.warning, title: 'Are you sure?', - description: - 'If you confirm, your account will be removed from this device. You can always recover your account with your username and phrase.', + description: message, actions: [ TextButton( child: const Text('Cancel'), @@ -336,12 +365,44 @@ class _PreferenceScreenState extends ConsumerState { .copyWith(color: Theme.of(context).colorScheme.warning), ), onPressed: () async { - // try { - // String deviceID = await _listener.getToken(); - // removeDeviceId(deviceID); - // } catch (e) {} + if (delete) { + String? pin = await getPin(); + bool? authenticated = await Navigator.push( + context, + MaterialPageRoute( + builder: (context) => AuthenticationScreen( + correctPin: pin!, + userMessage: 'Please enter your PIN code', + ), + )); + + if (authenticated == null || authenticated) { + return; + } + } Events().emit(CloseSocketEvent()); Events().emit(FfpClearCacheEvent()); + bool deleted = true; + if (delete) { + try { + Response response = await deleteUser(); + if (response.statusCode == HttpStatus.noContent) { + deleted = true; + } + } catch (e) { + print('Failed to delete user due to $e'); + deleted = false; + } + final seedPhrase = await getPhrase(); + FlutterPkid client = + await getPkidClient(seedPhrase: seedPhrase!); + List keyWords = ['email', 'phone']; + + keyWords.map((keyword) async { + await client.setPKidDoc(keyword, ''); + }); + await saveWalletsToPkid([]); + } bool result = await clearData(); if (result) { Navigator.pop(context); @@ -350,7 +411,9 @@ class _PreferenceScreenState extends ConsumerState { MaterialPageRoute( builder: (context) => const MainScreen( initDone: true, registered: false))); - } else { + return; + } + if (!result || !deleted) { showDialog( context: preferenceContext!, builder: (BuildContext context) => CustomDialog( diff --git a/app/lib/services/open_kyc_service.dart b/app/lib/services/open_kyc_service.dart index cc10332e..7db09589 100644 --- a/app/lib/services/open_kyc_service.dart +++ b/app/lib/services/open_kyc_service.dart @@ -102,7 +102,7 @@ Future sendVerificationSms() async { return http.post(url, body: encodedBody, headers: requestHeaders); } -// TODO: Remove this method and user update user data +// TODO: Remove this method and use update user data Future updateEmailAddressOfUser() async { String timestamp = DateTime.now().millisecondsSinceEpoch.toString(); Uint8List sk = await getPrivateKey(); @@ -155,3 +155,25 @@ Future updateUserData(String field, String value) async { return http.post(url, headers: loginRequestHeaders, body: encodedBody); } + +Future deleteUser() async { + String timestamp = DateTime.now().millisecondsSinceEpoch.toString(); + Uint8List sk = await getPrivateKey(); + + Map payload = { + 'timestamp': timestamp, + 'intention': 'delete-user' + }; + String signedPayload = await signData(jsonEncode(payload), sk); + + Map loginRequestHeaders = { + 'Content-type': 'application/json', + 'Jimber-Authorization': signedPayload + }; + + final doubleName = await getDoubleName(); + Uri url = Uri.parse('$threeBotApiUrl/users/$doubleName'); + logger.i('Sending call: ${url.toString()}'); + + return http.delete(url, headers: loginRequestHeaders); +} diff --git a/app/lib/services/wallet_service.dart b/app/lib/services/wallet_service.dart index 6bf9ad44..5a51c7ca 100644 --- a/app/lib/services/wallet_service.dart +++ b/app/lib/services/wallet_service.dart @@ -121,7 +121,7 @@ Future addWallet(String walletName, String walletSecret, seed: walletSecret, type: type)); - await _saveWalletsToPkid(wallets); + await saveWalletsToPkid(wallets); } Future editWallet(String oldName, String newName) async { @@ -132,16 +132,16 @@ Future editWallet(String oldName, String newName) async { break; } } - await _saveWalletsToPkid(wallets); + await saveWalletsToPkid(wallets); } Future deleteWallet(String walletName) async { List wallets = await _getPkidWallets(); wallets = wallets.where((w) => w.name != walletName).toList(); - await _saveWalletsToPkid(wallets); + await saveWalletsToPkid(wallets); } -Future _saveWalletsToPkid(List wallets) async { +Future saveWalletsToPkid(List wallets) async { FlutterPkid client = await _getPkidClient(); final encodedWallets = json.encode(wallets.map((w) => w.toMap()).toList()); await client.setPKidDoc('purse', encodedWallets); From 13b4c23112224f8736a10d81932cb8a274ac8437 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 17 Nov 2024 15:40:02 +0200 Subject: [PATCH 05/10] Fix delete user condition --- app/lib/screens/preference_screen.dart | 29 +++++++++++++------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/app/lib/screens/preference_screen.dart b/app/lib/screens/preference_screen.dart index ac0d301c..98059166 100644 --- a/app/lib/screens/preference_screen.dart +++ b/app/lib/screens/preference_screen.dart @@ -376,7 +376,7 @@ class _PreferenceScreenState extends ConsumerState { ), )); - if (authenticated == null || authenticated) { + if (authenticated == null || !authenticated) { return; } } @@ -396,22 +396,21 @@ class _PreferenceScreenState extends ConsumerState { final seedPhrase = await getPhrase(); FlutterPkid client = await getPkidClient(seedPhrase: seedPhrase!); - List keyWords = ['email', 'phone']; - - keyWords.map((keyword) async { - await client.setPKidDoc(keyword, ''); - }); + await client.setPKidDoc('email', ''); + await client.setPKidDoc('phone', ''); await saveWalletsToPkid([]); } - bool result = await clearData(); - if (result) { - Navigator.pop(context); - await Navigator.pushReplacement( - context, - MaterialPageRoute( - builder: (context) => const MainScreen( - initDone: true, registered: false))); - return; + bool result = false; + if (deleted) { + result = await clearData(); + if (result) { + Navigator.pop(context); + await Navigator.pushReplacement( + context, + MaterialPageRoute( + builder: (context) => const MainScreen( + initDone: true, registered: false))); + } } if (!result || !deleted) { showDialog( From 26f35d60f4ffc07611892d3284c3c7ca05ab7f56 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 17 Nov 2024 15:40:20 +0200 Subject: [PATCH 06/10] Fix delete user from the db --- backend/database.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/database.py b/backend/database.py index c95b6afb..162cad58 100644 --- a/backend/database.py +++ b/backend/database.py @@ -636,7 +636,7 @@ def delete_user(double_name): delete_sql = f'DELETE FROM users WHERE double_name =?' try: cursor = conn.cursor() - cursor.execute(delete_sql, (double_name)) + cursor.execute(delete_sql, (double_name,)) conn.commit() except Error as e: print(e) From 133a713e9d8d0e66d4cd5a0d7d2217cac942bc08 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 17 Nov 2024 16:43:43 +0200 Subject: [PATCH 07/10] Add loading for deleting accounts --- app/lib/screens/preference_screen.dart | 164 ++++++++++++------------- 1 file changed, 78 insertions(+), 86 deletions(-) diff --git a/app/lib/screens/preference_screen.dart b/app/lib/screens/preference_screen.dart index 98059166..0d836471 100644 --- a/app/lib/screens/preference_screen.dart +++ b/app/lib/screens/preference_screen.dart @@ -26,6 +26,7 @@ import 'package:threebotlogin/services/wallet_service.dart'; import 'package:threebotlogin/widgets/custom_dialog.dart'; import 'package:threebotlogin/widgets/layout_drawer.dart'; import 'package:threebotlogin/providers/theme_provider.dart'; +import 'package:threebotlogin/widgets/wallets/warning_dialog.dart'; import 'package:url_launcher/url_launcher.dart'; class PreferenceScreen extends ConsumerStatefulWidget { @@ -54,6 +55,7 @@ class _PreferenceScreenState extends ConsumerState { Globals globals = Globals(); MaterialColor thiscolor = Colors.green; + bool deleteLoading = false; @override void initState() { @@ -344,96 +346,86 @@ class _PreferenceScreenState extends ConsumerState { } showDialog( context: context, - builder: (BuildContext context) => CustomDialog( - type: DialogType.Warning, - image: Icons.warning, + builder: (BuildContext context) => WarningDialogWidget( title: 'Are you sure?', description: message, - actions: [ - TextButton( - child: const Text('Cancel'), - onPressed: () { - Navigator.pop(context); - }, - ), - TextButton( - child: Text( - 'Yes', - style: Theme.of(context) - .textTheme - .bodyMedium! - .copyWith(color: Theme.of(context).colorScheme.warning), - ), - onPressed: () async { - if (delete) { - String? pin = await getPin(); - bool? authenticated = await Navigator.push( - context, - MaterialPageRoute( - builder: (context) => AuthenticationScreen( - correctPin: pin!, - userMessage: 'Please enter your PIN code', - ), - )); - - if (authenticated == null || !authenticated) { - return; - } - } - Events().emit(CloseSocketEvent()); - Events().emit(FfpClearCacheEvent()); - bool deleted = true; - if (delete) { - try { - Response response = await deleteUser(); - if (response.statusCode == HttpStatus.noContent) { - deleted = true; - } - } catch (e) { - print('Failed to delete user due to $e'); - deleted = false; - } - final seedPhrase = await getPhrase(); - FlutterPkid client = - await getPkidClient(seedPhrase: seedPhrase!); - await client.setPKidDoc('email', ''); - await client.setPKidDoc('phone', ''); - await saveWalletsToPkid([]); - } - bool result = false; - if (deleted) { - result = await clearData(); - if (result) { - Navigator.pop(context); - await Navigator.pushReplacement( - context, - MaterialPageRoute( - builder: (context) => const MainScreen( - initDone: true, registered: false))); - } - } - if (!result || !deleted) { - showDialog( - context: preferenceContext!, - builder: (BuildContext context) => CustomDialog( - type: DialogType.Error, - title: 'Error', - description: - 'Something went wrong when trying to remove your account.', - actions: [ - TextButton( - child: const Text('Close'), - onPressed: () { - Navigator.pop(context); - }, - ) - ], + onAgree: () async { + deleteLoading = true; + setState(() {}); + if (delete) { + String? pin = await getPin(); + bool? authenticated = await Navigator.push( + context, + MaterialPageRoute( + builder: (context) => AuthenticationScreen( + correctPin: pin!, + userMessage: 'Please enter your PIN code', ), - ); + )); + + if (authenticated == null || !authenticated) { + deleteLoading = false; + setState(() {}); + return false; + } + } + Events().emit(CloseSocketEvent()); + Events().emit(FfpClearCacheEvent()); + bool deleted = true; + if (delete) { + try { + Response response = await deleteUser(); + if (response.statusCode == HttpStatus.noContent) { + deleted = true; } - }, - ), - ], + } catch (e) { + print('Failed to delete user due to $e'); + deleted = false; + } + final seedPhrase = await getPhrase(); + FlutterPkid client = await getPkidClient(seedPhrase: seedPhrase!); + await client.setPKidDoc('email', ''); + await client.setPKidDoc('phone', ''); + await saveWalletsToPkid([]); + } + bool result = false; + if (deleted) { + result = await clearData(); + if (result) { + Navigator.pop(context); + await Navigator.pushReplacement( + context, + MaterialPageRoute( + builder: (context) => + const MainScreen(initDone: true, registered: false))); + } + } + if (!result || !deleted) { + showDialog( + context: preferenceContext!, + builder: (BuildContext context) => CustomDialog( + type: DialogType.Error, + title: 'Error', + description: + 'Something went wrong when trying to remove your account.', + actions: [ + TextButton( + child: const Text('Close'), + onPressed: () { + Navigator.pop(context); + }, + ) + ], + ), + ); + deleteLoading = false; + setState(() {}); + return false; + } + deleteLoading = false; + setState(() {}); + return true; + }, ), ); } From a0b563cd46eb847a30c9a65ea308ceb393e8c62c Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Mon, 18 Nov 2024 11:59:58 +0200 Subject: [PATCH 08/10] Update the delete condition --- app/lib/screens/preference_screen.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/lib/screens/preference_screen.dart b/app/lib/screens/preference_screen.dart index 0d836471..f58f9c64 100644 --- a/app/lib/screens/preference_screen.dart +++ b/app/lib/screens/preference_screen.dart @@ -375,8 +375,8 @@ class _PreferenceScreenState extends ConsumerState { if (delete) { try { Response response = await deleteUser(); - if (response.statusCode == HttpStatus.noContent) { - deleted = true; + if (response.statusCode != HttpStatus.noContent) { + deleted = false; } } catch (e) { print('Failed to delete user due to $e'); From 8a1ba184950cfacc7f98c6faec583408cd83d15a Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Mon, 18 Nov 2024 12:44:03 +0200 Subject: [PATCH 09/10] Rephrase recover, sign up, and deactivate account to log in, create account, and log out --- app/lib/screens/preference_screen.dart | 38 +++++++++++------------- app/lib/screens/recover_screen.dart | 4 +-- app/lib/screens/unregistered_screen.dart | 8 ++--- 3 files changed, 23 insertions(+), 27 deletions(-) diff --git a/app/lib/screens/preference_screen.dart b/app/lib/screens/preference_screen.dart index f58f9c64..49bfa63c 100644 --- a/app/lib/screens/preference_screen.dart +++ b/app/lib/screens/preference_screen.dart @@ -173,7 +173,7 @@ class _PreferenceScreenState extends ConsumerState { }), ListTile( leading: const Icon(Icons.lock), - title: const Text('Change pincode'), + title: const Text('Change PIN'), onTap: () async { _changePincode(); }, @@ -250,28 +250,27 @@ class _PreferenceScreenState extends ConsumerState { title: const Text('Terms and conditions'), onTap: () async => {await _showTermsAndConds()}, ), + ListTile( + leading: const Icon(Icons.logout_outlined), + title: Text( + 'Log Out', + style: Theme.of(context) + .textTheme + .bodyLarge! + .copyWith(color: Theme.of(context).colorScheme.onSurface), + ), + onTap: _showDialog, + ), ExpansionTile( title: const Text( 'Advanced settings', ), children: [ ListTile( - leading: const Icon(Icons.person), - title: Text( - 'Deactivate Account', - style: Theme.of(context) - .textTheme - .bodyLarge! - .copyWith(color: Theme.of(context).colorScheme.error), - ), - trailing: Icon( + leading: Icon( Icons.remove_circle, color: Theme.of(context).colorScheme.error, ), - onTap: _showDialog, - ), - ListTile( - leading: const Icon(Icons.person), title: Text( 'Delete Account', style: Theme.of(context) @@ -279,10 +278,6 @@ class _PreferenceScreenState extends ConsumerState { .bodyLarge! .copyWith(color: Theme.of(context).colorScheme.error), ), - trailing: Icon( - Icons.remove_circle, - color: Theme.of(context).colorScheme.error, - ), onTap: () { _showDialog(delete: true); }, @@ -338,16 +333,17 @@ class _PreferenceScreenState extends ConsumerState { } void _showDialog({delete = false}) { - String message = - 'If you confirm, your account will be deactivated. You can always recover your account with your username and phrase.'; + String title = 'Log Out'; + String message = 'Are you sure you want to log out?'; if (delete) { + title = 'Are you sure?'; message = "If you confirm, your account will be deleted. You won't be able to recover your account."; } showDialog( context: context, builder: (BuildContext context) => WarningDialogWidget( - title: 'Are you sure?', + title: title, description: message, onAgree: () async { deleteLoading = true; diff --git a/app/lib/screens/recover_screen.dart b/app/lib/screens/recover_screen.dart index 846c47b0..62441f35 100644 --- a/app/lib/screens/recover_screen.dart +++ b/app/lib/screens/recover_screen.dart @@ -109,7 +109,7 @@ class _RecoverScreenState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: const Text('Recover Account'), + title: const Text('Log In'), ), body: Container( padding: const EdgeInsets.all(20.0), @@ -189,7 +189,7 @@ class _RecoverScreenState extends State { ElevatedButton( style: ElevatedButton.styleFrom(), child: Text( - 'Recover Account', + 'Log In', style: Theme.of(context).textTheme.bodyLarge!.copyWith( color: Theme.of(context).colorScheme.onPrimaryContainer), ), diff --git a/app/lib/screens/unregistered_screen.dart b/app/lib/screens/unregistered_screen.dart index fbf38b28..1d882056 100644 --- a/app/lib/screens/unregistered_screen.dart +++ b/app/lib/screens/unregistered_screen.dart @@ -51,8 +51,8 @@ class _UnregisteredScreenState extends State context: context, builder: (BuildContext context) => const CustomDialog( image: Icons.check, - title: 'Recovered', - description: 'Your account has been recovered.', + title: 'Logged In', + description: 'You have logged In successfully.', ), ); await Future.delayed( @@ -101,7 +101,7 @@ class _UnregisteredScreenState extends State mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - 'Sign Up', + 'Create Account', style: Theme.of(context) .textTheme .titleMedium! @@ -129,7 +129,7 @@ class _UnregisteredScreenState extends State mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - 'Recover Account', + 'Log In', style: Theme.of(context) .textTheme .titleMedium! From 2fd0a73c3f1e28d4a8034e5b40ed68e5feb86f44 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Mon, 18 Nov 2024 13:44:24 +0200 Subject: [PATCH 10/10] Fix context issue while showing the delete dialog --- app/lib/screens/preference_screen.dart | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/app/lib/screens/preference_screen.dart b/app/lib/screens/preference_screen.dart index 49bfa63c..2324c567 100644 --- a/app/lib/screens/preference_screen.dart +++ b/app/lib/screens/preference_screen.dart @@ -340,6 +340,7 @@ class _PreferenceScreenState extends ConsumerState { message = "If you confirm, your account will be deleted. You won't be able to recover your account."; } + preferenceContext = context; showDialog( context: context, builder: (BuildContext context) => WarningDialogWidget( @@ -378,11 +379,13 @@ class _PreferenceScreenState extends ConsumerState { print('Failed to delete user due to $e'); deleted = false; } - final seedPhrase = await getPhrase(); - FlutterPkid client = await getPkidClient(seedPhrase: seedPhrase!); - await client.setPKidDoc('email', ''); - await client.setPKidDoc('phone', ''); - await saveWalletsToPkid([]); + if (deleted) { + final seedPhrase = await getPhrase(); + FlutterPkid client = await getPkidClient(seedPhrase: seedPhrase!); + await client.setPKidDoc('email', ''); + await client.setPKidDoc('phone', ''); + await saveWalletsToPkid([]); + } } bool result = false; if (deleted) { @@ -397,7 +400,7 @@ class _PreferenceScreenState extends ConsumerState { } } if (!result || !deleted) { - showDialog( + await showDialog( context: preferenceContext!, builder: (BuildContext context) => CustomDialog( type: DialogType.Error,