QueenFruits/Mobile Operasional/lib/features/pos/presentation/widgets/cart_item_tile.dart

206 lines
6.8 KiB
Dart

import 'package:flutter/material.dart';
import 'package:niogu_app/core/constants/app_color.dart';
import 'package:niogu_app/core/constants/app_font_size.dart';
import 'package:niogu_app/core/utils/currency_format.dart';
import 'package:niogu_app/core/utils/extension_format.dart';
import 'package:niogu_app/core/enums/stock_type.dart';
import 'package:niogu_app/features/pos/domain/entities/pos.dart';
import 'package:sizer/sizer.dart';
class CartItemTile extends StatelessWidget {
final CartItems cartItem;
final void Function(CartItems) onDecrementTap;
final void Function(CartItems) onIncrementTap;
final void Function(CartItems) onEditPressed;
final void Function(CartItems) onDeletePressed;
const CartItemTile({
super.key,
required this.cartItem,
required this.onDecrementTap,
required this.onIncrementTap,
required this.onEditPressed,
required this.onDeletePressed,
});
@override
Widget build(BuildContext context) {
final bool isTablet = 100.w >= 600;
return Padding(
padding: EdgeInsets.only(bottom: 2.h),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: 10.w,
height: 10.w,
padding: EdgeInsets.symmetric(horizontal: 2.w, vertical: 0.5.h),
decoration: BoxDecoration(
color: Colors.grey[200],
borderRadius: BorderRadius.circular(1.w),
),
child: Center(
child: Text(
"${cartItem.quantity.toStringWithoutTrailingZero()}",
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: isTablet
? AppFontSize.medium.sp
: AppFontSize.small.sp,
),
),
),
),
SizedBox(width: 3.w),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
cartItem.name,
style: TextStyle(
overflow: TextOverflow.ellipsis,
fontWeight: FontWeight.w600,
fontSize: isTablet
? AppFontSize.medium.sp
: AppFontSize.small.sp,
height: 1.2,
),
),
if (cartItem.variantName != null &&
cartItem.variantName!.isNotEmpty) ...[
SizedBox(height: 0.5.h),
Text(
cartItem.variantName!,
style: TextStyle(
overflow: TextOverflow.ellipsis,
color: Colors.grey,
fontSize: isTablet
? AppFontSize.medium.sp
: AppFontSize.small.sp,
height: 1.2,
),
),
],
SizedBox(height: 0.5.h),
Text(
cartItem.stockType == StockType.unlimited
? "Stok : Selalu Ada"
: "Sisa Stok : ${cartItem.remainingStock.toStringWithoutTrailingZero()} ${cartItem.unit}",
style: TextStyle(
fontSize: isTablet
? AppFontSize.medium.sp
: AppFontSize.small.sp,
),
),
Text(
CurrencyFormat.formatToIdr(cartItem.sellingPrice, 0),
style: TextStyle(
color: AppColor.primaryColor,
fontSize: isTablet
? AppFontSize.medium.sp
: AppFontSize.small.sp,
fontWeight: FontWeight.bold,
),
),
],
),
),
Container(
decoration: BoxDecoration(
color: Colors.grey[50],
borderRadius: BorderRadius.circular(2.w),
border: Border.all(color: Colors.grey.shade200),
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
InkWell(
onTap: cartItem.quantity > 1
? () => onDecrementTap(cartItem)
: null,
child: Padding(
padding: EdgeInsets.all(1.5.w),
child: Icon(
Icons.remove,
size: 4.w,
color: AppColor.primaryColor,
),
),
),
Container(
margin: EdgeInsets.only(top: 0.5.h),
width: 10.w,
padding: EdgeInsets.symmetric(horizontal: 2.w),
child: Center(
child: Text(
"${cartItem.quantity.toStringWithoutTrailingZero()}",
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: isTablet
? AppFontSize.medium.sp
: AppFontSize.small.sp,
),
),
),
),
InkWell(
onTap: () => onIncrementTap(cartItem),
child: Padding(
padding: EdgeInsets.all(1.5.w),
child: Icon(
Icons.add,
size: 4.w,
color: AppColor.primaryColor,
),
),
),
],
),
),
SizedBox(width: 1.w),
Container(
margin: EdgeInsets.only(top: 0.5.h),
child: IconButton(
onPressed: () => onEditPressed(cartItem),
icon: Icon(
Icons.edit_note_rounded,
color: Colors.grey,
size: 6.w,
),
padding: EdgeInsets.zero,
constraints: const BoxConstraints(),
style: IconButton.styleFrom(
tapTargetSize: MaterialTapTargetSize.shrinkWrap,
),
),
),
SizedBox(width: 1.w),
Container(
margin: EdgeInsets.only(top: 0.5.h),
child: IconButton(
onPressed: () => onDeletePressed(cartItem),
icon: Icon(Icons.delete_outline, color: Colors.red, size: 6.w),
padding: EdgeInsets.zero,
constraints: const BoxConstraints(),
style: IconButton.styleFrom(
tapTargetSize: MaterialTapTargetSize.shrinkWrap,
),
),
),
],
),
);
}
}