import 'package:flutter/material.dart'; import 'package:qadirneyriz/models/private_meeting/private_meetings_model.dart'; import 'package:qadirneyriz/services/private_meetings/private_meetings.dart'; import 'package:qadirneyriz/utils/enums/status.dart'; class PrivateMeetingsState extends ChangeNotifier { // ذخیره فیلترهای قبلی برای مقایسه String? previousFromDate; String? previousToDate; int? previousLocationId; int? previousSubjectId; int? previousManagersId; int? previousStatusId; void setAllFiltersForThen() { previousFromDate = fromDate; previousToDate = toDate; previousLocationId = selectedLocationId; previousSubjectId = selectedSubjectId; previousManagersId = selectedManagersId; previousStatusId = selectedStatusId; } bool isAnyChangesInFilters() { if (previousFromDate != fromDate || previousToDate != toDate || previousLocationId != selectedLocationId || previousSubjectId != selectedSubjectId || previousManagersId != selectedManagersId || previousStatusId != selectedStatusId) { return true; } else { return false; } } // api meetings PrivateMeetingsApi privateMeetingsApi = PrivateMeetingsApi(); // meetings list Status privateStatusMeetings = Status.loading; Status privatePaginationMeetings = Status.ready; PrivateMeetingsModel? privateMeetingsModel; int pagePrivateMeetings = 1; int limitPrivateMeetings = 10; bool pageEndedPrivateMeetings = false; Future getPrivateMeetings( {bool refresh = false, String? fromDate, String? toDate, int? location, int? subject, int? meetingManager, int? meetingStatus}) async { if (refresh) { privateStatusMeetings = Status.loading; notifyListeners(); } if (privateMeetingsModel != null && privateMeetingsModel!.data!.isNotEmpty && !refresh) { privateStatusMeetings = Status.ready; notifyListeners(); pagePrivateMeetings = 1; pageEndedPrivateMeetings = false; privatePaginationMeetings = Status.ready; privateMeetingsModel = await privateMeetingsApi.getPrivateMeetings( page: pagePrivateMeetings, count: limitPrivateMeetings, fromDate: fromDate, toDate: toDate, location: location, subject: subject, meetingManager: meetingManager, status: meetingStatus); } else { pagePrivateMeetings = 1; pageEndedPrivateMeetings = false; privatePaginationMeetings = Status.ready; try { privateStatusMeetings = Status.loading; notifyListeners(); privateMeetingsModel = await privateMeetingsApi.getPrivateMeetings( page: pagePrivateMeetings, count: limitPrivateMeetings, fromDate: fromDate, toDate: toDate, location: location, subject: subject, meetingManager: meetingManager, status: meetingStatus); if (privateMeetingsModel != null && privateMeetingsModel!.data!.isNotEmpty) { if (privateMeetingsModel!.data!.isNotEmpty) { privateStatusMeetings = Status.ready; } else if (!privateMeetingsModel!.hasData() && privateMeetingsModel == null) { privateStatusMeetings = Status.empty; } else if (privateMeetingsModel!.data!.length < limitPrivateMeetings) { pageEndedPrivateMeetings = true; privateStatusMeetings = Status.empty; } } else { privateStatusMeetings = Status.empty; } } catch (e) { privateStatusMeetings = Status.error; print('$e'); } notifyListeners(); } notifyListeners(); print(privateStatusMeetings); return privateStatusMeetings; } Future nextPagePrivateMeetings( {String? fromDate, String? toDate, int? location, int? subject, int? meetingManager, int? meetingStatus}) async { if (pageEndedPrivateMeetings == false && privatePaginationMeetings == Status.ready) { privatePaginationMeetings = Status.loading; notifyListeners(); int p = pagePrivateMeetings; pagePrivateMeetings = p + 1; try { final adsPaginationModel = await privateMeetingsApi.getPrivateMeetings( page: pagePrivateMeetings, count: limitPrivateMeetings, fromDate: fromDate, toDate: toDate, location: location, subject: subject, meetingManager: meetingManager, status: meetingStatus); if (adsPaginationModel.hasData()) { privateMeetingsModel!.data!.addAll(adsPaginationModel.data!); if (adsPaginationModel.data!.length < limitPrivateMeetings) { pageEndedPrivateMeetings = true; privatePaginationMeetings = Status.empty; } else { privatePaginationMeetings = Status.ready; } } else if (!adsPaginationModel.hasData()) { pageEndedPrivateMeetings = true; privatePaginationMeetings = Status.empty; } } catch (e) { pageEndedPrivateMeetings = true; privatePaginationMeetings = Status.empty; } notifyListeners(); } } // set date for filters String fromDate = ''; String toDate = ''; void setFromDates(String? newFromDate) { fromDate = newFromDate ?? ''; notifyListeners(); } void setToDates(String? newToDate) { toDate = newToDate ?? ''; notifyListeners(); } // clear filters void clearFilters() { selectedLocationId = null; selectedManagersId = null; selectedStatusId = null; selectedSubjectId = null; fromDate = ''; toDate = ''; notifyListeners(); } // is filter Not empty bool hasActiveFilters() { return selectedLocationId != null || selectedManagersId != null || selectedStatusId != null || selectedSubjectId != null || fromDate.isNotEmpty || toDate.isNotEmpty; } // get filters location meetings int? selectedLocationId; void selectLocation(int? locationId) { selectedLocationId = locationId; notifyListeners(); } // get filters subjects meetings int? selectedSubjectId; void selectSubject(int? subjectId) { selectedSubjectId = subjectId; notifyListeners(); } // get filters meeting managers int? selectedManagersId; void selectManager(int? managerId) { selectedManagersId = managerId; notifyListeners(); } // all meeting status filters int? selectedStatusId; void selectStatusMeeting(int? statusId) { selectedStatusId = statusId; notifyListeners(); } // cancel meeting Map statusCancelMeeting = {}; String? messageCancelMeeting; Map? errorsCancelMeeting; Future cancelMeeting({ required int id, }) async { statusCancelMeeting[id] = Status.loading; notifyListeners(); try { final result = await privateMeetingsApi.cancelPrivateMeetingApi( id: id, ); if (result.isOk) { statusCancelMeeting[id] = Status.ready; messageCancelMeeting = result.message; } else if (result.isOk == false) { // print(result.isOk); errorsCancelMeeting = result.errors; messageCancelMeeting = result.message; statusCancelMeeting[id] = Status.error; } else { statusCancelMeeting[id] = Status.error; } notifyListeners(); } catch (e) { statusCancelMeeting[id] = Status.error; // print(e); } notifyListeners(); // print(statusCancelMeeting); return statusCancelMeeting[id]!; } // accept meeting Map statusAcceptMeeting = {}; String? messageAcceptMeeting; Map? errorsAcceptMeeting; Future acceptMeeting({ required int id, }) async { statusAcceptMeeting[id] = Status.loading; notifyListeners(); try { final result = await privateMeetingsApi.acceptPrivateMeetingApi( id: id, ); if (result.isOk) { statusAcceptMeeting[id] = Status.ready; messageAcceptMeeting = result.message; } else if (result.isOk == false) { // print(result.isOk); errorsAcceptMeeting = result.errors; messageAcceptMeeting = result.message; statusAcceptMeeting[id] = Status.error; } else { statusAcceptMeeting[id] = Status.error; } notifyListeners(); } catch (e) { statusAcceptMeeting[id] = Status.error; // print(e); } notifyListeners(); // print(statusAcceptMeeting); return statusAcceptMeeting[id]!; } }