diff --git a/lib/features/devices/bloc/power_clamp_bloc/power_clamp_bloc.dart b/lib/features/devices/bloc/power_clamp_bloc/power_clamp_bloc.dart index 4f2bbdb..5bec5cf 100644 --- a/lib/features/devices/bloc/power_clamp_bloc/power_clamp_bloc.dart +++ b/lib/features/devices/bloc/power_clamp_bloc/power_clamp_bloc.dart @@ -17,7 +17,7 @@ class PowerClampBloc extends Bloc { required this.PCId, }) : super(const PowerClampState()) { on(_fetchPowerClampInfo); - on(fetchLogsForLastMonth); + // on(fetchLogsForLastMonth); on(_mapReportToEnergyData); on(selectTimeOfLinePassword); } @@ -87,7 +87,6 @@ class PowerClampBloc extends Bloc { var response = await DevicesAPI.getPowerClampStatus(PCId); PowerClampModel deviceStatus = PowerClampModel.fromJson(response); emit(UpdateState(powerClampModel: deviceStatus)); - Future.delayed(const Duration(milliseconds: 500)); } catch (e) { emit(PowerClampFailedState(errorMessage: e.toString())); return; diff --git a/lib/features/devices/view/widgets/power_clamp/power_clamp_card.dart b/lib/features/devices/view/widgets/power_clamp/power_clamp_card.dart index f547113..372bb3d 100644 --- a/lib/features/devices/view/widgets/power_clamp/power_clamp_card.dart +++ b/lib/features/devices/view/widgets/power_clamp/power_clamp_card.dart @@ -6,7 +6,6 @@ import 'package:syncrow_app/features/shared_widgets/text_widgets/body_medium.dar import 'package:syncrow_app/features/shared_widgets/text_widgets/body_small.dart'; import 'package:syncrow_app/generated/assets.dart'; import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; - import 'power_chart.dart'; class PowerClampCard extends StatelessWidget { @@ -22,6 +21,7 @@ class PowerClampCard extends StatelessWidget { final String? totalFactor; final Widget? dateSwitcher; final String? formattedDate; + final String? energyConsumption; final Function()? selectDateEvent; final List? chartData; final BuildContext? context; @@ -43,6 +43,8 @@ class PowerClampCard extends StatelessWidget { this.selectDateEvent, this.chartData, this.context, + this. energyConsumption, + //nConsumption }) : super(key: key); @override @@ -68,7 +70,7 @@ class PowerClampCard extends StatelessWidget { Row( children: [ BodyLarge( - text: totalVoltage!, + text: energyConsumption!, fontSize: 20, fontWeight: FontWeight.w700, ), diff --git a/lib/features/devices/view/widgets/power_clamp/power_clamp_page.dart b/lib/features/devices/view/widgets/power_clamp/power_clamp_page.dart index 4b30614..0e6a608 100644 --- a/lib/features/devices/view/widgets/power_clamp/power_clamp_page.dart +++ b/lib/features/devices/view/widgets/power_clamp/power_clamp_page.dart @@ -6,13 +6,9 @@ import 'package:syncrow_app/features/devices/bloc/power_clamp_bloc/power_clamp_s import 'package:syncrow_app/features/devices/model/device_model.dart'; import 'package:syncrow_app/features/devices/model/power_clamp_model.dart'; import 'package:syncrow_app/features/devices/view/widgets/power_clamp/power_chart.dart'; -import 'package:syncrow_app/features/devices/view/widgets/power_clamp/power_info_card.dart'; +import 'package:syncrow_app/features/devices/view/widgets/power_clamp/power_clamp_card.dart'; import 'package:syncrow_app/features/shared_widgets/default_container.dart'; import 'package:syncrow_app/features/shared_widgets/default_scaffold.dart'; -import 'package:syncrow_app/features/shared_widgets/text_widgets/body_large.dart'; -import 'package:syncrow_app/features/shared_widgets/text_widgets/body_medium.dart'; -import 'package:syncrow_app/features/shared_widgets/text_widgets/body_small.dart'; -import 'package:syncrow_app/generated/assets.dart'; import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; class PowerClampPage extends StatefulWidget { @@ -21,29 +17,32 @@ class PowerClampPage extends StatefulWidget { const PowerClampPage({super.key, this.device}); @override - _PowerClampPageState createState() => _PowerClampPageState(); + State createState() => _PowerClampPageState(); } class _PowerClampPageState extends State { final PageController _pageController = PageController(); int _currentPage = 0; - final int _pageCount = 4; + static const int _pageCount = 4; + @override void initState() { super.initState(); - // Add listener to update _currentPage when the page is changed - _pageController.addListener(() { - int nextPage = _pageController.page?.round() ?? 0; - if (_currentPage != nextPage) { - setState(() { - _currentPage = nextPage; - }); - } - }); + _pageController.addListener(_handlePageChange); + } + + void _handlePageChange() { + int nextPage = _pageController.page?.round() ?? 0; + if (_currentPage != nextPage) { + setState(() { + _currentPage = nextPage; + }); + } } @override void dispose() { + _pageController.removeListener(_handlePageChange); _pageController.dispose(); super.dispose(); } @@ -57,57 +56,8 @@ class _PowerClampPageState extends State { ..add(const PowerClampInitial()), child: BlocBuilder( builder: (context, state) { - final _blocProvider = BlocProvider.of(context); - PowerClampModel model = PowerClampModel( - productType: '', - productUuid: '', - status: PowerStatus( - phaseA: Phase( - dataPoints: [ - DataPoint( - code: '', - customName: '', - dpId: 0, - time: 0, - type: '', - value: 0), - ], - ), - phaseB: Phase( - dataPoints: [ - DataPoint( - code: '', - customName: '', - dpId: 0, - time: 0, - type: '', - value: 0), - ], - ), - phaseC: Phase( - dataPoints: [ - DataPoint( - code: '', - customName: '', - dpId: 0, - time: 0, - type: '', - value: 0), - ], - ), - general: Phase( - dataPoints: [ - DataPoint( - code: '', - customName: '', - dpId: 0, - time: 0, - type: '', - value: 0), - ], - ), - ), - ); + final blocProvider = context.read(); + PowerClampModel model = _initialPowerClampModel(); List chartData = []; if (state is UpdateState) { @@ -115,386 +65,151 @@ class _PowerClampPageState extends State { } else if (state is EnergyDataState) { chartData = state.energyData; } - return state is PowerClampLoadingState - ? const Center( - child: DefaultContainer( - width: 50, - height: 50, - child: CircularProgressIndicator()), - ) - : Column( - children: [ - Flexible( - child: RefreshIndicator( - onRefresh: () async { - _blocProvider.add(const PowerClampInitial()); - }, - child: - PageView(controller: _pageController, children: [ - powerClampCard( - title: 'Total Energy \nConsumption', - isGeneral: true, - dateSwitcher: _blocProvider.dateSwitcher(), - formattedDate: _blocProvider.formattedDate, - selectDateEvent: () { - _blocProvider - .add(SelectDateEvent(context: context)); - }, - totalFrequencyGeneral: model - .status.general.dataPoints.isNotEmpty - ? model.status.general.dataPoints[0].value - .toString() - : 'N/A', - totalActiveGeneral: - model.status.general.dataPoints.length > 3 - ? model - .status.general.dataPoints[3].value - .toString() - : 'N/A', - totalCurrentGeneral: - model.status.general.dataPoints.length > 2 - ? model - .status.general.dataPoints[2].value - .toString() - : 'N/A', - totalVoltage: - model.status.general.dataPoints.length > 1 - ? model - .status.general.dataPoints[1].value - .toString() - : 'N/A', - chartData: chartData, - context: context), - powerClampCard( - title: 'Phase A Energy \nConsumption', - dateSwitcher: _blocProvider.dateSwitcher(), - formattedDate: _blocProvider.formattedDate, - selectDateEvent: () { - _blocProvider.add(SelectDateEvent(context: context)); - }, - totalFactor: model - .status.phaseA.dataPoints.isNotEmpty - ? model.status.phaseA.dataPoints[0].value - .toString() - : 'N/A', - totalActive: - model.status.phaseA.dataPoints.length > 3 - ? model - .status.phaseA.dataPoints[3].value - .toString() - : 'N/A', - totalCurrent: - model.status.phaseA.dataPoints.length > 1 - ? model - .status.phaseA.dataPoints[1].value - .toString() - : 'N/A', - totalVoltage: - model.status.phaseA.dataPoints.length > 0 - ? model - .status.phaseA.dataPoints[0].value - .toString() - : 'N/A', - chartData: chartData, - context: context), - powerClampCard( - title: 'Phase B Energy \nConsumption', - dateSwitcher: _blocProvider.dateSwitcher(), - formattedDate: _blocProvider.formattedDate, - selectDateEvent: () { - _blocProvider - .add(SelectDateEvent(context: context)); - }, - totalFactor: model - .status.phaseB.dataPoints.isNotEmpty - ? model.status.phaseB.dataPoints[0].value - .toString() - : 'N/A', - totalActive: - model.status.phaseB.dataPoints.length > 3 - ? model - .status.phaseB.dataPoints[3].value - .toString() - : 'N/A', - totalCurrent: - model.status.phaseB.dataPoints.length > 2 - ? model - .status.phaseB.dataPoints[2].value - .toString() - : 'N/A', - totalVoltage: - model.status.phaseB.dataPoints.length > 1 - ? model - .status.phaseB.dataPoints[1].value - .toString() - : 'N/A', - chartData: chartData, - context: context), - powerClampCard( - title: 'Phase C Energy \nConsumption', - dateSwitcher: _blocProvider.dateSwitcher(), - formattedDate: _blocProvider.formattedDate, - selectDateEvent: () { - _blocProvider - .add(SelectDateEvent(context: context)); - }, - totalFactor: model - .status.phaseC.dataPoints.isNotEmpty - ? model.status.phaseC.dataPoints[0].value - .toString() - : 'N/A', - totalActive: - model.status.phaseC.dataPoints.length > 3 - ? model - .status.phaseC.dataPoints[3].value - .toString() - : 'N/A', - totalCurrent: - model.status.phaseC.dataPoints.length > 2 - ? model - .status.phaseC.dataPoints[2].value - .toString() - : 'N/A', - totalVoltage: - model.status.phaseC.dataPoints.length > 1 - ? model - .status.phaseC.dataPoints[1].value - .toString() - : 'N/A', - chartData: chartData, - context: context), - ]), - ), - ), - Padding( - padding: const EdgeInsets.symmetric(vertical: 10.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: List.generate(_pageCount, (index) { - return AnimatedContainer( - duration: const Duration(milliseconds: 300), - margin: - const EdgeInsets.symmetric(horizontal: 4.0), - height: 10.0, - width: _currentPage == index - ? 20.0 - : 10.0, // Change width for current page - decoration: BoxDecoration( - color: _currentPage == index - ? Colors - .grey // Use a different color for the active indicator - : ColorsManager.greyColor, - borderRadius: BorderRadius.circular(5.0), - ), - ); - }), - ), - ), - ], - ); + + if (state is PowerClampLoadingState) { + return const Center( + child: DefaultContainer( + width: 50, + height: 50, + child: CircularProgressIndicator(), + ), + ); + } + + return Column( + children: [ + Flexible( + child: RefreshIndicator( + onRefresh: () async { + blocProvider.add(const PowerClampInitial()); + }, + child: PageView( + controller: _pageController, + children: + _buildPowerClampCards(model, chartData, blocProvider), + ), + ), + ), + _buildPageIndicator(), + ], + ); }, ), ), ); } - DefaultContainer powerClampCard( - {bool? isGeneral, - String? title, - String? totalCurrent, - String? totalActiveGeneral, - String? totalCurrentGeneral, - String? totalFrequencyGeneral, - String? totalVoltage, - String? totalActive, - String? totalFrequency, - String? totalFactor, - Widget? dateSwitcher, - String? formattedDate, - Function()? selectDateEvent, - List? chartData, - BuildContext? context}) { - return DefaultContainer( - child: Padding( - padding: - const EdgeInsets.only(left: 10, right: 10, top: 10, bottom: 10), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text('Energy usage'), - Row( - crossAxisAlignment: CrossAxisAlignment.end, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - BodyLarge( - text: title!, - // 'Total Energy \nConsumption', - fontSize: 20, - fontWeight: FontWeight.w700, - ), - Row( - children: [ - BodyLarge( - text: totalVoltage!, - fontSize: 20, - fontWeight: FontWeight.w700, - ), - BodySmall(text: 'kWh') - ], - ), - ], - ), - const SizedBox( - height: 20, - ), - isGeneral == true - ? Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - PowerClampInfoCard( - iconPath: Assets.powerActiveIcon, - title: 'Active', - value: '$totalActiveGeneral', - unit: ' w', - ), - PowerClampInfoCard( - iconPath: Assets.voltMeterIcon, - title: 'Current', - value: '$totalCurrentGeneral', - unit: ' A', - ), - PowerClampInfoCard( - iconPath: Assets.frequencyIcon, - title: 'Frequency', - value: '$totalFrequencyGeneral', - unit: ' Hz', - ), - ], - ) - : Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - PowerClampInfoCard( - iconPath: Assets.voltageIcon, - title: 'Voltage', - value: totalVoltage, - unit: ' V', - ), - PowerClampInfoCard( - iconPath: Assets.voltMeterIcon, - title: 'Current', - value: '$totalCurrent', - unit: ' A', - ), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - PowerClampInfoCard( - iconPath: Assets.powerActiveIcon, - title: 'Active Power', - value: '$totalActive', - unit: ' w', - ), - PowerClampInfoCard( - iconPath: Assets.speedoMeter, - title: 'Power Factor', - value: '$totalFactor', - unit: '', - ), - ], - ) - ], - ), - SizedBox( - height: 10, - ), - const Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - BodyMedium( - text: 'Total consumption', - fontSize: 12, - fontWeight: FontWeight.w700, - ), - Text( - '10/08/2024', - style: - TextStyle(fontSize: 8, fontWeight: FontWeight.w400), - ), - ], - ), - Row( - children: [ - BodyMedium( - text: '1000.00 ', - fontSize: 12, - fontWeight: FontWeight.w700), - BodyMedium( - text: 'kWh', - fontSize: 8, - fontWeight: FontWeight.w700), - ], - ), - ], - ), - SizedBox( - height: 290, - child: EnergyConsumptionPage( - chartData: chartData!.isNotEmpty - ? chartData - : [ - EnergyData('12:00 AM', 4.0), - EnergyData('01:00 AM', 3.5), - EnergyData('02:00 AM', 3.8), - EnergyData('03:00 AM', 3.2), - EnergyData('04:00 AM', 4.0), - EnergyData('05:00 AM', 3.4), - EnergyData('06:00 AM', 3.2), - EnergyData('07:00 AM', 3.5), - EnergyData('08:00 AM', 3.8), - EnergyData('09:00 AM', 3.6), - EnergyData('10:00 AM', 3.9), - EnergyData('11:00 AM', 4.0), - ], - totalConsumption: - chartData.fold(0, (sum, data) => sum + data.consumption), - date: '10/08/2024', - ), - ), - SizedBox( - height: 5, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - DefaultContainer( - padding: EdgeInsets.all(0), - color: ColorsManager.grayBox, - child: SizedBox( - child: dateSwitcher, - )), - InkWell( - onTap: selectDateEvent, - child: DefaultContainer( - color: ColorsManager.grayBox, - child: SizedBox( - child: Padding( - padding: const EdgeInsets.all(5), - child: Text(formattedDate!), - ), - )), - ), - ], - ) - ]), + PowerClampModel _initialPowerClampModel() { + return PowerClampModel( + productType: '', + productUuid: '', + status: PowerStatus( + phaseA: Phase(dataPoints: _emptyDataPoints()), + phaseB: Phase(dataPoints: _emptyDataPoints()), + phaseC: Phase(dataPoints: _emptyDataPoints()), + general: Phase(dataPoints: _emptyDataPoints()), + ), + ); + } + + List _emptyDataPoints() { + return [ + DataPoint( + code: '', + customName: '', + dpId: 0, + time: 0, + type: '', + value: 0, + ), + ]; + } + + List _buildPowerClampCards(PowerClampModel model, + List chartData, PowerClampBloc blocProvider) { + return [ + _buildPowerClampCard( + title: 'Total Energy \nConsumption', + phase: model.status.general, + isGeneral: true, + chartData: chartData, + blocProvider: blocProvider, + ), + _buildPowerClampCard( + title: 'Phase A Energy \nConsumption', + phase: model.status.phaseA, + chartData: chartData, + blocProvider: blocProvider, + ), + _buildPowerClampCard( + title: 'Phase B Energy \nConsumption', + phase: model.status.phaseB, + chartData: chartData, + blocProvider: blocProvider, + ), + _buildPowerClampCard( + title: 'Phase C Energy \nConsumption', + phase: model.status.phaseC, + chartData: chartData, + blocProvider: blocProvider, + ), + ]; + } + + Widget _buildPowerClampCard({ + required String title, + required Phase phase, + bool isGeneral = false, + required List chartData, + required PowerClampBloc blocProvider, + }) { + return PowerClampCard( + energyConsumption: _getValueOrNA(phase.dataPoints, isGeneral ? 0 : 5), + title: title, + isGeneral: isGeneral, + dateSwitcher: blocProvider.dateSwitcher(), + formattedDate: blocProvider.formattedDate, + selectDateEvent: () { + blocProvider.add(SelectDateEvent(context: context)); + }, + totalActiveGeneral: isGeneral ? _getValueOrNA(phase.dataPoints, 2) : null, + totalCurrentGeneral: + isGeneral ? _getValueOrNA(phase.dataPoints, 1) : null, + totalFrequencyGeneral: + isGeneral ? _getValueOrNA(phase.dataPoints, 4) : null, + totalFactor: !isGeneral ? _getValueOrNA(phase.dataPoints, 3) : null, + totalActive: !isGeneral ? _getValueOrNA(phase.dataPoints, 2) : null, + totalCurrent: !isGeneral ? _getValueOrNA(phase.dataPoints, 1) : null, + totalVoltage: !isGeneral ? _getValueOrNA(phase.dataPoints, 0) : null, + chartData: chartData, + context: context, + ); + } + + String _getValueOrNA(List dataPoints, int index) { + return dataPoints.length > index + ? dataPoints[index].value.toString() + : 'N/A'; + } + + Widget _buildPageIndicator() { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 10.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: List.generate(_pageCount, (index) { + return AnimatedContainer( + duration: const Duration(milliseconds: 300), + margin: const EdgeInsets.symmetric(horizontal: 4.0), + height: 10.0, + width: _currentPage == index ? 10.0 : 10.0, + decoration: BoxDecoration( + color: + _currentPage == index ? Colors.grey : ColorsManager.greyColor, + borderRadius: BorderRadius.circular(5.0), + ), + ); + }), ), ); } diff --git a/lib/features/devices/view/widgets/power_clamp/power_clamp_test.dart b/lib/features/devices/view/widgets/power_clamp/power_clamp_test.dart new file mode 100644 index 0000000..79f1e73 --- /dev/null +++ b/lib/features/devices/view/widgets/power_clamp/power_clamp_test.dart @@ -0,0 +1,312 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:syncrow_app/features/devices/bloc/power_clamp_bloc/power_clamp_bloc.dart'; +import 'package:syncrow_app/features/devices/bloc/power_clamp_bloc/power_clamp_event.dart'; +import 'package:syncrow_app/features/devices/bloc/power_clamp_bloc/power_clamp_state.dart'; +import 'package:syncrow_app/features/devices/model/device_model.dart'; +import 'package:syncrow_app/features/devices/model/power_clamp_model.dart'; +import 'package:syncrow_app/features/devices/view/widgets/power_clamp/power_chart.dart'; +import 'package:syncrow_app/features/devices/view/widgets/power_clamp/power_clamp_card.dart'; +import 'package:syncrow_app/features/shared_widgets/default_container.dart'; +import 'package:syncrow_app/features/shared_widgets/default_scaffold.dart'; +import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; + +class PowerClampTestPage extends StatefulWidget { + late final DeviceModel? device; + + PowerClampTestPage({super.key, this.device}); + + @override + _PowerClampTestPageState createState() => _PowerClampTestPageState(); +} + +class _PowerClampTestPageState extends State { + final PageController _pageController = PageController(); + int _currentPage = 0; + final int _pageCount = 4; + @override + void initState() { + super.initState(); + _pageController.addListener(() { + int nextPage = _pageController.page?.round() ?? 0; + if (_currentPage != nextPage) { + setState(() { + _currentPage = nextPage; + }); + } + }); + } + + @override + void dispose() { + _pageController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return DefaultScaffold( + title: 'Power Clamp', + child: BlocProvider( + create: (context) => PowerClampBloc(PCId: widget.device?.uuid ?? '') + ..add(const PowerClampInitial()), + child: BlocBuilder( + builder: (context, state) { + final _blocProvider = BlocProvider.of(context); + PowerClampModel model = PowerClampModel( + productType: '', + productUuid: '', + status: PowerStatus( + phaseA: Phase( + dataPoints: [ + DataPoint( + code: '', + customName: '', + dpId: 0, + time: 0, + type: '', + value: 0), + ], + ), + phaseB: Phase( + dataPoints: [ + DataPoint( + code: '', + customName: '', + dpId: 0, + time: 0, + type: '', + value: 0), + ], + ), + phaseC: Phase( + dataPoints: [ + DataPoint( + code: '', + customName: '', + dpId: 0, + time: 0, + type: '', + value: 0), + ], + ), + general: Phase( + dataPoints: [ + DataPoint( + code: '', + customName: '', + dpId: 0, + time: 0, + type: '', + value: 0), + ], + ), + ), + ); + List chartData = []; + + if (state is UpdateState) { + model = state.powerClampModel; + } else if (state is EnergyDataState) { + chartData = state.energyData; + } + return state is PowerClampLoadingState + ? const Center( + child: DefaultContainer( + width: 50, + height: 50, + child: CircularProgressIndicator()), + ) + : Column( + children: [ + Flexible( + child: RefreshIndicator( + onRefresh: () async { + _blocProvider.add(const PowerClampInitial()); + }, + child: PageView( + controller: _pageController, + children: [ + PowerClampCard( + energyConsumption: + model.status.general.dataPoints.length > 0 + ? model.status.general.dataPoints[0].value + .toString() + : 'N/A', + title: 'Total Energy \nConsumption', + isGeneral: true, + dateSwitcher: _blocProvider.dateSwitcher(), + formattedDate: _blocProvider.formattedDate, + selectDateEvent: () { + _blocProvider.add( + SelectDateEvent(context: context)); + }, + totalFrequencyGeneral: + model.status.general.dataPoints.length > 4 + ? model.status.general.dataPoints[4].value + .toString() + : 'N/A', + totalActiveGeneral: + model.status.general.dataPoints.length > 2 + ? model.status.general.dataPoints[2].value + .toString() + : 'N/A', + totalCurrentGeneral: + model.status.general.dataPoints.length > 1 + ? model.status.general.dataPoints[1].value + .toString() + : 'N/A', + totalVoltage: + model.status.general.dataPoints.length > 0 + ? model.status.general.dataPoints[0].value.toString() + : 'N/A', + chartData: chartData, + context: context), + + + + PowerClampCard( + energyConsumption: + model.status.phaseA.dataPoints.length > 5 + ? model.status.phaseA.dataPoints[5].value + .toString() + : 'N/A', + title: 'Phase A Energy \nConsumption', + dateSwitcher: _blocProvider.dateSwitcher(), + formattedDate: _blocProvider.formattedDate, + selectDateEvent: () { + _blocProvider.add( + SelectDateEvent(context: context)); + }, + totalFactor: model.status.phaseA.dataPoints.length > 3 + ? model.status.phaseA.dataPoints[3].value + .toString() + : 'N/A', + totalActive: model.status.phaseA.dataPoints.length > 2 + ? model.status.phaseA.dataPoints[2].value + .toString() + : 'N/A', + totalCurrent: + model.status.phaseA.dataPoints.length > 1 + ? model.status.phaseA.dataPoints[1] + .value + .toString() + : 'N/A', + totalVoltage: + model.status.phaseA.dataPoints.length > 0 + ? model.status.phaseA.dataPoints[0] + .value + .toString() + : 'N/A', + chartData: chartData, + context: context), + + + PowerClampCard( + energyConsumption: + model.status.phaseB.dataPoints.length > 5 + ? model.status.phaseB.dataPoints[5].value + .toString() + : 'N/A', + title: 'Phase B Energy \nConsumption', + dateSwitcher: _blocProvider.dateSwitcher(), + formattedDate: _blocProvider.formattedDate, + selectDateEvent: () { + _blocProvider.add( + SelectDateEvent(context: context)); + }, + totalFactor: model.status.phaseA.dataPoints.length > 3 + ? model.status.phaseB.dataPoints[3].value + .toString() + : 'N/A', + totalActive: model.status.phaseB.dataPoints.length > 2 + ? model.status.phaseB.dataPoints[2].value + .toString() + : 'N/A', + totalCurrent: + model.status.phaseB.dataPoints.length > 1 + ? model.status.phaseB.dataPoints[1] + .value + .toString() + : 'N/A', + totalVoltage: + model.status.phaseB.dataPoints.length > 0 + ? model.status.phaseB.dataPoints[0] + .value + .toString() + : 'N/A', + chartData: chartData, + context: context), + + + PowerClampCard( + energyConsumption: + model.status.phaseC.dataPoints.length > 5 + ? model.status.phaseC.dataPoints[5].value + .toString() + : 'N/A', + title: 'Phase A Energy \nConsumption', + dateSwitcher: _blocProvider.dateSwitcher(), + formattedDate: _blocProvider.formattedDate, + selectDateEvent: () { + _blocProvider.add( + SelectDateEvent(context: context)); + }, + totalFactor: model.status.phaseC.dataPoints.length > 3 + ? model.status.phaseC.dataPoints[3].value + .toString() + : 'N/A', + totalActive: model.status.phaseC.dataPoints.length > 2 + ? model.status.phaseC.dataPoints[2].value + .toString() + : 'N/A', + totalCurrent: + model.status.phaseC.dataPoints.length > 1 + ? model.status.phaseC.dataPoints[1] + .value + .toString() + : 'N/A', + totalVoltage: + model.status.phaseC.dataPoints.length > 0 + ? model.status.phaseC.dataPoints[0] + .value + .toString() + : 'N/A', + chartData: chartData, + context: context), + + ]), + ), + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 10.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: List.generate(_pageCount, (index) { + return AnimatedContainer( + duration: const Duration(milliseconds: 300), + margin: + const EdgeInsets.symmetric(horizontal: 4.0), + height: 10.0, + width: _currentPage == index + ? 10.0 + : 10.0, // Change width for current page + decoration: BoxDecoration( + color: _currentPage == index + ? Colors + .grey // Use a different color for the active indicator + : ColorsManager.greyColor, + borderRadius: BorderRadius.circular(5.0), + ), + ); + }), + ), + ), + ], + ); + }, + ), + ), + ); + } +}