danger_section_widget.dart 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. // @dart=2.9
  2. import 'package:expandable/expandable.dart';
  3. import 'package:flutter/material.dart';
  4. import 'package:photos/ente_theme_data.dart';
  5. import 'package:photos/services/user_service.dart';
  6. import 'package:photos/ui/account/delete_account_page.dart';
  7. import 'package:photos/ui/components/captioned_text_widget.dart';
  8. import 'package:photos/ui/components/menu_item_widget.dart';
  9. import 'package:photos/ui/settings/common_settings.dart';
  10. import 'package:photos/ui/settings/settings_text_item.dart';
  11. import 'package:photos/utils/navigation_util.dart';
  12. class DangerSectionWidget extends StatefulWidget {
  13. const DangerSectionWidget({Key key}) : super(key: key);
  14. @override
  15. State<DangerSectionWidget> createState() => _DangerSectionWidgetState();
  16. }
  17. class _DangerSectionWidgetState extends State<DangerSectionWidget> {
  18. final expandableController = ExpandableController(initialExpanded: false);
  19. @override
  20. void dispose() {
  21. expandableController.dispose();
  22. super.dispose();
  23. }
  24. @override
  25. Widget build(BuildContext context) {
  26. return ExpandablePanel(
  27. header: MenuItemWidget(
  28. captionedTextWidget: const CaptionedTextWidget(
  29. text: "Exit",
  30. ),
  31. isHeaderOfExpansion: true,
  32. leadingIcon: Icons.logout_outlined,
  33. trailingIcon: Icons.expand_more,
  34. menuItemColor:
  35. Theme.of(context).colorScheme.enteTheme.colorScheme.fillFaint,
  36. expandableController: expandableController,
  37. ),
  38. collapsed: const SizedBox.shrink(),
  39. expanded: _getSectionOptions(context),
  40. theme: getExpandableTheme(context),
  41. controller: expandableController,
  42. );
  43. }
  44. Widget _getSectionOptions(BuildContext context) {
  45. return Column(
  46. children: [
  47. sectionOptionDivider,
  48. GestureDetector(
  49. behavior: HitTestBehavior.translucent,
  50. onTap: () {
  51. _onLogoutTapped();
  52. },
  53. child:
  54. const SettingsTextItem(text: "Logout", icon: Icons.navigate_next),
  55. ),
  56. sectionOptionDivider,
  57. GestureDetector(
  58. behavior: HitTestBehavior.translucent,
  59. onTap: () async {
  60. routeToPage(context, const DeleteAccountPage());
  61. },
  62. child: const SettingsTextItem(
  63. text: "Delete account",
  64. icon: Icons.navigate_next,
  65. ),
  66. ),
  67. ],
  68. );
  69. }
  70. Future<void> _onLogoutTapped() async {
  71. final AlertDialog alert = AlertDialog(
  72. title: const Text(
  73. "Logout",
  74. style: TextStyle(
  75. color: Colors.red,
  76. ),
  77. ),
  78. content: const Text("Are you sure you want to logout?"),
  79. actions: [
  80. TextButton(
  81. child: const Text(
  82. "Yes, logout",
  83. style: TextStyle(
  84. color: Colors.red,
  85. ),
  86. ),
  87. onPressed: () async {
  88. Navigator.of(context, rootNavigator: true).pop('dialog');
  89. await UserService.instance.logout(context);
  90. },
  91. ),
  92. TextButton(
  93. child: Text(
  94. "No",
  95. style: TextStyle(
  96. color: Theme.of(context).colorScheme.greenAlternative,
  97. ),
  98. ),
  99. onPressed: () {
  100. Navigator.of(context, rootNavigator: true).pop('dialog');
  101. },
  102. ),
  103. ],
  104. );
  105. showDialog(
  106. context: context,
  107. builder: (BuildContext context) {
  108. return alert;
  109. },
  110. );
  111. }
  112. }