import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/pages/common/common_list_controller.dart'; import 'package:get/get.dart'; mixin MultiSelectData { bool checked = false; } abstract interface class MultiSelectBase { RxBool get enableMultiSelect; int get checkedCount; void onSelect(T item); void handleSelect({bool checked = false, bool disableSelect = true}); void onRemove(); } mixin BaseMultiSelectMixin implements MultiSelectBase { late final RxInt rxCount = 0.obs; @override int get checkedCount => rxCount.value; @override final RxBool enableMultiSelect = false.obs; RxObjectMixin get state; List get list; Iterable get allChecked => list.where((v) => v.checked); @override void handleSelect({bool checked = false, bool disableSelect = true}) { for (final item in list) { item.checked = checked; } state.refresh(); rxCount.value = checked ? list.length : 0; if (disableSelect && !checked) { enableMultiSelect.value = false; } } @override void onSelect(T item) { item.checked = !item.checked; if (item.checked) { rxCount.value++; } else { rxCount.value--; } state.refresh(); if (checkedCount == 0) { enableMultiSelect.value = false; } } } mixin CommonMultiSelectMixin implements MultiSelectBase { @override late final RxBool enableMultiSelect = false.obs; RxBool? get allSelected => null; Rx?>> get loadingState; late final RxInt rxCount = 0.obs; @override int get checkedCount => rxCount.value; Iterable get allChecked => loadingState.value.data!.where((v) => v.checked); @override void onSelect(T item) { List list = loadingState.value.data!; item.checked = !item.checked; if (item.checked) { rxCount.value++; } else { rxCount.value--; } loadingState.refresh(); if (checkedCount == 0) { enableMultiSelect.value = false; } else { allSelected?.value = checkedCount == list.length; } } @override void handleSelect({bool checked = false, bool disableSelect = true}) { if (loadingState.value.isSuccess) { final list = loadingState.value.data; if (list != null && list.isNotEmpty) { for (final item in list) { item.checked = checked; } loadingState.refresh(); rxCount.value = checked ? list.length : 0; } } if (disableSelect && !checked) { enableMultiSelect.value = false; } } } mixin DeleteItemMixin on CommonListController, CommonMultiSelectMixin { Future afterDelete(Set removeList) async { final list = loadingState.value.data!; if (removeList.length == list.length) { list.clear(); } else if (removeList.length == 1) { list.remove(removeList.first); } else { list.removeWhere(removeList.contains); } if (list.isNotEmpty || isEnd) { loadingState.refresh(); } else { onReload(); } if (enableMultiSelect.value) { rxCount.value = 0; enableMultiSelect.value = false; } } } // abstract class SetMultiSelectController // extends CommonListController // with MultiSelectMixin, SetCommonMultiSelectMixin {} // mixin SetCommonMultiSelectMixin on MultiSelectMixin { // Rx?>> get loadingState; // RxSet get selected; // @override // int get checkedCount => selected.length; // R getId(T item); // @override // void onSelect(T item, [bool disableSelect = true]) { // final id = getId(item); // if (selected.contains(id)) { // selected.remove(id); // } else { // selected.add(id); // } // loadingState.refresh(); // if (disableSelect) { // if (checkedCount == 0) { // enableMultiSelect.value = false; // } // } else { // allSelected.value = checkedCount == loadingState.value.data!.length; // } // } // @override // void handleSelect([bool checked = false, bool disableSelect = true]) { // if (loadingState.value.isSuccess) { // final list = loadingState.value.data; // if (list != null && list.isNotEmpty) { // if (checked) { // selected.addAll(list!.map(getId)); // } else { // selected.clear(); // } // loadingState.refresh(); // } // } // if (disableSelect && !checked) { // enableMultiSelect.value = false; // } // } // }