Aidra Driver 1.3.5+68
Aidra Driver - Your path to green energy
Loading...
Searching...
No Matches
dashboard_screen.dart
Go to the documentation of this file.
1import 'package:easy_localization/easy_localization.dart';
2import 'package:flutter/material.dart';
3
4import '../../../../core/ui/widgets/custom_scaffold.dart';
5import '../../../../core/ui/theme/color_palette.dart';
6import '../../../../core/ui/widgets/logo_header.dart';
7import '../../../../core/ui/widgets/error_widget.dart';
8import '../../../auth/presentation/bloc/authentication_bloc/authentication_bloc.dart';
9// import 'widgets/statistics_card.dart';
10// import 'widgets/statistics_card_shimmer.dart';
11import 'widgets/time_selector.dart';
12import 'widgets/today_collections.dart';
13import 'package:flutter_bloc/flutter_bloc.dart';
14import '../bloc/period_bloc/period_bloc.dart';
15import '../bloc/period_bloc/period_state.dart';
16import '../bloc/period_bloc/period_event.dart';
17import 'widgets/today_collections_shimmer.dart';
18
19class DashboardScreen extends StatefulWidget {
20 const DashboardScreen({super.key});
21
22 @override
23 State<DashboardScreen> createState() => _DashboardScreenState();
24}
25
26class _DashboardScreenState extends State<DashboardScreen> {
27 String period = 'week';
28
29 @override
30 void initState() {
31 super.initState();
33 }
34
35 @override
36 Widget build(BuildContext context) {
37 return CustomScaffold(
38 onRefresh: () {
40 },
41 isLeadingVisible: false,
42 backgroundColor: ColorPalette.antiFlashWhite,
43 body: BlocBuilder<PeriodBloc, PeriodState>(
44 builder: (context, state) {
45 if (state is TodayStatisticsError || state is PeriodError) {
46 return CustomErrorWidget(
47 message: "Connection failed",
48 onReload: () => loadStatistics(period),
49 );
50 }
51
52 return SingleChildScrollView(
54 children: [
55 Padding(
56 padding: const EdgeInsets.only(
57 bottom: 16.0,
58 left: 16.0,
59 right: 16.0,
60 ),
62 crossAxisAlignment: CrossAxisAlignment.start,
63 children: [
64 LogoHeader(title: "dashboard.title".tr()),
65 BlocBuilder<PeriodBloc, PeriodState>(
66 buildWhen: (previous, current) => current is TodayStatisticsLoading || current is TodayStatisticsLoaded,
67 builder: (context, state) {
68 if (state is TodayStatisticsLoading) {
69 return const TodayCollectionsShimmer();
70 } else if (state is TodayStatisticsLoaded) {
71 final stats = state.statistics;
72 final doneVolume = stats.doneVolume ?? 0;
73 // Format the volume value
74 String formattedVolume = doneVolume >= 1000
75 ? "${(doneVolume / 1000).toStringAsFixed(2)} MT"
76 : "${doneVolume.toStringAsFixed(0)} KG";
77
78 return TodayCollections(
79 totalCollections: ((stats.collectionNumbersDone ?? 0) + (stats.canceledCollections ?? 0)).toString(),
80 collectionsVolume: formattedVolume,
81 done: stats.collectionNumbersDone?.toString() ?? "0",
82 canceled: stats.canceledCollections?.toString() ?? "0",
83 completedPercentage: stats.percentageCompleted?.toString() ?? "0",
84 pendingCollections: stats.pendingCollections?.toString() ?? "0",
85 );
86 }
87 return const SizedBox.shrink();
88 },
89 ),
90 const SizedBox(height: 24),
91 TimeSelector(
92 onTimeRangeChanged: (String newPeriod) {
93 setState(() {
94 period = newPeriod;
95 });
96 _loadPeriodStatistics(newPeriod);
97 },
98 ),
99 const SizedBox(height: 24),
100 BlocBuilder<PeriodBloc, PeriodState>(
101 buildWhen: (previous, current) => current is PeriodLoading || current is PeriodLoaded,
102 builder: (context, state) {
103 if (state is PeriodLoading) {
104 return const TodayCollectionsShimmer();
105 } else if (state is PeriodLoaded) {
106 final stats = state.statistics;
107 final doneVolume = stats.doneVolume ?? 0;
108 String formattedVolume = doneVolume >= 1000
109 ? "${(doneVolume / 1000).toStringAsFixed(2)} MT"
110 : "${doneVolume.toStringAsFixed(0)} KG";
111 return TodayCollections(
112 isPeriodSection: true,
113 totalCollections: ((stats.collectionNumbersDone ?? 0) + (stats.canceledCollections ?? 0)).toString(),
114 collectionsVolume: formattedVolume,
115 done: stats.collectionNumbersDone?.toString() ?? "0",
116 canceled: stats.canceledCollections?.toString() ?? "0",
117 completedPercentage: stats.percentageCompleted?.toString() ?? "0",
118 pendingCollections: stats.pendingCollections?.toString() ?? "0",
119 );
120 }
121 return const SizedBox.shrink();
122 },
123 ),
124 ],
125 ),
126 ),
127 ],
128 ),
129 );
130 },
131 ),
132 );
133 }
134
136 final authState = context.read<AuthenticationBloc>().state;
137 if (authState is AuthenticatedState) {
138 context.read<PeriodBloc>().add(
139 GetTodayStatisticsEvent(
140 userId: authState.session.uid ?? 0
141 ),
142 );
143 }
144 }
145
146 void _loadPeriodStatistics(String periodToLoad) {
147 final authState = context.read<AuthenticationBloc>().state;
148 if (authState is AuthenticatedState) {
149 context.read<PeriodBloc>().add(
151 userId: authState.session.uid ?? 0,
152 period: periodToLoad,
153 ),
154 );
155 }
156 }
157
158 void loadStatistics(String periodToLoad) {
160 _loadPeriodStatistics(periodToLoad);
161 }
162}
override void initState()
class App extends StatefulWidget build(BuildContext context)
Definition app.dart:31
sealed class CheckInOutEvent extends Equatable userId
static const antiFlashWhite
override State< DashboardScreen > createState()
const DashboardScreen({super.key})
final Widget child
final EdgeInsets padding
void loadStatistics(String periodToLoad)
void _loadPeriodStatistics(String periodToLoad)
void _reloadTodayStatistics()
class Partner String
final String message
Definition failures.dart:0
const GetCollectionStatisticsEvent({ required this.userId, required this.period, })
abstract class PeriodEvent extends Equatable period
const PeriodLoaded({ required this.statistics, })
const TodayStatisticsLoaded({ required this.statistics, })
const PeriodError({ required this.message, })
final String title
style SizedBox(height:2.h)
style Column(crossAxisAlignment:CrossAxisAlignment.end, children:[Container(padding:EdgeInsets.symmetric(horizontal:8.w, vertical:4.h), decoration:BoxDecoration(color:ColorPalette.tiffanyBlue.withValues(alpha:0.1), borderRadius:BorderRadius.circular(12),), child:Text(collection.type ?? '', style:Theme.of(context).textTheme.bodySmall?.copyWith(color:ColorPalette.tiffanyBlue, fontWeight:FontWeight.bold,),),),],)