view.dart 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. import 'package:electronic_assistant/base/base_page.dart';
  2. import 'package:electronic_assistant/resource/colors.gen.dart';
  3. import 'package:electronic_assistant/resource/string.gen.dart';
  4. import 'package:electronic_assistant/utils/expand.dart';
  5. import 'package:flutter/material.dart';
  6. import 'package:flutter_screenutil/flutter_screenutil.dart';
  7. import 'package:get/get.dart';
  8. import '../../../data/bean/agenda.dart';
  9. import '../../../data/bean/talks.dart';
  10. import '../../../resource/assets.gen.dart';
  11. import '../../../utils/common_style.dart';
  12. import '../../home/view.dart';
  13. import '../common_view.dart';
  14. import 'controller.dart';
  15. class TodoView extends BasePage<TodoController> {
  16. final String? talkId;
  17. TodoView(this.talkId, {super.key}) {
  18. Get.lazyPut(() => TodoController(talkId), tag: talkId);
  19. }
  20. @override
  21. get controller => Get.find<TodoController>(tag: talkId);
  22. @override
  23. Widget buildBody(BuildContext context) {
  24. return Obx(() {
  25. return _buildTodoStatusView();
  26. });
  27. }
  28. _buildAllTaskView() {
  29. return Padding(
  30. padding: EdgeInsets.only(top: 6.h, bottom: 16.h),
  31. child: Column(
  32. crossAxisAlignment: CrossAxisAlignment.start,
  33. children: [
  34. Text(StringName.talkTodoAll.tr,
  35. style: TextStyle(
  36. fontSize: 14.sp, color: ColorName.secondaryTextColor)),
  37. SizedBox(height: 12.h),
  38. _buildAddAgendaView(),
  39. buildAllTodoView(),
  40. ],
  41. ),
  42. );
  43. }
  44. Widget buildAllTodoView() {
  45. return Obx(() {
  46. return Column(
  47. children: controller.agendaAllList.map((agenda) {
  48. return Padding(
  49. padding: EdgeInsets.only(bottom: 8.h),
  50. child: controller.isEditModel
  51. ? getTodoItemView(
  52. agenda,
  53. (list) => getTalkAgendaEditModelList(list,
  54. removeCallback: (agenda) {
  55. controller.removeTalkAgenda(list, agenda);
  56. }))
  57. : getTodoItemView(
  58. agenda,
  59. (list) => getTalkAgendaSettingList(list, itemClick: (agenda) {
  60. controller.agendaTodo(agenda);
  61. })),
  62. );
  63. }).toList());
  64. });
  65. }
  66. Widget _buildMineTodoList() {
  67. return Builder(builder: (context) {
  68. return Theme(
  69. data: Theme.of(context).copyWith(
  70. splashFactory: NoSplash.splashFactory,
  71. ),
  72. child: Obx(() {
  73. return Visibility(
  74. visible: !controller.isEditModel,
  75. child: ExpansionTile(
  76. initiallyExpanded: true,
  77. onExpansionChanged: (value) {
  78. controller.mineAgendaIsExpanded.value = value;
  79. },
  80. shape: RoundedRectangleBorder(
  81. borderRadius: BorderRadius.circular(4.0),
  82. side: const BorderSide(color: Colors.transparent),
  83. ),
  84. collapsedShape: RoundedRectangleBorder(
  85. borderRadius: BorderRadius.circular(4.0),
  86. side: const BorderSide(color: Colors.transparent),
  87. ),
  88. minTileHeight: 46.h,
  89. showTrailingIcon: false,
  90. childrenPadding: EdgeInsets.zero,
  91. tilePadding: EdgeInsets.zero,
  92. title: Row(
  93. children: [
  94. Text(StringName.talkTabMyTask.tr,
  95. style: TextStyle(
  96. fontSize: 14.sp,
  97. color: ColorName.secondaryTextColor)),
  98. const Spacer(),
  99. Obx(() {
  100. return Row(
  101. children: [
  102. Text(
  103. '${controller.agendaMineList.length}${StringName.talkTodoItem.tr}',
  104. style: TextStyle(
  105. fontSize: 15.sp,
  106. color: ColorName.secondaryTextColor),
  107. ),
  108. SizedBox(width: 3.w),
  109. SizedBox(
  110. width: 16.w,
  111. height: 16.w,
  112. child: controller.mineAgendaIsExpanded.value
  113. ? Assets.images.iconTalkExpand.image()
  114. : Assets.images.iconTalkCollapse.image()),
  115. ],
  116. );
  117. }),
  118. SizedBox(width: 12.w),
  119. ],
  120. ),
  121. children: controller.agendaMineList.map((agenda) {
  122. return _buildMineItem(agenda);
  123. }).toList(),
  124. ),
  125. );
  126. }),
  127. );
  128. });
  129. }
  130. Widget _buildMineItem(Agenda agenda) {
  131. return Container(
  132. margin: EdgeInsets.only(bottom: 8.w),
  133. decoration: BoxDecoration(
  134. borderRadius: BorderRadius.circular(8.0),
  135. border: Border.all(
  136. color: '#F6F6F6'.toColor(),
  137. width: 2,
  138. ),
  139. ),
  140. padding: EdgeInsets.symmetric(vertical: 17.w, horizontal: 12.w),
  141. child: Row(
  142. children: [
  143. Expanded(
  144. child: Padding(
  145. padding: const EdgeInsets.only(right: 12).w,
  146. child: Text(agenda.content ?? '',
  147. maxLines: 1,
  148. overflow: TextOverflow.ellipsis,
  149. style: TextStyle(
  150. fontSize: 15.sp,
  151. fontWeight: FontWeight.bold,
  152. color: ColorName.primaryTextColor)),
  153. ),
  154. ),
  155. GestureDetector(
  156. onTap: () {
  157. controller.onClickThinking(agenda);
  158. },
  159. child: Container(
  160. decoration: getPrimaryBtnDecoration(6),
  161. padding: const EdgeInsets.symmetric(horizontal: 9, vertical: 4).w,
  162. child: Text(
  163. StringName.homeTalkThinking.tr,
  164. style: TextStyle(fontSize: 13.sp, color: ColorName.white),
  165. ),
  166. ),
  167. )
  168. ],
  169. ),
  170. );
  171. }
  172. Widget _buildTodoStatusView() {
  173. if (controller.talkBean.value?.status.value == TalkStatus.analysisFail) {
  174. return getTalkFailView();
  175. } else if (controller.talkBean.value?.status.value ==
  176. TalkStatus.analysing ||
  177. controller.talkBean.value?.status.value == TalkStatus.waitAnalysis ||
  178. controller.talkBean.value?.status.value == TalkStatus.notAnalysis) {
  179. return getTalkAnalyseView(
  180. controller.talkController.isUploading.value == true &&
  181. controller.talkController.talkBean.value?.status.value ==
  182. TalkStatus.notAnalysis
  183. ? '录音上传中,请勿关闭小听'
  184. : controller
  185. .talkController.talkBean.value?.progressContent.value ??
  186. '',
  187. controller.talkController.isUploading.value == true &&
  188. controller.talkController.talkBean.value?.status.value ==
  189. TalkStatus.notAnalysis
  190. ? controller.talkController.uploadProgress.value
  191. : controller.talkController.talkBean.value?.progress.value
  192. ?.toDouble() ??
  193. 0.0);
  194. } else if (controller.talkBean.value?.status.value ==
  195. TalkStatus.analysisSuccess) {
  196. return _buildTodoContent();
  197. } else {
  198. return Container();
  199. }
  200. }
  201. Widget _buildTodoContent() {
  202. if (controller.agendaAllList.isEmpty && !controller.isEditModel) {
  203. return buildAgendaEmptyView(110.h);
  204. }
  205. return ListView(
  206. padding: EdgeInsets.only(left: 12.w, right: 12.w, bottom: 150.w),
  207. children: [_buildMineTodoList(), _buildAllTaskView()],
  208. );
  209. }
  210. Widget _buildAddAgendaView() {
  211. return Obx(() {
  212. if (controller.isEditModel) {
  213. return Container(
  214. margin: EdgeInsets.only(bottom: 8.h),
  215. child: Builder(builder: (context) {
  216. return getAddAgendaView(StringName.talkAddAgendaProject.tr,
  217. onClick: () {
  218. controller.showAddAgendaDialog(context);
  219. });
  220. }),
  221. );
  222. } else {
  223. return Container();
  224. }
  225. });
  226. }
  227. }