keyboard_repository.dart 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  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 '../../utils/async_util.dart';
  15. import '../../utils/http_handler.dart';
  16. import '../api/atmob_api.dart';
  17. import '../api/request/keyboard_character_list_request.dart';
  18. import '../api/request/keyboard_choose_request.dart';
  19. import '../api/request/keyboard_meme_explain_request.dart';
  20. import '../api/request/keyboard_update_request.dart';
  21. import '../api/response/keyboard_character_list_response.dart';
  22. import '../api/response/keyboard_home_info_response.dart';
  23. import '../api/response/keyboard_list_response.dart';
  24. import '../bean/keyboard_info.dart';
  25. import '../consts/error_code.dart';
  26. @lazySingleton
  27. class KeyboardRepository {
  28. final tag = "KeyboardRepository";
  29. final AtmobApi atmobApi;
  30. final RxList<KeyboardInfo> _keyboardInfoList = RxList();
  31. RxList<KeyboardInfo> get keyboardInfoList => _keyboardInfoList;
  32. final Rxn<KeyboardLoveIndexResponse> _homeLoveIndex =
  33. Rxn<KeyboardLoveIndexResponse>();
  34. Rxn<KeyboardLoveIndexResponse> get homeLoveIndex => _homeLoveIndex;
  35. final Rxn<KeyboardHomeInfoResponse> _homeInfo =
  36. Rxn<KeyboardHomeInfoResponse>();
  37. Rxn<KeyboardHomeInfoResponse> get homeInfo => _homeInfo;
  38. CancelableFuture? homeInfoFuture;
  39. CancelableFuture? homeLoveIndexFuture;
  40. KeyboardRepository(this.atmobApi) {
  41. print('$tag....init');
  42. refreshData();
  43. }
  44. Future refreshData() async {
  45. refreshKeyboardList();
  46. await Future.delayed(const Duration(milliseconds: 500));
  47. // 延迟为了保证首页数据能够正常获取,不然保存的时候,获取太快了,导致还是拉到旧的数值
  48. refreshUserInfo();
  49. refreshLoveIndex();
  50. }
  51. void refreshUserInfo() async {
  52. homeInfoFuture?.cancel();
  53. homeInfoFuture = AsyncUtil.retryWithExponentialBackoff(
  54. () => getKeyboardHomeInfo(),
  55. 10,
  56. predicate: (error) {
  57. if (error is ServerErrorException) {
  58. return error.code != ErrorCode.noLoginError;
  59. }
  60. return true;
  61. },
  62. );
  63. }
  64. void refreshLoveIndex() {
  65. homeLoveIndexFuture?.cancel();
  66. homeLoveIndexFuture = AsyncUtil.retryWithExponentialBackoff(
  67. () => getKeyboardLoveIndex(),
  68. 10,
  69. predicate: (error) {
  70. if (error is ServerErrorException) {
  71. return error.code != ErrorCode.noLoginError;
  72. }
  73. return true;
  74. },
  75. );
  76. }
  77. Future cleanData() async {
  78. _keyboardInfoList.clear();
  79. getKeyboardHomeInfo();
  80. getKeyboardLoveIndex();
  81. }
  82. Future refreshKeyboardList() async {
  83. return getKeyboardList().then((response) {
  84. _keyboardInfoList.value = response.keyboardInfos;
  85. print('$tag refreshKeyboardList: ${response.keyboardInfos.first.id}');
  86. });
  87. }
  88. // 获取键盘列表
  89. Future<KeyboardListResponse> getKeyboardList({String? type}) {
  90. return atmobApi
  91. .getKeyboardList(KeyboardListRequest(type: type))
  92. .then(HttpHandler.handle(true));
  93. }
  94. // 获取键盘人设列表
  95. Future<KeyboardCharacterListResponse> getKeyboardCharacterList({
  96. required String keyboardId,
  97. }) {
  98. return atmobApi
  99. .getKeyboardCharacterList(
  100. KeyboardCharacterListRequest(keyboardId: keyboardId),
  101. )
  102. .then(HttpHandler.handle(true));
  103. }
  104. //更新键盘人设
  105. Future<void> keyboardCharacterUpdate({
  106. required List<String> characterIds,
  107. required String keyboardId,
  108. }) {
  109. return atmobApi
  110. .keyboardCharacterUpdate(
  111. KeyboardCharacterUpdateRequest(
  112. keyboardId: keyboardId,
  113. characterIds: characterIds,
  114. ),
  115. )
  116. .then(HttpHandler.handle(true));
  117. }
  118. // 更新键盘信息
  119. Future<void> updateKeyboardInfo({
  120. required String keyboardId,
  121. String? name,
  122. String? imageUrl,
  123. String? birthday,
  124. int? intimacy,
  125. int? gender,
  126. }) {
  127. return atmobApi
  128. .keyboardUpdate(
  129. KeyboardUpdateRequest(
  130. keyboardId: keyboardId,
  131. name: name,
  132. imageUrl: imageUrl,
  133. birthday: birthday,
  134. intimacy: intimacy,
  135. gender: gender,
  136. ),
  137. )
  138. .then(HttpHandler.handle(false));
  139. }
  140. // 选择键盘
  141. Future<void> keyboardChoose({required String keyboardId}) {
  142. return atmobApi
  143. .keyboardChoose(KeyboardChooseRequest(keyboardId: keyboardId))
  144. .then(HttpHandler.handle(true));
  145. }
  146. // 获取开场白列表
  147. Future<KeyboardPrologueListResponse> getPrologueList() {
  148. return atmobApi
  149. .getPrologueList(AppBaseRequest())
  150. .then(HttpHandler.handle(true));
  151. }
  152. // 获取首页信息
  153. Future<KeyboardHomeInfoResponse> getKeyboardHomeInfo() {
  154. return atmobApi
  155. .getKeyboardHomeInfo(AppBaseRequest())
  156. .then(HttpHandler.handle(true))
  157. .then((response) {
  158. _homeInfo.value = response;
  159. return response;
  160. });
  161. }
  162. // 获取恋爱指数
  163. Future<KeyboardLoveIndexResponse> getKeyboardLoveIndex() {
  164. return atmobApi
  165. .getKeyboardLoveIndex(AppBaseRequest())
  166. .then(HttpHandler.handle(false))
  167. .then((response) {
  168. _homeLoveIndex.value = response;
  169. return response;
  170. });
  171. }
  172. // 生成键盘
  173. Future<KeyboardGenerateResponse> getKeyboardGenerate({
  174. required String name,
  175. required String imageUrl,
  176. required String birthday,
  177. required int intimacy,
  178. required int gender,
  179. }) {
  180. return atmobApi
  181. .keyboardGenerate(
  182. KeyboardGenerateRequest(
  183. intimacy: intimacy,
  184. name: name,
  185. gender: gender,
  186. birthday: birthday,
  187. imageUrl: imageUrl,
  188. ),
  189. )
  190. .then(HttpHandler.handle(true))
  191. .then((response) {
  192. return response;
  193. });
  194. }
  195. Future<KeyboardMemeExplainResponse> getKeyboardMemeExplain({
  196. required String birthday,
  197. required String targetBirthday,
  198. }) {
  199. return atmobApi
  200. .getKeyboardMemeExplain(
  201. KeyboardMemeExplainRequest(
  202. birthday: birthday,
  203. targetBirthday: targetBirthday,
  204. ),
  205. )
  206. .then(HttpHandler.handle(true));
  207. }
  208. static KeyboardRepository getInstance() => getIt.get<KeyboardRepository>();
  209. }