diff --git a/auth/lib/ui/settings/account_section_widget.dart b/auth/lib/ui/settings/account_section_widget.dart index 13e31e037..eceac521f 100644 --- a/auth/lib/ui/settings/account_section_widget.dart +++ b/auth/lib/ui/settings/account_section_widget.dart @@ -1,5 +1,4 @@ - - +import 'package:ente_auth/core/configuration.dart'; import 'package:ente_auth/l10n/l10n.dart'; import 'package:ente_auth/services/local_authentication_service.dart'; import 'package:ente_auth/services/user_service.dart'; @@ -7,6 +6,7 @@ import 'package:ente_auth/theme/ente_theme.dart'; import 'package:ente_auth/ui/account/change_email_dialog.dart'; import 'package:ente_auth/ui/account/delete_account_page.dart'; import 'package:ente_auth/ui/account/password_entry_page.dart'; +import 'package:ente_auth/ui/account/recovery_key_page.dart'; import 'package:ente_auth/ui/components/captioned_text_widget.dart'; import 'package:ente_auth/ui/components/expandable_menu_item_widget.dart'; import 'package:ente_auth/ui/components/menu_item_widget.dart'; @@ -14,6 +14,7 @@ import 'package:ente_auth/ui/settings/common_settings.dart'; import 'package:ente_auth/utils/dialog_util.dart'; import 'package:ente_auth/utils/navigation_util.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_sodium/flutter_sodium.dart'; class AccountSectionWidget extends StatelessWidget { AccountSectionWidget({Key? key}) : super(key: key); @@ -86,6 +87,41 @@ class AccountSectionWidget extends StatelessWidget { }, ), sectionOptionSpacing, + MenuItemWidget( + captionedTextWidget: CaptionedTextWidget( + title: l10n.recoveryKey, + ), + pressedColor: getEnteColorScheme(context).fillFaint, + trailingIcon: Icons.chevron_right_outlined, + trailingIconIsMuted: true, + onTap: () async { + final hasAuthenticated = await LocalAuthenticationService.instance + .requestLocalAuthentication( + context, + l10n.authToViewYourRecoveryKey, + ); + if (hasAuthenticated) { + String recoveryKey; + try { + recoveryKey = + Sodium.bin2hex(Configuration.instance.getRecoveryKey()); + } catch (e) { + showGenericErrorDialog(context: context); + return; + } + routeToPage( + context, + RecoveryKeyPage( + recoveryKey, + l10n.ok, + showAppBar: true, + onDone: () {}, + ), + ); + } + }, + ), + sectionOptionSpacing, MenuItemWidget( captionedTextWidget: CaptionedTextWidget( title: context.l10n.logout, @@ -115,6 +151,7 @@ class AccountSectionWidget extends StatelessWidget { children: children, ); } + void _onLogoutTapped(BuildContext context) { showChoiceActionSheet( context, diff --git a/auth/lib/ui/settings/security_section_widget.dart b/auth/lib/ui/settings/security_section_widget.dart index aa05dd62b..c8381dcab 100644 --- a/auth/lib/ui/settings/security_section_widget.dart +++ b/auth/lib/ui/settings/security_section_widget.dart @@ -7,7 +7,6 @@ import 'package:ente_auth/models/user_details.dart'; import 'package:ente_auth/services/local_authentication_service.dart'; import 'package:ente_auth/services/user_service.dart'; import 'package:ente_auth/theme/ente_theme.dart'; -import 'package:ente_auth/ui/account/recovery_key_page.dart'; import 'package:ente_auth/ui/account/request_pwd_verification_page.dart'; import 'package:ente_auth/ui/account/sessions_page.dart'; import 'package:ente_auth/ui/components/captioned_text_widget.dart'; @@ -20,7 +19,6 @@ import 'package:ente_auth/utils/dialog_util.dart'; import 'package:ente_auth/utils/navigation_util.dart'; import 'package:ente_auth/utils/toast_util.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_sodium/flutter_sodium.dart'; class SecuritySectionWidget extends StatefulWidget { const SecuritySectionWidget({Key? key}) : super(key: key); @@ -64,41 +62,6 @@ class _SecuritySectionWidgetState extends State { UserService.instance.getUserDetailsV2().ignore(); } children.addAll([ - sectionOptionSpacing, - MenuItemWidget( - captionedTextWidget: CaptionedTextWidget( - title: l10n.recoveryKey, - ), - pressedColor: getEnteColorScheme(context).fillFaint, - trailingIcon: Icons.chevron_right_outlined, - trailingIconIsMuted: true, - onTap: () async { - final hasAuthenticated = await LocalAuthenticationService.instance - .requestLocalAuthentication( - context, - l10n.authToViewYourRecoveryKey, - ); - if (hasAuthenticated) { - String recoveryKey; - try { - recoveryKey = - Sodium.bin2hex(Configuration.instance.getRecoveryKey()); - } catch (e) { - showGenericErrorDialog(context: context); - return; - } - routeToPage( - context, - RecoveryKeyPage( - recoveryKey, - l10n.ok, - showAppBar: true, - onDone: () {}, - ), - ); - } - }, - ), MenuItemWidget( captionedTextWidget: CaptionedTextWidget( title: l10n.emailVerificationToggle, diff --git a/mobile/lib/ui/settings/account_section_widget.dart b/mobile/lib/ui/settings/account_section_widget.dart index c184d4b89..8b9c7bbef 100644 --- a/mobile/lib/ui/settings/account_section_widget.dart +++ b/mobile/lib/ui/settings/account_section_widget.dart @@ -8,12 +8,15 @@ import 'package:photos/theme/ente_theme.dart'; import 'package:photos/ui/account/change_email_dialog.dart'; import 'package:photos/ui/account/delete_account_page.dart'; import 'package:photos/ui/account/password_entry_page.dart'; +import "package:photos/ui/account/recovery_key_page.dart"; import 'package:photos/ui/components/captioned_text_widget.dart'; import 'package:photos/ui/components/expandable_menu_item_widget.dart'; import 'package:photos/ui/components/menu_item_widget/menu_item_widget.dart'; import "package:photos/ui/payment/subscription.dart"; import 'package:photos/ui/settings/common_settings.dart'; +import "package:photos/utils/crypto_util.dart"; import 'package:photos/utils/dialog_util.dart'; +import "package:photos/utils/navigation_util.dart"; import "package:url_launcher/url_launcher_string.dart"; class AccountSectionWidget extends StatelessWidget { @@ -101,6 +104,43 @@ class AccountSectionWidget extends StatelessWidget { }, ), sectionOptionSpacing, + MenuItemWidget( + captionedTextWidget: CaptionedTextWidget( + title: S.of(context).recoveryKey, + ), + pressedColor: getEnteColorScheme(context).fillFaint, + trailingIcon: Icons.chevron_right_outlined, + trailingIconIsMuted: true, + showOnlyLoadingState: true, + onTap: () async { + final hasAuthenticated = await LocalAuthenticationService.instance + .requestLocalAuthentication( + context, + S.of(context).authToViewYourRecoveryKey, + ); + if (hasAuthenticated) { + String recoveryKey; + try { + recoveryKey = await _getOrCreateRecoveryKey(context); + } catch (e) { + await showGenericErrorDialog(context: context, error: e); + return; + } + unawaited( + routeToPage( + context, + RecoveryKeyPage( + recoveryKey, + S.of(context).ok, + showAppBar: true, + onDone: () {}, + ), + ), + ); + } + }, + ), + sectionOptionSpacing, MenuItemWidget( captionedTextWidget: CaptionedTextWidget( title: S.of(context).exportYourData, @@ -157,6 +197,12 @@ class AccountSectionWidget extends StatelessWidget { ); } + Future _getOrCreateRecoveryKey(BuildContext context) async { + return CryptoUtil.bin2hex( + await UserService.instance.getOrCreateRecoveryKey(context), + ); + } + void _onLogoutTapped(BuildContext context) { showChoiceActionSheet( context, diff --git a/mobile/lib/ui/settings/security_section_widget.dart b/mobile/lib/ui/settings/security_section_widget.dart index 7805167f9..ac36ac5a8 100644 --- a/mobile/lib/ui/settings/security_section_widget.dart +++ b/mobile/lib/ui/settings/security_section_widget.dart @@ -11,7 +11,6 @@ import "package:photos/models/user_details.dart"; import 'package:photos/services/local_authentication_service.dart'; import 'package:photos/services/user_service.dart'; import 'package:photos/theme/ente_theme.dart'; -import "package:photos/ui/account/recovery_key_page.dart"; import "package:photos/ui/account/request_pwd_verification_page.dart"; import 'package:photos/ui/account/sessions_page.dart'; import 'package:photos/ui/components/captioned_text_widget.dart'; @@ -20,7 +19,6 @@ import 'package:photos/ui/components/menu_item_widget/menu_item_widget.dart'; import 'package:photos/ui/components/toggle_switch_widget.dart'; import 'package:photos/ui/settings/common_settings.dart'; import "package:photos/utils/crypto_util.dart"; -import "package:photos/utils/dialog_util.dart"; import "package:photos/utils/navigation_util.dart"; import "package:photos/utils/toast_util.dart"; @@ -69,43 +67,6 @@ class _SecuritySectionWidgetState extends State { if (_config.hasConfiguredAccount()) { children.addAll( [ - sectionOptionSpacing, - MenuItemWidget( - captionedTextWidget: CaptionedTextWidget( - title: S.of(context).recoveryKey, - ), - pressedColor: getEnteColorScheme(context).fillFaint, - trailingIcon: Icons.chevron_right_outlined, - trailingIconIsMuted: true, - showOnlyLoadingState: true, - onTap: () async { - final hasAuthenticated = await LocalAuthenticationService.instance - .requestLocalAuthentication( - context, - S.of(context).authToViewYourRecoveryKey, - ); - if (hasAuthenticated) { - String recoveryKey; - try { - recoveryKey = await _getOrCreateRecoveryKey(context); - } catch (e) { - await showGenericErrorDialog(context: context, error: e); - return; - } - unawaited( - routeToPage( - context, - RecoveryKeyPage( - recoveryKey, - S.of(context).ok, - showAppBar: true, - onDone: () {}, - ), - ), - ); - } - }, - ), sectionOptionSpacing, MenuItemWidget( captionedTextWidget: CaptionedTextWidget( @@ -255,12 +216,6 @@ class _SecuritySectionWidgetState extends State { ); } - Future _getOrCreateRecoveryKey(BuildContext context) async { - return CryptoUtil.bin2hex( - await UserService.instance.getOrCreateRecoveryKey(context), - ); - } - Future updateEmailMFA(bool isEnabled) async { try { final UserDetails details =