Files
Vocasia-LMS-Mobile-apps--TA…/lib/screens/detail_course/detail_course_voucher_screen.dart

1593 lines
65 KiB
Dart

import 'package:cherry_toast/cherry_toast.dart';
import 'package:cherry_toast/resources/arrays.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:initial_folder/base_service.dart';
import 'package:initial_folder/helper/user_info.dart';
import 'package:initial_folder/helper/validator.dart';
import 'package:initial_folder/models/detail_course_model.dart';
import 'package:initial_folder/providers/detail_course_provider.dart';
import 'package:initial_folder/providers/tab_provider.dart';
import 'package:initial_folder/providers/total_price_provider.dart';
import 'package:initial_folder/screens/cart/cart_page.dart';
import 'package:initial_folder/screens/checkout/checkout_cart_coupon_page.dart';
import 'package:initial_folder/screens/checkout/detail_zero_payment.dart';
import 'package:initial_folder/screens/course/play_course_page.dart';
import 'package:initial_folder/screens/detail_course/components/app_bar.dart';
import 'package:initial_folder/screens/login/login_with_email/login_email_screen.dart';
import 'package:initial_folder/screens/my_course/success_free_course.dart';
import 'package:initial_folder/screens/splash/splash_screen_login.dart';
import 'package:initial_folder/screens/detail_course/components/custom_tab_bar.dart';
import 'package:initial_folder/screens/detail_course/components/header.dart';
import 'package:initial_folder/services/course_service.dart';
import 'package:initial_folder/services/instructor_service.dart';
import 'package:initial_folder/services/lesson_course_service.dart';
import 'package:initial_folder/services/section_lesson_service.dart';
import 'package:initial_folder/size_config.dart';
import 'package:initial_folder/theme.dart';
import 'package:initial_folder/widgets/custom_navigator.dart';
import 'package:provider/provider.dart';
import 'package:tap_debouncer/tap_debouncer.dart';
import '../../services/user_info_service.dart';
import 'package:initial_folder/providers/cart_provider.dart' as cartProvider;
import 'package:initial_folder/providers/carts_provider.dart' as cartsProvider;
import 'package:initial_folder/providers/order_provider.dart' as orderProvider;
import 'package:initial_folder/providers/detail_rating_course_provider.dart'
as detailRatingCourseProvider;
import 'package:initial_folder/providers/instructor_provider.dart'
as instructorProvider;
import 'package:initial_folder/providers/lesson_course_provider.dart'
as lessonCourseProvider;
import 'package:initial_folder/providers/my_course_provider.dart'
as myCourseProvider;
import 'package:initial_folder/providers/payments_provider.dart'
as paymentsProvider;
import 'package:initial_folder/providers/section_lesson_course_provider.dart'
as sectionLessonCourseProvider;
class DetailVoucherScreen extends StatefulWidget {
const DetailVoucherScreen({
Key? key,
required this.idcourse,
this.coupon,
this.resoaktifitas,
}) : super(key: key);
final String idcourse;
final String? coupon;
final String? resoaktifitas;
static String routeName = "/course_detail";
@override
_DetailVoucherScreenState createState() => _DetailVoucherScreenState();
}
class _DetailVoucherScreenState extends State<DetailVoucherScreen> {
late String cekstrAdmin = '';
late DataDetailCourseModel dataDetailCourseModel;
late int? iDuser;
bool _isAdminChecked = false;
ScrollController _scrollController = ScrollController();
Color appBarColor = Colors.transparent;
@override
void initState() {
super.initState();
_scrollController.addListener(() {
if (_scrollController.position.pixels > 50) {
setState(() {
appBarColor = Theme.of(context).colorScheme.background;
});
} else {
setState(() {
appBarColor = Colors.transparent;
});
}
});
cekadminbaru();
getIDuser();
}
void getIDuser() {
UsersInfo().getIdUser().then((value) => {
setState(() {
iDuser = value;
}),
});
}
void cekadminbaru() {
if (!_isAdminChecked) {
UserInfoService().getDataDiriADMIN().then((value) => {
if (value == 401)
{
setState(() {
cekstrAdmin = 'admin';
}),
}
else
{
setState(() {
cekstrAdmin = 'user';
}),
},
_isAdminChecked = true,
});
}
}
@override
Widget build(BuildContext context) {
final selectedTotalPrice = Provider.of<TotalPriceProvider>(context);
final typeCoupon = Provider.of<TotalPriceProvider>(context).typeCoupon;
List<String> idCarts = [];
SizeConfig().init(context);
paymentsProvider.PaymentsProvider pay =
Provider.of<paymentsProvider.PaymentsProvider>(context);
final finalPriceCoupon =
Provider.of<TotalPriceProvider>(context).finalPriceCoupon;
final potonganKupon = Provider.of<TotalPriceProvider>(context)
.potonganKupon
?.round()
.toString() ??
'0';
showNotifDialog(BuildContext context) {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
content: Consumer<paymentsProvider.PaymentsProvider>(
builder: (context, state, child) {
if (state.state == paymentsProvider.ResultState.gagal) {
return Container(
height: getProportionateScreenHeight(40),
width: getProportionateScreenWidth(15),
child: Center(
child: Text(
'Anda sudah memiliki kursus ini',
style: primaryTextStyle.copyWith(fontSize: 12),
textAlign: TextAlign.center,
),
),
);
} else {
Future.delayed(Duration.zero, () {
Navigator.pop(context);
CherryToast.error(
animationDuration: Durations.long1,
title: Text("Terjadi Kesalahan, silahkan coba lagi",
style: TextStyle(
color: Colors.black,
fontSize: 15,
)),
animationType: AnimationType.fromTop,
).show(context);
});
return Container();
}
},
),
);
},
);
}
Future _showDialogNotLogin(String teks) {
return showDialog(
context: context,
builder: (context) => AlertDialog(
contentPadding: EdgeInsets.fromLTRB(12, 20, 12, 1),
content: Text(
'Mohon login terlebih dahulu sebelum $teks',
style: primaryTextStyle.copyWith(
fontSize: getProportionateScreenWidth(12), letterSpacing: 1),
),
actions: [
GestureDetector(
onTap: () {
Navigator.of(context).pop();
},
child: Text(
'Batal',
style: primaryTextStyle.copyWith(
fontSize: getProportionateScreenWidth(12),
letterSpacing: 1,
color: primaryColor),
),
),
SizedBox(width: getProportionateScreenWidth(5)),
GestureDetector(
onTap: () {
Navigator.of(context).pushNamedAndRemoveUntil(
LoginEmail.routeName, (Route<dynamic> route) => false);
},
child: Text(
'Login',
style: primaryTextStyle.copyWith(
fontSize: getProportionateScreenWidth(12),
letterSpacing: 1,
color: primaryColor),
),
),
],
),
);
}
Future<void> _showMessage() {
return showModalBottomSheet<void>(
context: context,
builder: (BuildContext context) {
return Consumer<cartProvider.CartProvider>(
builder: (context, state, _) {
if (state.state == cartProvider.ResultState.loading) {
return Center(
child: CircularProgressIndicator(
strokeWidth: 1,
color: primaryColor,
),
);
} else if (state.state == cartProvider.ResultState.succes) {
return Container(
decoration: BoxDecoration(
boxShadow: [
BoxShadow(
blurRadius: 10,
offset: Offset(0, -1),
)
],
borderRadius: BorderRadius.vertical(
top: Radius.circular(10),
),
color: Color(0xff242424),
),
height: getProportionateScreenHeight(200),
child: Column(
children: [
Row(
children: [
IconButton(
onPressed: () {
Navigator.of(context).pop();
},
icon: Icon(
Icons.close,
color: secondaryColor,
size: 15,
)),
],
),
Icon(
Icons.check_rounded,
size: 40,
color: eightColor,
),
SizedBox(height: getProportionateScreenWidth(15)),
Text(
'Berhasil menambahkan kursus ke keranjang',
textAlign: TextAlign.center,
style: primaryTextStyle.copyWith(
fontSize: SizeConfig.blockHorizontal! * 4,
letterSpacing: 0.5),
),
SizedBox(height: getProportionateScreenWidth(4)),
TextButton(
style: ButtonStyle(
overlayColor: MaterialStateProperty.all(sixColor),
padding: MaterialStateProperty.all(
EdgeInsets.symmetric(vertical: 1, horizontal: 1),
),
),
onPressed: () {
Navigator.of(context).pushReplacement(
CustomNavigator(
child: CartPage(
idcourse: widget.idcourse,
),
),
);
},
child: Text(
'Lihat keranjang',
style: thirdTextStyle.copyWith(
fontSize: getProportionateScreenWidth(13),
letterSpacing: 0.5,
color: primaryColor),
),
),
],
),
);
} else if (state.state == cartProvider.ResultState.failed) {
return Container(
decoration: BoxDecoration(
boxShadow: [
BoxShadow(
blurRadius: 10,
offset: Offset(0, -1),
)
],
borderRadius: BorderRadius.vertical(
top: Radius.circular(10),
),
color: Color(0xff242424),
),
height: getProportionateScreenHeight(200),
child: Column(
children: [
Row(
children: [
IconButton(
onPressed: () {
Navigator.of(context).pop();
},
icon: Icon(
Icons.close,
color: secondaryColor,
size: 15,
),
),
],
),
Icon(
Icons.close,
size: 40,
color: Colors.red,
),
SizedBox(
height: getProportionateScreenWidth(15),
),
Text(
'Berhasil menghapus kursus dari keranjang',
textAlign: TextAlign.center,
style: primaryTextStyle.copyWith(
fontSize: SizeConfig.blockHorizontal! * 4,
letterSpacing: 0.5),
),
SizedBox(
height: getProportionateScreenWidth(4),
),
TextButton(
style: ButtonStyle(
overlayColor: MaterialStateProperty.all(sixColor),
padding: MaterialStateProperty.all(
EdgeInsets.symmetric(vertical: 1, horizontal: 1),
),
),
onPressed: () {
Navigator.of(context).pushReplacement(
CustomNavigator(
child: CartPage(
idcourse: widget.idcourse,
),
),
);
},
child: Text(
'Lihat keranjang',
style: thirdTextStyle.copyWith(
fontSize: getProportionateScreenWidth(13),
letterSpacing: 0.5,
color: primaryColor),
),
),
],
),
);
} else {
return Container(
decoration: BoxDecoration(
boxShadow: [
BoxShadow(
blurRadius: 10,
offset: Offset(0, -1),
)
],
borderRadius: BorderRadius.vertical(
top: Radius.circular(10),
),
color: Color(0xff242424),
),
height: getProportionateScreenHeight(200),
child: Center(
child: Text('Terjadi Kesalahan'),
));
}
});
},
);
}
Future<void> _showMessageCart() {
return showDialog<void>(
context: context,
barrierDismissible: true,
builder: (BuildContext context) {
return Consumer<cartProvider.CartProvider>(
builder: (context, state, _) {
if (state.state == cartProvider.ResultState.loading) {
return Center(
child: CircularProgressIndicator(
strokeWidth: 1,
color: primaryColor,
),
);
} else if (state.state == cartProvider.ResultState.succes) {
return Align(
alignment: Alignment.center,
child: Material(
type: MaterialType.transparency,
child: Padding(
padding: EdgeInsets.symmetric(
horizontal: getProportionateScreenWidth(20)),
child: Container(
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.background,
borderRadius: BorderRadius.circular(5),
boxShadow: [
BoxShadow(
blurRadius: 10,
offset: Offset(0, 2),
color: Colors.black26,
)
],
),
child: Consumer<cartProvider.CartProvider>(
builder: (context, state, _) {
return Column(
mainAxisSize: MainAxisSize.min,
children: [
SizedBox(
height: getProportionateScreenHeight(20)),
Padding(
padding: EdgeInsets.only(
left: getProportionateScreenWidth(13)),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Text(
'Kursus ini sudah berada dalam keranjang',
textAlign: TextAlign.left,
style: thirdTextStyle.copyWith(
fontSize:
getProportionateScreenWidth(12),
fontWeight: reguler,
),
),
],
),
),
SizedBox(
height: getProportionateScreenHeight(20)),
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
TextButton(
style: ButtonStyle(
overlayColor:
MaterialStateProperty.all(sixColor),
padding: MaterialStateProperty.all(
EdgeInsets.symmetric(
vertical: 1, horizontal: 1),
),
),
onPressed: () {
Navigator.of(context).pop();
},
child: Text(
'Batal',
style: thirdTextStyle.copyWith(
fontSize:
getProportionateScreenWidth(12),
color: primaryColor,
fontWeight: reguler,
),
),
),
TextButton(
style: ButtonStyle(
overlayColor:
MaterialStateProperty.all(sixColor),
padding: MaterialStateProperty.all(
EdgeInsets.symmetric(
vertical: 1, horizontal: 1),
),
),
onPressed: () {
Navigator.of(context).pushReplacement(
CustomNavigator(
child: CartPage(
idcourse: widget.idcourse,
),
),
);
},
child: Text(
'Lihat keranjang',
style: thirdTextStyle.copyWith(
fontSize:
getProportionateScreenWidth(12),
color: primaryColor,
fontWeight: reguler,
),
),
),
SizedBox(
width: getProportionateScreenWidth(10)),
],
),
SizedBox(height: getProportionateScreenHeight(5)),
],
);
},
),
),
),
),
);
} else if (state.state == cartProvider.ResultState.failed) {
return SizedBox.shrink();
} else {
return Container(
decoration: BoxDecoration(
boxShadow: [
BoxShadow(
blurRadius: 10,
offset: Offset(0, -1),
)
],
borderRadius: BorderRadius.vertical(
top: Radius.circular(10),
),
color: Color(0xff242424),
),
height: getProportionateScreenHeight(200),
child: Center(
child: Text('Terjadi Kesalahan'),
));
}
});
},
);
}
handleNotLogin() async {
var token = await UsersInfo().getToken();
if (token != null || Condition.loginFirebase == true) {
_showMessage();
await Provider.of<cartProvider.CartProvider>(context, listen: false)
.addCart(int.parse(widget.idcourse));
await Provider.of<cartsProvider.CartsProvider>(context, listen: false)
.getCarts();
} else {
String teks = 'menambahkan ke keranjang';
return _showDialogNotLogin(teks);
}
}
handleNotLoginWishlistNotExist() async {
var token = await UsersInfo().getToken();
if (token != null || Condition.loginFirebase == true) {
_showMessage();
await Provider.of<cartProvider.CartProvider>(context, listen: false)
.addCart(int.parse(widget.idcourse));
await Provider.of<cartsProvider.CartsProvider>(context, listen: false)
.getCarts();
} else {
String teks = 'menambahkan ke keranjang';
return _showDialogNotLogin(teks);
}
}
handleNotLoginBuy(
{required String title,
required String price,
required String discountPrice,
required String instructor,
required String imageUrl}) async {
var token = await UsersInfo().getToken();
if (token != null || Condition.loginFirebase == true) {
Provider.of<orderProvider.OrderProvider>(context, listen: false)
.clear();
Provider.of<orderProvider.OrderProvider>(context, listen: false)
.addOrder(
id: widget.idcourse,
title: title,
price: finalPriceCoupon != 0
? finalPriceCoupon! < 50000
? (finalPriceCoupon + 5000).toString()
: finalPriceCoupon.toString()
: finalPriceCoupon.toString(),
discountPrice: finalPriceCoupon.toString(),
imageUrl: imageUrl,
instructor: instructor,
);
int total;
if (discountPrice == "0") {
total = int.parse(price) < 50000
? int.parse(price) + 5000
: int.parse(price);
} else {
total = int.parse(discountPrice) < 50000
? int.parse(discountPrice) + 5000
: int.parse(discountPrice);
}
Provider.of<orderProvider.OrderProvider>(context, listen: false)
.getTotalPrice(total.toString());
Navigator.of(context, rootNavigator: true).push(
CustomNavigator(
child: CheckoutCartCouponPage(
idCart: idCarts,
potonganKupon: int.parse(potonganKupon.toString()),
discountHarga: discountPrice == "0"
? int.parse(price)
: int.parse(discountPrice),
),
),
);
} else {
String teks = 'membeli kursus';
return _showDialogNotLogin(teks);
}
}
handleNotLoginFree(
String? id,
String? title,
String? thumb,
String? instr,
) async {
var token = await UsersInfo().getToken();
if (token != null || Condition.loginFirebase == true) {
if (await pay.freeCourseCoupon(
int.parse(widget.idcourse), widget.coupon!)) {
await Provider.of<myCourseProvider.MyCourseProvider>(context,
listen: false)
.getMyCourse();
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => SuccessFreeCourse(
id: id,
thumbnail: thumb,
title: title,
instructor: instr,
),
),
);
} else {
showNotifDialog(context);
}
} else {
String teks = 'memiliki kursus ini';
return _showDialogNotLogin(teks);
}
}
Widget freeBottomNav(
String? courseId,
String? instructor,
String? instructorId,
String? thumbnail,
String? title,
String? statuscourse,
String isadmin) {
return Container(
width: double.infinity,
height: getProportionateScreenHeight(60),
decoration: BoxDecoration(
color: Theme.of(context).brightness == Brightness.dark
? twelveColor
: baruTextutih,
boxShadow: [
BoxShadow(
color: baruTexthitam.withOpacity(0.1),
offset: Offset(0, 1),
blurRadius: 9,
spreadRadius: 6,
),
],
),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
if ('$instructorId' == '$iDuser')
TapDebouncer(
cooldown: const Duration(milliseconds: 3500),
onTap: () async => await {
print('user nya sama'),
CherryToast.error(
animationDuration: Durations.long1,
title: Text(
"Tidak bisa membeli kursus milik anda sendiri",
style: TextStyle(
color: Colors.black,
fontSize: 15,
),
),
animationType: AnimationType.fromTop,
).show(context)
},
builder: (BuildContext context, TapDebouncerFunc? onTap) {
return GestureDetector(
onTap: onTap,
child: Container(
margin: EdgeInsets.only(
right: getProportionateScreenWidth(15)),
width: getProportionateScreenWidth(123),
height: getProportionateScreenHeight(33),
decoration: BoxDecoration(
color: fiveColor,
borderRadius: BorderRadius.circular(5)),
child: Center(
child: Consumer<paymentsProvider.PaymentsProvider>(
builder: (context, state, _) {
if (state.stateProcess ==
paymentsProvider.Process.uninitialized) {
Container(
width: getProportionateScreenWidth(140),
height: getProportionateScreenHeight(40),
decoration: BoxDecoration(
color: primaryColor,
borderRadius: BorderRadius.circular(10)),
child: Center(
child: Text(
'Miliki Sekarang',
style: thirdTextStyle.copyWith(
fontSize: getProportionateScreenWidth(15),
letterSpacing: 0.085,
color: baruTextutih,
),
),
),
);
} else if (state.stateProcess ==
paymentsProvider.Process.loading) {
return Container(
width: 20,
height: 20,
child: CircularProgressIndicator(
color: eightColor,
strokeWidth: 2,
),
);
}
return Container(
width: getProportionateScreenWidth(140),
height: getProportionateScreenHeight(40),
decoration: BoxDecoration(
color: primaryColor,
borderRadius: BorderRadius.circular(10)),
child: Center(
child: Text(
'Miliki Sekarang',
style: thirdTextStyle.copyWith(
fontSize: getProportionateScreenWidth(15),
letterSpacing: 0.085,
color: baruTextutih,
),
),
),
);
}),
),
),
);
},
)
else if (isadmin == 'admin')
GestureDetector(
onTap: () {
print('disabled');
},
child: Container(
margin:
EdgeInsets.only(right: getProportionateScreenWidth(15)),
width: getProportionateScreenWidth(123),
height: getProportionateScreenHeight(33),
decoration: BoxDecoration(
color: fiveColor, borderRadius: BorderRadius.circular(5)),
child: Center(
child: Consumer<paymentsProvider.PaymentsProvider>(
builder: (context, state, _) {
if (state.stateProcess ==
paymentsProvider.Process.uninitialized) {
return Container(
width: getProportionateScreenWidth(140),
height: getProportionateScreenHeight(40),
decoration: BoxDecoration(
color: primaryColor,
borderRadius: BorderRadius.circular(10)),
child: Center(
child: Text(
'Miliki Sekarang',
style: thirdTextStyle.copyWith(
fontSize: getProportionateScreenWidth(15),
letterSpacing: 0.085,
color: baruTextutih,
),
),
),
);
} else if (state.stateProcess ==
paymentsProvider.Process.loading) {
return Container(
width: 20,
height: 20,
child: CircularProgressIndicator(
color: eightColor,
strokeWidth: 2,
),
);
}
return Container(
width: getProportionateScreenWidth(140),
height: getProportionateScreenHeight(40),
decoration: BoxDecoration(
color: primaryColor,
borderRadius: BorderRadius.circular(10)),
child: Center(
child: Text(
'Miliki Sekarang',
style: thirdTextStyle.copyWith(
fontSize: getProportionateScreenWidth(15),
letterSpacing: 0.085,
color: baruTextutih,
),
),
),
);
}),
),
),
)
else if (statuscourse == 'private')
TapDebouncer(
cooldown: const Duration(milliseconds: 3500),
onTap: () async => await {
print('disabled private'),
CherryToast.error(
animationDuration: Durations.long1,
title: Text(
"Kursus sedang dalam status\ntidak aktif",
style: TextStyle(
color: Colors.black,
fontSize: 15,
),
),
animationType: AnimationType.fromTop,
).show(context)
},
builder: (BuildContext context, TapDebouncerFunc? onTap) {
return GestureDetector(
onTap: onTap,
child: Container(
margin: EdgeInsets.only(
right: getProportionateScreenWidth(15)),
width: getProportionateScreenWidth(123),
height: getProportionateScreenHeight(33),
decoration: BoxDecoration(
color: fiveColor,
borderRadius: BorderRadius.circular(5)),
child: Center(
child: Consumer<paymentsProvider.PaymentsProvider>(
builder: (context, state, _) {
if (state.stateProcess ==
paymentsProvider.Process.uninitialized) {
return Container(
width: getProportionateScreenWidth(140),
height: getProportionateScreenHeight(40),
decoration: BoxDecoration(
color: primaryColor,
borderRadius: BorderRadius.circular(10)),
child: Center(
child: Text(
'Miliki Sekarang',
style: thirdTextStyle.copyWith(
fontSize: getProportionateScreenWidth(15),
letterSpacing: 0.085,
color: baruTextutih,
),
),
),
);
} else if (state.stateProcess ==
paymentsProvider.Process.loading) {
return Container(
width: 20,
height: 20,
child: CircularProgressIndicator(
color: eightColor,
strokeWidth: 2,
),
);
}
return Container(
width: getProportionateScreenWidth(140),
height: getProportionateScreenHeight(40),
decoration: BoxDecoration(
color: primaryColor,
borderRadius: BorderRadius.circular(10)),
child: Center(
child: Text(
'Miliki Sekarang',
style: thirdTextStyle.copyWith(
fontSize: getProportionateScreenWidth(15),
letterSpacing: 0.085,
color: baruTextutih,
),
),
),
);
}),
),
),
);
},
)
else if (statuscourse != 'active')
TapDebouncer(
cooldown: const Duration(milliseconds: 3500),
onTap: () async => await {
print('disabled ini'),
CherryToast.error(
animationDuration: Durations.long1,
title: Text(
"Kursus sedang dalam status\ntidak aktif",
style: TextStyle(
color: Colors.black,
fontSize: 15,
),
),
animationType: AnimationType.fromTop,
).show(context)
},
builder: (BuildContext context, TapDebouncerFunc? onTap) {
return GestureDetector(
onTap: onTap,
child: Container(
margin: EdgeInsets.only(
right: getProportionateScreenWidth(15)),
width: getProportionateScreenWidth(123),
height: getProportionateScreenHeight(33),
decoration: BoxDecoration(
color: fiveColor,
borderRadius: BorderRadius.circular(5)),
child: Center(
child: Consumer<paymentsProvider.PaymentsProvider>(
builder: (context, state, _) {
if (state.stateProcess ==
paymentsProvider.Process.uninitialized) {
return Container(
width: getProportionateScreenWidth(113),
height: getProportionateScreenHeight(33),
decoration: BoxDecoration(
color: primaryColor,
borderRadius: BorderRadius.circular(8)),
child: Center(
child: Text(
'Segera Hadir',
style: thirdTextStyle.copyWith(
fontSize: SizeConfig.blockHorizontal! * 3.5,
letterSpacing: 0.085,
color: baruTextutih,
),
),
),
);
} else if (state.stateProcess ==
paymentsProvider.Process.loading) {
return Container(
width: 20,
height: 20,
child: CircularProgressIndicator(
color: eightColor,
strokeWidth: 2,
),
);
}
return Container(
width: getProportionateScreenWidth(140),
height: getProportionateScreenHeight(40),
decoration: BoxDecoration(
color: primaryColor,
borderRadius: BorderRadius.circular(10)),
child: Center(
child: Text(
'Miliki Sekarang',
style: thirdTextStyle.copyWith(
fontSize: getProportionateScreenWidth(15),
letterSpacing: 0.085,
color: baruTextutih,
),
),
),
);
}),
),
),
);
},
)
else
GestureDetector(
onTap: () =>
handleNotLoginFree(courseId, title, thumbnail, instructor),
child: Center(
child: Consumer<paymentsProvider.PaymentsProvider>(
builder: (context, state, _) {
if (state.stateProcess ==
paymentsProvider.Process.uninitialized) {
return Container(
width: getProportionateScreenWidth(140),
height: getProportionateScreenHeight(40),
decoration: BoxDecoration(
color: primaryColor,
borderRadius: BorderRadius.circular(10)),
child: Center(
child: Text(
'Miliki Sekarang',
style: thirdTextStyle.copyWith(
fontSize: getProportionateScreenWidth(15),
letterSpacing: 0.085,
color: baruTextutih,
),
),
),
);
} else if (state.stateProcess ==
paymentsProvider.Process.loading) {
return Container(
width: 20,
height: 20,
child: CircularProgressIndicator(
color: eightColor,
strokeWidth: 2,
),
);
}
return Container(
width: getProportionateScreenWidth(140),
height: getProportionateScreenHeight(40),
decoration: BoxDecoration(
color: primaryColor,
borderRadius: BorderRadius.circular(10)),
child: Center(
child: Text(
'Miliki Sekarang',
style: thirdTextStyle.copyWith(
fontSize: getProportionateScreenWidth(15),
letterSpacing: 0.085,
color: baruTextutih,
),
),
),
);
},
),
),
),
],
),
);
}
Widget playCourseNav(String? courseId, String? instructor,
String? thumbnail, String? title) {
return Container(
width: double.infinity,
height: getProportionateScreenHeight(60),
decoration: BoxDecoration(
color: Theme.of(context).brightness == Brightness.dark
? twelveColor
: baruTextutih,
boxShadow: [
BoxShadow(
color: baruTexthitam.withOpacity(0.1),
offset: Offset(0, 1),
blurRadius: 9,
spreadRadius: 6,
),
],
),
child: GestureDetector(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => MultiProvider(
providers: [
ChangeNotifierProvider(
create: (context) =>
lessonCourseProvider.LessonCourseProvider(
lessonCourseService: LessonCourseService(),
id: int.parse(courseId ?? '0'),
),
),
ChangeNotifierProvider(
create: (context) => DetailCourseProvider(
courseService: CourseService(), id: courseId ?? '1'),
)
],
child: PlayCourse(
judul: title ?? '',
instruktur: instructor ?? '',
thumbnail: thumbnail ??
'$baseUrl/uploads/courses_thumbnail/course_thumbnail_default_57.jpg',
courseeid: courseId ?? '',
),
),
),
);
},
child: Container(
margin: EdgeInsets.symmetric(
horizontal: getProportionateScreenWidth(110),
vertical: getProportionateScreenHeight(10),
),
decoration: BoxDecoration(
color: primaryColor, borderRadius: BorderRadius.circular(10)),
child: Center(
child: Text(
'Lanjutkan Belajar',
style: thirdTextStyle.copyWith(
fontSize: SizeConfig.blockHorizontal! * 3.5,
letterSpacing: 0.085,
color: baruTextutih,
),
),
),
),
),
);
}
Widget bottomNav(
{required String discountPrice,
required String idCourse,
required String title,
required String price,
required String instructor,
required String? instructorId,
required String imageUrl,
required String statuscourse,
required String isadmin}) {
return Container(
width: double.infinity,
height: getProportionateScreenHeight(60),
decoration: BoxDecoration(
color: Theme.of(context).brightness == Brightness.dark
? twelveColor
: baruTextutih,
boxShadow: [
BoxShadow(
color: baruTexthitam.withOpacity(0.1),
offset: Offset(0, 1),
blurRadius: 9,
spreadRadius: 6,
),
],
),
child: Padding(
padding:
EdgeInsets.symmetric(horizontal: getProportionateScreenWidth(15)),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
if ('$instructorId' == '$iDuser')
TapDebouncer(
cooldown: const Duration(milliseconds: 3500),
onTap: () async => await {
CherryToast.error(
animationDuration: Durations.long1,
title: Text(
"Anda Tidak bisa membeli kursus milik anda sendiri",
style: TextStyle(
color: Colors.black,
fontSize: 15,
),
),
animationType: AnimationType.fromTop,
).show(context)
},
builder: (BuildContext context, TapDebouncerFunc? onTap) {
return GestureDetector(
onTap: onTap,
child: Container(
width: getProportionateScreenWidth(140),
height: getProportionateScreenHeight(40),
decoration: BoxDecoration(
color: primaryColor,
borderRadius: BorderRadius.circular(10)),
child: Center(
child: Text(
'Beli Sekarang',
style: thirdTextStyle.copyWith(
fontSize: getProportionateScreenWidth(15),
letterSpacing: 0.085,
color: baruTextutih,
),
),
),
),
);
},
)
else if (isadmin == 'admin' && statuscourse == 'prepublish')
GestureDetector(
onTap: () {
print('jadi admin');
},
child: Container(
margin:
EdgeInsets.only(right: getProportionateScreenWidth(15)),
width: getProportionateScreenWidth(113),
height: getProportionateScreenHeight(33),
decoration: BoxDecoration(
color: primaryColor,
borderRadius: BorderRadius.circular(8)),
child: Center(
child: Text(
'Segera Hadir',
style: thirdTextStyle.copyWith(
fontSize: SizeConfig.blockHorizontal! * 3.5,
letterSpacing: 0.085,
color: baruTextutih,
),
),
),
),
)
else if (cekstrAdmin == 'admin')
GestureDetector(
onTap: () {
print('jadi admin');
},
child: Container(
width: getProportionateScreenWidth(140),
height: getProportionateScreenHeight(40),
decoration: BoxDecoration(
color: primaryColor,
borderRadius: BorderRadius.circular(10)),
child: Center(
child: Text(
'Beli Sekarang',
style: thirdTextStyle.copyWith(
fontSize: getProportionateScreenWidth(15),
letterSpacing: 0.085,
color: baruTextutih,
),
),
),
),
)
else if (statuscourse == 'prepublish')
TapDebouncer(
cooldown: const Duration(milliseconds: 3500),
onTap: () async => await {
CherryToast.error(
animationDuration: Durations.long1,
title: Text(
"Kursus sedang dalam status\ntidak aktif",
style: TextStyle(
color: Colors.black,
fontSize: 15,
),
),
animationType: AnimationType.fromTop,
).show(context)
},
builder: (BuildContext context, TapDebouncerFunc? onTap) {
return GestureDetector(
onTap: onTap,
child: Container(
margin: EdgeInsets.only(
right: getProportionateScreenWidth(15)),
width: getProportionateScreenWidth(113),
height: getProportionateScreenHeight(33),
decoration: BoxDecoration(
color: primaryColor,
borderRadius: BorderRadius.circular(8)),
child: Center(
child: Text(
'Segera Hadir',
style: thirdTextStyle.copyWith(
fontSize: SizeConfig.blockHorizontal! * 3.5,
letterSpacing: 0.085,
color: baruTextutih,
),
),
),
),
);
},
)
else if (statuscourse == 'private')
TapDebouncer(
cooldown: const Duration(milliseconds: 3500),
onTap: () async => await {
CherryToast.error(
animationDuration: Durations.long1,
title: Text(
"Kursus sedang dalam status\ntidak aktif",
style: TextStyle(
color: Colors.black,
fontSize: 15,
),
),
animationType: AnimationType.fromTop,
).show(context)
},
builder: (BuildContext context, TapDebouncerFunc? onTap) {
return GestureDetector(
onTap: onTap,
child: Container(
width: getProportionateScreenWidth(140),
height: getProportionateScreenHeight(40),
decoration: BoxDecoration(
color: primaryColor,
borderRadius: BorderRadius.circular(10)),
child: Center(
child: Text(
'Beli Sekarang',
style: thirdTextStyle.copyWith(
fontSize: getProportionateScreenWidth(15),
letterSpacing: 0.085,
color: baruTextutih,
),
),
),
),
);
},
)
else if (statuscourse != 'active')
TapDebouncer(
cooldown: const Duration(milliseconds: 3500),
onTap: () async => await {
CherryToast.error(
animationDuration: Durations.long1,
title: Text(
"Kursus sedang dalam status\ntidak aktif",
style: TextStyle(
color: Colors.black,
fontSize: 15,
),
),
animationType: AnimationType.fromTop,
).show(context)
},
builder: (BuildContext context, TapDebouncerFunc? onTap) {
return GestureDetector(
onTap: onTap,
child: Container(
margin: EdgeInsets.only(
right: getProportionateScreenWidth(15)),
width: getProportionateScreenWidth(113),
height: getProportionateScreenHeight(33),
decoration: BoxDecoration(
color: primaryColor,
borderRadius: BorderRadius.circular(8)),
child: Center(
child: Text(
'Segera Hadir',
style: thirdTextStyle.copyWith(
fontSize: SizeConfig.blockHorizontal! * 3.5,
letterSpacing: 0.085,
color: baruTextutih,
),
),
),
),
);
},
)
else
GestureDetector(
onTap: () {
print(
'4 ${selectedTotalPrice.selectedTotalPrice = int.parse(discountPrice)}');
selectedTotalPrice.selectedTotalPrice = discountPrice == "0"
? (int.parse(price) < 50000
? int.parse(price) + 5000
: int.parse(price))
: (int.parse(discountPrice) < 50000
? int.parse(discountPrice) + 5000
: int.parse(discountPrice));
if (numberFormat(discountPrice) == 'Rp. 0') {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => DetailZeroPayment(),
),
);
handleNotLoginBuy(
title: title,
discountPrice: discountPrice,
imageUrl: imageUrl,
price: price,
instructor: instructor,
);
}
handleNotLoginBuy(
title: title,
discountPrice: discountPrice,
imageUrl: imageUrl,
price: price,
instructor: instructor,
);
},
child: Container(
width: getProportionateScreenWidth(140),
height: getProportionateScreenHeight(40),
decoration: BoxDecoration(
color: primaryColor,
borderRadius: BorderRadius.circular(10)),
child: Center(
child: Text(
'Beli Sekarang',
style: thirdTextStyle.copyWith(
fontSize: getProportionateScreenWidth(15),
letterSpacing: 0.085,
color: baruTextutih,
),
),
),
),
),
],
),
),
);
}
return (cekstrAdmin == "")
? Container(
child: Center(
child: CircularProgressIndicator(),
),
)
: SafeArea(
child: MultiProvider(
providers: [
ChangeNotifierProvider(
create: (context) => DetailCourseProvider(
courseService: CourseService(),
id: widget.idcourse,
),
),
ChangeNotifierProvider(
create: (context) =>
detailRatingCourseProvider.DetailRatingCourseProvider(
courseService: CourseService(), id: widget.idcourse),
),
ChangeNotifierProvider(
create: (context) =>
sectionLessonCourseProvider.SectionLessonCourseProvider(
id: widget.idcourse,
sectionLessonService: SectionLessonService()),
),
],
child: Consumer<DetailCourseProvider>(
builder: (context, state, _) {
cekadminbaru();
if (state.state == ResultState.Loading) {
return Center(
child: CircularProgressIndicator(
color: secondaryColor,
strokeWidth: 2,
),
);
} else if (state.state == ResultState.HasData) {
var detailCourse = state.result!.data[0][0];
return Scaffold(
body: Stack(
children: [
ListView(
controller: _scrollController,
physics: ScrollPhysics(),
shrinkWrap: true,
children: [
Header(
dataDetailCourseModel: detailCourse,
coupon: widget.coupon,
),
MultiProvider(
providers: [
ChangeNotifierProvider(
create: (context) =>
instructorProvider.InstructorProvider(
instructorService: InstructorService(),
id: int.parse(detailCourse.instructorId!),
),
),
ChangeNotifierProvider(
create: (context) => TabProvider()),
],
child: CustomTabBar(
dataDetailCourseModel: detailCourse,
totalDuration: detailCourse.totalDuration,
bio: detailCourse.bio,
instructor: detailCourse.instructor,
fotoProfile: detailCourse.fotoProfile,
rating: detailCourse.rating[0].avgRating
.toString(),
review: detailCourse.rating[0].totalReview,
totalLesson: detailCourse.totalLesson,
totalStudent: detailCourse.totalStudents,
headline: detailCourse.headlineInstructor,
resoaktifitas: widget.resoaktifitas,
idCategory:
detailCourse.breadcrumbs.idCategory,
),
),
],
),
AppBarHeader(
idcourse: widget.idcourse,
color: appBarColor,
),
],
),
bottomNavigationBar: (detailCourse.isMine == 1)
? playCourseNav(
detailCourse.id,
detailCourse.instructor,
detailCourse.thumbnail,
detailCourse.title,
)
: (detailCourse.isFreeCourse == '1' ||
typeCoupon == "1")
? freeBottomNav(
detailCourse.id,
detailCourse.instructor,
detailCourse.instructorId,
detailCourse.thumbnail,
detailCourse.title,
detailCourse.status_course,
cekstrAdmin)
: bottomNav(
discountPrice:
detailCourse.discountPrice ?? ' ',
idCourse: detailCourse.id,
instructor: detailCourse.instructor!,
instructorId: detailCourse.instructorId!,
price: detailCourse.price!,
title: detailCourse.title!,
imageUrl: detailCourse.thumbnail ?? '',
statuscourse:
detailCourse.status_course ?? '',
isadmin: cekstrAdmin),
);
} else if (state.state == ResultState.NoData) {
return Center(child: Text(state.message));
} else if (state.state == ResultState.Error) {
return const Scaffold(
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text('Error 500: Terdapat kesalahan pada server'),
],
),
),
);
} else {
return const Scaffold(
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text('Terjadi kesalahan, sebaiknya hati-hati'),
],
),
),
);
}
},
),
),
);
}
}