keyboard_repository.dart 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. import 'package:get/get.dart';
  2. import 'package:injectable/injectable.dart';
  3. import 'package:keyboard/base/app_base_request.dart';
  4. import 'package:keyboard/data/api/request/keyboard_character_update_request.dart';
  5. import 'package:keyboard/data/api/request/keyboard_generate_request.dart';
  6. import 'package:keyboard/data/api/request/keyboard_list_request.dart';
  7. import 'package:keyboard/data/api/response/keyboard_generate_response.dart';
  8. import 'package:keyboard/data/api/response/keyboard_love_index_response.dart';
  9. import 'package:keyboard/data/api/response/keyboard_meme_explain_response.dart';
  10. import 'package:keyboard/data/api/response/keyboard_prologue_list_response.dart';
  11. import 'package:keyboard/utils/atmob_log.dart';
  12. import 'dart:convert';
  13. import '../../di/get_it.dart';
  14. import '../../module/keyboard_manage/keyboard_manage_controller.dart';
  15. import '../../utils/async_util.dart';
  16. import '../../utils/http_handler.dart';
  17. import '../api/atmob_api.dart';
  18. import '../api/request/keyboard_character_list_request.dart';
  19. import '../api/request/keyboard_character_start_request.dart';
  20. import '../api/request/keyboard_choose_request.dart';
  21. import '../api/request/keyboard_meme_explain_request.dart';
  22. import '../api/request/keyboard_update_request.dart';
  23. import '../api/response/keyboard_character_list_response.dart';
  24. import '../api/response/keyboard_home_info_response.dart';
  25. import '../api/response/keyboard_list_response.dart';
  26. import '../bean/keyboard_info.dart';
  27. import '../consts/error_code.dart';
  28. @lazySingleton
  29. class KeyboardRepository {
  30. final tag = "KeyboardRepository";
  31. final AtmobApi atmobApi;
  32. final RxList<KeyboardInfo> _keyboardInfoList = RxList();
  33. RxList<KeyboardInfo> get keyboardInfoList => _keyboardInfoList;
  34. final RxList<KeyboardInfo> _customKeyboardInfoList = RxList();
  35. RxList<KeyboardInfo> get customKeyboardInfoList => _customKeyboardInfoList;
  36. final Rxn<KeyboardLoveIndexResponse> _homeLoveIndex =
  37. Rxn<KeyboardLoveIndexResponse>();
  38. Rxn<KeyboardLoveIndexResponse> get homeLoveIndex => _homeLoveIndex;
  39. final Rxn<KeyboardHomeInfoResponse> _homeInfo =
  40. Rxn<KeyboardHomeInfoResponse>();
  41. Rxn<KeyboardHomeInfoResponse> get homeInfo => _homeInfo;
  42. CancelableFuture? homeInfoFuture;
  43. CancelableFuture? homeLoveIndexFuture;
  44. final Rxn<KeyboardInfo> _chooseKeyboardInfo = Rxn<KeyboardInfo>(null);
  45. Rxn<KeyboardInfo> get chooseKeyboardInfo => _chooseKeyboardInfo;
  46. KeyboardRepository(this.atmobApi) {
  47. print('$tag....init');
  48. refreshData();
  49. }
  50. Future refreshData() async {
  51. _homeLoveIndex.value = null;
  52. await Future.delayed(const Duration(milliseconds: 500));
  53. // 延迟为了保证首页数据能够正常获取,不然保存的时候,获取太快了,导致还是拉到旧的数值
  54. refreshUserInfo();
  55. await Future.delayed(const Duration(milliseconds: 300));
  56. getKeyboardHomeInfo();
  57. // 注销登录后,重新获取键盘列表。过快拉取服务端会直接返回空数据,导致人设页数据没有通用键盘
  58. await Future.delayed(const Duration(milliseconds: 300));
  59. refreshKeyboardList();
  60. refreshLoveIndex();
  61. }
  62. void refreshUserInfo() async {
  63. homeInfoFuture?.cancel();
  64. homeInfoFuture = AsyncUtil.retryWithExponentialBackoff(
  65. () => getKeyboardHomeInfo(),
  66. 10,
  67. predicate: (error) {
  68. if (error is ServerErrorException) {
  69. return error.code != ErrorCode.noLoginError;
  70. }
  71. return true;
  72. },
  73. );
  74. }
  75. void refreshLoveIndex() {
  76. homeLoveIndexFuture?.cancel();
  77. homeLoveIndexFuture = AsyncUtil.retryWithExponentialBackoff(
  78. () => getKeyboardLoveIndex(),
  79. 10,
  80. predicate: (error) {
  81. if (error is ServerErrorException) {
  82. return error.code != ErrorCode.noLoginError;
  83. }
  84. return true;
  85. },
  86. );
  87. }
  88. Future refreshKeyboardList() async {
  89. return getKeyboardList().then((response) {
  90. _keyboardInfoList.value = response.keyboardInfos;
  91. final chosen = response.keyboardInfos.firstWhereOrNull(
  92. (e) => e.isChoose == true,
  93. );
  94. if (chosen != null) {
  95. _chooseKeyboardInfo.value = chosen;
  96. }
  97. // 过滤掉系统键盘
  98. _customKeyboardInfoList.value =
  99. response.keyboardInfos
  100. .where((keyboard) => keyboard.type != KeyboardType.system.name)
  101. .toList();
  102. });
  103. }
  104. // 获取键盘列表
  105. Future<KeyboardListResponse> getKeyboardList({String? type}) {
  106. return atmobApi
  107. .getKeyboardList(KeyboardListRequest(type: type))
  108. .then(HttpHandler.handle(true));
  109. }
  110. // 获取键盘人设列表
  111. Future<KeyboardCharacterListResponse> getKeyboardCharacterList({
  112. required String keyboardId,
  113. }) {
  114. return atmobApi
  115. .getKeyboardCharacterList(
  116. KeyboardCharacterListRequest(keyboardId: keyboardId),
  117. )
  118. .then(HttpHandler.handle(true));
  119. }
  120. //更新键盘人设
  121. Future<void> keyboardCharacterUpdate({
  122. required List<String> characterIds,
  123. required String keyboardId,
  124. }) {
  125. return atmobApi
  126. .keyboardCharacterUpdate(
  127. KeyboardCharacterUpdateRequest(
  128. keyboardId: keyboardId,
  129. characterIds: characterIds,
  130. ),
  131. )
  132. .then(HttpHandler.handle(true));
  133. }
  134. Future<void> keyboardCharacterStart({
  135. required List<String> characterIds,
  136. required String keyboardId,
  137. }) {
  138. return atmobApi
  139. .keyboardCharacterStart(
  140. KeyboardCharacterStartRequest(
  141. keyboardId: keyboardId,
  142. characterIds: characterIds,
  143. ),
  144. )
  145. .then(HttpHandler.handle(true));
  146. }
  147. // 更新键盘信息
  148. Future<void> updateKeyboardInfo({
  149. required String keyboardId,
  150. String? name,
  151. String? imageUrl,
  152. String? birthday,
  153. int? intimacy,
  154. int? gender,
  155. }) {
  156. return atmobApi
  157. .keyboardUpdate(
  158. KeyboardUpdateRequest(
  159. keyboardId: keyboardId,
  160. name: name,
  161. imageUrl: imageUrl,
  162. birthday: birthday,
  163. intimacy: intimacy,
  164. gender: gender,
  165. ),
  166. )
  167. .then(HttpHandler.handle(true));
  168. }
  169. // 选择键盘
  170. Future<void> keyboardChoose({required String keyboardId}) {
  171. return atmobApi
  172. .keyboardChoose(KeyboardChooseRequest(keyboardId: keyboardId))
  173. .then(HttpHandler.handle(true));
  174. }
  175. // 获取开场白列表
  176. Future<KeyboardPrologueListResponse> getPrologueList() {
  177. return atmobApi
  178. .getPrologueList(AppBaseRequest())
  179. .then(HttpHandler.handle(true));
  180. }
  181. // 获取首页信息
  182. Future<KeyboardHomeInfoResponse> getKeyboardHomeInfo() {
  183. return atmobApi
  184. .getKeyboardHomeInfo(AppBaseRequest())
  185. .then(HttpHandler.handle(true))
  186. .then((response) {
  187. _homeInfo.value = response;
  188. return response;
  189. });
  190. }
  191. // 获取恋爱指数
  192. Future<KeyboardLoveIndexResponse> getKeyboardLoveIndex() {
  193. return atmobApi
  194. .getKeyboardLoveIndex(AppBaseRequest())
  195. .then(HttpHandler.handle(false))
  196. .then((response) {
  197. _homeLoveIndex.value = response;
  198. return response;
  199. });
  200. }
  201. // 生成键盘
  202. Future<KeyboardGenerateResponse> getKeyboardGenerate({
  203. required String name,
  204. required String imageUrl,
  205. required String birthday,
  206. required int intimacy,
  207. required int gender,
  208. }) {
  209. return atmobApi
  210. .keyboardGenerate(
  211. KeyboardGenerateRequest(
  212. intimacy: intimacy,
  213. name: name,
  214. gender: gender,
  215. birthday: birthday,
  216. imageUrl: imageUrl,
  217. ),
  218. )
  219. .then(HttpHandler.handle(true))
  220. .then((response) {
  221. return response;
  222. });
  223. }
  224. Future<KeyboardMemeExplainResponse> getKeyboardMemeExplain({
  225. required String birthday,
  226. required String targetBirthday,
  227. }) {
  228. return atmobApi
  229. .getKeyboardMemeExplain(
  230. KeyboardMemeExplainRequest(
  231. birthday: birthday,
  232. targetBirthday: targetBirthday,
  233. ),
  234. )
  235. .then(HttpHandler.handle(true));
  236. }
  237. static KeyboardRepository getInstance() => getIt.get<KeyboardRepository>();
  238. }