1import 'package:connect/core/constants/app_values.dart';
2import 'package:connect/core/localization/app_localizations.dart';
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';
24 _LastThreeMonthsPerformanceCardState();
27class _LastThreeMonthsPerformanceCardState
28 extends State<LastThreeMonthsPerformanceCard> {
37 widget.earningLastTwoMonth,
38 widget.earningLastMonth,
39 widget.earningActualMonth,
46 super.didChangeDependencies();
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);
63 List<String> monthNames = [
77 return monthNames[monthIndex - 1];
81 Widget
build(BuildContext context) {
84 crossAxisAlignment: CrossAxisAlignment.start,
88 style: Theme.of(context).textTheme.bodySmall,
90 SizedBox(height: 20.sp),
97 borderData: FlBorderData(show:
false),
98 gridData:
const FlGridData(show:
false),
99 alignment: BarChartAlignment.spaceAround,
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,
116 final value = validEarnings[index];
117 final isHovered = index == hoveredIndex;
118 return BarChartGroupData(
122 toY: maxEarning == 0 ? 0 : value / maxEarning * 8,
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),
130 gradient: LinearGradient(
134 .withOpacity(isHovered ? 0.9 : 0.4),
135 Theme.of(context).colorScheme.surface.withOpacity(0.4),
137 begin: Alignment.topCenter,
138 end: Alignment.bottomCenter,
149 leftTitles:
const AxisTitles(
150 sideTitles: SideTitles(showTitles:
false),
152 topTitles:
const AxisTitles(sideTitles: SideTitles(showTitles:
false)),
153 rightTitles:
const AxisTitles(sideTitles: SideTitles(showTitles:
false)),
154 bottomTitles: AxisTitles(
155 sideTitles: SideTitles(
157 getTitlesWidget: (
value, _) {
158 final index =
value.toInt();
159 if (index <
months.length) {
161 padding: EdgeInsets.only(top: 4.sp),
164 style: Theme.of(context).textTheme.bodySmall?.copyWith(
165 color: Theme.of(context).hintColor,
171 return const SizedBox.shrink();
181 touchTooltipData: BarTouchTooltipData(
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,
195 touchCallback: (event, response) {
196 if (response != null && response.spot != null) {
198 hoveredIndex = response.spot!.touchedBarGroupIndex;
String translate(String key)
static AppLocalizations of(BuildContext context)
override void didChangeDependencies()
const CustomCard({ super.key, required this.child, this.padding, this.bgColor, })
override void initState()
override Widget build(BuildContext context)