feedback_controller.dart 3.7 KB

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