settings_page.dart 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. import 'dart:io';
  2. import 'package:flutter/foundation.dart';
  3. import 'package:flutter/material.dart';
  4. import 'package:photos/core/configuration.dart';
  5. import 'package:photos/core/event_bus.dart';
  6. import 'package:photos/events/opened_settings_event.dart';
  7. import 'package:photos/services/feature_flag_service.dart';
  8. import 'package:photos/theme/colors.dart';
  9. import 'package:photos/theme/ente_theme.dart';
  10. import 'package:photos/ui/settings/about_section_widget.dart';
  11. import 'package:photos/ui/settings/account_section_widget.dart';
  12. import 'package:photos/ui/settings/app_version_widget.dart';
  13. import 'package:photos/ui/settings/backup_section_widget.dart';
  14. import 'package:photos/ui/settings/debug_section_widget.dart';
  15. import 'package:photos/ui/settings/general_section_widget.dart';
  16. import 'package:photos/ui/settings/inherited_settings_state.dart';
  17. import 'package:photos/ui/settings/security_section_widget.dart';
  18. import 'package:photos/ui/settings/settings_title_bar_widget.dart';
  19. import 'package:photos/ui/settings/social_section_widget.dart';
  20. import 'package:photos/ui/settings/storage_card_widget.dart';
  21. import 'package:photos/ui/settings/support_section_widget.dart';
  22. import 'package:photos/ui/settings/theme_switch_widget.dart';
  23. class SettingsPage extends StatelessWidget {
  24. final ValueNotifier<String?> emailNotifier;
  25. const SettingsPage({Key? key, required this.emailNotifier}) : super(key: key);
  26. @override
  27. Widget build(BuildContext context) {
  28. Bus.instance.fire(OpenedSettingsEvent());
  29. final enteColorScheme = getEnteColorScheme(context);
  30. return Scaffold(
  31. body: Container(
  32. color: enteColorScheme.backdropMuted,
  33. child: SettingsStateContainer(
  34. child: _getBody(context, enteColorScheme),
  35. ),
  36. ),
  37. );
  38. }
  39. Widget _getBody(BuildContext context, EnteColorScheme colorScheme) {
  40. final hasLoggedIn = Configuration.instance.isLoggedIn();
  41. final enteTextTheme = getEnteTextTheme(context);
  42. final List<Widget> contents = [];
  43. contents.add(
  44. Container(
  45. constraints: const BoxConstraints(maxWidth: 350),
  46. padding: const EdgeInsets.symmetric(horizontal: 8),
  47. child: Align(
  48. alignment: Alignment.centerLeft,
  49. child: AnimatedBuilder(
  50. // [AnimatedBuilder] accepts any [Listenable] subtype.
  51. animation: emailNotifier,
  52. builder: (BuildContext context, Widget? child) {
  53. return Text(
  54. emailNotifier.value!,
  55. style: enteTextTheme.body.copyWith(
  56. color: colorScheme.textMuted,
  57. overflow: TextOverflow.ellipsis,
  58. ),
  59. );
  60. },
  61. ),
  62. ),
  63. ),
  64. );
  65. const sectionSpacing = SizedBox(height: 8);
  66. contents.add(const SizedBox(height: 8));
  67. if (hasLoggedIn) {
  68. contents.addAll([
  69. const StorageCardWidget(),
  70. const SizedBox(height: 12),
  71. const BackupSectionWidget(),
  72. sectionSpacing,
  73. const AccountSectionWidget(),
  74. sectionSpacing,
  75. ]);
  76. }
  77. contents.addAll([
  78. const SecuritySectionWidget(),
  79. sectionSpacing,
  80. const GeneralSectionWidget(),
  81. sectionSpacing,
  82. ]);
  83. if (Platform.isAndroid || kDebugMode) {
  84. contents.addAll([
  85. const ThemeSwitchWidget(),
  86. sectionSpacing,
  87. ]);
  88. }
  89. contents.addAll([
  90. const SupportSectionWidget(),
  91. sectionSpacing,
  92. const SocialSectionWidget(),
  93. sectionSpacing,
  94. const AboutSectionWidget(),
  95. ]);
  96. if (hasLoggedIn &&
  97. FeatureFlagService.instance.isInternalUserOrDebugBuild()) {
  98. contents.addAll([sectionSpacing, const DebugSectionWidget()]);
  99. }
  100. contents.add(const AppVersionWidget());
  101. contents.add(
  102. const Padding(
  103. padding: EdgeInsets.only(bottom: 60),
  104. ),
  105. );
  106. return SafeArea(
  107. bottom: false,
  108. child: SingleChildScrollView(
  109. child: Column(
  110. mainAxisSize: MainAxisSize.min,
  111. children: [
  112. const SettingsTitleBarWidget(),
  113. Padding(
  114. padding: const EdgeInsets.fromLTRB(16, 16, 16, 24),
  115. child: Column(
  116. children: contents,
  117. ),
  118. ),
  119. ],
  120. ),
  121. ),
  122. );
  123. }
  124. }