import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import '../../../application/checkout/checkout_form/checkout_form_bloc.dart'; import '../../../common/extension/extension.dart'; import '../../../common/theme/theme.dart'; import '../../../domain/product/product.dart'; import '../dialog/dialog.dart'; import '../image/image.dart'; import '../spaces/space.dart'; class ProductCard extends StatelessWidget { final Product product; const ProductCard({super.key, required this.product}); @override Widget build(BuildContext context) { return GestureDetector( onTap: () { if (product.isActive == true) { if (product.variants.isEmpty) { context.read().add( CheckoutFormEvent.addItem(product, null), ); } else { showDialog( context: context, builder: (context) => VariantDialog(product: product), ); } } }, child: Container( decoration: BoxDecoration( color: AppColor.white, borderRadius: BorderRadius.circular(8.0), border: Border.all(color: AppColor.disabled), ), child: Stack( children: [ Padding( padding: const EdgeInsets.all(4.0), child: Column( mainAxisAlignment: MainAxisAlignment.start, children: [ ClipRRect( borderRadius: BorderRadius.all(Radius.circular(8.0)), child: product.imageUrl == "" ? Container( width: double.infinity, height: 120, decoration: BoxDecoration( color: AppColor.disabled.withOpacity(0.4), ), child: const Icon( Icons.image, color: AppColor.textSecondary, ), ) : AppNetworkImage( url: product.imageUrl, fit: BoxFit.fill, width: double.infinity, height: 140, ), ), const Spacer(), Text( product.name, style: AppStyle.md.copyWith(fontWeight: FontWeight.w700), maxLines: 1, overflow: TextOverflow.ellipsis, ), SpaceHeight(4), Align( alignment: Alignment.center, child: Text( product.price.currencyFormatRp, style: const TextStyle( fontWeight: FontWeight.bold, fontSize: 12, ), ), ), SpaceHeight(4), ], ), ), BlocBuilder( builder: (context, state) { final totalQuantity = state.items .where((item) => item.product.id == product.id) .map((item) => item.quantity) .fold(0, (sum, qty) => sum + qty); if (totalQuantity == 0) { return const SizedBox.shrink(); } return Positioned( top: 4, right: 4, child: Container( width: 40, height: 40, padding: const EdgeInsets.all(6), decoration: const BoxDecoration( borderRadius: BorderRadius.all(Radius.circular(9.0)), color: AppColor.primary, ), child: Center( child: Text( totalQuantity.toString(), style: const TextStyle( color: Colors.white, fontSize: 20, fontWeight: FontWeight.bold, ), ), ), ), ); }, ), if (product.isActive == false) Container( width: double.infinity, decoration: BoxDecoration( borderRadius: BorderRadius.all(Radius.circular(8.0)), color: AppColor.disabled.withOpacity(0.5), ), ), ], ), ), ); } }