import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:http/http.dart'; import '../../../models/pantry/pentry.dart'; import '../../../models/user.dart'; import '../../../models/visits/visit.dart'; import '../../../models/visits/visits_group.dart'; import '../../../models/visits/visits_search.dart'; import '../../api_routes/urls.dart'; class RegularVisitsProvider extends ChangeNotifier { // number of items call in each request final pageItemNumber = 50; //reset provider data void reset() { visits = null; nextPage = true; stateCode = null; } // state code of current request to defied error message // like 400 customer request failed // 500 service not available int? stateCode; // true if there is next page in product list and false if not bool nextPage = true; // list of user requests List? visits; // when requests in-process _loading = true // done _loading = true // failed _loading = false bool? isLoading; VisitsSearch? visitsSearch = VisitsSearch(); /// return -2 if request in progress /// return -1 if error happen when sending request /// return state code if request complete may be 200, 404 or 403 /// for more details check http state manager /// lib\controllers\http_status_manger\http_status_manger.dart Future getVisits({ required String host, required User user, // VisitsSearch visitsSearch, }) async { if (isLoading == true) { return -2; } isLoading = true; Response response; //userId = 397.toString(); // testing id to view data try { response = await get( Uri.parse( "$host${URLs.getRegularVisits}?uid=${user.id}&token=${user.token}&page=${(visits?.length ?? 0) ~/ pageItemNumber}${visitsSearch?.toSearchString()}", ), headers: {"Content-Type": "application/json; charset=utf-8"}, ); } catch (error) { isLoading = false; stateCode = -1; notifyListeners(); return -1; } stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received try { List requestsListJson = json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", "")); List visits = requestsListJson.map((request) => Visit.fromJson(request)).toList(); visits.addAll(visits); if (visits.length == pageItemNumber) { nextPage = true; } else { nextPage = false; } } catch (error) { isLoading = false; stateCode = -1; notifyListeners(); return -1; } } isLoading = false; notifyListeners(); return response.statusCode; } /// return -2 if request in progress /// return -1 if error happen when sending request /// return state code if request complete may be 200, 404 or 403 /// for more details check http state manager /// lib\controllers\http_status_manger\http_status_manger.dart Future updateGroupOfVisits({ required String host, required User user, required VisitsGroup group, }) async { Response response; Map body = group.toJson(); body["token"] = user.token ?? ""; body["uid"] = user.id; //userId = 397.toString(); // testing id to view data try { response = await post( Uri.parse(host + URLs.updateRegularVisits), body: body, ); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received reset(); notifyListeners(); } return response.statusCode; } catch (error) { isLoading = false; stateCode = -1; notifyListeners(); return -1; } } Future getPently({ required String host, required User user, required String id, }) async { Response response; response = await get( Uri.parse("$host${URLs.getPentry}/$id"), headers: {"Content-Type": "application/json; charset=utf-8"}, ); Pentry? pantry; if (response.statusCode >= 200 && response.statusCode < 300) { pantry = Pentry.fromMap(json.decode(utf8.decode(response.bodyBytes))); } return pantry; } Future updatePentry({ required String host, required User user, required Pentry pentry, required Visit visit, }) async { try { Response response; Map body = pentry.toMap(); body["uid"] = user.id; body["token"] = user.token; response = await post( Uri.parse("$host${URLs.updatePentry}/${visit.id}"), body: body, ); if (response.statusCode >= 200 && response.statusCode < 300) { visit.status = pentry.ppmVisitStatus; notifyListeners(); } return response.statusCode; } catch (error) { return -1; } } }