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/components/spaces.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( padding: const EdgeInsets.all(16.0), decoration: BoxDecoration( color: AppColors.white, borderRadius: BorderRadius.circular(12.0), border: Border.all( color: AppColors.disabled, ), ), child: Stack( children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ SpaceHeight(8), Container( alignment: Alignment.center, padding: const EdgeInsets.all(12.0), decoration: BoxDecoration( shape: BoxShape.circle, color: AppColors.disabled.withOpacity(0.4), ), child: ClipRRect( borderRadius: BorderRadius.all(Radius.circular(40.0)), child: CachedNetworkImage( imageUrl: data.image!.contains('http') ? data.image! : '${Variables.baseUrl}/${data.image}', fit: BoxFit.cover, width: 60, height: 60, errorWidget: (context, url, error) => Container( width: 60, height: 60, decoration: BoxDecoration( shape: BoxShape.circle, color: AppColors.disabled.withOpacity(0.4), ), child: const Icon( Icons.image_not_supported, color: AppColors.grey, ), ), ), ), ), const Spacer(), Text( "${data.name}", style: const TextStyle( fontSize: 15, fontWeight: FontWeight.w700, ), maxLines: 2, overflow: TextOverflow.ellipsis, ), const Spacer(), Align( alignment: Alignment.center, child: Text( data.category?.name ?? '-', style: const TextStyle( fontSize: 14, color: AppColors.grey, fontWeight: FontWeight.w500, ), maxLines: 2, overflow: TextOverflow.ellipsis, ), ), const Spacer(), Align( alignment: Alignment.center, child: Text( data.price!.toIntegerFromText.currencyFormatRp, style: const TextStyle( fontWeight: FontWeight.bold, fontSize: 13, ), ), ), 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(); }, ); }, ), ], ), ), ); } }