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 'package:test_sa/modules/asset_tracking/models/coordinates_model.dart'; import 'package:test_sa/modules/asset_tracking/models/asset_tracking_search_model.dart'; import 'package:test_sa/views/widgets/equipment/asset_tag_model.dart'; import 'models/asset_tracking_model.dart'; import 'models/floor_map_model.dart'; import 'models/penguin_site_model.dart'; import 'models/zone_data_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 zonesList = []; ZoneModel? selectedZone; List sitesList = []; PenguinSiteModel? selectedSite; List buildList = []; PenguinSiteModel? selectedBuilding; List floorList = []; PenguinSiteModel? selectedFloor; List coordinates = []; void calculateCoordinates() { coordinates.clear(); coordinates.addAll(selectedBuilding!.coordinates!.map((e) => Coordinates(latitude: e.latitude, longitude: e.longitude)).toList()); notify(); } // List getFilteredZones() { // if (zonesList.isEmpty || selectedSite == null || selectedBuilding == null) { // return []; // } else { // return zonesList.where((zone) => zone.siteId == selectedSite!.id).toList(); // } // } String get getExpansionHeader => (selectedBuilding == null || selectedBuilding == null) ? "Search Floor Map" : "${selectedSite!.label} > ${selectedBuilding!.label} > ${selectedFloor?.label ?? "Select Floor"}"; reset() { isLoading = false; isNextPageLoading = false; pageNo = 1; nextPage = false; selectedFloor = null; selectedBuilding = null; selectedSite = null; assetsList = []; assetsOnTheFloorList = []; coordinates = []; notify(); } notify() { notifyListeners(); } Future getAssetsFromPenguin({bool loadMore = false, AssetTrackingSearchModel? searchModel}) async { if (isLoading || isNextPageLoading) return -2; if (loadMore) { isNextPageLoading = true; pageNo += 1; } else { isLoading = true; pageNo = 1; } notifyListeners(); try { final Map payload = { "pageSize": pageItemNumber, "pageNumber": pageNo, }; if (searchModel != null) { payload.addAll(searchModel.toJson()); } 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(); if (loadMore) { assetsList.addAll(responseAssetList); } else { assetsList = responseAssetList; } 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; notifyListeners(); return -1; } } Future getBuildingMapFromPenguin() async { if (zonesList.isNotEmpty) { await Future.delayed(const Duration(milliseconds: 250)); // return; } try { final response = await ApiManager.instance.get(URLs.getPenguinBuildings + ""); if (response.statusCode >= 200 && response.statusCode < 300) { final Map jsonData = json.decode(response.body); List list = jsonData["data"]; zonesList.addAll(list.map((item) => ZoneModel.fromJson(item)).toList()); notify(); } } catch (error) { print("getZoneFromPenguin:Error:$error"); } } Future getZoneFromPenguin() async { if (zonesList.isEmpty) { try { final response = await ApiManager.instance.get(URLs.getPenguinZones); if (response.statusCode >= 200 && response.statusCode < 300) { final Map jsonData = json.decode(response.body); List list = jsonData["data"] ?? []; zonesList.addAll(list.map((item) => ZoneModel.fromJson(item)).toList()); } } catch (error) { print("getZoneFromPenguin:Error:$error"); } } // Building outline comes from the selected building, so always compute it. calculateCoordinates(); } Future getAssetsFromPenguinByFloor() async { try { assetsOnTheFloorList.clear(); Map body = { "campusId": selectedSite!.id, "venueIds": [selectedBuilding!.id] }; if (selectedFloor != null) { body["floorIds"] = [selectedFloor!.id]; } final response = await ApiManager.instance.post(URLs.getAssetsFromPenguin, body: body); 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(); } } int assetTagPageNumber = 1; int? totalAssetTags; List tagList = []; bool isLoadingAssetTags = false; void resetAssetTagData() { tagList.clear(); assetTagPageNumber = 1; totalAssetTags = null; } bool get isCanLoadMore => tagList.length < (totalAssetTags ?? 0); Future getPenguinAssetTags() async { if (isLoadingAssetTags) return; try { isLoadingAssetTags = true; notify(); final response = await ApiManager.instance.get(URLs.getPenguinAssetTags + "?pageNumber=$assetTagPageNumber&tagStatus=1&isMobile=1"); if (response.statusCode >= 200 && response.statusCode < 300) { final Map jsonData = json.decode(response.body); List list = jsonData["response"]["data"]; totalAssetTags ??= jsonData["response"]["totalRows"]; tagList.addAll(list.map((item) => AssetTagModel.fromJson(item)).toList()); if (tagList.length < totalAssetTags!) { assetTagPageNumber += 1; } } } catch (error) {} isLoadingAssetTags = false; notify(); } Future linkAssetWithPenguinTag(int assetId, int penguinTagId) async { try { final response = await ApiManager.instance.get(URLs.getPenguinAssetTags); if (response.statusCode >= 200 && response.statusCode < 300) { final Map jsonData = json.decode(response.body); List list = jsonData["data"]; return list; } return []; } catch (error) { return []; } } }