/// Price Display Widget /// /// Formats and displays prices in Vietnamese currency format library; import 'package:flutter/material.dart'; import '../../core/utils/formatters.dart'; /// Price display with Vietnamese currency formatting class PriceDisplay extends StatelessWidget { final double price; final TextStyle? style; final bool showSymbol; final int decimalDigits; final Color? color; final FontWeight? fontWeight; final double? fontSize; const PriceDisplay({ super.key, required this.price, this.style, this.showSymbol = true, this.decimalDigits = 0, this.color, this.fontWeight, this.fontSize, }); @override Widget build(BuildContext context) { final formattedPrice = CurrencyFormatter.formatWithDecimals( price, decimalDigits: decimalDigits, showSymbol: showSymbol, ); return Text( formattedPrice, style: style ?? TextStyle( color: color, fontWeight: fontWeight ?? FontWeight.w600, fontSize: fontSize, ), ); } } /// Price display with sale price comparison class SalePriceDisplay extends StatelessWidget { final double originalPrice; final double salePrice; final TextStyle? originalPriceStyle; final TextStyle? salePriceStyle; final bool showSymbol; final MainAxisAlignment alignment; const SalePriceDisplay({ super.key, required this.originalPrice, required this.salePrice, this.originalPriceStyle, this.salePriceStyle, this.showSymbol = true, this.alignment = MainAxisAlignment.start, }); @override Widget build(BuildContext context) { return Row( mainAxisAlignment: alignment, crossAxisAlignment: CrossAxisAlignment.baseline, textBaseline: TextBaseline.alphabetic, children: [ // Sale price (larger, prominent) Text( CurrencyFormatter.format(salePrice, showSymbol: showSymbol), style: salePriceStyle ?? const TextStyle( fontSize: 18, fontWeight: FontWeight.bold, color: Colors.red, ), ), const SizedBox(width: 8), // Original price (smaller, strikethrough) Text( CurrencyFormatter.format(originalPrice, showSymbol: showSymbol), style: originalPriceStyle ?? TextStyle( fontSize: 14, fontWeight: FontWeight.normal, color: Colors.grey[600], decoration: TextDecoration.lineThrough, ), ), ], ); } } /// Price display with discount percentage badge class PriceWithDiscount extends StatelessWidget { final double originalPrice; final double salePrice; final bool showSymbol; final TextStyle? salePriceStyle; final TextStyle? originalPriceStyle; const PriceWithDiscount({ super.key, required this.originalPrice, required this.salePrice, this.showSymbol = true, this.salePriceStyle, this.originalPriceStyle, }); double get discountPercentage { return ((originalPrice - salePrice) / originalPrice * 100); } @override Widget build(BuildContext context) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ // Sale price Text( CurrencyFormatter.format(salePrice, showSymbol: showSymbol), style: salePriceStyle ?? const TextStyle( fontSize: 18, fontWeight: FontWeight.bold, color: Colors.red, ), ), const SizedBox(width: 8), // Discount badge Container( padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 2), decoration: BoxDecoration( color: Colors.red, borderRadius: BorderRadius.circular(4), ), child: Text( '-${discountPercentage.toStringAsFixed(0)}%', style: const TextStyle( fontSize: 11, fontWeight: FontWeight.bold, color: Colors.white, ), ), ), ], ), const SizedBox(height: 4), // Original price Text( CurrencyFormatter.format(originalPrice, showSymbol: showSymbol), style: originalPriceStyle ?? TextStyle( fontSize: 14, fontWeight: FontWeight.normal, color: Colors.grey[600], decoration: TextDecoration.lineThrough, ), ), ], ); } } /// Compact price display for lists/grids class CompactPriceDisplay extends StatelessWidget { final double price; final double? salePrice; final bool showSymbol; const CompactPriceDisplay({ super.key, required this.price, this.salePrice, this.showSymbol = true, }); @override Widget build(BuildContext context) { final bool isOnSale = salePrice != null && salePrice! < price; if (isOnSale) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( CurrencyFormatter.format(salePrice!, showSymbol: showSymbol), style: const TextStyle( fontSize: 16, fontWeight: FontWeight.bold, color: Colors.red, ), ), Text( CurrencyFormatter.format(price, showSymbol: showSymbol), style: TextStyle( fontSize: 12, color: Colors.grey[600], decoration: TextDecoration.lineThrough, ), ), ], ); } return Text( CurrencyFormatter.format(price, showSymbol: showSymbol), style: const TextStyle( fontSize: 16, fontWeight: FontWeight.bold, ), ); } } /// Large price display for checkout/order summary class LargePriceDisplay extends StatelessWidget { final double price; final String? label; final bool showSymbol; final Color? color; const LargePriceDisplay({ super.key, required this.price, this.label, this.showSymbol = true, this.color, }); @override Widget build(BuildContext context) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ if (label != null) ...[ Text( label!, style: TextStyle( fontSize: 14, color: Colors.grey[600], ), ), const SizedBox(height: 4), ], Text( CurrencyFormatter.format(price, showSymbol: showSymbol), style: TextStyle( fontSize: 28, fontWeight: FontWeight.bold, color: color ?? Theme.of(context).primaryColor, ), ), ], ); } }