diff --git a/frontend/appflowy_flutter/ios/Runner/Info.plist b/frontend/appflowy_flutter/ios/Runner/Info.plist
index e9e15609ee..0c8c1eff43 100644
--- a/frontend/appflowy_flutter/ios/Runner/Info.plist
+++ b/frontend/appflowy_flutter/ios/Runner/Info.plist
@@ -47,7 +47,7 @@
NSPhotoLibraryUsageDescription
- Allow access to photos to upload photos from your library.
+ AppFlowy needs access to your photos to let you add images to your documents
UIApplicationSupportsIndirectInputEvents
UILaunchStoryboardName
diff --git a/frontend/appflowy_flutter/lib/mobile/presentation/database/board/mobile_board_page.dart b/frontend/appflowy_flutter/lib/mobile/presentation/database/board/mobile_board_page.dart
index a80a28c124..90ebd4f61f 100644
--- a/frontend/appflowy_flutter/lib/mobile/presentation/database/board/mobile_board_page.dart
+++ b/frontend/appflowy_flutter/lib/mobile/presentation/database/board/mobile_board_page.dart
@@ -69,8 +69,10 @@ class _MobileBoardPageState extends State {
loading: (_) => const Center(
child: CircularProgressIndicator.adaptive(),
),
- error: (err) => AppFlowyErrorPage(
- error: err.error,
+ error: (err) => Center(
+ child: AppFlowyErrorPage(
+ error: err.error,
+ ),
),
ready: (data) => const _BoardContent(),
orElse: () => const SizedBox.shrink(),
diff --git a/frontend/appflowy_flutter/lib/mobile/presentation/setting/user_session_setting_group.dart b/frontend/appflowy_flutter/lib/mobile/presentation/setting/user_session_setting_group.dart
index 797c97ca74..15172aa68c 100644
--- a/frontend/appflowy_flutter/lib/mobile/presentation/setting/user_session_setting_group.dart
+++ b/frontend/appflowy_flutter/lib/mobile/presentation/setting/user_session_setting_group.dart
@@ -115,12 +115,13 @@ class _DeleteAccountBottomSheet extends StatefulWidget {
}
class _DeleteAccountBottomSheetState extends State<_DeleteAccountBottomSheet> {
- final emailController = TextEditingController();
+ final controller = TextEditingController();
final isChecked = ValueNotifier(false);
@override
void dispose() {
- emailController.dispose();
+ controller.dispose();
+ isChecked.dispose();
super.dispose();
}
@@ -153,10 +154,12 @@ class _DeleteAccountBottomSheetState extends State<_DeleteAccountBottomSheet> {
SizedBox(
height: 36.0,
child: FlowyTextField(
- controller: emailController,
+ controller: controller,
textStyle: const TextStyle(fontSize: 14.0),
hintStyle: const TextStyle(fontSize: 14.0),
- hintText: LocaleKeys.settings_user_email.tr(),
+ hintText: LocaleKeys
+ .newSettings_myAccount_deleteAccount_confirmHint3
+ .tr(),
),
),
const VSpace(18.0),
@@ -167,8 +170,9 @@ class _DeleteAccountBottomSheetState extends State<_DeleteAccountBottomSheet> {
textColor: Theme.of(context).colorScheme.error,
onPressed: () => deleteMyAccount(
context,
- emailController.text.trim(),
+ controller.text.trim(),
isChecked.value,
+ onSuccess: () => Navigator.of(context).pop(),
),
),
const VSpace(12.0),
diff --git a/frontend/appflowy_flutter/lib/plugins/database/board/presentation/board_page.dart b/frontend/appflowy_flutter/lib/plugins/database/board/presentation/board_page.dart
index c224749b71..1861d771d5 100644
--- a/frontend/appflowy_flutter/lib/plugins/database/board/presentation/board_page.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database/board/presentation/board_page.dart
@@ -1,8 +1,5 @@
import 'dart:io';
-import 'package:flutter/material.dart' hide Card;
-import 'package:flutter/services.dart';
-
import 'package:appflowy/generated/flowy_svgs.g.dart';
import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/mobile/presentation/database/board/mobile_board_page.dart';
@@ -19,6 +16,7 @@ import 'package:appflowy/plugins/database/widgets/card/card_bloc.dart';
import 'package:appflowy/plugins/database/widgets/cell/card_cell_style_maps/desktop_board_card_cell_style.dart';
import 'package:appflowy/plugins/database/widgets/row/row_detail.dart';
import 'package:appflowy/shared/conditional_listenable_builder.dart';
+import 'package:appflowy/shared/flowy_error_page.dart';
import 'package:appflowy_backend/protobuf/flowy-database2/protobuf.dart';
import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
import 'package:appflowy_board/appflowy_board.dart';
@@ -27,13 +25,13 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra/theme_extension.dart';
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
import 'package:flowy_infra_ui/style_widget/hover.dart';
-import 'package:flowy_infra_ui/widget/error_page.dart';
+import 'package:flutter/material.dart' hide Card;
+import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import '../../widgets/card/card.dart';
import '../../widgets/cell/card_cell_builder.dart';
import '../application/board_bloc.dart';
-
import 'toolbar/board_setting_bar.dart';
import 'widgets/board_focus_scope.dart';
import 'widgets/board_hidden_groups.dart';
@@ -202,9 +200,10 @@ class _DesktopBoardPageState extends State {
loading: (_) => const Center(
child: CircularProgressIndicator.adaptive(),
),
- error: (err) => FlowyErrorPage.message(
- err.toString(),
- howToFix: LocaleKeys.errorDialog_howToFixFallback.tr(),
+ error: (err) => Center(
+ child: AppFlowyErrorPage(
+ error: err.error,
+ ),
),
orElse: () => _BoardContent(
onEditStateChanged: widget.onEditStateChanged,
diff --git a/frontend/appflowy_flutter/lib/plugins/database/grid/presentation/grid_page.dart b/frontend/appflowy_flutter/lib/plugins/database/grid/presentation/grid_page.dart
index f2f1d8547f..601c41db63 100755
--- a/frontend/appflowy_flutter/lib/plugins/database/grid/presentation/grid_page.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database/grid/presentation/grid_page.dart
@@ -1,22 +1,19 @@
import 'dart:math';
-import 'package:flutter/material.dart';
-
-import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/plugins/database/application/row/row_service.dart';
import 'package:appflowy/plugins/database/grid/presentation/widgets/calculations/calculations_row.dart';
import 'package:appflowy/plugins/database/grid/presentation/widgets/toolbar/grid_setting_bar.dart';
import 'package:appflowy/plugins/database/tab_bar/desktop/setting_menu.dart';
import 'package:appflowy/plugins/database/widgets/cell/editable_cell_builder.dart';
+import 'package:appflowy/shared/flowy_error_page.dart';
import 'package:appflowy/workspace/application/action_navigation/action_navigation_bloc.dart';
import 'package:appflowy/workspace/application/action_navigation/navigation_action.dart';
import 'package:appflowy/workspace/application/view/view_bloc.dart';
import 'package:appflowy_backend/log.dart';
import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
-import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
import 'package:flowy_infra_ui/style_widget/scrolling/styled_scrollview.dart';
-import 'package:flowy_infra_ui/widget/error_page.dart';
+import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:linked_scroll_controller/linked_scroll_controller.dart';
import 'package:provider/provider.dart';
@@ -26,7 +23,6 @@ import '../../application/row/row_controller.dart';
import '../../tab_bar/tab_bar_view.dart';
import '../../widgets/row/row_detail.dart';
import '../application/grid_bloc.dart';
-
import 'grid_scroll.dart';
import 'layout/layout.dart';
import 'layout/sizes.dart';
@@ -153,8 +149,9 @@ class _GridPageState extends State {
},
),
builder: (context, state) => state.loadingState.map(
- loading: (_) =>
- const Center(child: CircularProgressIndicator.adaptive()),
+ loading: (_) => const Center(
+ child: CircularProgressIndicator.adaptive(),
+ ),
finish: (result) => result.successOrFail.fold(
(_) => GridShortcuts(
child: GridPageContent(
@@ -162,9 +159,10 @@ class _GridPageState extends State {
view: widget.view,
),
),
- (err) => FlowyErrorPage.message(
- err.toString(),
- howToFix: LocaleKeys.errorDialog_howToFixFallback.tr(),
+ (err) => Center(
+ child: AppFlowyErrorPage(
+ error: err,
+ ),
),
),
idle: (_) => const SizedBox.shrink(),
diff --git a/frontend/appflowy_flutter/lib/plugins/database/grid/presentation/mobile_grid_page.dart b/frontend/appflowy_flutter/lib/plugins/database/grid/presentation/mobile_grid_page.dart
index 210bd8b2a7..f70d98ab77 100644
--- a/frontend/appflowy_flutter/lib/plugins/database/grid/presentation/mobile_grid_page.dart
+++ b/frontend/appflowy_flutter/lib/plugins/database/grid/presentation/mobile_grid_page.dart
@@ -105,8 +105,10 @@ class _MobileGridPageState extends State {
_openRow(context, widget.initialRowId, true);
return result.successOrFail.fold(
(_) => GridShortcuts(child: GridPageContent(view: widget.view)),
- (err) => AppFlowyErrorPage(
- error: err,
+ (err) => Center(
+ child: AppFlowyErrorPage(
+ error: err,
+ ),
),
);
},
diff --git a/frontend/appflowy_flutter/lib/plugins/inline_actions/handlers/inline_page_reference.dart b/frontend/appflowy_flutter/lib/plugins/inline_actions/handlers/inline_page_reference.dart
index 0dabe397bc..da7ce92106 100644
--- a/frontend/appflowy_flutter/lib/plugins/inline_actions/handlers/inline_page_reference.dart
+++ b/frontend/appflowy_flutter/lib/plugins/inline_actions/handlers/inline_page_reference.dart
@@ -7,6 +7,7 @@ import 'package:appflowy/plugins/document/presentation/editor_plugins/mention/me
import 'package:appflowy/plugins/inline_actions/inline_actions_menu.dart';
import 'package:appflowy/plugins/inline_actions/inline_actions_result.dart';
import 'package:appflowy/plugins/inline_actions/service_handler.dart';
+import 'package:appflowy/shared/flowy_error_page.dart';
import 'package:appflowy/shared/list_extension.dart';
import 'package:appflowy/startup/startup.dart';
import 'package:appflowy/workspace/application/recent/cached_recent_service.dart';
@@ -18,7 +19,6 @@ import 'package:appflowy_editor/appflowy_editor.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
import 'package:flowy_infra_ui/widget/dialog/styled_dialogs.dart';
-import 'package:flowy_infra_ui/widget/error_page.dart';
import 'package:flutter/material.dart';
// const _channel = "InlinePageReference";
@@ -177,9 +177,8 @@ class InlinePageReferenceService extends InlineActionsDelegate {
if (context.mounted) {
return Dialogs.show(
context,
- child: FlowyErrorPage.message(
- e.msg,
- howToFix: LocaleKeys.errorDialog_howToFixFallback.tr(),
+ child: AppFlowyErrorPage(
+ error: e,
),
);
}
diff --git a/frontend/appflowy_flutter/lib/user/presentation/screens/workspace_start_screen/desktop_workspace_start_screen.dart b/frontend/appflowy_flutter/lib/user/presentation/screens/workspace_start_screen/desktop_workspace_start_screen.dart
index 2be9ed6484..af5e7367e5 100644
--- a/frontend/appflowy_flutter/lib/user/presentation/screens/workspace_start_screen/desktop_workspace_start_screen.dart
+++ b/frontend/appflowy_flutter/lib/user/presentation/screens/workspace_start_screen/desktop_workspace_start_screen.dart
@@ -1,10 +1,10 @@
import 'package:appflowy/generated/locale_keys.g.dart';
+import 'package:appflowy/shared/flowy_error_page.dart';
import 'package:appflowy/workspace/application/workspace/prelude.dart';
import 'package:appflowy_backend/protobuf/flowy-folder/workspace.pb.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra/theme_extension.dart';
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
-import 'package:flowy_infra_ui/widget/error_page.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:go_router/go_router.dart';
@@ -33,9 +33,10 @@ class DesktopWorkspaceStartScreen extends StatelessWidget {
Widget _renderBody(WorkspaceState state) {
final body = state.successOrFailure.fold(
(_) => _renderList(state.workspaces),
- (error) => FlowyErrorPage.message(
- error.toString(),
- howToFix: LocaleKeys.errorDialog_howToFixFallback.tr(),
+ (error) => Center(
+ child: AppFlowyErrorPage(
+ error: error,
+ ),
),
);
return body;
diff --git a/frontend/appflowy_flutter/lib/user/presentation/screens/workspace_start_screen/mobile_workspace_start_screen.dart b/frontend/appflowy_flutter/lib/user/presentation/screens/workspace_start_screen/mobile_workspace_start_screen.dart
index b3c1f1cd0a..59b61aa54b 100644
--- a/frontend/appflowy_flutter/lib/user/presentation/screens/workspace_start_screen/mobile_workspace_start_screen.dart
+++ b/frontend/appflowy_flutter/lib/user/presentation/screens/workspace_start_screen/mobile_workspace_start_screen.dart
@@ -1,10 +1,10 @@
import 'package:appflowy/generated/flowy_svgs.g.dart';
import 'package:appflowy/generated/locale_keys.g.dart';
+import 'package:appflowy/shared/flowy_error_page.dart';
import 'package:appflowy/workspace/application/workspace/prelude.dart';
import 'package:appflowy_backend/protobuf/flowy-folder/workspace.pb.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
-import 'package:flowy_infra_ui/widget/error_page.dart';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
@@ -129,9 +129,10 @@ class _MobileWorkspaceStartScreenState
);
},
(error) {
- return FlowyErrorPage.message(
- error.toString(),
- howToFix: LocaleKeys.errorDialog_howToFixFallback.tr(),
+ return Center(
+ child: AppFlowyErrorPage(
+ error: error,
+ ),
);
},
);
diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/settings/pages/account/account_deletion.dart b/frontend/appflowy_flutter/lib/workspace/presentation/settings/pages/account/account_deletion.dart
index afb078bff8..f59053b55f 100644
--- a/frontend/appflowy_flutter/lib/workspace/presentation/settings/pages/account/account_deletion.dart
+++ b/frontend/appflowy_flutter/lib/workspace/presentation/settings/pages/account/account_deletion.dart
@@ -15,6 +15,14 @@ import 'package:flowy_infra_ui/flowy_infra_ui.dart';
import 'package:flutter/material.dart';
import 'package:toastification/toastification.dart';
+const _confirmText = 'DELETE MY ACCOUNT';
+const _acceptableConfirmTexts = [
+ 'delete my account',
+ 'deletemyaccount',
+ 'DELETE MY ACCOUNT',
+ 'DELETEMYACCOUNT',
+];
+
class AccountDeletionButton extends StatefulWidget {
const AccountDeletionButton({
super.key,
@@ -25,12 +33,12 @@ class AccountDeletionButton extends StatefulWidget {
}
class _AccountDeletionButtonState extends State {
- final TextEditingController emailController = TextEditingController();
+ final textEditingController = TextEditingController();
final isCheckedNotifier = ValueNotifier(false);
@override
void dispose() {
- emailController.dispose();
+ textEditingController.dispose();
isCheckedNotifier.dispose();
super.dispose();
}
@@ -65,9 +73,10 @@ class _AccountDeletionButtonState extends State {
const HSpace(32),
FlowyTextButton(
LocaleKeys.button_deleteAccount.tr(),
+ constraints: const BoxConstraints(minHeight: 32),
padding: const EdgeInsets.symmetric(horizontal: 26, vertical: 10),
fillColor: Colors.transparent,
- radius: Corners.s12Border,
+ radius: Corners.s8Border,
hoverColor: Theme.of(context).colorScheme.error.withOpacity(0.1),
fontColor: Theme.of(context).colorScheme.error,
fontHoverColor: Colors.white,
@@ -76,6 +85,7 @@ class _AccountDeletionButtonState extends State {
lineHeight: 18.0 / 12.0,
onPressed: () {
isCheckedNotifier.value = false;
+ textEditingController.clear();
showCancelAndDeleteDialog(
context: context,
@@ -83,13 +93,21 @@ class _AccountDeletionButtonState extends State {
LocaleKeys.newSettings_myAccount_deleteAccount_title.tr(),
description: '',
builder: (_) => _AccountDeletionDialog(
- emailController: emailController,
+ controller: textEditingController,
isChecked: isCheckedNotifier,
),
onDelete: () => deleteMyAccount(
context,
- emailController.text.trim(),
+ textEditingController.text.trim(),
isCheckedNotifier.value,
+ onSuccess: () {
+ Navigator.of(context).popUntil((route) {
+ if (route.settings.name == '/') {
+ return true;
+ }
+ return false;
+ });
+ },
),
);
},
@@ -103,11 +121,11 @@ class _AccountDeletionButtonState extends State {
class _AccountDeletionDialog extends StatelessWidget {
const _AccountDeletionDialog({
- required this.emailController,
+ required this.controller,
required this.isChecked,
});
- final TextEditingController emailController;
+ final TextEditingController controller;
final ValueNotifier isChecked;
@override
@@ -125,8 +143,8 @@ class _AccountDeletionDialog extends StatelessWidget {
),
const VSpace(12.0),
FlowyTextField(
- hintText: LocaleKeys.settings_user_email.tr(),
- controller: emailController,
+ hintText: _confirmText,
+ controller: controller,
),
const VSpace(16),
Row(
@@ -163,11 +181,19 @@ class _AccountDeletionDialog extends StatelessWidget {
}
}
+bool _isConfirmTextValid(String text) {
+ // don't convert the text to lower case or upper case,
+ // just check if the text is in the list
+ return _acceptableConfirmTexts.contains(text);
+}
+
Future deleteMyAccount(
BuildContext context,
- String email,
- bool isChecked,
-) async {
+ String confirmText,
+ bool isChecked, {
+ VoidCallback? onSuccess,
+ VoidCallback? onFailure,
+}) async {
final bottomPadding = PlatformExtension.isMobile
? MediaQuery.of(context).viewInsets.bottom
: 0.0;
@@ -184,34 +210,17 @@ Future deleteMyAccount(
return;
}
- // fetch the user email from server instead of reading from provider,
- // this is to avoid the email doesn't match the real user's email
- final userEmail = await UserBackendService.getCurrentUserProfile()
- .fold((s) => s.email, (_) => null);
-
if (!context.mounted) {
return;
}
- if (userEmail == null) {
- showToastNotification(
- context,
- type: ToastificationType.error,
- bottomPadding: bottomPadding,
- message: LocaleKeys
- .newSettings_myAccount_deleteAccount_failedToGetCurrentUser
- .tr(),
- );
- return;
- }
-
- if (email.isEmpty || email.toLowerCase() != userEmail.toLowerCase()) {
+ if (confirmText.isEmpty || !_isConfirmTextValid(confirmText)) {
showToastNotification(
context,
type: ToastificationType.warning,
bottomPadding: bottomPadding,
message: LocaleKeys
- .newSettings_myAccount_deleteAccount_emailValidationFailed
+ .newSettings_myAccount_deleteAccount_confirmTextValidationFailed
.tr(),
);
return;
@@ -221,7 +230,7 @@ Future deleteMyAccount(
await UserBackendService.deleteCurrentAccount().fold(
(s) {
- Log.info('account deletion success, email: $email');
+ Log.info('account deletion success');
loading.stop();
showToastNotification(
@@ -234,13 +243,7 @@ Future deleteMyAccount(
// delay 1 second to make sure the toast notification is shown
Future.delayed(const Duration(seconds: 1), () async {
- // pop to the home screen
- Navigator.of(context).popUntil((route) {
- if (route.settings.name == '/') {
- return true;
- }
- return false;
- });
+ onSuccess?.call();
// restart the application
await getIt().signOut();
@@ -248,7 +251,7 @@ Future deleteMyAccount(
});
},
(f) {
- Log.error('account deletion failed, email: $email, error: $f');
+ Log.error('account deletion failed, error: $f');
loading.stop();
showToastNotification(
@@ -257,6 +260,8 @@ Future deleteMyAccount(
bottomPadding: bottomPadding,
message: f.msg,
);
+
+ onFailure?.call();
},
);
}
diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/settings/pages/settings_billing_view.dart b/frontend/appflowy_flutter/lib/workspace/presentation/settings/pages/settings_billing_view.dart
index aa4e5f2465..8bccf2b9da 100644
--- a/frontend/appflowy_flutter/lib/workspace/presentation/settings/pages/settings_billing_view.dart
+++ b/frontend/appflowy_flutter/lib/workspace/presentation/settings/pages/settings_billing_view.dart
@@ -1,7 +1,6 @@
import 'dart:io';
-import 'package:flutter/material.dart';
-
+import 'package:appflowy/shared/flowy_error_page.dart';
import 'package:appflowy/util/int64_extension.dart';
import 'package:appflowy/workspace/application/settings/appearance/appearance_cubit.dart';
import 'package:appflowy/workspace/application/settings/billing/settings_billing_bloc.dart';
@@ -21,8 +20,8 @@ import 'package:collection/collection.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:fixnum/fixnum.dart';
import 'package:flowy_infra_ui/style_widget/text.dart';
-import 'package:flowy_infra_ui/widget/error_page.dart';
import 'package:flowy_infra_ui/widget/spacing.dart';
+import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import '../../../../generated/locale_keys.g.dart';
@@ -82,9 +81,10 @@ class _SettingsBillingViewState extends State {
if (state.error != null) {
return Padding(
padding: const EdgeInsets.all(16),
- child: FlowyErrorPage.message(
- state.error!.msg,
- howToFix: LocaleKeys.errorDialog_howToFixFallback.tr(),
+ child: Center(
+ child: AppFlowyErrorPage(
+ error: state.error!,
+ ),
),
);
}
diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/settings/pages/settings_plan_view.dart b/frontend/appflowy_flutter/lib/workspace/presentation/settings/pages/settings_plan_view.dart
index d64790527e..24e35ce454 100644
--- a/frontend/appflowy_flutter/lib/workspace/presentation/settings/pages/settings_plan_view.dart
+++ b/frontend/appflowy_flutter/lib/workspace/presentation/settings/pages/settings_plan_view.dart
@@ -2,6 +2,7 @@ import 'dart:io';
import 'package:appflowy/generated/flowy_svgs.g.dart';
import 'package:appflowy/generated/locale_keys.g.dart';
+import 'package:appflowy/shared/flowy_error_page.dart';
import 'package:appflowy/util/int64_extension.dart';
import 'package:appflowy/util/theme_extension.dart';
import 'package:appflowy/workspace/application/settings/appearance/appearance_cubit.dart';
@@ -19,7 +20,6 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra/size.dart';
import 'package:flowy_infra/theme_extension.dart';
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
-import 'package:flowy_infra_ui/widget/error_page.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
@@ -75,9 +75,10 @@ class _SettingsPlanViewState extends State {
if (state.error != null) {
return Padding(
padding: const EdgeInsets.all(16),
- child: FlowyErrorPage.message(
- state.error!.msg,
- howToFix: LocaleKeys.errorDialog_howToFixFallback.tr(),
+ child: Center(
+ child: AppFlowyErrorPage(
+ error: state.error!,
+ ),
),
);
}
diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/settings/pages/settings_shortcuts_view.dart b/frontend/appflowy_flutter/lib/workspace/presentation/settings/pages/settings_shortcuts_view.dart
index 1491af3d4c..6860a811d6 100644
--- a/frontend/appflowy_flutter/lib/workspace/presentation/settings/pages/settings_shortcuts_view.dart
+++ b/frontend/appflowy_flutter/lib/workspace/presentation/settings/pages/settings_shortcuts_view.dart
@@ -1,6 +1,3 @@
-import 'package:flutter/material.dart';
-import 'package:flutter/services.dart';
-
import 'package:appflowy/generated/flowy_svgs.g.dart';
import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/align_toolbar_item/custom_text_align_command.dart';
@@ -23,6 +20,8 @@ import 'package:flowy_infra/theme_extension.dart';
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
import 'package:flowy_infra_ui/style_widget/hover.dart';
import 'package:flowy_infra_ui/widget/error_page.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
class SettingsShortcutsView extends StatefulWidget {
diff --git a/frontend/resources/translations/el-GR.json b/frontend/resources/translations/el-GR.json
index ce8d8510b3..c317b0ebb8 100644
--- a/frontend/resources/translations/el-GR.json
+++ b/frontend/resources/translations/el-GR.json
@@ -310,7 +310,7 @@
"cloudSupabaseUrlCanNotBeEmpty": "The supabase url can't be empty",
"cloudSupabaseAnonKey": "Supabase anon key",
"cloudSupabaseAnonKeyCanNotBeEmpty": "The anon key can't be empty",
- "cloudAppFlowy": "AppFlowy Cloud Beta",
+ "cloudAppFlowy": "AppFlowy Cloud",
"cloudAppFlowySelfHost": "AppFlowy Cloud Self-hosted",
"appFlowyCloudUrlCanNotBeEmpty": "The cloud url can't be empty",
"clickToCopy": "Click to copy",
@@ -1408,4 +1408,4 @@
}
}
}
-}
\ No newline at end of file
+}
diff --git a/frontend/resources/translations/en.json b/frontend/resources/translations/en.json
index 4c38e06ada..b2ff19e50e 100644
--- a/frontend/resources/translations/en.json
+++ b/frontend/resources/translations/en.json
@@ -942,7 +942,7 @@
"cloudSupabaseUrlCanNotBeEmpty": "The supabase url can't be empty",
"cloudSupabaseAnonKey": "Supabase anon key",
"cloudSupabaseAnonKeyCanNotBeEmpty": "The anon key can't be empty",
- "cloudAppFlowy": "@:appName Cloud Beta",
+ "cloudAppFlowy": "@:appName Cloud",
"cloudAppFlowySelfHost": "@:appName Cloud Self-hosted",
"appFlowyCloudUrlCanNotBeEmpty": "The cloud url can't be empty",
"clickToCopy": "Click to copy",
@@ -2251,16 +2251,17 @@
"deleteAccount": {
"title": "Delete Account",
"subtitle": "Permanently delete your account and all of your data.",
- "description": "Permanently delete your account and remove access from all teamspaces.",
+ "description": "Permanently delete your account and remove access from all workspaces.",
"deleteMyAccount": "Delete my account",
"dialogTitle": "Delete account",
"dialogContent1": "Are you sure you want to permanently delete your account?",
- "dialogContent2": "This action cannot be undone, and will remove access from all teamspaces, erasing your entire account, including private workspaces, and removing you from all shared workspaces.",
- "confirmHint1": "Please type in your email address to confirm.",
+ "dialogContent2": "This action cannot be undone, and will remove access from all workspaces, erasing your entire account, including private workspaces, and removing you from all shared workspaces.",
+ "confirmHint1": "Please type \"DELETE MY ACCOUNT\" to confirm.",
"confirmHint2": "I understand that this action is irreversible and will permanently delete my account and all associated data.",
+ "confirmHint3": "DELETE MY ACCOUNT",
"checkToConfirmError": "You must check the box to confirm deletion",
"failedToGetCurrentUser": "Failed to get current user email",
- "emailValidationFailed": "Your email address does not match the account email address",
+ "confirmTextValidationFailed": "Your confirmation text does not match \"DELETE MY ACCOUNT\"",
"deleteAccountSuccess": "Account deleted successfully"
}
},
@@ -2304,7 +2305,7 @@
"unsplash": "Unsplash",
"pageCover": "Page cover",
"none": "None",
- "photoPermissionDescription": "Allow access to the photo library for uploading images.",
+ "photoPermissionDescription": "@:appName needs access to your photos to let you add images to your documents",
"openSettings": "Open Settings",
"photoPermissionTitle": "@:appName would like to access your photo library",
"doNotAllow": "Don't Allow",