You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

199 lines
7.2KB

  1. import 'package:farm_tpf/data/repository/repository.dart';
  2. import 'package:farm_tpf/presentation/custom_widgets/button/button_2_icon.dart';
  3. import 'package:farm_tpf/presentation/custom_widgets/button/second_button.dart';
  4. import 'package:farm_tpf/presentation/screens/codes/code_detail_page.dart';
  5. import 'package:farm_tpf/presentation/screens/codes/create_stamp_page.dart';
  6. import 'package:farm_tpf/presentation/screens/codes/models/stamp.dart';
  7. import 'package:farm_tpf/presentation/screens/codes/widgets/item_code.dart';
  8. import 'package:farm_tpf/presentation/screens/task/models/task_update_request.dart';
  9. import 'package:farm_tpf/themes/app_colors.dart';
  10. import 'package:farm_tpf/utils/const_common.dart';
  11. import 'package:flutter/cupertino.dart';
  12. import 'package:flutter/foundation.dart';
  13. import 'package:flutter/material.dart';
  14. import 'package:flutter_bloc/flutter_bloc.dart';
  15. import 'package:get/get.dart';
  16. import '../../../models/item_dropdown.dart';
  17. import '../../../themes/styles_text.dart';
  18. import '../../../utils/const_string.dart';
  19. import '../../../utils/helpers.dart';
  20. import '../../custom_widgets/bottom_loader.dart';
  21. import '../../custom_widgets/dropdown/multiple_select_bottom_sheet.dart';
  22. import '../../custom_widgets/loading_list_page.dart';
  23. import '../plot/widget_search.dart';
  24. import 'bloc/task_bloc.dart';
  25. import 'create_task_page.dart';
  26. import 'task_detail_page.dart';
  27. import 'widgets/task_item.dart';
  28. class TaskPage extends StatefulWidget {
  29. final int cropId;
  30. const TaskPage({super.key, required this.cropId});
  31. @override
  32. State<TaskPage> createState() => _TaskPageState();
  33. }
  34. class _TaskPageState extends State<TaskPage> {
  35. final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
  36. TaskBloc bloc = TaskBloc(Repository());
  37. final _scrollController = ScrollController();
  38. final _scrollThreshold = 250.0;
  39. @override
  40. void initState() {
  41. bloc.cropId = widget.cropId;
  42. bloc.add(DataFetched());
  43. _scrollController.addListener(() {
  44. final maxScroll = _scrollController.position.maxScrollExtent;
  45. final currentScroll = _scrollController.position.pixels;
  46. if (maxScroll - currentScroll < _scrollThreshold) {
  47. bloc.add(DataFetched());
  48. }
  49. });
  50. super.initState();
  51. }
  52. @override
  53. void dispose() {
  54. _scrollController.dispose();
  55. super.dispose();
  56. }
  57. @override
  58. Widget build(BuildContext context) {
  59. return Scaffold(
  60. backgroundColor: Colors.white,
  61. key: _scaffoldKey,
  62. body: SafeArea(
  63. child: Column(
  64. crossAxisAlignment: CrossAxisAlignment.start,
  65. children: <Widget>[
  66. Row(
  67. children: [
  68. ValueListenableBuilder<String>(
  69. valueListenable: bloc.sort,
  70. builder: (context, sort, _) {
  71. return Button2Icon(
  72. leftIcon: (sort == describeEnum(SortType.asc)) ? CupertinoIcons.arrow_up : CupertinoIcons.arrow_down,
  73. title: 'Ngày tạo',
  74. onPressed: () {
  75. if (sort == describeEnum(SortType.asc)) {
  76. bloc.sort.value = describeEnum(SortType.desc);
  77. } else {
  78. bloc.sort.value = describeEnum(SortType.asc);
  79. }
  80. bloc.sort.notifyListeners();
  81. bloc.add(OnRefresh());
  82. },
  83. );
  84. },
  85. ),
  86. ValueListenableBuilder<List<ItemDropDown>>(
  87. valueListenable: bloc.selectedStatus,
  88. builder: (context, selecteds, _) {
  89. return ValueListenableBuilder<List<ItemDropDown>>(
  90. valueListenable: bloc.status,
  91. builder: (context, status, _) {
  92. return MultipleSelectBottomSheet(
  93. dataSources: status,
  94. initValue: selecteds,
  95. onSelected: (val) {
  96. bloc.selectedStatus.value = val;
  97. Helpers.hideKeyboard(context);
  98. bloc.add(OnRefresh());
  99. },
  100. hint: 'Trạng thái',
  101. );
  102. },
  103. );
  104. },
  105. ),
  106. const Spacer(),
  107. SecondButton(
  108. onPressed: () {
  109. Get.to(() => CreateTaskPage(
  110. cropId: widget.cropId,
  111. ))?.then((value) {
  112. if (value != null) {
  113. bloc.add(OnRefresh());
  114. }
  115. });
  116. },
  117. title: 'Thêm',
  118. leftIcon: CupertinoIcons.add,
  119. color: AppColors.primary1,
  120. textColor: Colors.white,
  121. borderColor: AppColors.primary1,
  122. ),
  123. ],
  124. ),
  125. Expanded(
  126. child: mainBody(),
  127. ),
  128. ],
  129. ),
  130. ),
  131. );
  132. }
  133. Widget mainBody() {
  134. return BlocBuilder<TaskBloc, TaskState>(
  135. bloc: bloc,
  136. builder: (context, state) {
  137. if (state is TaskFailure) {
  138. return Center(child: Text(state.errorString));
  139. }
  140. if (state is TaskSuccess) {
  141. if ((state.items ?? []).isEmpty) {
  142. return Center(child: Text(label_list_empty));
  143. }
  144. return RefreshIndicator(
  145. child: ListView.builder(
  146. physics: AlwaysScrollableScrollPhysics(),
  147. itemBuilder: (BuildContext context, int index) {
  148. return index >= (state.items ?? []).length
  149. ? BottomLoader()
  150. : ItemTask(
  151. item: state.items?[index],
  152. onPressed: () {
  153. Get.to(
  154. () => TaskDetailPage(
  155. taskId: state.items?[index].id,
  156. ),
  157. )?.then((value) {
  158. if (value != null) {
  159. bloc.add(OnRefresh());
  160. }
  161. });
  162. },
  163. onChangedStatus: (status) {
  164. bloc.updateStatusTask(
  165. RequestTaskUpdate(
  166. id: state.items?[index].id,
  167. completed: status,
  168. ),
  169. onSuccess: () {
  170. bloc.add(OnRefresh());
  171. },
  172. );
  173. },
  174. );
  175. },
  176. itemCount: (state.hasReachedMax ?? false) ? (state.items ?? []).length : (state.items ?? []).length + 1,
  177. controller: _scrollController,
  178. ),
  179. onRefresh: () async {
  180. bloc.add(OnRefresh());
  181. });
  182. }
  183. return Center(
  184. child: LoadingListPage(),
  185. );
  186. },
  187. );
  188. }
  189. }