Aidra Connect 10.0.2+16
Aidra Connect Mobile Application
Loading...
Searching...
No Matches
last_three_months_performance_card.dart
Go to the documentation of this file.
1import 'package:connect/core/constants/app_values.dart';
2import 'package:connect/core/localization/app_localizations.dart';
3
4import '/core/ui/widgets/custom_card.dart';
5import 'package:fl_chart/fl_chart.dart';
6import 'package:flutter/material.dart';
7import 'package:flutter_screenutil/flutter_screenutil.dart';
8import 'package:intl/intl.dart';
9
10class LastThreeMonthsPerformanceCard extends StatefulWidget {
12 super.key,
13 required this.earningActualMonth,
14 required this.earningLastMonth,
15 required this.earningLastTwoMonth,
16 });
17
19 final num? earningLastMonth;
21
22 @override
23 State<LastThreeMonthsPerformanceCard> createState() =>
24 _LastThreeMonthsPerformanceCardState();
25}
26
27class _LastThreeMonthsPerformanceCardState
28 extends State<LastThreeMonthsPerformanceCard> {
29 late List<num?> earnings;
30 late List<String> months;
32
33 @override
34 void initState() {
35 super.initState();
36 earnings = [
37 widget.earningLastTwoMonth,
38 widget.earningLastMonth,
39 widget.earningActualMonth,
40 ];
41 hoveredIndex = null;
42 }
43
44 @override
46 super.didChangeDependencies();
48 }
49
50 List<String> _getMonthNames() {
51 DateTime now = DateTime.now();
52 DateTime lastMonth = DateTime(now.year, now.month - 1, now.day);
53 DateTime twoMonthsAgo = DateTime(now.year, now.month - 2, now.day);
54 List<String> months = [
55 _getMonthName(twoMonthsAgo.month),
56 _getMonthName(lastMonth.month),
57 _getMonthName(now.month),
58 ];
59 return months;
60 }
61
62 String _getMonthName(int monthIndex) {
63 List<String> monthNames = [
64 AppLocalizations.of(context).translate('January'),
65 AppLocalizations.of(context).translate('February'),
66 AppLocalizations.of(context).translate('March'),
67 AppLocalizations.of(context).translate('April'),
68 AppLocalizations.of(context).translate('May'),
69 AppLocalizations.of(context).translate('June'),
70 AppLocalizations.of(context).translate('July'),
71 AppLocalizations.of(context).translate('August'),
72 AppLocalizations.of(context).translate('September'),
73 AppLocalizations.of(context).translate('October'),
74 AppLocalizations.of(context).translate('November'),
75 AppLocalizations.of(context).translate('December'),
76 ];
77 return monthNames[monthIndex - 1];
78 }
79
80 @override
81 Widget build(BuildContext context) {
82 return CustomCard(
83 child: Column(
84 crossAxisAlignment: CrossAxisAlignment.start,
85 children: [
86 Text(
87 AppLocalizations.of(context).translate('LAST 3 MONTHS PERFORMANCE'),
88 style: Theme.of(context).textTheme.bodySmall,
89 ),
90 SizedBox(height: 20.sp),
91 SizedBox(
92 height: 170.sp,
93 child: BarChart(
94 BarChartData(
95 barGroups: _buildBarGroups(),
96 titlesData: _buildTitlesData(),
97 borderData: FlBorderData(show: false),
98 gridData: const FlGridData(show: false),
99 alignment: BarChartAlignment.spaceAround,
100 groupsSpace: 8.sp,
101 barTouchData: _buildBarTouchData(context),
102 ),
103 ),
104 ),
105 ],
106 ),
107 );
108 }
109
110 List<BarChartGroupData> _buildBarGroups() {
111 final validEarnings = earnings.map((e) => e ?? 0).toList();
112 final maxEarning = validEarnings.reduce((a, b) => a > b ? a : b);
113 return List.generate(
114 validEarnings.length,
115 (index) {
116 final value = validEarnings[index];
117 final isHovered = index == hoveredIndex;
118 return BarChartGroupData(
119 x: index,
120 barRods: [
121 BarChartRodData(
122 toY: maxEarning == 0 ? 0 : value / maxEarning * 8,
123 width: 60.sp,
124 borderRadius: const BorderRadius.only(
125 topLeft: Radius.circular(5),
126 topRight: Radius.circular(5),
127 bottomLeft: Radius.circular(5),
128 bottomRight: Radius.circular(5),
129 ),
130 gradient: LinearGradient(
131 colors: [
132 Theme.of(context)
133 .primaryColor
134 .withOpacity(isHovered ? 0.9 : 0.4),
135 Theme.of(context).colorScheme.surface.withOpacity(0.4),
136 ],
137 begin: Alignment.topCenter,
138 end: Alignment.bottomCenter,
139 ),
140 ),
141 ],
142 );
143 },
144 );
145 }
146
147 FlTitlesData _buildTitlesData() {
148 return FlTitlesData(
149 leftTitles: const AxisTitles(
150 sideTitles: SideTitles(showTitles: false),
151 ),
152 topTitles: const AxisTitles(sideTitles: SideTitles(showTitles: false)),
153 rightTitles: const AxisTitles(sideTitles: SideTitles(showTitles: false)),
154 bottomTitles: AxisTitles(
155 sideTitles: SideTitles(
156 showTitles: true,
157 getTitlesWidget: (value, _) {
158 final index = value.toInt();
159 if (index < months.length) {
160 return Padding(
161 padding: EdgeInsets.only(top: 4.sp),
162 child: Text(
163 months[index],
164 style: Theme.of(context).textTheme.bodySmall?.copyWith(
165 color: Theme.of(context).hintColor,
166 fontSize: 10.sp,
167 ),
168 ),
169 );
170 }
171 return const SizedBox.shrink();
172 },
173 ),
174 ),
175 );
176 }
177
178 BarTouchData _buildBarTouchData(BuildContext context) {
179 return BarTouchData(
180 enabled: true,
181 touchTooltipData: BarTouchTooltipData(
182 tooltipMargin: 8.sp,
183 getTooltipColor: (group) => Theme.of(context).colorScheme.primary,
184 getTooltipItem: (group, groupIndex, rod, rodIndex) {
185 return BarTooltipItem(
186 NumberFormat.currency(symbol: AppValues.currency)
187 .format(earnings[groupIndex]),
188 Theme.of(context).textTheme.displayLarge!.copyWith(
189 color: Theme.of(context).colorScheme.surface,
190 fontSize: 11.sp,
191 ),
192 );
193 },
194 ),
195 touchCallback: (event, response) {
196 if (response != null && response.spot != null) {
197 setState(() {
198 hoveredIndex = response.spot!.touchedBarGroupIndex;
199 });
200 } else {
201 setState(() {
202 hoveredIndex = null;
203 });
204 }
205 },
206 );
207 }
208}
String translate(String key)
static AppLocalizations of(BuildContext context)
const LastThreeMonthsPerformanceCard({ super.key, required this.earningActualMonth, required this.earningLastMonth, required this.earningLastTwoMonth, })
override State< LastThreeMonthsPerformanceCard > createState()
override void didChangeDependencies()
const CustomCard({ super.key, required this.child, this.padding, this.bgColor, })
final Widget child
final EdgeInsets padding
override void initState()
final Color color
Definition failures.dart:1
FlTitlesData _buildTitlesData()
late List< String > months
class LastThreeMonthsPerformanceCard extends StatefulWidget earnings
List< BarChartGroupData > _buildBarGroups()
List< String > _getMonthNames()
String _getMonthName(int monthIndex)
BarTouchData _buildBarTouchData(BuildContext context)
override Widget build(BuildContext context)
final double value