keyboard_repository.dart 8.7 KB

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