keyboard_repository.dart 8.4 KB

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