From 3a98f71ff3eed552403bfb925b94d82af705f347 Mon Sep 17 00:00:00 2001 From: Faris Armoush Date: Wed, 4 Jun 2025 14:42:41 +0300 Subject: [PATCH] SP-1665-FE-Return-a-readable-error-when-a-connection-error-Exception-occurs-on-the-charts. --- .../analytics_devices_bloc.dart | 8 +++++++ .../energy_consumption_by_phases_bloc.dart | 8 +++++++ .../energy_consumption_per_device_bloc.dart | 11 +++++++++- .../power_clamp_info_bloc.dart | 8 +++++++ .../total_energy_consumption_bloc.dart | 8 +++++++ .../blocs/occupancy/occupancy_bloc.dart | 3 +++ .../occupancy_heat_map_bloc.dart | 8 +++++++ ..._management_analytics_devices_service.dart | 12 ++++++++++- ...e_occupancy_analytics_devices_service.dart | 21 +++++++++++++++++-- ..._energy_consumption_by_phases_service.dart | 13 +++++++++++- ...energy_consumption_per_device_service.dart | 13 +++++++++++- .../occupacy/remote_occupancy_service.dart | 15 +++++++++++-- .../remote_occupancy_heat_map_service.dart | 13 +++++++++++- .../remote_power_clamp_info_service.dart | 13 +++++++++++- ...mote_total_energy_consumption_service.dart | 13 +++++++++++- 15 files changed, 156 insertions(+), 11 deletions(-) diff --git a/lib/pages/analytics/modules/analytics/blocs/analytics_devices/analytics_devices_bloc.dart b/lib/pages/analytics/modules/analytics/blocs/analytics_devices/analytics_devices_bloc.dart index 244b2fa0..fbd28dee 100644 --- a/lib/pages/analytics/modules/analytics/blocs/analytics_devices/analytics_devices_bloc.dart +++ b/lib/pages/analytics/modules/analytics/blocs/analytics_devices/analytics_devices_bloc.dart @@ -3,6 +3,7 @@ import 'package:equatable/equatable.dart'; import 'package:syncrow_web/pages/analytics/models/analytics_device.dart'; import 'package:syncrow_web/pages/analytics/params/get_analytics_devices_param.dart'; import 'package:syncrow_web/pages/analytics/services/analytics_devices/analytics_devices_service.dart'; +import 'package:syncrow_web/services/api/api_exception.dart'; part 'analytics_devices_event.dart'; part 'analytics_devices_state.dart'; @@ -36,6 +37,13 @@ class AnalyticsDevicesBloc if (devices.isNotEmpty) { event.onSuccess(devices.first); } + } on APIException catch (e) { + emit( + AnalyticsDevicesState( + status: AnalyticsDevicesStatus.failure, + errorMessage: e.message, + ), + ); } catch (e) { emit( AnalyticsDevicesState( diff --git a/lib/pages/analytics/modules/energy_management/blocs/energy_consumption_by_phases/energy_consumption_by_phases_bloc.dart b/lib/pages/analytics/modules/energy_management/blocs/energy_consumption_by_phases/energy_consumption_by_phases_bloc.dart index 012f435a..1acf7df5 100644 --- a/lib/pages/analytics/modules/energy_management/blocs/energy_consumption_by_phases/energy_consumption_by_phases_bloc.dart +++ b/lib/pages/analytics/modules/energy_management/blocs/energy_consumption_by_phases/energy_consumption_by_phases_bloc.dart @@ -3,6 +3,7 @@ import 'package:equatable/equatable.dart'; import 'package:syncrow_web/pages/analytics/models/phases_energy_consumption.dart'; import 'package:syncrow_web/pages/analytics/params/get_energy_consumption_by_phases_param.dart'; import 'package:syncrow_web/pages/analytics/services/energy_consumption_by_phases/energy_consumption_by_phases_service.dart'; +import 'package:syncrow_web/services/api/api_exception.dart'; part 'energy_consumption_by_phases_event.dart'; part 'energy_consumption_by_phases_state.dart'; @@ -31,6 +32,13 @@ class EnergyConsumptionByPhasesBloc chartData: chartData, ), ); + } on APIException catch (e) { + emit( + state.copyWith( + status: EnergyConsumptionByPhasesStatus.failure, + errorMessage: e.message, + ), + ); } catch (e) { emit( state.copyWith( diff --git a/lib/pages/analytics/modules/energy_management/blocs/energy_consumption_per_device/energy_consumption_per_device_bloc.dart b/lib/pages/analytics/modules/energy_management/blocs/energy_consumption_per_device/energy_consumption_per_device_bloc.dart index c1c51a16..97d182c5 100644 --- a/lib/pages/analytics/modules/energy_management/blocs/energy_consumption_per_device/energy_consumption_per_device_bloc.dart +++ b/lib/pages/analytics/modules/energy_management/blocs/energy_consumption_per_device/energy_consumption_per_device_bloc.dart @@ -3,6 +3,7 @@ import 'package:equatable/equatable.dart'; import 'package:syncrow_web/pages/analytics/models/device_energy_data_model.dart'; import 'package:syncrow_web/pages/analytics/params/get_energy_consumption_per_device_param.dart'; import 'package:syncrow_web/pages/analytics/services/energy_consumption_per_device/energy_consumption_per_device_service.dart'; +import 'package:syncrow_web/services/api/api_exception.dart'; part 'energy_consumption_per_device_event.dart'; part 'energy_consumption_per_device_state.dart'; @@ -13,7 +14,8 @@ class EnergyConsumptionPerDeviceBloc this._energyConsumptionPerDeviceService, ) : super(const EnergyConsumptionPerDeviceState()) { on(_onLoadEnergyConsumptionPerDeviceEvent); - on(_onClearEnergyConsumptionPerDeviceEvent); + on( + _onClearEnergyConsumptionPerDeviceEvent); } final EnergyConsumptionPerDeviceService _energyConsumptionPerDeviceService; @@ -31,6 +33,13 @@ class EnergyConsumptionPerDeviceBloc chartData: chartData, ), ); + } on APIException catch (e) { + emit( + state.copyWith( + status: EnergyConsumptionPerDeviceStatus.failure, + errorMessage: e.message, + ), + ); } catch (e) { emit( state.copyWith( diff --git a/lib/pages/analytics/modules/energy_management/blocs/power_clamp_info/power_clamp_info_bloc.dart b/lib/pages/analytics/modules/energy_management/blocs/power_clamp_info/power_clamp_info_bloc.dart index d0e7aab6..2aefd798 100644 --- a/lib/pages/analytics/modules/energy_management/blocs/power_clamp_info/power_clamp_info_bloc.dart +++ b/lib/pages/analytics/modules/energy_management/blocs/power_clamp_info/power_clamp_info_bloc.dart @@ -3,6 +3,7 @@ import 'package:equatable/equatable.dart'; import 'package:syncrow_web/pages/analytics/services/power_clamp_info/power_clamp_info_service.dart'; import 'package:syncrow_web/pages/device_managment/all_devices/models/device_status.dart'; import 'package:syncrow_web/pages/device_managment/power_clamp/models/power_clamp_model.dart'; +import 'package:syncrow_web/services/api/api_exception.dart'; part 'power_clamp_info_event.dart'; part 'power_clamp_info_state.dart'; @@ -31,6 +32,13 @@ class PowerClampInfoBloc extends Bloc powerClampModel: powerClampModel, ), ); + } on APIException catch (e) { + emit( + state.copyWith( + status: PowerClampInfoStatus.error, + errorMessage: e.message, + ), + ); } catch (e) { emit( state.copyWith( diff --git a/lib/pages/analytics/modules/energy_management/blocs/total_energy_consumption/total_energy_consumption_bloc.dart b/lib/pages/analytics/modules/energy_management/blocs/total_energy_consumption/total_energy_consumption_bloc.dart index 42ad57e8..f51d20cf 100644 --- a/lib/pages/analytics/modules/energy_management/blocs/total_energy_consumption/total_energy_consumption_bloc.dart +++ b/lib/pages/analytics/modules/energy_management/blocs/total_energy_consumption/total_energy_consumption_bloc.dart @@ -3,6 +3,7 @@ import 'package:equatable/equatable.dart'; import 'package:syncrow_web/pages/analytics/models/energy_data_model.dart'; import 'package:syncrow_web/pages/analytics/params/get_total_energy_consumption_param.dart'; import 'package:syncrow_web/pages/analytics/services/total_energy_consumption/total_energy_consumption_service.dart'; +import 'package:syncrow_web/services/api/api_exception.dart'; part 'total_energy_consumption_event.dart'; part 'total_energy_consumption_state.dart'; @@ -31,6 +32,13 @@ class TotalEnergyConsumptionBloc status: TotalEnergyConsumptionStatus.loaded, ), ); + } on APIException catch (e) { + emit( + state.copyWith( + errorMessage: e.message, + status: TotalEnergyConsumptionStatus.failure, + ), + ); } catch (e) { emit( state.copyWith( diff --git a/lib/pages/analytics/modules/occupancy/blocs/occupancy/occupancy_bloc.dart b/lib/pages/analytics/modules/occupancy/blocs/occupancy/occupancy_bloc.dart index 6eeda29b..110f3c60 100644 --- a/lib/pages/analytics/modules/occupancy/blocs/occupancy/occupancy_bloc.dart +++ b/lib/pages/analytics/modules/occupancy/blocs/occupancy/occupancy_bloc.dart @@ -3,6 +3,7 @@ import 'package:equatable/equatable.dart'; import 'package:syncrow_web/pages/analytics/models/occupacy.dart'; import 'package:syncrow_web/pages/analytics/params/get_occupancy_param.dart'; import 'package:syncrow_web/pages/analytics/services/occupacy/occupacy_service.dart'; +import 'package:syncrow_web/services/api/api_exception.dart'; part 'occupancy_event.dart'; part 'occupancy_state.dart'; @@ -23,6 +24,8 @@ class OccupancyBloc extends Bloc { try { final chartData = await _occupacyService.load(event.param); emit(state.copyWith(chartData: chartData, status: OccupancyStatus.loaded)); + } on APIException catch (e) { + emit(state.copyWith(status: OccupancyStatus.failure, errorMessage: e.message)); } catch (e) { emit(state.copyWith(status: OccupancyStatus.failure, errorMessage: '$e')); } diff --git a/lib/pages/analytics/modules/occupancy/blocs/occupancy_heat_map/occupancy_heat_map_bloc.dart b/lib/pages/analytics/modules/occupancy/blocs/occupancy_heat_map/occupancy_heat_map_bloc.dart index 5d5cb914..453b68ce 100644 --- a/lib/pages/analytics/modules/occupancy/blocs/occupancy_heat_map/occupancy_heat_map_bloc.dart +++ b/lib/pages/analytics/modules/occupancy/blocs/occupancy_heat_map/occupancy_heat_map_bloc.dart @@ -3,6 +3,7 @@ import 'package:equatable/equatable.dart'; 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/api_exception.dart'; part 'occupancy_heat_map_event.dart'; part 'occupancy_heat_map_state.dart'; @@ -30,6 +31,13 @@ class OccupancyHeatMapBloc heatMapData: occupancyHeatMap, ), ); + } on APIException catch (e) { + emit( + state.copyWith( + status: OccupancyHeatMapStatus.failure, + errorMessage: e.message, + ), + ); } catch (e) { emit( state.copyWith( diff --git a/lib/pages/analytics/services/analytics_devices/remote_energy_management_analytics_devices_service.dart b/lib/pages/analytics/services/analytics_devices/remote_energy_management_analytics_devices_service.dart index adf8a6fa..9ef711e9 100644 --- a/lib/pages/analytics/services/analytics_devices/remote_energy_management_analytics_devices_service.dart +++ b/lib/pages/analytics/services/analytics_devices/remote_energy_management_analytics_devices_service.dart @@ -1,6 +1,8 @@ +import 'package:dio/dio.dart'; import 'package:syncrow_web/pages/analytics/models/analytics_device.dart'; import 'package:syncrow_web/pages/analytics/params/get_analytics_devices_param.dart'; import 'package:syncrow_web/pages/analytics/services/analytics_devices/analytics_devices_service.dart'; +import 'package:syncrow_web/services/api/api_exception.dart'; import 'package:syncrow_web/services/api/http_service.dart'; final class RemoteEnergyManagementAnalyticsDevicesService @@ -9,6 +11,8 @@ final class RemoteEnergyManagementAnalyticsDevicesService final HTTPService _httpService; + static const _defaultErrorMessage = 'Failed to load analytics devices'; + @override Future> getDevices(GetAnalyticsDevicesParam param) async { try { @@ -29,8 +33,14 @@ final class RemoteEnergyManagementAnalyticsDevicesService ); return response; + } on DioException catch (e) { + final message = e.response?.data as Map?; + final error = message?['error'] as Map?; + final errorMessage = error?['error'] as String? ?? ''; + final formattedErrorMessage = [_defaultErrorMessage, errorMessage].join(': '); + throw APIException(formattedErrorMessage); } catch (e) { - throw Exception('Failed to load total energy consumption: $e'); + throw APIException('$_defaultErrorMessage: $e'); } } } diff --git a/lib/pages/analytics/services/analytics_devices/remote_occupancy_analytics_devices_service.dart b/lib/pages/analytics/services/analytics_devices/remote_occupancy_analytics_devices_service.dart index 91bbe1f4..736b0804 100644 --- a/lib/pages/analytics/services/analytics_devices/remote_occupancy_analytics_devices_service.dart +++ b/lib/pages/analytics/services/analytics_devices/remote_occupancy_analytics_devices_service.dart @@ -1,7 +1,9 @@ +import 'package:dio/dio.dart'; import 'package:syncrow_web/pages/analytics/models/analytics_device.dart'; import 'package:syncrow_web/pages/analytics/params/get_analytics_devices_param.dart'; import 'package:syncrow_web/pages/analytics/services/analytics_devices/analytics_devices_service.dart'; import 'package:syncrow_web/pages/common/bloc/project_manager.dart'; +import 'package:syncrow_web/services/api/api_exception.dart'; import 'package:syncrow_web/services/api/http_service.dart'; class RemoteOccupancyAnalyticsDevicesService implements AnalyticsDevicesService { @@ -9,6 +11,8 @@ class RemoteOccupancyAnalyticsDevicesService implements AnalyticsDevicesService final HTTPService _httpService; + static const _defaultErrorMessage = 'Failed to load analytics devices'; + @override Future> getDevices(GetAnalyticsDevicesParam param) async { try { @@ -26,8 +30,15 @@ class RemoteOccupancyAnalyticsDevicesService implements AnalyticsDevicesService final result = requests.map((e) => e.first).toList(); return result; + } on DioException catch (e) { + final message = e.response?.data as Map?; + final error = message?['error'] as Map?; + final errorMessage = error?['error'] as String? ?? ''; + final formattedErrorMessage = [_defaultErrorMessage, errorMessage].join(': '); + throw APIException(formattedErrorMessage); } catch (e) { - throw Exception('Failed to load total energy consumption: $e'); + final formattedErrorMessage = [_defaultErrorMessage, e.toString()].join(': '); + throw APIException(formattedErrorMessage); } } @@ -54,8 +65,14 @@ class RemoteOccupancyAnalyticsDevicesService implements AnalyticsDevicesService }, ); return response; + } on DioException catch (e) { + final message = e.response?.data as Map?; + final error = message?['error'] as Map?; + final errorMessage = error?['error'] as String? ?? ''; + final formattedErrorMessage = [_defaultErrorMessage, errorMessage].join(': '); + throw APIException(formattedErrorMessage); } catch (e) { - rethrow; + throw APIException('$_defaultErrorMessage: $e'); } } } diff --git a/lib/pages/analytics/services/energy_consumption_by_phases/remote_energy_consumption_by_phases_service.dart b/lib/pages/analytics/services/energy_consumption_by_phases/remote_energy_consumption_by_phases_service.dart index 28df5eed..17f9baff 100644 --- a/lib/pages/analytics/services/energy_consumption_by_phases/remote_energy_consumption_by_phases_service.dart +++ b/lib/pages/analytics/services/energy_consumption_by_phases/remote_energy_consumption_by_phases_service.dart @@ -1,6 +1,8 @@ +import 'package:dio/dio.dart'; import 'package:syncrow_web/pages/analytics/models/phases_energy_consumption.dart'; import 'package:syncrow_web/pages/analytics/params/get_energy_consumption_by_phases_param.dart'; import 'package:syncrow_web/pages/analytics/services/energy_consumption_by_phases/energy_consumption_by_phases_service.dart'; +import 'package:syncrow_web/services/api/api_exception.dart'; import 'package:syncrow_web/services/api/http_service.dart'; final class RemoteEnergyConsumptionByPhasesService @@ -9,6 +11,8 @@ final class RemoteEnergyConsumptionByPhasesService final HTTPService _httpService; + static const _defaultErrorMessage = 'Failed to load energy consumption per phase'; + @override Future> load( GetEnergyConsumptionByPhasesParam param, @@ -28,8 +32,15 @@ final class RemoteEnergyConsumptionByPhasesService }, ); return response; + } on DioException catch (e) { + final message = e.response?.data as Map?; + final error = message?['error'] as Map?; + final errorMessage = error?['error'] as String? ?? ''; + final formattedErrorMessage = [_defaultErrorMessage, errorMessage].join(': '); + throw APIException(formattedErrorMessage); } catch (e) { - throw Exception('Failed to load energy consumption per phase: $e'); + final formattedErrorMessage = [_defaultErrorMessage, '$e'].join(': '); + throw APIException(formattedErrorMessage); } } } diff --git a/lib/pages/analytics/services/energy_consumption_per_device/remote_energy_consumption_per_device_service.dart b/lib/pages/analytics/services/energy_consumption_per_device/remote_energy_consumption_per_device_service.dart index 165ab5ab..82b21b1c 100644 --- a/lib/pages/analytics/services/energy_consumption_per_device/remote_energy_consumption_per_device_service.dart +++ b/lib/pages/analytics/services/energy_consumption_per_device/remote_energy_consumption_per_device_service.dart @@ -1,8 +1,10 @@ +import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:syncrow_web/pages/analytics/models/device_energy_data_model.dart'; import 'package:syncrow_web/pages/analytics/models/energy_data_model.dart'; import 'package:syncrow_web/pages/analytics/params/get_energy_consumption_per_device_param.dart'; import 'package:syncrow_web/pages/analytics/services/energy_consumption_per_device/energy_consumption_per_device_service.dart'; +import 'package:syncrow_web/services/api/api_exception.dart'; import 'package:syncrow_web/services/api/http_service.dart'; class RemoteEnergyConsumptionPerDeviceService @@ -11,6 +13,8 @@ class RemoteEnergyConsumptionPerDeviceService final HTTPService _httpService; + static const _defaultErrorMessage = 'Failed to load energy consumption per device'; + @override Future> load( GetEnergyConsumptionPerDeviceParam param, @@ -23,8 +27,15 @@ class RemoteEnergyConsumptionPerDeviceService expectedResponseModel: _EnergyConsumptionPerDeviceMapper.map, ); return response; + } on DioException catch (e) { + final message = e.response?.data as Map?; + final error = message?['error'] as Map?; + final errorMessage = error?['error'] as String? ?? ''; + final formattedErrorMessage = [_defaultErrorMessage, errorMessage].join(': '); + throw APIException(formattedErrorMessage); } catch (e) { - throw Exception('Failed to load energy consumption per device: $e'); + final formattedErrorMessage = [_defaultErrorMessage, '$e'].join(': '); + throw APIException(formattedErrorMessage); } } } diff --git a/lib/pages/analytics/services/occupacy/remote_occupancy_service.dart b/lib/pages/analytics/services/occupacy/remote_occupancy_service.dart index b8cce70a..afd3f79e 100644 --- a/lib/pages/analytics/services/occupacy/remote_occupancy_service.dart +++ b/lib/pages/analytics/services/occupacy/remote_occupancy_service.dart @@ -1,6 +1,8 @@ +import 'package:dio/dio.dart'; import 'package:syncrow_web/pages/analytics/models/occupacy.dart'; import 'package:syncrow_web/pages/analytics/params/get_occupancy_param.dart'; import 'package:syncrow_web/pages/analytics/services/occupacy/occupacy_service.dart'; +import 'package:syncrow_web/services/api/api_exception.dart'; import 'package:syncrow_web/services/api/http_service.dart'; final class RemoteOccupancyService implements OccupacyService { @@ -8,6 +10,8 @@ final class RemoteOccupancyService implements OccupacyService { final HTTPService _httpService; + static const _defaultErrorMessage = 'Failed to load occupancy'; + @override Future> load(GetOccupancyParam param) async { try { @@ -25,8 +29,15 @@ final class RemoteOccupancyService implements OccupacyService { }, ); return response; + } on DioException catch (e) { + final message = e.response?.data as Map?; + final error = message?['error'] as Map?; + final errorMessage = error?['error'] as String? ?? ''; + final formattedErrorMessage = [_defaultErrorMessage, errorMessage].join(': '); + throw APIException(formattedErrorMessage); } catch (e) { - throw Exception('Failed to load energy consumption per phase: $e'); + final formattedErrorMessage = [_defaultErrorMessage, '$e'].join(': '); + throw APIException(formattedErrorMessage); } } -} \ No newline at end of file +} 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 index ac06ccf7..0d7f6500 100644 --- 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 @@ -1,6 +1,8 @@ +import 'package:dio/dio.dart'; 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/api_exception.dart'; import 'package:syncrow_web/services/api/http_service.dart'; final class RemoteOccupancyHeatMapService implements OccupancyHeatMapService { @@ -8,6 +10,8 @@ final class RemoteOccupancyHeatMapService implements OccupancyHeatMapService { final HTTPService _httpService; + static const _defaultErrorMessage = 'Failed to load occupancy heat map'; + @override Future> load(GetOccupancyHeatMapParam param) async { try { @@ -28,8 +32,15 @@ final class RemoteOccupancyHeatMapService implements OccupancyHeatMapService { ); return response; + } on DioException catch (e) { + final message = e.response?.data as Map?; + final error = message?['error'] as Map?; + final errorMessage = error?['error'] as String? ?? ''; + final formattedErrorMessage = [_defaultErrorMessage, errorMessage].join(': '); + throw APIException(formattedErrorMessage); } catch (e) { - throw Exception('Failed to load total energy consumption:'); + final formattedErrorMessage = [_defaultErrorMessage, '$e'].join(': '); + throw APIException(formattedErrorMessage); } } } diff --git a/lib/pages/analytics/services/power_clamp_info/remote_power_clamp_info_service.dart b/lib/pages/analytics/services/power_clamp_info/remote_power_clamp_info_service.dart index 17d5a7fc..b4bc82c6 100644 --- a/lib/pages/analytics/services/power_clamp_info/remote_power_clamp_info_service.dart +++ b/lib/pages/analytics/services/power_clamp_info/remote_power_clamp_info_service.dart @@ -1,5 +1,7 @@ +import 'package:dio/dio.dart'; import 'package:syncrow_web/pages/analytics/services/power_clamp_info/power_clamp_info_service.dart'; import 'package:syncrow_web/pages/device_managment/power_clamp/models/power_clamp_model.dart'; +import 'package:syncrow_web/services/api/api_exception.dart'; import 'package:syncrow_web/services/api/http_service.dart'; final class RemotePowerClampInfoService implements PowerClampInfoService { @@ -7,6 +9,8 @@ final class RemotePowerClampInfoService implements PowerClampInfoService { final HTTPService _httpService; + static const _defaultErrorMessage = 'Failed to fetch power clamp info'; + @override Future getInfo(String deviceId) async { try { @@ -20,8 +24,15 @@ final class RemotePowerClampInfoService implements PowerClampInfoService { }, ); return response; + } on DioException catch (e) { + final message = e.response?.data as Map?; + final error = message?['error'] as Map?; + final errorMessage = error?['error'] as String? ?? ''; + final formattedErrorMessage = [_defaultErrorMessage, errorMessage].join(': '); + throw APIException(formattedErrorMessage); } catch (e) { - throw Exception('Failed to fetch power clamp info: $e'); + final formattedErrorMessage = [_defaultErrorMessage, '$e'].join(': '); + throw APIException(formattedErrorMessage); } } } diff --git a/lib/pages/analytics/services/total_energy_consumption/remote_total_energy_consumption_service.dart b/lib/pages/analytics/services/total_energy_consumption/remote_total_energy_consumption_service.dart index 8c3041eb..838cc5e7 100644 --- a/lib/pages/analytics/services/total_energy_consumption/remote_total_energy_consumption_service.dart +++ b/lib/pages/analytics/services/total_energy_consumption/remote_total_energy_consumption_service.dart @@ -1,6 +1,8 @@ +import 'package:dio/dio.dart'; import 'package:syncrow_web/pages/analytics/models/energy_data_model.dart'; import 'package:syncrow_web/pages/analytics/params/get_total_energy_consumption_param.dart'; import 'package:syncrow_web/pages/analytics/services/total_energy_consumption/total_energy_consumption_service.dart'; +import 'package:syncrow_web/services/api/api_exception.dart'; import 'package:syncrow_web/services/api/http_service.dart'; class RemoteTotalEnergyConsumptionService implements TotalEnergyConsumptionService { @@ -8,6 +10,8 @@ class RemoteTotalEnergyConsumptionService implements TotalEnergyConsumptionServi final HTTPService _httpService; + static const _defaultErrorMessage = 'Failed to load total energy consumption'; + @override Future> load( GetTotalEnergyConsumptionParam param, @@ -21,8 +25,15 @@ class RemoteTotalEnergyConsumptionService implements TotalEnergyConsumptionServi ); return response; + } on DioException catch (e) { + final message = e.response?.data as Map?; + final error = message?['error'] as Map?; + final errorMessage = error?['error'] as String? ?? ''; + final formattedErrorMessage = [_defaultErrorMessage, errorMessage].join(': '); + throw APIException(formattedErrorMessage); } catch (e) { - throw Exception('Failed to load total energy consumption: $e'); + final formattedErrorMessage = [_defaultErrorMessage, '$e'].join(': '); + throw APIException(formattedErrorMessage); } } }