From 2f5ad03431e2a398c091997fbe1f254043ea22d8 Mon Sep 17 00:00:00 2001 From: Faris Armoush Date: Sun, 29 Jun 2025 10:57:18 +0300 Subject: [PATCH 1/4] created empty charts widget. --- .../total_energy_consumption_chart_box.dart | 12 ++- .../analytics_chart_empty_state_widget.dart | 80 +++++++++++++++++++ 2 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 lib/pages/analytics/widgets/analytics_chart_empty_state_widget.dart diff --git a/lib/pages/analytics/modules/energy_management/widgets/total_energy_consumption_chart_box.dart b/lib/pages/analytics/modules/energy_management/widgets/total_energy_consumption_chart_box.dart index 4d88471d..52a0b0ba 100644 --- a/lib/pages/analytics/modules/energy_management/widgets/total_energy_consumption_chart_box.dart +++ b/lib/pages/analytics/modules/energy_management/widgets/total_energy_consumption_chart_box.dart @@ -3,6 +3,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:syncrow_web/pages/analytics/modules/energy_management/blocs/total_energy_consumption/total_energy_consumption_bloc.dart'; import 'package:syncrow_web/pages/analytics/modules/energy_management/widgets/chart_title.dart'; import 'package:syncrow_web/pages/analytics/modules/energy_management/widgets/total_energy_consumption_chart.dart'; +import 'package:syncrow_web/pages/analytics/widgets/analytics_chart_empty_state_widget.dart'; import 'package:syncrow_web/pages/analytics/widgets/analytics_error_widget.dart'; import 'package:syncrow_web/pages/analytics/widgets/charts_loading_widget.dart'; import 'package:syncrow_web/utils/style.dart'; @@ -41,7 +42,16 @@ class TotalEnergyConsumptionChartBox extends StatelessWidget { const SizedBox(height: 20), const Divider(), const SizedBox(height: 20), - TotalEnergyConsumptionChart(chartData: state.chartData), + Visibility( + visible: state.chartData.isNotEmpty, + replacement: AnalyticsChartEmptyStateWidget( + isLoading: state.status == TotalEnergyConsumptionStatus.loading, + isError: state.status == TotalEnergyConsumptionStatus.failure, + isInitial: state.status == TotalEnergyConsumptionStatus.initial, + errorMessage: state.errorMessage, + ), + child: TotalEnergyConsumptionChart(chartData: state.chartData), + ), ], ), ), diff --git a/lib/pages/analytics/widgets/analytics_chart_empty_state_widget.dart b/lib/pages/analytics/widgets/analytics_chart_empty_state_widget.dart new file mode 100644 index 00000000..086cf959 --- /dev/null +++ b/lib/pages/analytics/widgets/analytics_chart_empty_state_widget.dart @@ -0,0 +1,80 @@ +import 'package:flutter/material.dart'; +import 'package:syncrow_web/common/widgets/app_loading_indicator.dart'; +import 'package:syncrow_web/utils/color_manager.dart'; +import 'package:syncrow_web/utils/extension/build_context_x.dart'; + +class AnalyticsChartEmptyStateWidget extends StatelessWidget { + const AnalyticsChartEmptyStateWidget({ + this.isLoading = false, + this.isError = false, + this.isInitial = false, + this.errorMessage, + this.noDataMessage = 'No data to display', + this.initialMessage = 'Please select a space to see data', + super.key, + }); + + final bool isLoading; + final bool isError; + final bool isInitial; + final String? errorMessage; + final String noDataMessage; + final String initialMessage; + + @override + Widget build(BuildContext context) { + return Expanded( + child: isLoading + ? const Center( + child: AppLoadingIndicator(), + ) + : isError + ? _buildState( + context, + icon: Icons.error_outline, + message: errorMessage ?? 'Something went wrong', + color: ColorsManager.red, + ) + : isInitial + ? _buildState( + context, + icon: Icons.filter_list, + message: initialMessage, + ) + : _buildState( + context, + icon: Icons.bar_chart, + message: noDataMessage, + ), + ); + } + + Widget _buildState( + BuildContext context, { + required IconData icon, + required String message, + Color? color, + }) { + final disabledColor = context.theme.disabledColor; + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + icon, + size: 48, + color: color ?? disabledColor, + ), + const SizedBox(height: 16), + SelectableText( + message, + style: context.textTheme.bodyMedium?.copyWith( + color: color ?? disabledColor, + ), + textAlign: TextAlign.center, + ), + ], + ), + ); + } +} From 44c88fb1c442270246d33ea4346b2f2a234c1a8f Mon Sep 17 00:00:00 2001 From: Faris Armoush Date: Mon, 30 Jun 2025 10:54:33 +0300 Subject: [PATCH 2/4] added empty charts icons. --- assets/icons/empty_barred_chart.svg | 8 ++ .../icons/empty_energy_management_chart.svg | 5 + .../empty_energy_management_per_device.svg | 7 ++ assets/icons/empty_heatmap.svg | 99 +++++++++++++++++++ assets/icons/empty_range_of_aqi.svg | 7 ++ lib/utils/constants/assets.dart | 7 ++ 6 files changed, 133 insertions(+) create mode 100644 assets/icons/empty_barred_chart.svg create mode 100644 assets/icons/empty_energy_management_chart.svg create mode 100644 assets/icons/empty_energy_management_per_device.svg create mode 100644 assets/icons/empty_heatmap.svg create mode 100644 assets/icons/empty_range_of_aqi.svg diff --git a/assets/icons/empty_barred_chart.svg b/assets/icons/empty_barred_chart.svg new file mode 100644 index 00000000..723d5e14 --- /dev/null +++ b/assets/icons/empty_barred_chart.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/icons/empty_energy_management_chart.svg b/assets/icons/empty_energy_management_chart.svg new file mode 100644 index 00000000..042b9990 --- /dev/null +++ b/assets/icons/empty_energy_management_chart.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/icons/empty_energy_management_per_device.svg b/assets/icons/empty_energy_management_per_device.svg new file mode 100644 index 00000000..0408cd3a --- /dev/null +++ b/assets/icons/empty_energy_management_per_device.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/icons/empty_heatmap.svg b/assets/icons/empty_heatmap.svg new file mode 100644 index 00000000..bbb2cfed --- /dev/null +++ b/assets/icons/empty_heatmap.svg @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icons/empty_range_of_aqi.svg b/assets/icons/empty_range_of_aqi.svg new file mode 100644 index 00000000..aa51a41c --- /dev/null +++ b/assets/icons/empty_range_of_aqi.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/lib/utils/constants/assets.dart b/lib/utils/constants/assets.dart index 6a0ef799..226766b3 100644 --- a/lib/utils/constants/assets.dart +++ b/lib/utils/constants/assets.dart @@ -502,4 +502,11 @@ class Assets { static const String temperatureAqiSidebar = 'assets/icons/thermometer.svg'; static const String humidityAqiSidebar = 'assets/icons/humidity.svg'; static const String autocadOccupancyImage = 'assets/images/autocad_occupancy_image.png'; + static const String emptyBarredChart = 'assets/icons/empty_barred_chart.svg'; + static const String emptyEnergyManagementChart = + 'assets/icons/empty_energy_management_chart.svg'; + static const String emptyEnergyManagementPerDevice = + 'assets/icons/empty_energy_management_per_device.svg'; + static const String emptyHeatmap = 'assets/icons/empty_heatmap.svg'; + static const String emptyRangeOfAqi = 'assets/icons/empty_range_of_aqi.svg'; } From db05331e9a4e348a0e354e1102dfd5fb9129a59b Mon Sep 17 00:00:00 2001 From: Faris Armoush Date: Mon, 30 Jun 2025 10:54:53 +0300 Subject: [PATCH 3/4] update `AnalyticsChartEmptyStateWidget` to use new icons. --- .../total_energy_consumption_chart_box.dart | 5 +- .../analytics_chart_empty_state_widget.dart | 60 ++++++++++--------- 2 files changed, 36 insertions(+), 29 deletions(-) diff --git a/lib/pages/analytics/modules/energy_management/widgets/total_energy_consumption_chart_box.dart b/lib/pages/analytics/modules/energy_management/widgets/total_energy_consumption_chart_box.dart index 52a0b0ba..a7992223 100644 --- a/lib/pages/analytics/modules/energy_management/widgets/total_energy_consumption_chart_box.dart +++ b/lib/pages/analytics/modules/energy_management/widgets/total_energy_consumption_chart_box.dart @@ -6,6 +6,7 @@ import 'package:syncrow_web/pages/analytics/modules/energy_management/widgets/to import 'package:syncrow_web/pages/analytics/widgets/analytics_chart_empty_state_widget.dart'; import 'package:syncrow_web/pages/analytics/widgets/analytics_error_widget.dart'; import 'package:syncrow_web/pages/analytics/widgets/charts_loading_widget.dart'; +import 'package:syncrow_web/utils/constants/assets.dart'; import 'package:syncrow_web/utils/style.dart'; class TotalEnergyConsumptionChartBox extends StatelessWidget { @@ -43,12 +44,14 @@ class TotalEnergyConsumptionChartBox extends StatelessWidget { const Divider(), const SizedBox(height: 20), Visibility( - visible: state.chartData.isNotEmpty, + visible: state.chartData.isNotEmpty && + state.chartData.every((e) => e.value != 0), replacement: AnalyticsChartEmptyStateWidget( isLoading: state.status == TotalEnergyConsumptionStatus.loading, isError: state.status == TotalEnergyConsumptionStatus.failure, isInitial: state.status == TotalEnergyConsumptionStatus.initial, errorMessage: state.errorMessage, + iconPath: Assets.emptyEnergyManagementChart, ), child: TotalEnergyConsumptionChart(chartData: state.chartData), ), diff --git a/lib/pages/analytics/widgets/analytics_chart_empty_state_widget.dart b/lib/pages/analytics/widgets/analytics_chart_empty_state_widget.dart index 086cf959..786fe020 100644 --- a/lib/pages/analytics/widgets/analytics_chart_empty_state_widget.dart +++ b/lib/pages/analytics/widgets/analytics_chart_empty_state_widget.dart @@ -1,10 +1,12 @@ import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; import 'package:syncrow_web/common/widgets/app_loading_indicator.dart'; import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/extension/build_context_x.dart'; class AnalyticsChartEmptyStateWidget extends StatelessWidget { const AnalyticsChartEmptyStateWidget({ + required this.iconPath, this.isLoading = false, this.isError = false, this.isInitial = false, @@ -20,59 +22,61 @@ class AnalyticsChartEmptyStateWidget extends StatelessWidget { final String? errorMessage; final String noDataMessage; final String initialMessage; + final String iconPath; @override Widget build(BuildContext context) { return Expanded( - child: isLoading - ? const Center( - child: AppLoadingIndicator(), - ) - : isError - ? _buildState( - context, - icon: Icons.error_outline, - message: errorMessage ?? 'Something went wrong', - color: ColorsManager.red, - ) - : isInitial - ? _buildState( - context, - icon: Icons.filter_list, - message: initialMessage, - ) - : _buildState( - context, - icon: Icons.bar_chart, - message: noDataMessage, - ), + child: () { + if (isLoading) { + return const AppLoadingIndicator(); + } else if (isError) { + return _buildState( + context, + message: errorMessage ?? 'Something went wrong', + color: ColorsManager.red, + ); + } else if (isInitial) { + return _buildState(context, message: initialMessage); + } else { + return _buildState(context, message: noDataMessage); + } + }(), ); } Widget _buildState( BuildContext context, { - required IconData icon, required String message, Color? color, }) { final disabledColor = context.theme.disabledColor; return Center( child: Column( + spacing: 16, mainAxisAlignment: MainAxisAlignment.center, children: [ - Icon( - icon, - size: 48, - color: color ?? disabledColor, - ), const SizedBox(height: 16), + Expanded( + child: SvgPicture.asset( + iconPath, + fit: BoxFit.contain, + colorFilter: ColorFilter.mode( + color ?? disabledColor, + BlendMode.srcIn, + ), + ), + ), SelectableText( message, style: context.textTheme.bodyMedium?.copyWith( color: color ?? disabledColor, + fontSize: 16, + fontWeight: FontWeight.w700, ), textAlign: TextAlign.center, ), + const SizedBox(height: 16), ], ), ); From 9ebf474a600ff577927079bd658b57a7a18ba055 Mon Sep 17 00:00:00 2001 From: Faris Armoush Date: Mon, 30 Jun 2025 12:52:22 +0300 Subject: [PATCH 4/4] analytics-empty-state. --- .../widgets/aqi_distribution_chart_box.dart | 18 +++++- .../widgets/range_of_aqi_chart_box.dart | 20 +++++-- ...ergy_consumption_per_device_chart_box.dart | 22 +++++++- .../widgets/occupancy_chart_box.dart | 21 ++++++- .../widgets/occupancy_heat_map_box.dart | 33 ++++++++--- .../analytics_chart_empty_state_widget.dart | 56 +++++++------------ 6 files changed, 116 insertions(+), 54 deletions(-) diff --git a/lib/pages/analytics/modules/air_quality/widgets/aqi_distribution_chart_box.dart b/lib/pages/analytics/modules/air_quality/widgets/aqi_distribution_chart_box.dart index 25cfd19d..41448f4e 100644 --- a/lib/pages/analytics/modules/air_quality/widgets/aqi_distribution_chart_box.dart +++ b/lib/pages/analytics/modules/air_quality/widgets/aqi_distribution_chart_box.dart @@ -3,7 +3,9 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:syncrow_web/pages/analytics/modules/air_quality/blocs/air_quality_distribution/air_quality_distribution_bloc.dart'; import 'package:syncrow_web/pages/analytics/modules/air_quality/widgets/aqi_distribution_chart.dart'; import 'package:syncrow_web/pages/analytics/modules/air_quality/widgets/aqi_distribution_chart_title.dart'; +import 'package:syncrow_web/pages/analytics/widgets/analytics_chart_empty_state_widget.dart'; import 'package:syncrow_web/pages/analytics/widgets/analytics_error_widget.dart'; +import 'package:syncrow_web/utils/constants/assets.dart'; import 'package:syncrow_web/utils/style.dart'; class AqiDistributionChartBox extends StatelessWidget { @@ -32,8 +34,20 @@ class AqiDistributionChartBox extends StatelessWidget { const SizedBox(height: 10), const Divider(), const SizedBox(height: 20), - Expanded( - child: AqiDistributionChart(chartData: state.chartData), + Visibility( + visible: state.chartData.isNotEmpty, + replacement: AnalyticsChartEmptyStateWidget( + isLoading: state.status == AirQualityDistributionStatus.loading, + isError: state.status == AirQualityDistributionStatus.failure, + isInitial: state.status == AirQualityDistributionStatus.initial, + errorMessage: state.errorMessage, + iconPath: Assets.emptyBarredChart, + ), + child: Expanded( + child: AqiDistributionChart( + chartData: state.chartData, + ), + ), ), ], ), diff --git a/lib/pages/analytics/modules/air_quality/widgets/range_of_aqi_chart_box.dart b/lib/pages/analytics/modules/air_quality/widgets/range_of_aqi_chart_box.dart index cb189dce..5ec5158f 100644 --- a/lib/pages/analytics/modules/air_quality/widgets/range_of_aqi_chart_box.dart +++ b/lib/pages/analytics/modules/air_quality/widgets/range_of_aqi_chart_box.dart @@ -3,7 +3,9 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:syncrow_web/pages/analytics/modules/air_quality/blocs/range_of_aqi/range_of_aqi_bloc.dart'; import 'package:syncrow_web/pages/analytics/modules/air_quality/widgets/range_of_aqi_chart.dart'; import 'package:syncrow_web/pages/analytics/modules/air_quality/widgets/range_of_aqi_chart_title.dart'; +import 'package:syncrow_web/pages/analytics/widgets/analytics_chart_empty_state_widget.dart'; import 'package:syncrow_web/pages/analytics/widgets/analytics_error_widget.dart'; +import 'package:syncrow_web/utils/constants/assets.dart'; import 'package:syncrow_web/utils/style.dart'; class RangeOfAqiChartBox extends StatelessWidget { @@ -32,10 +34,20 @@ class RangeOfAqiChartBox extends StatelessWidget { const SizedBox(height: 10), const Divider(), const SizedBox(height: 20), - Expanded( - child: RangeOfAqiChart( - chartData: state.filteredRangeOfAqi, - selectedAqiType: state.selectedAqiType, + Visibility( + visible: state.filteredRangeOfAqi.isNotEmpty, + replacement: AnalyticsChartEmptyStateWidget( + isLoading: state.status == RangeOfAqiStatus.loading, + isError: state.status == RangeOfAqiStatus.failure, + isInitial: state.status == RangeOfAqiStatus.initial, + errorMessage: state.errorMessage, + iconPath: Assets.emptyRangeOfAqi, + ), + child: Expanded( + child: RangeOfAqiChart( + chartData: state.filteredRangeOfAqi, + selectedAqiType: state.selectedAqiType, + ), ), ), ], diff --git a/lib/pages/analytics/modules/energy_management/widgets/energy_consumption_per_device_chart_box.dart b/lib/pages/analytics/modules/energy_management/widgets/energy_consumption_per_device_chart_box.dart index 06b6c529..48c9af94 100644 --- a/lib/pages/analytics/modules/energy_management/widgets/energy_consumption_per_device_chart_box.dart +++ b/lib/pages/analytics/modules/energy_management/widgets/energy_consumption_per_device_chart_box.dart @@ -5,8 +5,10 @@ import 'package:syncrow_web/pages/analytics/modules/energy_management/blocs/ener import 'package:syncrow_web/pages/analytics/modules/energy_management/widgets/chart_title.dart'; import 'package:syncrow_web/pages/analytics/modules/energy_management/widgets/energy_consumption_per_device_chart.dart'; import 'package:syncrow_web/pages/analytics/modules/energy_management/widgets/energy_consumption_per_device_devices_list.dart'; +import 'package:syncrow_web/pages/analytics/widgets/analytics_chart_empty_state_widget.dart'; import 'package:syncrow_web/pages/analytics/widgets/analytics_error_widget.dart'; import 'package:syncrow_web/pages/analytics/widgets/charts_loading_widget.dart'; +import 'package:syncrow_web/utils/constants/assets.dart'; import 'package:syncrow_web/utils/style.dart'; class EnergyConsumptionPerDeviceChartBox extends StatelessWidget { @@ -54,8 +56,24 @@ class EnergyConsumptionPerDeviceChartBox extends StatelessWidget { const SizedBox(height: 20), const Divider(height: 0), const SizedBox(height: 20), - Expanded( - child: EnergyConsumptionPerDeviceChart(chartData: state.chartData), + Visibility( + visible: state.chartData.isNotEmpty && + state.chartData + .every((e) => e.energy.every((e) => e.value != 0)), + replacement: AnalyticsChartEmptyStateWidget( + isLoading: + state.status == EnergyConsumptionPerDeviceStatus.loading, + isError: state.status == EnergyConsumptionPerDeviceStatus.failure, + isInitial: + state.status == EnergyConsumptionPerDeviceStatus.initial, + errorMessage: state.errorMessage, + iconPath: Assets.emptyEnergyManagementPerDevice, + ), + child: Expanded( + child: EnergyConsumptionPerDeviceChart( + chartData: state.chartData, + ), + ), ), ], ), diff --git a/lib/pages/analytics/modules/occupancy/widgets/occupancy_chart_box.dart b/lib/pages/analytics/modules/occupancy/widgets/occupancy_chart_box.dart index 08f7223f..30d96ac5 100644 --- a/lib/pages/analytics/modules/occupancy/widgets/occupancy_chart_box.dart +++ b/lib/pages/analytics/modules/occupancy/widgets/occupancy_chart_box.dart @@ -6,8 +6,10 @@ import 'package:syncrow_web/pages/analytics/modules/energy_management/widgets/ch import 'package:syncrow_web/pages/analytics/modules/occupancy/blocs/occupancy/occupancy_bloc.dart'; import 'package:syncrow_web/pages/analytics/modules/occupancy/helpers/fetch_occupancy_data_helper.dart'; import 'package:syncrow_web/pages/analytics/modules/occupancy/widgets/occupancy_chart.dart'; +import 'package:syncrow_web/pages/analytics/widgets/analytics_chart_empty_state_widget.dart'; import 'package:syncrow_web/pages/analytics/widgets/analytics_error_widget.dart'; import 'package:syncrow_web/pages/space_tree/bloc/space_tree_bloc.dart'; +import 'package:syncrow_web/utils/constants/assets.dart'; import 'package:syncrow_web/utils/style.dart'; class OccupancyChartBox extends StatelessWidget { @@ -67,7 +69,24 @@ class OccupancyChartBox extends StatelessWidget { const SizedBox(height: 20), const Divider(), const SizedBox(height: 20), - Expanded(child: OccupancyChart(chartData: state.chartData)), + Visibility( + visible: state.chartData.isNotEmpty && + state.chartData.every( + (e) => e.occupancy.isNotEmpty, + ), + replacement: AnalyticsChartEmptyStateWidget( + isLoading: state.status == OccupancyStatus.loading, + isError: state.status == OccupancyStatus.failure, + isInitial: state.status == OccupancyStatus.initial, + errorMessage: state.errorMessage, + iconPath: Assets.emptyBarredChart, + ), + child: Expanded( + child: OccupancyChart( + chartData: state.chartData, + ), + ), + ), ], ), ); diff --git a/lib/pages/analytics/modules/occupancy/widgets/occupancy_heat_map_box.dart b/lib/pages/analytics/modules/occupancy/widgets/occupancy_heat_map_box.dart index a5f56aa4..9c8e3a1b 100644 --- a/lib/pages/analytics/modules/occupancy/widgets/occupancy_heat_map_box.dart +++ b/lib/pages/analytics/modules/occupancy/widgets/occupancy_heat_map_box.dart @@ -6,8 +6,10 @@ import 'package:syncrow_web/pages/analytics/modules/energy_management/widgets/ch import 'package:syncrow_web/pages/analytics/modules/occupancy/blocs/occupancy_heat_map/occupancy_heat_map_bloc.dart'; import 'package:syncrow_web/pages/analytics/modules/occupancy/helpers/fetch_occupancy_data_helper.dart'; import 'package:syncrow_web/pages/analytics/modules/occupancy/widgets/occupancy_heat_map.dart'; +import 'package:syncrow_web/pages/analytics/widgets/analytics_chart_empty_state_widget.dart'; import 'package:syncrow_web/pages/analytics/widgets/analytics_error_widget.dart'; import 'package:syncrow_web/pages/space_tree/bloc/space_tree_bloc.dart'; +import 'package:syncrow_web/utils/constants/assets.dart'; import 'package:syncrow_web/utils/style.dart'; class OccupancyHeatMapBox extends StatelessWidget { @@ -68,16 +70,29 @@ class OccupancyHeatMapBox extends StatelessWidget { const SizedBox(height: 20), const Divider(), const SizedBox(height: 20), - Expanded( - child: OccupancyHeatMap( - selectedDate: - context.watch().state.yearlyDate, - heatMapData: state.heatMapData.asMap().map( - (_, value) => MapEntry( - value.eventDate, - value.countTotalPresenceDetected, + Visibility( + visible: state.heatMapData.isNotEmpty && + state.heatMapData.every( + (e) => e.countTotalPresenceDetected != 0, + ), + replacement: AnalyticsChartEmptyStateWidget( + isLoading: state.status == OccupancyHeatMapStatus.loading, + isError: state.status == OccupancyHeatMapStatus.failure, + isInitial: state.status == OccupancyHeatMapStatus.initial, + errorMessage: state.errorMessage, + iconPath: Assets.emptyHeatmap, + ), + child: Expanded( + child: OccupancyHeatMap( + selectedDate: + context.watch().state.yearlyDate, + heatMapData: state.heatMapData.asMap().map( + (_, value) => MapEntry( + value.eventDate, + value.countTotalPresenceDetected, + ), ), - ), + ), ), ), ], diff --git a/lib/pages/analytics/widgets/analytics_chart_empty_state_widget.dart b/lib/pages/analytics/widgets/analytics_chart_empty_state_widget.dart index 786fe020..f65e1de0 100644 --- a/lib/pages/analytics/widgets/analytics_chart_empty_state_widget.dart +++ b/lib/pages/analytics/widgets/analytics_chart_empty_state_widget.dart @@ -27,53 +27,37 @@ class AnalyticsChartEmptyStateWidget extends StatelessWidget { @override Widget build(BuildContext context) { return Expanded( - child: () { - if (isLoading) { - return const AppLoadingIndicator(); - } else if (isError) { - return _buildState( - context, - message: errorMessage ?? 'Something went wrong', - color: ColorsManager.red, - ); - } else if (isInitial) { - return _buildState(context, message: initialMessage); - } else { - return _buildState(context, message: noDataMessage); - } - }(), + child: _buildWidgetBasedOnState(context), ); } - Widget _buildState( - BuildContext context, { - required String message, - Color? color, - }) { - final disabledColor = context.theme.disabledColor; + Widget _buildWidgetBasedOnState(BuildContext context) { + final widgetsMap = { + isLoading: const AppLoadingIndicator(), + isInitial: _buildState(context, initialMessage), + isError: _buildState(context, errorMessage ?? 'Something went wrong'), + }; + + return widgetsMap[true] ?? _buildState(context, noDataMessage); + } + + Widget _buildState(BuildContext context, String message) { return Center( child: Column( spacing: 16, mainAxisAlignment: MainAxisAlignment.center, children: [ const SizedBox(height: 16), - Expanded( - child: SvgPicture.asset( - iconPath, - fit: BoxFit.contain, - colorFilter: ColorFilter.mode( - color ?? disabledColor, - BlendMode.srcIn, - ), - ), - ), + Expanded(child: SvgPicture.asset(iconPath, fit: BoxFit.contain)), SelectableText( message, - style: context.textTheme.bodyMedium?.copyWith( - color: color ?? disabledColor, - fontSize: 16, - fontWeight: FontWeight.w700, - ), + style: isError + ? context.textTheme.bodyMedium?.copyWith( + color: ColorsManager.red, + fontSize: 16, + fontWeight: FontWeight.w700, + ) + : null, textAlign: TextAlign.center, ), const SizedBox(height: 16),