update total price

This commit is contained in:
efrilm
2025-10-25 03:03:44 +07:00
parent 013f313e35
commit 0e83d213fc
9 changed files with 401 additions and 60 deletions
@@ -0,0 +1,156 @@
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 '../image/image.dart';
import '../spaces/space.dart';
class OrderMenu extends StatefulWidget {
final ProductQuantity data;
const OrderMenu({super.key, required this.data});
@override
State<OrderMenu> createState() => _OrderMenuState();
}
class _OrderMenuState extends State<OrderMenu> {
final _controller = TextEditingController();
@override
void initState() {
super.initState();
_controller.text = widget.data.notes;
_controller.addListener(() {
context.read<CheckoutFormBloc>().add(
CheckoutFormEvent.updateItemNotes(
widget.data.product,
_controller.text,
),
);
});
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Column(
children: [
Row(
children: [
Flexible(
child: ListTile(
contentPadding: EdgeInsets.zero,
leading: ClipRRect(
borderRadius: BorderRadius.all(Radius.circular(8.0)),
child: AppNetworkImage(
url: widget.data.product.imageUrl,
width: 50.0,
height: 50.0,
fit: BoxFit.cover,
),
),
title: Row(
children: [
Expanded(
child: Text(
widget.data.product.name,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: const TextStyle(
fontSize: 14,
fontWeight: FontWeight.bold,
),
),
),
],
),
subtitle: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
(widget.data.product.price +
(widget.data.variant?.priceModifier ?? 0))
.currencyFormatRp,
),
if (widget.data.variant != null)
Text(widget.data.variant?.name ?? ""),
],
),
),
),
Row(
children: [
GestureDetector(
onTap: () {
context.read<CheckoutFormBloc>().add(
CheckoutFormEvent.removeItem(
widget.data.product,
widget.data.variant,
),
);
},
child: Container(
width: 30,
height: 30,
color: AppColor.white,
child: const Icon(
Icons.remove_circle,
color: AppColor.primary,
),
),
),
SizedBox(
width: 30.0,
child: Center(child: Text(widget.data.quantity.toString())),
),
GestureDetector(
onTap: () {
context.read<CheckoutFormBloc>().add(
CheckoutFormEvent.addItem(
widget.data.product,
widget.data.variant,
),
);
},
child: Container(
width: 30,
height: 30,
color: AppColor.white,
child: const Icon(
Icons.add_circle,
color: AppColor.primary,
),
),
),
],
),
const SpaceWidth(8),
SizedBox(
width: 80.0,
child: Text(
((widget.data.product.price +
(widget.data.variant?.priceModifier ?? 0)) *
widget.data.quantity)
.currencyFormatRp,
textAlign: TextAlign.right,
style: const TextStyle(
color: AppColor.primary,
fontWeight: FontWeight.bold,
),
),
),
],
),
],
);
}
}
@@ -1,5 +1,7 @@
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';
@@ -17,9 +19,9 @@ class ProductCard extends StatelessWidget {
onTap: () {
if (product.isActive == true) {
if (product.variants.isEmpty) {
// context.read<CheckoutBloc>().add(
// CheckoutEvent.addItem(data, null),
// );
context.read<CheckoutFormBloc>().add(
CheckoutFormEvent.addItem(product, null),
);
} else {
showDialog(
context: context,
@@ -85,28 +87,40 @@ class ProductCard extends StatelessWidget {
),
),
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(
0.toString(),
style: const TextStyle(
color: Colors.white,
fontSize: 20,
fontWeight: FontWeight.bold,
BlocBuilder<CheckoutFormBloc, CheckoutFormState>(
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(