feedback_controller.dart 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. import 'package:flutter/material.dart';
  2. import 'package:get/get.dart';
  3. import 'package:nomo/app/components/ix_snackbar.dart';
  4. import 'package:uuid/uuid.dart';
  5. import '../../../../config/translations/strings_enum.dart';
  6. import '../../../constants/configs.dart';
  7. import '../../../constants/enums.dart';
  8. import '../../../controllers/api_controller.dart';
  9. import '../../../data/sp/ix_sp.dart';
  10. class FeedbackController extends GetxController {
  11. final apiController = Get.find<ApiController>();
  12. // 反馈内容控制器
  13. final feedbackController = TextEditingController();
  14. // 邮箱控制器
  15. final emailController = TextEditingController();
  16. // 反馈内容焦点
  17. final feedbackFocusNode = FocusNode();
  18. // 邮箱焦点
  19. final emailFocusNode = FocusNode();
  20. // 是否正在提交
  21. final isSubmitting = false.obs;
  22. // 输入内容是否有效(用于按钮状态)
  23. final _feedbackText = ''.obs;
  24. final _emailText = ''.obs;
  25. @override
  26. void onInit() {
  27. super.onInit();
  28. // 监听输入变化
  29. feedbackController.addListener(() {
  30. _feedbackText.value = feedbackController.text;
  31. });
  32. emailController.addListener(() {
  33. _emailText.value = emailController.text;
  34. });
  35. }
  36. @override
  37. void onClose() {
  38. feedbackController.dispose();
  39. emailController.dispose();
  40. feedbackFocusNode.dispose();
  41. emailFocusNode.dispose();
  42. super.onClose();
  43. }
  44. void onBackPressed() {
  45. // 判断软键盘是否弹出
  46. if (feedbackFocusNode.hasFocus || emailFocusNode.hasFocus) {
  47. FocusManager.instance.primaryFocus?.unfocus();
  48. // 延迟100毫秒后关闭页面
  49. Future.delayed(const Duration(milliseconds: 250), () {
  50. Get.back();
  51. });
  52. } else {
  53. Get.back();
  54. }
  55. }
  56. /// 提交反馈
  57. void submitFeedback() async {
  58. if (feedbackController.text.trim().isEmpty) {
  59. IXSnackBar.showIXErrorSnackBar(
  60. title: Strings.error.tr,
  61. message: Strings.pleaseEnterFeedback.tr,
  62. );
  63. return;
  64. }
  65. if (emailController.text.trim().isEmpty) {
  66. IXSnackBar.showIXErrorSnackBar(
  67. title: Strings.error.tr,
  68. message: Strings.pleaseEnterEmail.tr,
  69. );
  70. return;
  71. }
  72. // 简单的邮箱格式验证
  73. if (!GetUtils.isEmail(emailController.text.trim())) {
  74. IXSnackBar.showIXErrorSnackBar(
  75. title: Strings.error.tr,
  76. message: Strings.pleaseEnterValidEmail.tr,
  77. );
  78. return;
  79. }
  80. // 取消输入框焦点,关闭软键盘
  81. FocusManager.instance.primaryFocus?.unfocus();
  82. isSubmitting.value = true;
  83. try {
  84. final appConfig = IXSP.getAppConfig();
  85. if (!((appConfig?.disabledLogModules ?? [])).contains(
  86. LogModule.NM_FeedbackLog.name,
  87. )) {
  88. await apiController.uploadLogs([
  89. {
  90. "id": const Uuid().v4(),
  91. "time": DateTime.now().millisecondsSinceEpoch,
  92. "level": LogLevel.info.name,
  93. 'module': LogModule.NM_FeedbackLog.name,
  94. "category": Configs.productCode,
  95. "fields": {
  96. 'content': feedbackController.text.trim(),
  97. 'email': emailController.text.trim(),
  98. },
  99. },
  100. ]);
  101. }
  102. // 提交成功
  103. IXSnackBar.showIXSnackBar(
  104. title: Strings.success.tr,
  105. message: Strings.feedbackSubmitted.tr,
  106. );
  107. // 清空输入框
  108. feedbackController.clear();
  109. emailController.clear();
  110. // 延迟返回
  111. Future.delayed(const Duration(milliseconds: 500), () {
  112. Get.back();
  113. });
  114. } catch (e) {
  115. IXSnackBar.showIXErrorSnackBar(
  116. title: Strings.error.tr,
  117. message: Strings.feedbackSubmitFailed.tr,
  118. );
  119. } finally {
  120. isSubmitting.value = false;
  121. }
  122. }
  123. /// 检查是否可以提交(响应式)
  124. bool get canSubmit {
  125. // 访问响应式变量以触发 Obx 更新
  126. return _feedbackText.value.trim().isNotEmpty &&
  127. _emailText.value.trim().isNotEmpty;
  128. }
  129. }