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