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 { 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(context); final typeCoupon = Provider.of(context).typeCoupon; List idCarts = []; SizeConfig().init(context); paymentsProvider.PaymentsProvider pay = Provider.of(context); final finalPriceCoupon = Provider.of(context).finalPriceCoupon; final potonganKupon = Provider.of(context) .potonganKupon ?.round() .toString() ?? '0'; showNotifDialog(BuildContext context) { showDialog( context: context, builder: (context) { return AlertDialog( content: Consumer( 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 route) => false); }, child: Text( 'Login', style: primaryTextStyle.copyWith( fontSize: getProportionateScreenWidth(12), letterSpacing: 1, color: primaryColor), ), ), ], ), ); } Future _showMessage() { return showModalBottomSheet( context: context, builder: (BuildContext context) { return Consumer( 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 _showMessageCart() { return showDialog( context: context, barrierDismissible: true, builder: (BuildContext context) { return Consumer( 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( 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(context, listen: false) .addCart(int.parse(widget.idcourse)); await Provider.of(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(context, listen: false) .addCart(int.parse(widget.idcourse)); await Provider.of(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(context, listen: false) .clear(); Provider.of(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(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(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( 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( 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( 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( 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( 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( 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'), ], ), ), ); } }, ), ), ); } }