From 4d9e57c8b5d35c0225571bffe6eb4a5ff394c4f9 Mon Sep 17 00:00:00 2001 From: Faris Armoush Date: Wed, 14 May 2025 10:51:37 +0300 Subject: [PATCH] Created and connected a remote implementation that fetches the heat map occupancy per space from the API. --- .../analytics/views/analytics_page.dart | 6 ++-- .../fake_occupancy_heat_map_service.dart | 25 ------------- .../remote_occupancy_heat_map_service.dart | 35 +++++++++++++++++++ 3 files changed, 39 insertions(+), 27 deletions(-) delete mode 100644 lib/pages/analytics/services/occupancy_heat_map/fake_occupancy_heat_map_service.dart create mode 100644 lib/pages/analytics/services/occupancy_heat_map/remote_occupancy_heat_map_service.dart diff --git a/lib/pages/analytics/modules/analytics/views/analytics_page.dart b/lib/pages/analytics/modules/analytics/views/analytics_page.dart index 354455e9..6674667c 100644 --- a/lib/pages/analytics/modules/analytics/views/analytics_page.dart +++ b/lib/pages/analytics/modules/analytics/views/analytics_page.dart @@ -14,7 +14,7 @@ import 'package:syncrow_web/pages/analytics/modules/occupancy/blocs/occupancy_he import 'package:syncrow_web/pages/analytics/services/energy_consumption_by_phases/fake_energy_consumption_by_phases_service.dart'; import 'package:syncrow_web/pages/analytics/services/energy_consumption_per_device/fake_energy_consumption_per_device_service.dart'; import 'package:syncrow_web/pages/analytics/services/occupacy/fake_occupacy_service.dart'; -import 'package:syncrow_web/pages/analytics/services/occupancy_heat_map/fake_occupancy_heat_map_service.dart'; +import 'package:syncrow_web/pages/analytics/services/occupancy_heat_map/remote_occupancy_heat_map_service.dart'; import 'package:syncrow_web/pages/analytics/services/power_clamp_info/remote_power_clamp_info_service.dart'; import 'package:syncrow_web/pages/analytics/services/realtime_device_service/firebase_realtime_device_service.dart'; import 'package:syncrow_web/pages/analytics/services/total_energy_consumption/remote_total_energy_consumption_service.dart'; @@ -60,7 +60,9 @@ class AnalyticsPage extends StatelessWidget { ), BlocProvider(create: (context) => OccupancyBloc(FakeOccupacyService())), BlocProvider( - create: (context) => OccupancyHeatMapBloc(FakeOccupancyHeatMapService()), + create: (context) => OccupancyHeatMapBloc( + RemoteOccupancyHeatMapService(HTTPService()), + ), ), BlocProvider(create: (context) => AnalyticsDatePickerBloc()), ], diff --git a/lib/pages/analytics/services/occupancy_heat_map/fake_occupancy_heat_map_service.dart b/lib/pages/analytics/services/occupancy_heat_map/fake_occupancy_heat_map_service.dart deleted file mode 100644 index 852e9e8c..00000000 --- a/lib/pages/analytics/services/occupancy_heat_map/fake_occupancy_heat_map_service.dart +++ /dev/null @@ -1,25 +0,0 @@ -import 'package:syncrow_web/pages/analytics/models/occupancy_heat_map_model.dart'; -import 'package:syncrow_web/pages/analytics/params/get_occupancy_heat_map_param.dart'; -import 'package:syncrow_web/pages/analytics/services/occupancy_heat_map/occupancy_heat_map_service.dart'; - -class FakeOccupancyHeatMapService implements OccupancyHeatMapService { - @override - Future> load(GetOccupancyHeatMapParam param) { - return Future.delayed(const Duration(milliseconds: 200), () { - final now = DateTime.now(); - final startOfYear = DateTime(now.year, 1, 1); - final endOfYear = DateTime(now.year, 12, 31); - final daysInYear = endOfYear.difference(startOfYear).inDays + 1; - - final List data = List.generate( - daysInYear, - (index) => OccupancyHeatMapModel( - date: startOfYear.add(Duration(days: index)), - occupancy: ((index + 1) * 10) % 100, - ), - ); - - return data; - }); - } -} diff --git a/lib/pages/analytics/services/occupancy_heat_map/remote_occupancy_heat_map_service.dart b/lib/pages/analytics/services/occupancy_heat_map/remote_occupancy_heat_map_service.dart new file mode 100644 index 00000000..ac06ccf7 --- /dev/null +++ b/lib/pages/analytics/services/occupancy_heat_map/remote_occupancy_heat_map_service.dart @@ -0,0 +1,35 @@ +import 'package:syncrow_web/pages/analytics/models/occupancy_heat_map_model.dart'; +import 'package:syncrow_web/pages/analytics/params/get_occupancy_heat_map_param.dart'; +import 'package:syncrow_web/pages/analytics/services/occupancy_heat_map/occupancy_heat_map_service.dart'; +import 'package:syncrow_web/services/api/http_service.dart'; + +final class RemoteOccupancyHeatMapService implements OccupancyHeatMapService { + const RemoteOccupancyHeatMapService(this._httpService); + + final HTTPService _httpService; + + @override + Future> load(GetOccupancyHeatMapParam param) async { + try { + final response = await _httpService.get( + path: '/occupancy/heat-map/space/${param.spaceUuid}', + showServerMessage: true, + queryParameters: param.toJson(), + expectedResponseModel: (response) { + final json = response as Map; + final dailyData = json['data'] as List? ?? []; + + final result = dailyData.map( + (json) => OccupancyHeatMapModel.fromJson(json as Map), + ); + + return result.toList(); + }, + ); + + return response; + } catch (e) { + throw Exception('Failed to load total energy consumption:'); + } + } +}