keyboard_repository.dart 9.0 KB

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