settings_page.dart 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. import 'dart:io';
  2. import 'package:ente_auth/core/configuration.dart';
  3. import 'package:ente_auth/l10n/l10n.dart';
  4. import 'package:ente_auth/onboarding/view/onboarding_page.dart';
  5. import 'package:ente_auth/services/user_service.dart';
  6. import 'package:ente_auth/theme/colors.dart';
  7. import 'package:ente_auth/theme/ente_theme.dart';
  8. import 'package:ente_auth/ui/components/buttons/button_widget.dart';
  9. import 'package:ente_auth/ui/components/models/button_result.dart';
  10. import 'package:ente_auth/ui/components/notification_warning_widget.dart';
  11. import 'package:ente_auth/ui/settings/about_section_widget.dart';
  12. import 'package:ente_auth/ui/settings/account_section_widget.dart';
  13. import 'package:ente_auth/ui/settings/app_version_widget.dart';
  14. import 'package:ente_auth/ui/settings/data/data_section_widget.dart';
  15. import 'package:ente_auth/ui/settings/data/export_widget.dart';
  16. import 'package:ente_auth/ui/settings/security_section_widget.dart';
  17. import 'package:ente_auth/ui/settings/social_section_widget.dart';
  18. import 'package:ente_auth/ui/settings/support_dev_widget.dart';
  19. import 'package:ente_auth/ui/settings/support_section_widget.dart';
  20. import 'package:ente_auth/ui/settings/theme_switch_widget.dart';
  21. import 'package:ente_auth/ui/settings/title_bar_widget.dart';
  22. import 'package:ente_auth/utils/dialog_util.dart';
  23. import 'package:ente_auth/utils/navigation_util.dart';
  24. import 'package:flutter/foundation.dart';
  25. import 'package:flutter/material.dart';
  26. class SettingsPage extends StatelessWidget {
  27. final ValueNotifier<String?> emailNotifier;
  28. SettingsPage({Key? key, required this.emailNotifier}) : super(key: key);
  29. @override
  30. Widget build(BuildContext context) {
  31. final _hasLoggedIn = Configuration.instance.hasConfiguredAccount();
  32. if (_hasLoggedIn) {
  33. UserService.instance.getUserDetailsV2().ignore();
  34. }
  35. final enteColorScheme = getEnteColorScheme(context);
  36. return Scaffold(
  37. body: Container(
  38. color: enteColorScheme.backdropBase,
  39. child: _getBody(context, enteColorScheme),
  40. ),
  41. );
  42. }
  43. Widget _getBody(BuildContext context, EnteColorScheme colorScheme) {
  44. final _hasLoggedIn = Configuration.instance.hasConfiguredAccount();
  45. final enteTextTheme = getEnteTextTheme(context);
  46. const sectionSpacing = SizedBox(height: 8);
  47. final List<Widget> contents = [];
  48. if (_hasLoggedIn) {
  49. contents.add(
  50. Container(
  51. padding: const EdgeInsets.symmetric(horizontal: 8),
  52. child: Align(
  53. alignment: Alignment.centerLeft,
  54. child: AnimatedBuilder(
  55. // [AnimatedBuilder] accepts any [Listenable] subtype.
  56. animation: emailNotifier,
  57. builder: (BuildContext context, Widget? child) {
  58. return Text(
  59. emailNotifier.value!,
  60. style: enteTextTheme.body.copyWith(
  61. color: colorScheme.textMuted,
  62. overflow: TextOverflow.ellipsis,
  63. ),
  64. );
  65. },
  66. ),
  67. ),
  68. ),
  69. );
  70. contents.addAll([
  71. const SizedBox(height: 12),
  72. AccountSectionWidget(),
  73. sectionSpacing,
  74. ]);
  75. } else {
  76. contents.addAll([
  77. NotificationWidget(
  78. startIcon: Icons.account_circle_sharp,
  79. actionIcon: Icons.arrow_forward,
  80. text: context.l10n.signInToBackup,
  81. type: NotificationType.notice,
  82. onTap: () async {
  83. ButtonResult? result = await showChoiceActionSheet(
  84. context,
  85. title: context.l10n.warning,
  86. body: context.l10n.sigInBackupReminder,
  87. secondButtonLabel: context.l10n.singIn,
  88. secondButtonAction: ButtonAction.second,
  89. firstButtonLabel: context.l10n.exportCodes,
  90. );
  91. if (result == null) return;
  92. if (result.action == ButtonAction.first) {
  93. await handleExportClick(context);
  94. } else {
  95. if (result.action == ButtonAction.second) {
  96. await routeToPage(
  97. context,
  98. const OnboardingPage(),
  99. );
  100. }
  101. }
  102. },
  103. ),
  104. sectionSpacing,
  105. sectionSpacing,
  106. ]);
  107. }
  108. contents.addAll([
  109. DataSectionWidget(),
  110. sectionSpacing,
  111. const SecuritySectionWidget(),
  112. sectionSpacing,
  113. ]);
  114. if (Platform.isAndroid || kDebugMode) {
  115. contents.addAll([
  116. const ThemeSwitchWidget(),
  117. sectionSpacing,
  118. ]);
  119. }
  120. contents.addAll([
  121. const SupportSectionWidget(),
  122. sectionSpacing,
  123. const SocialSectionWidget(),
  124. sectionSpacing,
  125. const AboutSectionWidget(),
  126. const AppVersionWidget(),
  127. const SupportDevWidget(),
  128. const Padding(
  129. padding: EdgeInsets.only(bottom: 60),
  130. ),
  131. ]);
  132. return SafeArea(
  133. bottom: false,
  134. child: SingleChildScrollView(
  135. child: Column(
  136. mainAxisSize: MainAxisSize.min,
  137. children: [
  138. const SettingsTitleBarWidget(),
  139. Padding(
  140. padding: const EdgeInsets.fromLTRB(16, 16, 16, 24),
  141. child: Column(
  142. children: contents,
  143. ),
  144. ),
  145. ],
  146. ),
  147. ),
  148. );
  149. }
  150. }