keyboard_repository.dart 9.5 KB

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