import 'dart:convert'; import 'package:flutter/foundation.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'models/asset_tracking_model.dart'; import 'models/floor_map_model.dart'; import 'models/penguin_site_model.dart'; class AssetTrackingProvider extends ChangeNotifier { bool isLoading = false; bool isNextPageLoading = false; final pageItemNumber = 12; int pageNo = 1; bool nextPage = false; List assetsList = []; List assetsOnTheFloorList = []; List sitesList = []; PenguinSiteModel? selectedSite; List buildList = []; PenguinSiteModel? selectedBuilding; List floorList = []; PenguinSiteModel? selectedFloor; String get getExpansionHeader => (selectedBuilding == null || selectedBuilding == null || selectedFloor == null) ? "Search Floor Map" : "${selectedSite!.label} > ${selectedBuilding!.label} > ${selectedFloor!.label}"; reset() { isLoading = false; isNextPageLoading = false; pageNo = 1; nextPage = false; selectedFloor = null; selectedBuilding = null; selectedSite = null; assetsList = []; assetsOnTheFloorList = []; notify(); } notify() { notifyListeners(); } Future getAssetsFromPenguin({bool loadMore = false}) async { if (isLoading || isNextPageLoading) return -2; if (loadMore) { isNextPageLoading = true; pageNo += 1; } else { isLoading = true; pageNo = 1; // reset pagination } notifyListeners(); try { final payload = {"pageSize": pageItemNumber, "pageNumber": pageNo}; final response = await ApiManager.instance.post(URLs.getAssetsFromPenguin, body: payload); if (response.statusCode >= 200 && response.statusCode < 300) { final Map jsonData = json.decode(response.body); List list = jsonData["data"] ?? []; List responseAssetList = list.map((item) => AssetTrackingModel.fromJson(item)).toList(); // assetsList.addAll(list.map((item) => AssetTrackingModel.fromJson(item)).toList()); // if (jsonData["totalRows"] <= assetsList.length) { // nextPage = true; // } if (loadMore) { assetsList.addAll(responseAssetList); // assetInventoryResponse?.totalRows = newResponse.totalRows; } else { assetsList = responseAssetList; // assetInventoryResponse = newResponse; } final int totalRows = (jsonData["totalRows"] as int?) ?? assetsList.length; nextPage = (assetsList.length) < totalRows; } else { if (loadMore) pageNo -= 1; } isLoading = false; isNextPageLoading = false; notifyListeners(); return response.statusCode; } catch (error) { if (loadMore) pageNo -= 1; isLoading = false; isNextPageLoading = false; // stateCode = -1; // nextPage = false; notifyListeners(); return -1; } } Future getAssetsFromPenguinByFloor() async { try { assetsOnTheFloorList.clear(); final response = await ApiManager.instance.post(URLs.getAssetsFromPenguin, body: { "campusId": selectedSite!.id, "venueIds": [selectedBuilding!.id], "floorIds": [selectedFloor!.id] }); if (response.statusCode >= 200 && response.statusCode < 300) { final Map jsonData = json.decode(response.body); List list = jsonData["data"]; assetsOnTheFloorList.addAll(list.map((item) => AssetTrackingModel.fromJson(item)).toList()); } notifyListeners(); } catch (error) { notifyListeners(); } } Future getFloorMap(int floorId) async { FloorMapModel? floorMapModel; try { final response = await ApiManager.instance.get(URLs.getPenguinFloors + "/$floorId/maps"); if (response.statusCode >= 200 && response.statusCode < 300) { floorMapModel = FloorMapModel.fromJson(json.decode(response.body)["data"]); final geoJsonResponse = await ApiManager.instance.get(floorMapModel.geojsonUrl!); floorMapModel.geojsonData = json.decode(geoJsonResponse.body); } return floorMapModel; } catch (error) { return floorMapModel; } } Future getPenguinSites() async { try { sitesList.clear(); buildList.clear(); floorList.clear(); selectedSite = null; selectedBuilding = null; selectedFloor = null; final response = await ApiManager.instance.get(URLs.getPenguinSites); if (response.statusCode >= 200 && response.statusCode < 300) { final Map jsonData = json.decode(response.body); List list = jsonData["data"]; sitesList.addAll(list.map((item) => PenguinSiteModel.fromJson(item)).toList()); } notifyListeners(); } catch (error) { notifyListeners(); } } Future> getPenguinDepartments(int id) async { List sitesList = []; try { final response = await ApiManager.instance.get(URLs.getPenguinDepartments + "?siteId=$id"); if (response.statusCode >= 200 && response.statusCode < 300) { final Map jsonData = json.decode(response.body); List list = jsonData["data"]; sitesList.addAll(list.map((item) => PenguinSiteModel.fromJson(item)).toList()); } return sitesList; } catch (error) { return sitesList; } } Future getPenguinBuildings(int id) async { try { buildList.clear(); floorList.clear(); selectedBuilding = null; selectedFloor = null; final response = await ApiManager.instance.get(URLs.getPenguinBuildings + "?siteId=$id"); if (response.statusCode >= 200 && response.statusCode < 300) { final Map jsonData = json.decode(response.body); List list = jsonData["data"]; buildList.addAll(list.map((item) => PenguinSiteModel.fromJson(item)).toList()); } notifyListeners(); } catch (error) { notifyListeners(); } } Future getPenguinFloors(int id) async { try { floorList.clear(); selectedFloor = null; final response = await ApiManager.instance.get(URLs.getPenguinFloors + "?buildingId=$id"); if (response.statusCode >= 200 && response.statusCode < 300) { final Map jsonData = json.decode(response.body); List list = jsonData["data"]; floorList.addAll(list.map((item) => PenguinSiteModel.fromJson(item)).toList()); } notifyListeners(); } catch (error) { notifyListeners(); } } }