Files
retail/lib/features/home/presentation/providers/cart_total_provider.dart
2025-10-16 18:06:31 +07:00

84 lines
2.0 KiB
Dart

import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'cart_provider.dart';
import '../../../settings/presentation/providers/settings_provider.dart';
part 'cart_total_provider.g.dart';
/// Cart totals calculation provider
@riverpod
class CartTotal extends _$CartTotal {
@override
CartTotalData build() {
final itemsAsync = ref.watch(cartProvider);
final settingsAsync = ref.watch(settingsProvider);
final items = itemsAsync.when(
data: (data) => data,
loading: () => <dynamic>[],
error: (_, __) => <dynamic>[],
);
final settings = settingsAsync.when(
data: (data) => data,
loading: () => null,
error: (_, __) => null,
);
// Calculate subtotal
final subtotal = items.fold<double>(
0.0,
(sum, item) => sum + item.total,
);
// Calculate tax
final taxRate = settings?.taxRate ?? 0.0;
final tax = subtotal * taxRate;
// Calculate total
final total = subtotal + tax;
return CartTotalData(
subtotal: subtotal,
tax: tax,
taxRate: taxRate,
total: total,
itemCount: items.length,
);
}
/// Apply discount amount to total
double applyDiscount(double discountAmount) {
final currentTotal = state.total;
return (currentTotal - discountAmount).clamp(0.0, double.infinity);
}
/// Apply discount percentage to total
double applyDiscountPercentage(double discountPercent) {
final currentTotal = state.total;
final discountAmount = currentTotal * (discountPercent / 100);
return (currentTotal - discountAmount).clamp(0.0, double.infinity);
}
}
/// Cart total data model
class CartTotalData {
final double subtotal;
final double tax;
final double taxRate;
final double total;
final int itemCount;
const CartTotalData({
required this.subtotal,
required this.tax,
required this.taxRate,
required this.total,
required this.itemCount,
});
@override
String toString() {
return 'CartTotalData(subtotal: $subtotal, tax: $tax, total: $total, items: $itemCount)';
}
}