Initial commit: Penyerahan final Source code Tugas Akhir
This commit is contained in:
874
lib/screens/cart/cart_page.dart
Normal file
874
lib/screens/cart/cart_page.dart
Normal file
@ -0,0 +1,874 @@
|
||||
import 'dart:async';
|
||||
import 'package:cherry_toast/cherry_toast.dart';
|
||||
import 'package:cherry_toast/resources/arrays.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:initial_folder/helper/validator.dart';
|
||||
import 'package:initial_folder/models/carts_model.dart';
|
||||
import 'package:initial_folder/providers/carts_provider.dart';
|
||||
import 'package:initial_folder/providers/total_price_provider.dart';
|
||||
import 'package:initial_folder/screens/cart/components/cart_list.dart';
|
||||
import 'package:initial_folder/screens/checkout/checkout_cart_page.dart';
|
||||
import 'package:initial_folder/screens/checkout/components/field_kupon.dart';
|
||||
import 'package:initial_folder/size_config.dart';
|
||||
import 'package:initial_folder/theme.dart';
|
||||
import 'package:initial_folder/widgets/login_regist/default_button.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:initial_folder/widgets/custom_navigator.dart';
|
||||
import 'package:initial_folder/providers/order_provider.dart' as orderProv;
|
||||
import 'package:initial_folder/providers/radeem_voucher_provider.dart'
|
||||
as radeemVoucher;
|
||||
|
||||
class CartPage extends StatefulWidget {
|
||||
const CartPage({
|
||||
Key? key,
|
||||
this.idcourse,
|
||||
this.cartsModel,
|
||||
this.isiVoucher,
|
||||
}) : super(key: key);
|
||||
|
||||
final String? idcourse;
|
||||
final DataCartsModel? cartsModel;
|
||||
final String? isiVoucher;
|
||||
|
||||
@override
|
||||
State<CartPage> createState() => _CartPageState();
|
||||
}
|
||||
|
||||
class _CartPageState extends State<CartPage> {
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
Provider.of<CartsProvider>(context, listen: false).getCarts();
|
||||
});
|
||||
}
|
||||
bool isChecked = true;
|
||||
Set<int> selectedItems = {};
|
||||
bool isMultiSelectionMode = false;
|
||||
bool isToastShowing = false;
|
||||
|
||||
void _onItemLongPressed(int index) {
|
||||
setState(() {
|
||||
isMultiSelectionMode = true;
|
||||
selectedItems.add(index);
|
||||
});
|
||||
}
|
||||
|
||||
void _onItemTapped(int index) {
|
||||
// setState(() {
|
||||
// if (selectedItems.contains(index)) {
|
||||
// selectedItems.remove(index);
|
||||
// if (selectedItems.isEmpty) {
|
||||
// isMultiSelectionMode = false;
|
||||
// }
|
||||
// } else {
|
||||
// selectedItems.add(index);
|
||||
// }
|
||||
// });
|
||||
}
|
||||
|
||||
void _selectAllItems(bool selectAll, int itemCount) {
|
||||
setState(() {
|
||||
if (selectAll) {
|
||||
for (int i = 0; i < itemCount; i++) {
|
||||
selectedItems.add(i);
|
||||
}
|
||||
} else {
|
||||
selectedItems.clear();
|
||||
}
|
||||
isChecked = selectAll;
|
||||
});
|
||||
}
|
||||
|
||||
void _showToast(String message) {
|
||||
isToastShowing = true;
|
||||
CherryToast.error(
|
||||
title: Text(message),
|
||||
animationDuration: Durations.medium1,
|
||||
animationType: AnimationType.fromTop,
|
||||
autoDismiss: true,
|
||||
).show(context);
|
||||
Timer(Duration(seconds: 2), () {
|
||||
isToastShowing = false;
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
List<String> idCarts = [];
|
||||
Provider.of<orderProv.OrderProvider>(context, listen: false).clear();
|
||||
TextEditingController kuponController = TextEditingController();
|
||||
var kuponIsApplied = TextEditingController();
|
||||
final selectedTotalPrice = Provider.of<TotalPriceProvider>(context);
|
||||
|
||||
Widget _validasiKupon() {
|
||||
return Dialog(
|
||||
elevation: 5.0,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(29),
|
||||
child: Text(
|
||||
'Kupon tidak valid atau sudah habis',
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
),
|
||||
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
|
||||
);
|
||||
}
|
||||
|
||||
Widget kupon(List<String> idKursus) {
|
||||
Provider.of<orderProv.OrderProvider>(context).clear();
|
||||
return Consumer<CartsProvider>(
|
||||
builder: (context, state, _) {
|
||||
var resultData = state.result!.data.length;
|
||||
|
||||
for (var i = 0; i <= resultData - 1; i++) {
|
||||
if (state.result?.data[i].coupon != null) {
|
||||
kuponIsApplied = TextEditingController(
|
||||
text: state.result?.data[i].coupon?.codeCoupon ?? '');
|
||||
return Column(
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: Container(
|
||||
padding: EdgeInsets.only(
|
||||
left: getProportionateScreenWidth(4),
|
||||
top: getProportionateScreenHeight(14)),
|
||||
child: FieldKupon(
|
||||
prefix: IconButton(
|
||||
onPressed: () async {
|
||||
await Provider.of<
|
||||
radeemVoucher
|
||||
.RadeemVoucherProvider>(context,
|
||||
listen: false)
|
||||
.deleteCoupon(kuponIsApplied.text);
|
||||
kuponIsApplied.text = '';
|
||||
kuponIsApplied.clear();
|
||||
Provider.of<orderProv.OrderProvider>(context,
|
||||
listen: false)
|
||||
.clear();
|
||||
await Provider.of<CartsProvider>(context,
|
||||
listen: false)
|
||||
.getCarts();
|
||||
},
|
||||
icon: Icon(Icons.close),
|
||||
iconSize: 15,
|
||||
color: secondaryColor,
|
||||
),
|
||||
controler: kuponIsApplied,
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(width: getProportionateScreenWidth(13)),
|
||||
Container(
|
||||
child: ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: primaryColor,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(6),
|
||||
),
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: getProportionateScreenWidth(12),
|
||||
vertical: getProportionateScreenHeight(8),
|
||||
),
|
||||
),
|
||||
onPressed: () async {
|
||||
final voucher = kuponIsApplied.text;
|
||||
if (await Provider.of<
|
||||
radeemVoucher.RadeemVoucherProvider>(
|
||||
context,
|
||||
listen: false)
|
||||
.redeemVoucherCart(
|
||||
idKursus,
|
||||
voucher,
|
||||
)) {
|
||||
kuponIsApplied = TextEditingController(
|
||||
text: state
|
||||
.result?.data.last.coupon?.codeCoupon);
|
||||
|
||||
Navigator.of(context).pushReplacement(
|
||||
MaterialPageRoute(
|
||||
builder: (context) => CartPage(),
|
||||
),
|
||||
);
|
||||
} else {
|
||||
showDialog(
|
||||
barrierColor: Color.fromARGB(70, 24, 24, 24),
|
||||
context: context,
|
||||
builder: (context) {
|
||||
return _validasiKupon();
|
||||
},
|
||||
);
|
||||
}
|
||||
},
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
'Gunakan',
|
||||
textAlign: TextAlign.start,
|
||||
style: thirdTextStyle.copyWith(
|
||||
color: baruTextutih,
|
||||
fontSize: getProportionateScreenWidth(13),
|
||||
fontWeight: reguler,
|
||||
),
|
||||
),
|
||||
SizedBox(width: getProportionateScreenWidth(8)),
|
||||
Image.asset(
|
||||
"assets/icons/cart_gunakan.png",
|
||||
color: baruTextutih,
|
||||
width: getProportionateScreenWidth(16),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
return Column(
|
||||
children: [
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Expanded(
|
||||
child: Container(
|
||||
padding: EdgeInsets.only(
|
||||
left: getProportionateScreenWidth(4),
|
||||
top: getProportionateScreenHeight(14)),
|
||||
child: FieldKupon(
|
||||
controler: kuponController,
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(width: 14),
|
||||
ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: primaryColor,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(6),
|
||||
),
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: getProportionateScreenWidth(12),
|
||||
vertical: getProportionateScreenHeight(8),
|
||||
),
|
||||
),
|
||||
onPressed: () async {
|
||||
final voucher = kuponController.text;
|
||||
|
||||
if (await Provider.of<
|
||||
radeemVoucher.RadeemVoucherProvider>(context,
|
||||
listen: false)
|
||||
.redeemVoucherCart(idKursus, voucher)) {
|
||||
Provider.of<CartsProvider>(context, listen: false)
|
||||
.getCarts();
|
||||
kuponController.clear();
|
||||
} else {
|
||||
showDialog(
|
||||
barrierColor: Color.fromARGB(70, 24, 24, 24),
|
||||
context: context,
|
||||
builder: (context) {
|
||||
return _validasiKupon();
|
||||
},
|
||||
);
|
||||
}
|
||||
},
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
'Gunakan',
|
||||
textAlign: TextAlign.start,
|
||||
style: thirdTextStyle.copyWith(
|
||||
color: baruTextutih,
|
||||
fontSize: getProportionateScreenWidth(13),
|
||||
fontWeight: reguler,
|
||||
),
|
||||
),
|
||||
SizedBox(width: getProportionateScreenWidth(8)),
|
||||
Image.asset(
|
||||
"assets/icons/cart_gunakan.png",
|
||||
width: getProportionateScreenWidth(16),
|
||||
color: baruTextutih,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
)
|
||||
],
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
Widget custombottomCart(
|
||||
String price, String total, List<String> coursesId) {
|
||||
return SingleChildScrollView(
|
||||
child: Container(
|
||||
color: Theme.of(context).brightness == Brightness.dark
|
||||
? seventeenColor.withOpacity(0.9)
|
||||
: baruTextutih.withOpacity(0.3),
|
||||
child: Column(
|
||||
children: [
|
||||
Padding(
|
||||
padding: EdgeInsets.only(
|
||||
left: getProportionateScreenWidth(16),
|
||||
right: getProportionateScreenWidth(16),
|
||||
top: getProportionateScreenHeight(12),
|
||||
),
|
||||
child: Row(
|
||||
children: [
|
||||
Text(
|
||||
'Subtotal Harga Kursus',
|
||||
style: thirdTextStyle.copyWith(
|
||||
fontWeight: reguler,
|
||||
fontSize: SizeConfig.blockHorizontal! * 3,
|
||||
),
|
||||
),
|
||||
Spacer(),
|
||||
SizedBox(width: getProportionateScreenWidth(8)),
|
||||
if (int.parse(price) < 50000)
|
||||
RichText(
|
||||
text: TextSpan(
|
||||
children: [
|
||||
TextSpan(
|
||||
text: numberFormat(total),
|
||||
style: primaryTextStyle.copyWith(
|
||||
letterSpacing: 0.5,
|
||||
decoration: TextDecoration.lineThrough,
|
||||
color: fourthColor,
|
||||
fontWeight: reguler,
|
||||
fontSize: SizeConfig.blockHorizontal! * 2.8,
|
||||
),
|
||||
),
|
||||
WidgetSpan(
|
||||
child: SizedBox(
|
||||
width: getProportionateScreenWidth(8))),
|
||||
TextSpan(
|
||||
text: numberFormat(int.parse(price) < 50000
|
||||
? (int.parse(price) - 5000).toString()
|
||||
: price),
|
||||
style: thirdTextStyle.copyWith(
|
||||
letterSpacing: 0.23,
|
||||
fontWeight: reguler,
|
||||
fontSize: SizeConfig.blockHorizontal! * 2.8,
|
||||
color: Theme.of(context).colorScheme.onPrimary,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
)
|
||||
else
|
||||
RichText(
|
||||
text: TextSpan(
|
||||
children: [
|
||||
TextSpan(
|
||||
text: "",
|
||||
style: primaryTextStyle.copyWith(
|
||||
letterSpacing: 0.5,
|
||||
decoration: TextDecoration.lineThrough,
|
||||
color: fourthColor,
|
||||
fontWeight: reguler,
|
||||
fontSize: SizeConfig.blockHorizontal! * 2.8,
|
||||
),
|
||||
),
|
||||
WidgetSpan(
|
||||
child: SizedBox(
|
||||
width: getProportionateScreenWidth(8))),
|
||||
TextSpan(
|
||||
text: numberFormat(price),
|
||||
style: thirdTextStyle.copyWith(
|
||||
letterSpacing: 0.23,
|
||||
fontWeight: reguler,
|
||||
fontSize: SizeConfig.blockHorizontal! * 2.8,
|
||||
color: Theme.of(context).colorScheme.onPrimary,
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
SizedBox(height: getProportionateScreenHeight(3)),
|
||||
Padding(
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: getProportionateScreenWidth(16)),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
'Biaya Layanan',
|
||||
style: thirdTextStyle.copyWith(
|
||||
fontWeight: reguler,
|
||||
fontSize: SizeConfig.blockHorizontal! * 3,
|
||||
),
|
||||
),
|
||||
Text(
|
||||
numberFormat(int.parse(price) < 50000 ? "5000" : "0"),
|
||||
style: thirdTextStyle.copyWith(
|
||||
fontWeight: reguler,
|
||||
fontSize: SizeConfig.blockHorizontal! * 3,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
SizedBox(height: getProportionateScreenHeight(3)),
|
||||
Padding(
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: getProportionateScreenWidth(16)),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
'Potongan Kupon',
|
||||
style: thirdTextStyle.copyWith(
|
||||
fontWeight: reguler,
|
||||
fontSize: SizeConfig.blockHorizontal! * 3,
|
||||
),
|
||||
),
|
||||
Text(
|
||||
numberFormat("0"),
|
||||
style: thirdTextStyle.copyWith(
|
||||
fontWeight: reguler,
|
||||
fontSize: SizeConfig.blockHorizontal! * 3,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
SizedBox(height: getProportionateScreenHeight(16)),
|
||||
Padding(
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: getProportionateScreenWidth(16)),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
'Total Bayar',
|
||||
style: thirdTextStyle.copyWith(
|
||||
fontWeight: reguler,
|
||||
fontSize: SizeConfig.blockHorizontal! * 3.2,
|
||||
),
|
||||
),
|
||||
Text(
|
||||
numberFormat(price),
|
||||
style: thirdTextStyle.copyWith(
|
||||
fontWeight: bold,
|
||||
fontSize: SizeConfig.blockHorizontal! * 3.2,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
SizedBox(height: getProportionateScreenHeight(12)),
|
||||
Consumer<CartsProvider>(
|
||||
builder: (context, state, _) {
|
||||
int _hasil = 0;
|
||||
var priceDiscount = state.result!.data
|
||||
.map((e) => int.parse(e.discountPrice ?? '0'))
|
||||
.toList();
|
||||
|
||||
var diskonHarga = 0;
|
||||
for (var i = 0; i < state.data.length; i++) {
|
||||
diskonHarga += priceDiscount[i];
|
||||
}
|
||||
var potonganKupon = state.result!.potonganKupon;
|
||||
|
||||
return Container(
|
||||
color: Theme.of(context).colorScheme.primaryContainer,
|
||||
height: getProportionateScreenHeight(52),
|
||||
child: Padding(
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: getProportionateScreenWidth(16)),
|
||||
child: Row(
|
||||
children: [
|
||||
// GestureDetector(
|
||||
// onTap: () {
|
||||
// _selectAllItems(
|
||||
// !isChecked, state.result!.data.length);
|
||||
// },
|
||||
// child: Container(
|
||||
// decoration: BoxDecoration(
|
||||
// color: isChecked
|
||||
// ? (Theme.of(context).brightness ==
|
||||
// Brightness.light
|
||||
// ? baruTexthitam
|
||||
// : baruTextutih)
|
||||
// : Theme.of(context).brightness ==
|
||||
// Brightness.light
|
||||
// ? baruTextutih
|
||||
// : seventeenColor,
|
||||
// shape: BoxShape.rectangle,
|
||||
// border: Border.all(
|
||||
// color: isChecked
|
||||
// ? Theme.of(context).brightness ==
|
||||
// Brightness.light
|
||||
// ? baruTexthitam
|
||||
// : baruTextutih
|
||||
// : (Theme.of(context).brightness ==
|
||||
// Brightness.light
|
||||
// ? baruTexthitam.withOpacity(0.7)
|
||||
// : Colors.grey),
|
||||
// width: getProportionateScreenWidth(3),
|
||||
// ),
|
||||
// borderRadius: BorderRadius.circular(6),
|
||||
// ),
|
||||
// width: getProportionateScreenWidth(18),
|
||||
// height: getProportionateScreenHeight(16),
|
||||
// child: isChecked
|
||||
// ? Icon(
|
||||
// Icons.check,
|
||||
// size: getProportionateScreenWidth(13),
|
||||
// color: Theme.of(context)
|
||||
// .colorScheme
|
||||
// .background,
|
||||
// )
|
||||
// : null,
|
||||
// ),
|
||||
// ),
|
||||
SizedBox(width: getProportionateScreenWidth(5)),
|
||||
// Text(
|
||||
// 'Semua',
|
||||
// style: thirdTextStyle.copyWith(
|
||||
// fontWeight: reguler,
|
||||
// fontSize: SizeConfig.blockHorizontal! * 3,
|
||||
// ),
|
||||
// ),
|
||||
SizedBox(width: getProportionateScreenWidth(13)),
|
||||
Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
'Total',
|
||||
style: thirdTextStyle.copyWith(
|
||||
fontWeight: reguler,
|
||||
fontSize: SizeConfig.blockHorizontal! * 3.4,
|
||||
),
|
||||
),
|
||||
Text(
|
||||
numberFormat(price),
|
||||
style: thirdTextStyle.copyWith(
|
||||
fontWeight: bold,
|
||||
fontSize: SizeConfig.blockHorizontal! * 3.8,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
Spacer(),
|
||||
Container(
|
||||
child: DefaultButton(
|
||||
isCart: true,
|
||||
text: 'Checkout (${selectedItems.length})',
|
||||
press: () {
|
||||
if (!isToastShowing) {
|
||||
if (selectedItems.isEmpty) {
|
||||
_showToast("Anda belum memilih kursus!");
|
||||
} else {
|
||||
selectedTotalPrice.selectedTotalPrice =
|
||||
int.parse(price);
|
||||
setState(() {
|
||||
if (potonganKupon != null) {
|
||||
_hasil = potonganKupon;
|
||||
}
|
||||
});
|
||||
Navigator.of(context).push(
|
||||
CustomNavigator(
|
||||
child: CheckoutCartPage(
|
||||
idCart: idCarts,
|
||||
potonganKupon: _hasil,
|
||||
discountHarga: diskonHarga,
|
||||
isCart: true,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
return Scaffold(
|
||||
resizeToAvoidBottomInset: true,
|
||||
appBar: AppBar(
|
||||
backgroundColor: Theme.of(context).colorScheme.background,
|
||||
centerTitle: true,
|
||||
title: Text(
|
||||
'Keranjang',
|
||||
style: thirdTextStyle.copyWith(
|
||||
letterSpacing: 1,
|
||||
fontWeight: semiBold,
|
||||
fontSize: getProportionateScreenWidth(14),
|
||||
),
|
||||
),
|
||||
),
|
||||
body: Consumer<CartsProvider>(
|
||||
builder: (context, state, _) {
|
||||
if (state.state == ResultState.Loading) {
|
||||
return Center(
|
||||
child: CircularProgressIndicator(
|
||||
color: primaryColor,
|
||||
strokeWidth: 2,
|
||||
),
|
||||
);
|
||||
} else if (state.state == ResultState.HasData) {
|
||||
List<String> coursesId = [];
|
||||
|
||||
var carts = state.result!.data;
|
||||
for (int i = 0; i < carts.length; i++) {
|
||||
idCarts.add(carts[i].cartId!);
|
||||
}
|
||||
for (int i = 0; i < carts.length; i++) {
|
||||
coursesId.add(carts[i].courseId!);
|
||||
}
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
if (state.result != null && selectedItems.isEmpty) {
|
||||
_selectAllItems(true, state.result!.data.length);
|
||||
}
|
||||
});
|
||||
return Stack(
|
||||
children: [
|
||||
SingleChildScrollView(
|
||||
child: Container(
|
||||
margin:
|
||||
EdgeInsets.only(left: getProportionateScreenWidth(16)),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
'${state.result?.data.length} Kursus di Keranjang ',
|
||||
style: thirdTextStyle.copyWith(
|
||||
letterSpacing: 1,
|
||||
fontWeight: semiBold,
|
||||
fontSize: getProportionateScreenWidth(14),
|
||||
),
|
||||
),
|
||||
SizedBox(height: getProportionateScreenHeight(13)),
|
||||
ListView.builder(
|
||||
physics: NeverScrollableScrollPhysics(),
|
||||
shrinkWrap: true,
|
||||
itemCount: state.result!.data.length,
|
||||
itemBuilder: (context, index) {
|
||||
var carts = state.result!.data[index];
|
||||
|
||||
Provider.of<orderProv.OrderProvider>(context)
|
||||
.addOrder(
|
||||
id: carts.courseId,
|
||||
title: carts.title,
|
||||
price: carts.price,
|
||||
imageUrl: carts.thumbnail ??
|
||||
'https://vocasia.id/uploads/thumbnails/course_thumbnails/course_thumbnail_default_63.jpg',
|
||||
discountPrice: carts.finalPrice,
|
||||
instructor: carts.instructor!,
|
||||
);
|
||||
bool isSelected = selectedItems.contains(index);
|
||||
return GestureDetector(
|
||||
onTap: () => _onItemTapped(index),
|
||||
child: CartList(
|
||||
idCourse: carts.courseId ?? '0',
|
||||
id: carts.cartId ?? '',
|
||||
image: carts.thumbnail ??
|
||||
'https://vocasia.id/uploads/thumbnails/course_thumbnails/course_thumbnail_default_63.jpg',
|
||||
title: carts.title ?? '',
|
||||
instruktur: carts.instructor ?? '',
|
||||
price: carts.price ?? '',
|
||||
discountPrice: carts.finalPrice ?? '',
|
||||
isSelected: isSelected,
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
SizedBox(height: 90),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
} else if (state.state == ResultState.NoData) {
|
||||
return SingleChildScrollView(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
SizedBox(height: 48),
|
||||
Container(
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: getProportionateScreenWidth(16)),
|
||||
child: Center(
|
||||
child: Column(
|
||||
children: [
|
||||
Container(
|
||||
width: getProportionateScreenWidth(100),
|
||||
height: getProportionateScreenHeight(100),
|
||||
child: ColorFiltered(
|
||||
colorFilter: ColorFilter.mode(
|
||||
Theme.of(context).colorScheme.onPrimary,
|
||||
BlendMode.srcATop,
|
||||
),
|
||||
child: Image.asset('assets/images/search.png'),
|
||||
),
|
||||
),
|
||||
SizedBox(height: 16),
|
||||
Text(
|
||||
"Keranjang Kosong",
|
||||
style: thirdTextStyle.copyWith(
|
||||
letterSpacing: 1,
|
||||
fontWeight: semiBold,
|
||||
fontSize: getProportionateScreenWidth(14),
|
||||
color: Theme.of(context).colorScheme.onPrimary,
|
||||
),
|
||||
),
|
||||
SizedBox(height: 4),
|
||||
Text(
|
||||
"Keranjang kamu kosong, tetap berbelanja dan cari kursus",
|
||||
textAlign: TextAlign.center,
|
||||
style: thirdTextStyle.copyWith(
|
||||
letterSpacing: 0.5,
|
||||
fontWeight: reguler,
|
||||
fontSize: getProportionateScreenWidth(12),
|
||||
color: Theme.of(context).colorScheme.onPrimary,
|
||||
),
|
||||
),
|
||||
SizedBox(height: 16),
|
||||
Container(
|
||||
margin: EdgeInsets.symmetric(
|
||||
horizontal: getProportionateScreenWidth(78),
|
||||
vertical: getProportionateScreenHeight(10)),
|
||||
child: DefaultButton(
|
||||
weight: reguler,
|
||||
text: 'Belanja Kursus',
|
||||
press: () {
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
} else if (state.state == ResultState.Error) {
|
||||
return AlertDialog(
|
||||
title: const Text('Koneksi Internet'),
|
||||
content: const Text('Terjadi Kesalahan'),
|
||||
actions: <Widget>[
|
||||
TextButton(
|
||||
onPressed: () => Navigator.pop(context, 'Cancel'),
|
||||
child: const Text('Cancel'),
|
||||
),
|
||||
],
|
||||
);
|
||||
} else {
|
||||
return Center(child: Text(''));
|
||||
}
|
||||
},
|
||||
),
|
||||
bottomNavigationBar: Consumer<CartsProvider>(
|
||||
builder: (context, state, _) {
|
||||
if (state.state == ResultState.Loading) {
|
||||
return Container(
|
||||
width: double.infinity,
|
||||
height: getProportionateScreenHeight(121),
|
||||
child: Center(
|
||||
child: CircularProgressIndicator(
|
||||
color: primaryColor,
|
||||
strokeWidth: 2,
|
||||
),
|
||||
),
|
||||
);
|
||||
} else if (state.state == ResultState.HasData) {
|
||||
var total = state.result!.data.map((e) {
|
||||
if (e.price != null && e.discountPrice != null) {
|
||||
return int.parse(e.discountPrice!) == 0
|
||||
? 0
|
||||
: int.parse(e.price!);
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}).toList();
|
||||
var result = 0;
|
||||
for (var i = 0; i < total.length; i++) {
|
||||
result += total[i];
|
||||
}
|
||||
Provider.of<orderProv.OrderProvider>(context)
|
||||
.getTotalPrice((state.result?.totalPayment.toString() ?? '0'));
|
||||
var carts = state.result!.data;
|
||||
List<String> coursesId = [];
|
||||
|
||||
for (int i = 0; i < carts.length; i++) {
|
||||
coursesId.add(carts[i].courseId!);
|
||||
}
|
||||
|
||||
selectedTotalPrice.selectedSubTotal = result.toString();
|
||||
|
||||
return custombottomCart(
|
||||
state.result?.totalPayment.toString() ?? '0',
|
||||
result.toString(),
|
||||
coursesId,
|
||||
);
|
||||
} else if (state.state == ResultState.NoData) {
|
||||
return Text(
|
||||
"",
|
||||
style: secondaryTextStyle.copyWith(
|
||||
letterSpacing: 1,
|
||||
fontWeight: semiBold,
|
||||
fontSize: getProportionateScreenWidth(14),
|
||||
color: tenthColor,
|
||||
),
|
||||
);
|
||||
} else if (state.state == ResultState.Error) {
|
||||
return Text('');
|
||||
} else {
|
||||
return Center(child: Text(''));
|
||||
}
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Align(
|
||||
// alignment: Alignment.bottomCenter,
|
||||
// child: SingleChildScrollView(
|
||||
// child: Container(
|
||||
// padding: EdgeInsets.symmetric(
|
||||
// horizontal: getProportionateScreenWidth(16)),
|
||||
// child: Column(
|
||||
// crossAxisAlignment: CrossAxisAlignment.start,
|
||||
// children: [
|
||||
// Text(
|
||||
// "Promotions",
|
||||
// style: thirdTextStyle.copyWith(
|
||||
// fontWeight: semiBold,
|
||||
// letterSpacing: 1,
|
||||
// fontSize: SizeConfig.blockHorizontal! * 3.4,
|
||||
// ),
|
||||
// ),
|
||||
// kupon(coursesId),
|
||||
// ],
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
325
lib/screens/cart/components/cart_list.dart
Normal file
325
lib/screens/cart/components/cart_list.dart
Normal file
@ -0,0 +1,325 @@
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:initial_folder/helper/validator.dart';
|
||||
import 'package:initial_folder/providers/cart_provider.dart';
|
||||
import 'package:initial_folder/providers/order_provider.dart';
|
||||
import 'package:initial_folder/providers/page_provider.dart';
|
||||
import 'package:initial_folder/providers/whislist_provider.dart';
|
||||
import 'package:initial_folder/providers/wishlist_post_provider.dart';
|
||||
import 'package:initial_folder/screens/home/home_screen.dart';
|
||||
import 'package:initial_folder/size_config.dart';
|
||||
import 'package:initial_folder/theme.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:initial_folder/providers/carts_provider.dart' as cartsProv;
|
||||
|
||||
class CartList extends StatefulWidget {
|
||||
const CartList({
|
||||
Key? key,
|
||||
required this.image,
|
||||
required this.title,
|
||||
required this.instruktur,
|
||||
required this.price,
|
||||
required this.id,
|
||||
required this.idCourse,
|
||||
this.discountPrice,
|
||||
this.isSelected = false,
|
||||
}) : super(key: key);
|
||||
|
||||
final String image, instruktur, title, price, id, idCourse;
|
||||
final String? discountPrice;
|
||||
final bool isSelected;
|
||||
|
||||
@override
|
||||
State<CartList> createState() => _CartListState();
|
||||
}
|
||||
|
||||
class _CartListState extends State<CartList> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final pageProvider = Provider.of<PageProvider>(context);
|
||||
|
||||
Future<void> getCartsLength() async {}
|
||||
|
||||
return SingleChildScrollView(
|
||||
scrollDirection: Axis.horizontal,
|
||||
child: Padding(
|
||||
padding: EdgeInsets.only(bottom: getProportionateScreenHeight(20)),
|
||||
child: Container(
|
||||
width: getProportionateScreenWidth(330 + 108),
|
||||
child: Stack(
|
||||
children: [
|
||||
Container(
|
||||
height: getProportionateScreenHeight(98),
|
||||
width: getProportionateScreenWidth(330),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
color: Theme.of(context).brightness == Brightness.dark
|
||||
? seventeenColor
|
||||
: sixteenColor,
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.only(
|
||||
top: getProportionateScreenHeight(9),
|
||||
right: getProportionateScreenWidth(15),
|
||||
),
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Flexible(
|
||||
flex: 11,
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Container(
|
||||
width: getProportionateScreenWidth(156),
|
||||
height: getProportionateScreenWidth(88),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(2),
|
||||
image: DecorationImage(
|
||||
fit: BoxFit.cover,
|
||||
image: NetworkImage(widget.image),
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(height: getProportionateScreenHeight(8)),
|
||||
],
|
||||
),
|
||||
),
|
||||
SizedBox(width: getProportionateScreenWidth(10)),
|
||||
Flexible(
|
||||
flex: 7,
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
widget.title,
|
||||
style: thirdTextStyle.copyWith(
|
||||
fontWeight: semiBold,
|
||||
fontSize: getProportionateScreenWidth(14),
|
||||
),
|
||||
maxLines: 2,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
SizedBox(height: getProportionateScreenHeight(2)),
|
||||
Text(
|
||||
'oleh ${widget.instruktur}',
|
||||
style: primaryTextStyle.copyWith(
|
||||
fontSize: getProportionateScreenWidth(12),
|
||||
fontWeight: light,
|
||||
),
|
||||
),
|
||||
Visibility(
|
||||
visible: widget.discountPrice != "0",
|
||||
child: Text(
|
||||
numberFormat(widget.discountPrice),
|
||||
style: thirdTextStyle.copyWith(
|
||||
fontSize: getProportionateScreenWidth(10),
|
||||
fontWeight: light,
|
||||
),
|
||||
),
|
||||
),
|
||||
Visibility(
|
||||
visible: widget.discountPrice == widget.price,
|
||||
child: SizedBox(
|
||||
height: getProportionateScreenHeight(2)),
|
||||
),
|
||||
Visibility(
|
||||
visible: widget.discountPrice != widget.price,
|
||||
child: Text(
|
||||
numberFormat(widget.price),
|
||||
style: thirdTextStyle.copyWith(
|
||||
decoration: TextDecoration.lineThrough,
|
||||
color: secondaryColor,
|
||||
fontSize: getProportionateScreenWidth(10),
|
||||
fontWeight: light,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
// widget.isSelected
|
||||
// ? Padding(
|
||||
// padding: EdgeInsets.only(
|
||||
// top: getProportionateScreenHeight(13),
|
||||
// left: getProportionateScreenWidth(6),
|
||||
// ),
|
||||
// child:
|
||||
// SvgPicture.asset("assets/icons/cart_checklist.svg"),
|
||||
// )
|
||||
// : Padding(
|
||||
// padding: EdgeInsets.only(
|
||||
// top: getProportionateScreenHeight(13),
|
||||
// left: getProportionateScreenWidth(6),
|
||||
// ),
|
||||
// child:
|
||||
// SvgPicture.asset("assets/icons/cart_unchecklist.svg"),
|
||||
// ),
|
||||
widget.isSelected
|
||||
? Container(
|
||||
height: getProportionateScreenHeight(98),
|
||||
width: getProportionateScreenWidth(330),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
color: Theme.of(context).brightness == Brightness.light
|
||||
? baruTexthitam.withOpacity(0.1)
|
||||
: baruTexthitam.withOpacity(0.3),
|
||||
),
|
||||
)
|
||||
: Container(),
|
||||
Consumer<cartsProv.CartsProvider>(
|
||||
builder: (context, state, _) {
|
||||
if (state.state == cartsProv.ResultState.Loading) {
|
||||
return CircularProgressIndicator(
|
||||
color: primaryColor,
|
||||
strokeWidth: 2,
|
||||
);
|
||||
} else {
|
||||
return Row(
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
children: [
|
||||
GestureDetector(
|
||||
onTap: () async {
|
||||
await Provider.of<WishlistPostProvider>(context,
|
||||
listen: false)
|
||||
.addWishlist(int.parse(widget.idCourse));
|
||||
await Provider.of<WishlistProvider>(context,
|
||||
listen: false)
|
||||
.getWishlist();
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) => AlertDialog(
|
||||
backgroundColor:
|
||||
Theme.of(context).colorScheme.background,
|
||||
elevation: 0.0,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
),
|
||||
contentPadding:
|
||||
EdgeInsets.fromLTRB(12, 26, 22, 15),
|
||||
content: Padding(
|
||||
padding: EdgeInsets.only(
|
||||
bottom: getProportionateScreenHeight(14)),
|
||||
child: Text(
|
||||
textAlign: TextAlign.left,
|
||||
'Berhasil memindahkan kursus ke wishlist',
|
||||
style: thirdTextStyle.copyWith(
|
||||
fontSize: getProportionateScreenWidth(12),
|
||||
),
|
||||
),
|
||||
),
|
||||
actions: [
|
||||
SizedBox(
|
||||
width: getProportionateScreenWidth(10)),
|
||||
GestureDetector(
|
||||
onTap: () {
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
child: Text(
|
||||
'Kembali',
|
||||
style: thirdTextStyle.copyWith(
|
||||
fontSize:
|
||||
getProportionateScreenWidth(12),
|
||||
color: primaryColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
width: getProportionateScreenWidth(3)),
|
||||
GestureDetector(
|
||||
onTap: () {
|
||||
pageProvider.currentIndex = 3;
|
||||
Navigator.pushAndRemoveUntil(
|
||||
context,
|
||||
MaterialPageRoute(
|
||||
builder: (context) => HomeScreen(),
|
||||
),
|
||||
(route) => false);
|
||||
},
|
||||
child: Text(
|
||||
'Lihat Wishlist',
|
||||
style: thirdTextStyle.copyWith(
|
||||
fontSize:
|
||||
getProportionateScreenWidth(12),
|
||||
color: primaryColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
child: SvgPicture.asset(
|
||||
"assets/icons/cart_wishlist.svg",
|
||||
height: getProportionateScreenHeight(96),
|
||||
width: getProportionateScreenWidth(45),
|
||||
),
|
||||
),
|
||||
GestureDetector(
|
||||
onTap: () async {
|
||||
await Provider.of<CartProvider>(context,
|
||||
listen: false)
|
||||
.deleteCart(widget.id);
|
||||
Provider.of<OrderProvider>(context, listen: false)
|
||||
.removeOrder(
|
||||
id: widget.idCourse,
|
||||
title: widget.title,
|
||||
price: widget.price,
|
||||
imageUrl: widget.image,
|
||||
discountPrice: widget.discountPrice,
|
||||
instructor: widget.instruktur,
|
||||
);
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) => AlertDialog(
|
||||
backgroundColor:
|
||||
Theme.of(context).colorScheme.background,
|
||||
elevation: 0.0,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
),
|
||||
contentPadding:
|
||||
EdgeInsets.fromLTRB(12, 26, 22, 15),
|
||||
content: Padding(
|
||||
padding: EdgeInsets.only(
|
||||
bottom: getProportionateScreenHeight(14)),
|
||||
child: Text(
|
||||
textAlign: TextAlign.center,
|
||||
'Berhasil menghapus kursus',
|
||||
style: thirdTextStyle.copyWith(
|
||||
fontSize: getProportionateScreenWidth(12),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
await Provider.of<cartsProv.CartsProvider>(context,
|
||||
listen: false)
|
||||
.getCarts();
|
||||
},
|
||||
child: SvgPicture.asset(
|
||||
"assets/icons/cart_remove.svg",
|
||||
height: getProportionateScreenHeight(96),
|
||||
width: getProportionateScreenWidth(45),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user