support_section_widget.dart 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import 'dart:io';
  2. import 'package:expandable/expandable.dart';
  3. import 'package:flutter/material.dart';
  4. import 'package:logging/logging.dart';
  5. import 'package:photos/core/configuration.dart';
  6. import 'package:photos/core/constants.dart';
  7. import 'package:photos/ui/common/web_page.dart';
  8. import 'package:photos/ui/settings/common_settings.dart';
  9. import 'package:photos/ui/settings/settings_section_title.dart';
  10. import 'package:photos/ui/settings/settings_text_item.dart';
  11. import 'package:photos/utils/dialog_util.dart';
  12. import 'package:photos/utils/email_util.dart';
  13. import 'package:url_launcher/url_launcher.dart';
  14. class SupportSectionWidget extends StatelessWidget {
  15. const SupportSectionWidget({Key key}) : super(key: key);
  16. @override
  17. Widget build(BuildContext context) {
  18. return ExpandablePanel(
  19. header: const SettingsSectionTitle("Support"),
  20. collapsed: Container(),
  21. expanded: _getSectionOptions(context),
  22. theme: getExpandableTheme(context),
  23. );
  24. }
  25. Widget _getSectionOptions(BuildContext context) {
  26. final String bugsEmail =
  27. Platform.isAndroid ? "android-bugs@ente.io" : "ios-bugs@ente.io";
  28. return Column(
  29. children: [
  30. GestureDetector(
  31. behavior: HitTestBehavior.translucent,
  32. onTap: () async {
  33. try {
  34. final Uri emailLaunchUri = Uri(
  35. scheme: 'mailto',
  36. path: kSupportEmail,
  37. );
  38. launchUrl(emailLaunchUri);
  39. } catch (e) {
  40. Logger("SupportSection").severe(e);
  41. showErrorDialog(context, "", "Please email us at $kSupportEmail");
  42. }
  43. },
  44. child:
  45. const SettingsTextItem(text: "Email", icon: Icons.navigate_next),
  46. ),
  47. sectionOptionDivider,
  48. GestureDetector(
  49. behavior: HitTestBehavior.translucent,
  50. onTap: () {
  51. Navigator.of(context).push(
  52. MaterialPageRoute(
  53. builder: (BuildContext context) {
  54. final endpoint = Configuration.instance.getHttpEndpoint() +
  55. "/users/roadmap";
  56. final isLoggedIn = Configuration.instance.getToken() != null;
  57. final url = isLoggedIn
  58. ? endpoint + "?token=" + Configuration.instance.getToken()
  59. : kRoadmapURL;
  60. return WebPage("Roadmap", url);
  61. },
  62. ),
  63. );
  64. },
  65. child: const SettingsTextItem(
  66. text: "Roadmap",
  67. icon: Icons.navigate_next,
  68. ),
  69. ),
  70. sectionOptionDivider,
  71. GestureDetector(
  72. behavior: HitTestBehavior.translucent,
  73. onTap: () async {
  74. await sendLogs(context, "Report bug", bugsEmail);
  75. },
  76. onDoubleTap: () async {
  77. final zipFilePath = await getZippedLogsFile(context);
  78. await shareLogs(context, bugsEmail, zipFilePath);
  79. },
  80. child: const SettingsTextItem(
  81. text: "Report bug 🐞",
  82. icon: Icons.navigate_next,
  83. ),
  84. ),
  85. ],
  86. );
  87. }
  88. }