talk_repository.dart 5.3 KB

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