import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:enaklo_pos/core/constants/variables.dart'; import 'package:enaklo_pos/core/extensions/int_ext.dart'; import 'package:enaklo_pos/core/extensions/string_ext.dart'; import 'package:enaklo_pos/data/models/response/product_response_model.dart'; import 'package:enaklo_pos/presentation/home/bloc/checkout/checkout_bloc.dart'; import '../../../core/constants/colors.dart'; class ProductCard extends StatelessWidget { final Product data; final VoidCallback onCartButton; const ProductCard({ super.key, required this.data, required this.onCartButton, }); @override Widget build(BuildContext context) { return GestureDetector( onTap: () { context.read().add(CheckoutEvent.addItem(data)); }, child: Container( decoration: BoxDecoration( color: AppColors.white, borderRadius: BorderRadius.circular(8.0), border: Border.all( color: AppColors.disabled, ), ), child: Stack( children: [ Padding( padding: const EdgeInsets.all(4.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ ClipRRect( borderRadius: BorderRadius.all(Radius.circular(8.0)), child: CachedNetworkImage( imageUrl: data.image!.contains('http') ? data.image! : '${Variables.baseUrl}/${data.image}', fit: BoxFit.cover, width: double.infinity, height: 120, errorWidget: (context, url, error) => Container( width: double.infinity, height: 120, decoration: BoxDecoration( color: AppColors.disabled.withOpacity(0.4), ), child: const Icon( Icons.image, color: AppColors.grey, ), ), ), ), const Spacer(), Text( "${data.name}", style: const TextStyle( fontSize: 14, fontWeight: FontWeight.w700, ), maxLines: 1, overflow: TextOverflow.ellipsis, ), const Spacer(), Align( alignment: Alignment.center, child: Text( data.category?.name ?? '-', style: const TextStyle( fontSize: 12, color: AppColors.grey, fontWeight: FontWeight.w500, ), maxLines: 1, overflow: TextOverflow.ellipsis, ), ), const Spacer(), Align( alignment: Alignment.center, child: Text( data.price!.toIntegerFromText.currencyFormatRp, style: const TextStyle( fontWeight: FontWeight.bold, fontSize: 12, ), ), ), const Spacer(), ], ), ), BlocBuilder( builder: (context, state) { return state.maybeWhen( orElse: () => const SizedBox(), loaded: (products, discountModel, discount, discountAmount, tax, serviceCharge, totalQuantity, totalPrice, draftName, orderType) { return products.any((element) => element.product == data) ? products .firstWhere( (element) => element.product == data) .quantity > 0 ? Align( alignment: Alignment.topRight, child: Container( width: 40, height: 40, padding: const EdgeInsets.all(6), decoration: const BoxDecoration( borderRadius: BorderRadius.all(Radius.circular(9.0)), color: AppColors.primary, ), child: Center( child: Text( products .firstWhere((element) => element.product == data) .quantity .toString(), style: const TextStyle( color: Colors.white, fontSize: 20, fontWeight: FontWeight.bold), ), ), ), ) : SizedBox.shrink() : SizedBox.shrink(); }, ); }, ), ], ), ), ); } }