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.

194 lines
7.0KB

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