new_user_controller.dart 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. import 'package:flutter/material.dart';
  2. import 'package:injectable/injectable.dart';
  3. import 'package:keyboard/data/bean/keyboard_info.dart';
  4. import 'package:keyboard/data/repository/keyboard_repository.dart';
  5. import 'package:keyboard/main.dart';
  6. import 'package:keyboard/module/main/main_page.dart';
  7. import 'package:keyboard/module/new_user/result/new_user_result_page.dart';
  8. import 'package:keyboard/module/new_user/step/birthday/step_birthday_logic.dart';
  9. import 'package:keyboard/module/new_user/step/gender/step_gender_logic.dart';
  10. import 'package:keyboard/module/new_user/step/intimacy/step_intimacy_stages_logic.dart';
  11. import 'package:keyboard/module/new_user/step/nickname/step_nickname_logic.dart';
  12. import 'package:keyboard/module/new_user/step/partner/step_partner_logic.dart';
  13. import 'package:keyboard/resource/string.gen.dart';
  14. import 'package:keyboard/utils/atmob_log.dart';
  15. import 'package:intl/intl.dart';
  16. import '../../base/base_controller.dart';
  17. import '../../data/api/response/keyboard_generate_response.dart';
  18. import '../../data/bean/default_avatar_info.dart';
  19. import '../../data/consts/constants.dart';
  20. import '../../data/repository/account_repository.dart';
  21. import 'package:get/get.dart';
  22. import '../../dialog/keyboard_generating_dialog.dart';
  23. import '../../utils/error_handler.dart';
  24. import '../../utils/http_handler.dart';
  25. import '../../utils/toast_util.dart';
  26. enum NewUserStepType {
  27. stepGenDer(0),
  28. stepBirthday(1),
  29. stepNickname(2),
  30. stepIntimacyStages(3),
  31. stepPartner(4);
  32. final int value;
  33. const NewUserStepType(this.value);
  34. }
  35. @injectable
  36. class NewUserController extends BaseController
  37. with
  38. StepGenDerLogic,
  39. StepBirthdayLogic,
  40. StepNicknameLogic,
  41. StepIntimacyStagesLogic,
  42. StepPartnerLogic {
  43. final AccountRepository accountRepository;
  44. final KeyboardRepository keyboardRepository;
  45. NewUserController(this.accountRepository, this.keyboardRepository);
  46. final RxInt _currentStep = 1.obs;
  47. int get currentStep => _currentStep.value;
  48. final RxInt _totalSteps = 5.obs;
  49. int get totalSteps => _totalSteps.value;
  50. final PageController pageController = PageController();
  51. final Rx<KeyboardInfo> _keyboardInfo = KeyboardInfo().obs;
  52. @override
  53. void onInit() {
  54. super.onInit();
  55. updateAvatarListsAndSelectFirst(currentDefaultAvatarInfo.value);
  56. ever<DefaultAvatarInfo?>(currentDefaultAvatarInfo, (info) {
  57. updateAvatarListsAndSelectFirst(info);
  58. });
  59. }
  60. void clickBack() {
  61. if (currentStep > 1) {
  62. pageController.previousPage(
  63. duration: const Duration(milliseconds: 300),
  64. curve: Curves.easeOut,
  65. );
  66. _currentStep.value--;
  67. } else {
  68. Get.back();
  69. }
  70. }
  71. Future<void> clickNextButton() async {
  72. if (!isCurrentStepValid) {
  73. ToastUtil.show(currentStepValidationError ?? "请完成当前步骤");
  74. return;
  75. }
  76. if (currentStep == totalSteps) {
  77. _generateKeyboard();
  78. } else {
  79. await _settingUseInfo();
  80. }
  81. }
  82. void clickUseGeneralMode() {
  83. MainPage.start();
  84. }
  85. void clickSkip() {
  86. MainPage.start();
  87. }
  88. /// 当前步骤是否完成验证
  89. bool get isCurrentStepValid {
  90. switch (currentStep) {
  91. case 1: // 性别
  92. return currentGender != null;
  93. case 2: // 生日
  94. return currentBirthday != null;
  95. case 3: // 昵称
  96. return nickname.trim().isNotEmpty;
  97. case 4: // 亲密阶段
  98. return currentIntimacyMedian > 0;
  99. case 5: // 伴侣信息
  100. return partnerName.value.trim().isNotEmpty &&
  101. currentPartnerBirthday != null &&
  102. partnerAvatarUrl.isNotEmpty &&
  103. partnerGender != null;
  104. default:
  105. return false;
  106. }
  107. }
  108. /// 获取当前步骤未完成提示
  109. String? get currentStepValidationError {
  110. switch (currentStep) {
  111. case 1:
  112. return currentGender == null ? "请选择性别" : null;
  113. case 2:
  114. return currentBirthday == null ? "请选择生日" : null;
  115. case 3:
  116. if (nickname.trim().isEmpty) return "请输入昵称";
  117. if (nickname.value.length > 5) return "昵称最多5个字";
  118. if (nickname.contains(' ')) return "昵称不能包含空格";
  119. return null;
  120. case 4:
  121. return currentIntimacyMedian == 0 ? "请选择亲密阶段" : null;
  122. case 5:
  123. if (partnerName.value.isEmpty) return "请填写TA姓名";
  124. if (partnerGender == null) return "请选择TA性别";
  125. if (currentPartnerBirthday == null) return "请填写TA生日";
  126. if (partnerAvatarUrl.isEmpty) return "请选择TA头像";
  127. return null;
  128. default:
  129. return null;
  130. }
  131. }
  132. Future<void> _settingUseInfo() async {
  133. try {
  134. await accountRepository.setUserInfo(
  135. name: nickname.value,
  136. birthday:
  137. currentBirthday != null
  138. ? DateFormat('yyyy-MM-dd').format(currentBirthday!)
  139. : null,
  140. gender: currentGender,
  141. imageUrl: null,
  142. );
  143. pageController.nextPage(
  144. duration: const Duration(milliseconds: 300),
  145. curve: Curves.easeIn,
  146. );
  147. _currentStep.value++;
  148. accountRepository.refreshUserInfo();
  149. } catch (error) {
  150. if (error is ServerErrorException) {
  151. ToastUtil.show(error.message);
  152. } else {
  153. ErrorHandler.toastError(error);
  154. }
  155. }
  156. }
  157. Future<void> _generateKeyboard() async {
  158. KeyboardGeneratingDialog.show(text: StringName.newUserKeyboardGenerating);
  159. try {
  160. KeyboardGenerateResponse keyboardGenerateResponse =
  161. await keyboardRepository.getKeyboardGenerate(
  162. name: partnerName.value,
  163. gender: partnerGender!,
  164. imageUrl: partnerAvatarUrl,
  165. birthday: DateFormat('yyyy-MM-dd').format(currentPartnerBirthday!),
  166. intimacy: currentIntimacyMedian,
  167. );
  168. if (keyboardGenerateResponse.keyboardInfo == null) {
  169. ToastUtil.show("生成失败");
  170. KeyboardGeneratingDialog.hide();
  171. return;
  172. }
  173. _keyboardInfo.value = keyboardGenerateResponse.keyboardInfo!;
  174. keyboardRepository.refreshData();
  175. Future.delayed(const Duration(seconds: 3), () {
  176. KeyboardGeneratingDialog.hide();
  177. NewUserResultPage.start(
  178. newUserKeyboardInfo: _keyboardInfo.value,
  179. );
  180. });
  181. } catch (error) {
  182. KeyboardGeneratingDialog.hide();
  183. if (error is ServerErrorException) {
  184. ToastUtil.show(error.message);
  185. AtmobLog.d(tag, '_generateKeyboard error: ${error.message}');
  186. } else {
  187. AtmobLog.d(tag, '_generateKeyboard error: $error');
  188. }
  189. }
  190. }
  191. }