talk_repository.dart 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. import 'dart:io';
  2. import 'package:electronic_assistant/data/api/atmob_api.dart';
  3. import 'package:electronic_assistant/data/api/atmob_file_api.dart';
  4. import 'package:electronic_assistant/data/api/request/talk_create_request.dart';
  5. import 'package:electronic_assistant/data/api/request/talk_delete_request.dart';
  6. import 'package:electronic_assistant/data/api/request/talk_file_request.dart';
  7. import 'package:get/get.dart';
  8. import '../../utils/http_handler.dart';
  9. import '../api/request/talk_generate_request.dart';
  10. import '../api/request/talk_paginate_request.dart';
  11. import '../api/request/talk_rename_request.dart';
  12. import '../api/request/talk_request.dart';
  13. import '../api/response/talk_check_electric_response.dart';
  14. import '../api/response/talk_info_response.dart';
  15. import '../api/response/talk_paginate_response.dart';
  16. import '../bean/talk_original.dart';
  17. import '../bean/talks.dart';
  18. import 'account_repository.dart';
  19. class TalkRepository {
  20. TalkRepository._();
  21. final Set<String> _uploadingTalkIds = {};
  22. final Map<String, RxDouble> _uploadingTalkProgress = {};
  23. final _talkList = RxList<TalkBean>();
  24. RxList<TalkBean> get talkList => _talkList;
  25. bool isUploadingTalk(String talkId) {
  26. return _uploadingTalkIds.contains(talkId);
  27. }
  28. void renovateTalkData(TalkBean talkInfo) {
  29. for (int i = 0; i < _talkList.length; i++) {
  30. if (_talkList[i].id == talkInfo.id) {
  31. _talkList[i].updateBean(talkInfo);
  32. break;
  33. }
  34. }
  35. }
  36. void setTalkList(List<TalkBean> list) {
  37. _talkList.assignAll(list);
  38. }
  39. void addNewTalkData(TalkBean talkInfo) {
  40. _talkList.insert(0, talkInfo);
  41. }
  42. clearTalkList() {
  43. _talkList.clear();
  44. }
  45. Future<TalkPaginateResponse> refreshHomeTalkData({int? sortType = 1}) {
  46. int limit;
  47. if (_talkList.isEmpty) {
  48. limit = 10;
  49. } else {
  50. limit = _talkList.length;
  51. }
  52. return requestTalkPagePaginate(0, limit,
  53. sortType: sortType, isClearAll: true);
  54. }
  55. Future<TalkPaginateResponse> requestTalkPagePaginate(int offset, int limit,
  56. {String? searchKeyword, int? sortType = 1, bool? isClearAll = false}) {
  57. return talkPagePaginate(offset, limit,
  58. searchKeyword: searchKeyword, sortType: sortType)
  59. .then((response) {
  60. if (isClearAll == true) {
  61. _talkList.clear();
  62. }
  63. if (response.list != null) {
  64. _talkList.addAll(response.list!);
  65. }
  66. return response;
  67. });
  68. }
  69. ///sortType 1:按创建时间倒序 2:按更新时间倒序
  70. Future<TalkPaginateResponse> talkPagePaginate(int offset, int limit,
  71. {String? searchKeyword, int? sortType = 1}) {
  72. return atmobApi
  73. .talkPagePaginate(TalkPaginateRequest(offset, limit,
  74. searchKeyword: searchKeyword, sortType: sortType))
  75. .then(HttpHandler.handle(false));
  76. }
  77. Future<List<TalkOriginal>> talkOriginal(String? talkId) {
  78. return atmobApi
  79. .talkOriginal(
  80. TalkRequest(talkId, isExample: !accountRepository.isLogin.value))
  81. .then(HttpHandler.handle(false))
  82. .then((data) {
  83. if (data.list != null) {
  84. return data.list!;
  85. } else {
  86. return [];
  87. }
  88. });
  89. }
  90. // duration 音频时长,单位为秒
  91. Future<TalkCheckElectricResponse> checkElectric(double duration) {
  92. return atmobApi
  93. .checkElectric(TalkGenerateRequest(duration))
  94. .then(HttpHandler.handle(false));
  95. }
  96. Future<TalkInfoResponse> talkInfo(String id) {
  97. return atmobApi
  98. .talkInfo(TalkRequest(id, isExample: !accountRepository.isLogin.value))
  99. .then(HttpHandler.handle(true));
  100. }
  101. Future<void> talkRename(String? id, String? title) {
  102. return atmobApi
  103. .talkRename(TalkRenameRequest(id, title))
  104. .then(HttpHandler.handle(true));
  105. }
  106. Future<void> talkDelete(String? id) {
  107. return atmobApi
  108. .talkDelete(TalkDeleteRequest(id))
  109. .then(HttpHandler.handle(true));
  110. }
  111. Future<TalkBean> talkCreate(String requestId, int duration,
  112. {String? localAudioUrl, int? uploadType}) {
  113. return atmobApi
  114. .talkCreate(TalkCreateRequest(duration, requestId,
  115. localAudioUrl: localAudioUrl, uploadType: uploadType))
  116. .then(HttpHandler.handle(true))
  117. .then((bean) {
  118. //添加新的录音到最新记录
  119. talkRepository.addNewTalkData(bean);
  120. return bean;
  121. });
  122. }
  123. Future<String> uploadTalkFile(String talkId, double duration, File file) {
  124. _uploadingTalkIds.add(talkId);
  125. return atmobFileApi
  126. .uploadTalkFile(TalkFileRequest(talkId, duration, file: file).toJson(),
  127. onSendProgress: (count, total) {
  128. if (_uploadingTalkProgress[talkId] == null) {
  129. _uploadingTalkProgress[talkId] = RxDouble(0);
  130. } else {
  131. _uploadingTalkProgress[talkId]!.value = count / total;
  132. }
  133. })
  134. .then(HttpHandler.handle(true))
  135. .then((response) {
  136. _uploadingTalkIds.remove(talkId);
  137. return response.taskId;
  138. })
  139. .catchError((error) {
  140. _uploadingTalkIds.remove(talkId);
  141. throw error;
  142. });
  143. }
  144. RxDouble getUploadProgress(String talkId) {
  145. if (_uploadingTalkProgress[talkId] == null) {
  146. _uploadingTalkProgress[talkId] = RxDouble(0);
  147. }
  148. return _uploadingTalkProgress[talkId]!;
  149. }
  150. }
  151. final talkRepository = TalkRepository._();