112 lines
3.7 KiB
Dart
Raw Normal View History

2025-08-12 22:33:31 +07:00
import 'package:flutter/material.dart';
2025-08-18 01:50:50 +07:00
import '../../../../common/extension/extension.dart';
2025-08-12 22:33:31 +07:00
import '../../../../common/theme/theme.dart';
2025-08-18 01:50:50 +07:00
import '../../../../domain/analytic/analytic.dart';
2025-08-12 22:33:31 +07:00
import 'stat_tile.dart';
class ReportQuickStats extends StatelessWidget {
2025-08-18 01:50:50 +07:00
final DashboardOverview overview;
const ReportQuickStats({super.key, required this.overview});
2025-08-12 22:33:31 +07:00
@override
Widget build(BuildContext context) {
2025-08-18 01:50:50 +07:00
return Column(
2025-08-12 22:33:31 +07:00
children: [
2025-08-18 01:50:50 +07:00
Row(
children: [
Expanded(
child: TweenAnimationBuilder<double>(
tween: Tween<double>(begin: 0, end: 1),
duration: const Duration(milliseconds: 800),
builder: (context, value, child) {
return Transform.scale(
scale: value,
child: ReportStatTile(
title: 'Total Orders',
value: overview.totalOrders.toString(),
icon: Icons.receipt_long,
color: AppColor.info,
animatedValue: overview.totalOrders * value,
),
);
},
),
),
const SizedBox(width: 16),
Expanded(
child: TweenAnimationBuilder<double>(
tween: Tween<double>(begin: 0, end: 1),
duration: const Duration(milliseconds: 1000),
builder: (context, value, child) {
return Transform.scale(
scale: value,
child: ReportStatTile(
title: 'Average Order',
value: overview.averageOrderValue
.round()
.currencyFormatRp,
icon: Icons.trending_up,
color: AppColor.warning,
animatedValue: overview.averageOrderValue * value,
),
);
},
),
),
],
2025-08-12 22:33:31 +07:00
),
2025-08-18 01:50:50 +07:00
const SizedBox(height: 16),
Row(
children: [
Expanded(
child: TweenAnimationBuilder<double>(
tween: Tween<double>(begin: 0, end: 1),
duration: const Duration(milliseconds: 1200),
builder: (context, value, child) {
return Transform.scale(
scale: value,
child: ReportStatTile(
title: 'Customers',
value: overview.totalCustomers.toString(),
icon: Icons.people,
color: AppColor.success,
animatedValue: overview.totalCustomers * value,
),
);
},
),
),
const SizedBox(width: 16),
Expanded(
child: TweenAnimationBuilder<double>(
tween: Tween<double>(begin: 0, end: 1),
duration: const Duration(milliseconds: 1400),
builder: (context, value, child) {
return Transform.scale(
scale: value,
child: ReportStatTile(
title: 'Void + Refund',
value: (overview.voidedOrders + overview.refundedOrders)
.toString(),
icon: Icons.cancel,
color: AppColor.error,
animatedValue:
(overview.voidedOrders + overview.refundedOrders) *
value,
),
);
},
),
),
],
2025-08-12 22:33:31 +07:00
),
],
);
}
}