import 'package:cached_network_image/cached_network_image.dart'; import 'package:cherry_toast/cherry_toast.dart'; import 'package:cherry_toast/resources/arrays.dart'; import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_svg/flutter_svg.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/models/voucher_model.dart'; import 'package:initial_folder/providers/carts_provider.dart'; import 'package:initial_folder/providers/my_course_provider.dart'; import 'package:initial_folder/providers/order_provider.dart'; import 'package:initial_folder/providers/radeem_voucher_provider.dart'; import 'package:initial_folder/providers/theme_provider.dart'; import 'package:initial_folder/providers/total_price_provider.dart'; import 'package:initial_folder/providers/wishlist_post_provider.dart'; import 'package:initial_folder/screens/checkout/checkout_detail_coupon.dart'; import 'package:initial_folder/screens/checkout/components/field_kupon.dart'; import 'package:initial_folder/screens/detail_course/components/murid_and_rating.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/services/user_info_service.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:initial_folder/widgets/login_regist/loading_button.dart'; import 'package:provider/provider.dart'; import 'package:shimmer/shimmer.dart'; import 'package:tap_debouncer/tap_debouncer.dart'; import 'package:initial_folder/providers/payments_provider.dart' as paysProv; import 'package:initial_folder/providers/detail_course_provider.dart' as detailCourseProv; import 'package:initial_folder/providers/whislist_provider.dart' as wishlistProvider; class Header extends StatefulWidget { const Header( {Key? key, required this.dataDetailCourseModel, this.coupon, this.discountPrice, this.price, this.idCourse}) : super(key: key); final DataDetailCourseModel dataDetailCourseModel; final String? coupon; final String? discountPrice; final String? price; final String? idCourse; @override State
createState() => _HeaderState(); } class _HeaderState extends State
{ @override bool isAdmin = false; int? iDuser; String? tokenCek; void cekadmin() { UserInfoService().getDataDiriADMIN().then((value) => { if (value == 401) { setState(() { isAdmin = true; }) } }); } void getIDuser() { UsersInfo().getIdUser().then((value) => { setState(() { iDuser = value; }), }); } void getTokenuser() { UsersInfo().getToken().then((value) => { setState(() { tokenCek = value; }), }); } @override void initState() { super.initState(); cekadmin(); getIDuser(); getTokenuser(); } Widget build(BuildContext context) { final selected = Provider.of(context); final kuponController = TextEditingController(); final themeProvider = Provider.of(context); final finalPriceCoupon = Provider.of(context).finalPriceCoupon; String? kuponErrorMessage = ""; bool isLoading = false; WishlistPostProvider wishlistPostProvider = Provider.of(context); paysProv.PaymentsProvider pay = Provider.of(context); showNotifDialog(BuildContext context) { showDialog( context: context, builder: (context) { return AlertDialog( content: Consumer( builder: (context, state, child) { if (state.state == paysProv.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() { return showDialog( context: context, builder: (context) => AlertDialog( contentPadding: EdgeInsets.fromLTRB(12, 20, 12, 1), content: Text( 'Mohon login terlebih dahulu sebelum menambahkan ke wishlist', 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 _showDialogNotLoginKupon() { return showDialog( context: context, builder: (context) => AlertDialog( contentPadding: EdgeInsets.fromLTRB(12, 20, 12, 1), content: Text( 'Mohon login terlebih dahulu sebelum tukar kupon', 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, ), ), ), ], ), ); } updateWishlist() async { var connectivityResult = await (Connectivity().checkConnectivity()); if (connectivityResult == ConnectivityResult.none) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( duration: Duration(seconds: 1), backgroundColor: Colors.red[600], content: Text( 'No Internet Connections', textAlign: TextAlign.center, style: primaryTextStyle.copyWith(color: Colors.white), ), behavior: SnackBarBehavior.floating, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(5), ), ), ); } else { await wishlistPostProvider .deleteWishlist(int.parse(widget.dataDetailCourseModel.id)); await Provider.of(context, listen: false) .getWishlist(); } } addWishlistNotExist() async { var connectivityResult = await (Connectivity().checkConnectivity()); if (connectivityResult == ConnectivityResult.none) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( duration: Duration(seconds: 1), backgroundColor: Colors.red[600], content: Text( 'No Internet Connections', textAlign: TextAlign.center, style: primaryTextStyle.copyWith(color: Colors.white), ), behavior: SnackBarBehavior.floating, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(5), ), ), ); } else { await wishlistPostProvider .addWishlist(int.parse(widget.dataDetailCourseModel.id)); await Provider.of(context, listen: false) .getWishlist() .then( (value) => { if (value == "gagal") { CherryToast.error( animationDuration: Durations.long1, title: Text( "Terjadi kesalahan, silahkan coba lagi", style: TextStyle( color: Colors.black, fontSize: 15, ), ), animationType: AnimationType.fromTop, ).show(context) } }, ); } } checkUser() async { var token = await UsersInfo().getToken(); if (token != null || Condition.loginFirebase == true) { updateWishlist(); } else { return _showDialogNotLogin(); } } wishlistExist() async { var token = await UsersInfo().getToken(); if (token != null || Condition.loginFirebase == true) { addWishlistNotExist(); } else { return _showDialogNotLogin(); } } Future _showKupon() { setState(() { kuponErrorMessage = ""; }); return showModalBottomSheet( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(0), ), elevation: 0.0, context: context, isScrollControlled: true, builder: (context) { return Padding( padding: EdgeInsets.only( bottom: MediaQuery.of(context).viewInsets.bottom, ), child: SingleChildScrollView( child: Container( color: Theme.of(context).colorScheme.background, padding: EdgeInsets.all(16.0), child: Column( mainAxisSize: MainAxisSize.min, children: [ Row( mainAxisAlignment: MainAxisAlignment.end, children: [ IconButton( icon: Icon(Icons.close), onPressed: () { Navigator.pop(context); }, ), ], ), Center( child: Column( children: [ Text( 'Tukarkan Voucher', style: thirdTextStyle.copyWith( letterSpacing: 1, fontWeight: semiBold, fontSize: getProportionateScreenWidth(14)), ), SizedBox(height: getProportionateScreenHeight(16)), Text( 'Masukkan kode kupon untuk klaim\npromo menarik Vocasia', textAlign: TextAlign.center, style: primaryTextStyle.copyWith( fontWeight: reguler, fontSize: getProportionateScreenWidth(12)), ), SizedBox(height: getProportionateScreenHeight(30)), Padding( padding: EdgeInsets.symmetric( horizontal: getProportionateScreenWidth(16)), child: FieldKupon( controler: kuponController, ), ), SizedBox(height: getProportionateScreenHeight(7)), Padding( padding: EdgeInsets.symmetric( horizontal: getProportionateScreenWidth(15)), child: isLoading ? LoadingButton( backgroundButtonColor: primaryColor, textButtonColor: Color(0xff050505), ) : TapDebouncer( cooldown: const Duration(milliseconds: 3000), onTap: () async { final voucher = kuponController.text; var radeemVoucherProvider = Provider.of( context, listen: false); VoucherModel? response = await radeemVoucherProvider .radeemVoucher( int.parse(widget .dataDetailCourseModel .id), voucher); if (response?.error == false) { await Provider.of( context, listen: false) .getCarts(); VoucherModel? detailKupon = radeemVoucherProvider.result; DataVoucher? firstDataItem = detailKupon?.data?.first; Provider.of(context, listen: false) .clear(); var finalPriceReal = firstDataItem ?.finalPrice .toString() .replaceAll(".", ""); int? discountPriceRounded = firstDataItem?.discountPrice ?.round() ?? 0; if (firstDataItem?.typeCoupon != "1" || firstDataItem?.finalPrice == 0 || firstDataItem ?.finalPrice.toString == "0") Provider.of(context, listen: false) .addOrder( id: firstDataItem?.idCourse, title: firstDataItem?.courseName, price: finalPriceReal, discountPrice: finalPriceReal, imageUrl: firstDataItem ?.thubmnail == null ? '$baseUrl/uploads/courses_thumbnail/course_thumbnail_default_57.jpg' : firstDataItem?.thubmnail, instructor: firstDataItem?.instructor, ); selected.selectedPriceCoupon = int.parse( firstDataItem?.originalPrice ?? "0"); selected.selectedTypeCoupon = firstDataItem?.typeCoupon ?? ""; selected.selectedCouponText = voucher.toString(); selected.selectedFinalPriceCoupon = int.parse(firstDataItem!.finalPrice .toString()); selected.selectedTotalPrice = int.parse( firstDataItem.finalPrice .toString()); selected.selectedTotalPrices = int.parse(firstDataItem .originalPrice .toString()); selected.selectedPotonganKupon = discountPriceRounded!; Provider.of(context, listen: false) .getTotalPrice(firstDataItem .finalPrice .toString()); int? potonganKupon = (firstDataItem .discountPrice != null && firstDataItem.finalPrice != null ? discountPriceRounded - firstDataItem.finalPrice : null) as int?; int? potonganKupon2 = (firstDataItem.originalPrice != null && firstDataItem.finalPrice != null) ? int.parse(firstDataItem .originalPrice ?? "0") - int.parse(firstDataItem .finalPrice .toString()) : null; selected.selectedPenguranganHarga = potonganKupon2!; if (firstDataItem.typeCoupon != "1") Navigator.of(context, rootNavigator: true) .pushReplacement( MaterialPageRoute( builder: (context) => CheckoutDetailCoupon( idCart: [], potonganKupon: discountPriceRounded != 0 ? (discountPriceRounded > int.parse( firstDataItem .finalPrice .toString()) ? potonganKupon : discountPriceRounded) : potonganKupon2, discountHarga: firstDataItem.finalPrice, isKupon: true, ), ), ); var token = await UsersInfo().getToken(); if (firstDataItem.typeCoupon == "1") if (token != null || Condition.loginFirebase == true) { if (await pay.freeCourseCoupon( int.parse( firstDataItem.idCourse!), voucher)) { await Provider.of( context, listen: false) .getMyCourse(); Navigator.pushReplacement( context, MaterialPageRoute( builder: (context) => SuccessFreeCourse( id: firstDataItem.idCourse, thumbnail: firstDataItem.thubmnail, title: firstDataItem.courseName, instructor: firstDataItem.instructor, ), ), ); } else { showNotifDialog(context); } } else { String teks = 'memiliki kursus ini'; return _showDialogNotLogin(); } kuponController.clear(); } else { CherryToast.error( animationDuration: Durations.long1, title: Text( "Kupon tidak ditemukan pada kursus ini", style: TextStyle( color: Colors.black, fontSize: 15, )), animationType: AnimationType.fromTop, ).show(context); } }, builder: (BuildContext context, TapDebouncerFunc? onTap) { return Padding( padding: EdgeInsets.only( bottom: getProportionateScreenHeight( 30)), child: DefaultButton( text: 'Tukarkan', press: onTap), ); }, ), ), ], ), ), ], ), ), ), ); }, ); } Widget imageCourse() { return Container( margin: EdgeInsets.only( left: getProportionateScreenWidth(2), right: getProportionateScreenWidth(2)), width: double.infinity, height: getProportionateScreenWidth(178), child: Stack( children: [ Column( children: [ Container( width: double.infinity, height: getProportionateScreenWidth(178), child: CachedNetworkImage( imageUrl: widget.dataDetailCourseModel.thumbnail ?? '$baseUrl/uploads/courses_thumbnail/course_thumbnail_default_57.jpg', imageBuilder: (context, imageProvider) => Container( decoration: BoxDecoration( image: DecorationImage( image: imageProvider, fit: BoxFit.cover, ), ), ), placeholder: (context, url) => Shimmer( child: Container( color: thirdColor, ), gradient: LinearGradient( stops: [0.4, 0.5, 0.6], colors: [secondaryColor, thirdColor, secondaryColor]), ), errorWidget: (context, url, error) => Icon(Icons.error), ), ), ], ), ], ), ); } Widget buttonKuponWishlist() { return Row( mainAxisAlignment: MainAxisAlignment.end, children: [ Consumer( builder: (context, state, _) { if (state.state == detailCourseProv.ResultState.HasData) { var detailCourse = state.result!.data[0][0]; if (detailCourse.isFreeCourse == '1') { return SizedBox(); } else { if (widget.coupon == null) { return Expanded( child: (tokenCek == null) ? Container( margin: EdgeInsets.only( left: getProportionateScreenWidth(2)), child: Transform.translate( offset: Offset(getProportionateScreenWidth(110), 0), child: GestureDetector( onTap: () { _showDialogNotLoginKupon(); }, child: Padding( padding: EdgeInsets.all(2.5), child: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ Text(""), ], ), ), ), ), ) : (iDuser == null) ? Container( margin: EdgeInsets.only( left: getProportionateScreenWidth(2)), child: Padding( padding: EdgeInsets.all(2.5), child: Center( child: CircularProgressIndicator(), )), ) : ('${detailCourse.instructorId}' == '$iDuser') ? Container( margin: EdgeInsets.only( left: getProportionateScreenWidth(2)), child: TapDebouncer( cooldown: const Duration(milliseconds: 3000), onTap: () async => await { CherryToast.error( animationDuration: Durations.long1, title: Text( "Anda tidak dapat menukarkan kupon di kursus anda sendiri", style: TextStyle( color: Colors.black, fontSize: 15, ), ), animationType: AnimationType.fromTop, ).show(context) }, builder: (BuildContext context, TapDebouncerFunc? onTap) { return Transform.translate( offset: Offset( getProportionateScreenWidth( 110), 0), child: GestureDetector( onTap: onTap, child: Padding( padding: EdgeInsets.all(2.5), child: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ SizedBox(width: 4), Image.asset( "assets/images/home_coupon.png", color: primaryColor, ), SizedBox(width: 10), ], ), ), ), ); }, ), ) : (detailCourse.status_course != 'active') ? Container( margin: EdgeInsets.only( left: getProportionateScreenWidth( 2)), child: TapDebouncer( cooldown: const Duration( milliseconds: 3000), 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 Transform.translate( offset: Offset( getProportionateScreenWidth( 110), 0), child: GestureDetector( onTap: onTap, child: Padding( padding: EdgeInsets.all(2.5), child: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ SizedBox(width: 4), Image.asset( "assets/images/home_coupon.png", color: primaryColor, ), SizedBox(width: 10), ], ), ), ), ); }, ), ) : (isAdmin == true) ? Container( margin: EdgeInsets.only( left: getProportionateScreenWidth( 2)), child: GestureDetector( onTap: () {}, child: Transform.translate( offset: Offset( getProportionateScreenWidth( 110), 0), child: Padding( padding: EdgeInsets.all(2.5), child: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ SizedBox(width: 4), Image.asset( "assets/images/home_coupon.png", color: primaryColor, ), SizedBox(width: 1), ], ), ), ), ), ) : Transform.translate( offset: Offset( getProportionateScreenWidth( 110), 0), child: GestureDetector( onTap: () { if (Condition.loginEmail || Condition.loginFirebase) { _showKupon(); } else { _showDialogNotLoginKupon(); } }, child: Padding( padding: EdgeInsets.symmetric( vertical: 8), child: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ Image.asset( "assets/images/home_coupon.png", color: themeProvider.themeData == ThemeClass.darkmode ?primaryColor : primaryColorligtmode, ), ], ), ), ), ), ); } else { return SizedBox.shrink(); } } } else { return const SizedBox(); } }, ), Consumer( builder: (context, state, _) { if (state.state == detailCourseProv.ResultState.HasData) { var detailCourse = state.result!.data[0][0]; if (detailCourse.isFreeCourse == '1') { return SizedBox(); } else { return SizedBox(width: 12); } } else { return SizedBox(); } }), Expanded( child: (iDuser == null) ? GestureDetector( onTap: () { _showDialogNotLogin(); }, child: !Condition.loginEmail && !Condition.loginFirebase ? Padding( padding: EdgeInsets.only( right: getProportionateScreenWidth(10)), child: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ SvgPicture.asset(Theme.of(context).brightness == Brightness.dark ? 'assets/icons/heart_dark.svg' : 'assets/icons/heart.svg'), ], ), ) : Padding( padding: EdgeInsets.all(2.5), child: Row( mainAxisAlignment: MainAxisAlignment.end, children: [CircularProgressIndicator()], ), ), ) : ('${widget.dataDetailCourseModel.instructorId}' == '$iDuser') ? GestureDetector( onTap: Provider.of(context) .data .contains(widget.dataDetailCourseModel.id) ? checkUser : wishlistExist, child: !Condition.loginEmail && !Condition.loginFirebase ? Row( children: [ Icon( Icons.favorite_border, color: Colors.white, size: getProportionateScreenWidth(18), ), ], ) : Row( mainAxisAlignment: MainAxisAlignment.end, children: [ Center( child: Consumer< wishlistProvider.WishlistProvider>( builder: (context, state, _) { if (state.state == wishlistProvider .ResultState.Loading) { return SizedBox( height: 20, width: 20, child: CircularProgressIndicator( color: secondaryColor, strokeWidth: 1, ), ); } return SvgPicture.asset( state.data.contains(widget .dataDetailCourseModel.id) ? Theme.of(context).brightness == Brightness.dark ? 'assets/icons/heart_dark_select.svg' : 'assets/icons/heart_select.svg' : Theme.of(context).brightness == Brightness.dark ? 'assets/icons/heart_dark.svg' : 'assets/icons/heart.svg', ); }, ), ), SizedBox( width: getProportionateScreenWidth(6)), Center( child: Consumer< wishlistProvider.WishlistProvider>( builder: (contex, state, _) { if (state.state == wishlistProvider .ResultState.Loading) { return Text(''); } return Text( state.data.contains(widget .dataDetailCourseModel.id) ? '' : '', overflow: TextOverflow.ellipsis, style: primaryTextStyle.copyWith( fontSize: getProportionateScreenWidth(12), letterSpacing: 0.2, ), ); }, ), ), ], ), ) : (isAdmin == true) ? GestureDetector( onTap: () { print('disabled admin'); }, child: !Condition.loginEmail && !Condition.loginFirebase ? Row( children: [ Icon( Icons.favorite_border, color: Colors.white, size: getProportionateScreenWidth(18), ), ], ) : Row( mainAxisAlignment: MainAxisAlignment.end, children: [ Center( child: Consumer< wishlistProvider.WishlistProvider>( builder: (context, state, _) { if (state.state == wishlistProvider .ResultState.Loading) { return SizedBox( height: 20, width: 20, child: CircularProgressIndicator( color: secondaryColor, strokeWidth: 1, ), ); } return SvgPicture.asset( state.data.contains(widget .dataDetailCourseModel.id) ? Theme.of(context) .brightness == Brightness.dark ? 'assets/icons/heart_dark_select.svg' : 'assets/icons/heart_select.svg' : Theme.of(context) .brightness == Brightness.dark ? 'assets/icons/heart_dark.svg' : 'assets/icons/heart.svg', ); }, ), ), SizedBox( width: getProportionateScreenWidth(6)), Center( child: Consumer< wishlistProvider.WishlistProvider>( builder: (contex, state, _) { if (state.state == wishlistProvider .ResultState.Loading) { return Text(''); } return Text( state.data.contains(widget .dataDetailCourseModel.id) ? '' : '', overflow: TextOverflow.ellipsis, style: primaryTextStyle.copyWith( fontSize: getProportionateScreenWidth( 12), letterSpacing: 0.2, ), ); }, ), ), ], ), ) : (widget.dataDetailCourseModel.status_course == 'prepublish') ? GestureDetector( onTap: Provider.of(context) .data .contains( widget.dataDetailCourseModel.id) ? checkUser : wishlistExist, child: !Condition.loginEmail && !Condition.loginFirebase ? Row( children: [ Icon( Icons.favorite_border, color: Colors.white, size: getProportionateScreenWidth(18), ), ], ) : Row( mainAxisAlignment: MainAxisAlignment.end, children: [ Center( child: Consumer< wishlistProvider .WishlistProvider>( builder: (context, state, _) { if (state.state == wishlistProvider .ResultState.Loading) { return SizedBox( height: 20, width: 20, child: CircularProgressIndicator( color: secondaryColor, strokeWidth: 1, ), ); } return SvgPicture.asset( state.data.contains(widget .dataDetailCourseModel .id) ? Theme.of(context) .brightness == Brightness.dark ? 'assets/icons/heart_dark_select.svg' : 'assets/icons/heart_select.svg' : Theme.of(context) .brightness == Brightness.dark ? 'assets/icons/heart_dark.svg' : 'assets/icons/heart.svg', ); }, ), ), SizedBox( width: getProportionateScreenWidth( 6)), Center( child: Consumer< wishlistProvider .WishlistProvider>( builder: (contex, state, _) { if (state.state == wishlistProvider .ResultState.Loading) { return Text(''); } return Text( state.data.contains(widget .dataDetailCourseModel .id) ? '' : '', overflow: TextOverflow.ellipsis, style: primaryTextStyle.copyWith( fontSize: getProportionateScreenWidth( 12), letterSpacing: 0.2, ), ); }, ), ), ], ), ) : (widget.dataDetailCourseModel.status_course != '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: !Condition.loginEmail && !Condition.loginFirebase ? Row( children: [ Icon( Icons.favorite_border, color: Colors.white, size: getProportionateScreenWidth( 18), ), ], ) : Row( mainAxisAlignment: MainAxisAlignment.end, children: [ Center( child: Consumer< wishlistProvider .WishlistProvider>( builder: (context, state, _) { if (state.state == wishlistProvider .ResultState .Loading) { return SizedBox( height: 20, width: 20, child: CircularProgressIndicator( color: secondaryColor, strokeWidth: 1, ), ); } return SvgPicture.asset( state.data.contains(widget .dataDetailCourseModel .id) ? Theme.of(context) .brightness == Brightness .dark ? 'assets/icons/heart_dark_select.svg' : 'assets/icons/heart_select.svg' : Theme.of(context) .brightness == Brightness .dark ? 'assets/icons/heart_dark.svg' : 'assets/icons/heart.svg', ); }, ), ), SizedBox( width: getProportionateScreenWidth( 6), ), Center( child: Consumer< wishlistProvider .WishlistProvider>( builder: (contex, state, _) { if (state.state == wishlistProvider .ResultState .Loading) { return Text(''); } return Text( state.data.contains(widget .dataDetailCourseModel .id) ? '' : '', overflow: TextOverflow .ellipsis, style: primaryTextStyle .copyWith( fontSize: getProportionateScreenWidth( 12), letterSpacing: 0.2, ), ); }, ), ), ], ), ); }, ) : GestureDetector( onTap: Provider.of< wishlistProvider .WishlistProvider>(context) .data .contains( widget.dataDetailCourseModel.id) ? checkUser : wishlistExist, child: !Condition.loginEmail && !Condition.loginFirebase ? Center( child: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ Icon( Icons.favorite_border, color: Colors.white, size: getProportionateScreenWidth( 18), ), ], ), ) : Row( mainAxisAlignment: MainAxisAlignment.end, children: [ Center( child: Consumer< wishlistProvider .WishlistProvider>( builder: (context, state, _) { if (state.state == wishlistProvider .ResultState .Loading) { return SizedBox( height: 20, width: 20, child: CircularProgressIndicator( color: secondaryColor, strokeWidth: 1, ), ); } return SvgPicture.asset( state.data.contains(widget .dataDetailCourseModel .id) ? Theme.of(context) .brightness == Brightness .dark ? 'assets/icons/heart_dark_select.svg' : 'assets/icons/heart_select.svg' : Theme.of(context) .brightness == Brightness .dark ? 'assets/icons/heart_dark.svg' : 'assets/icons/heart.svg', ); }, ), ), SizedBox( width: getProportionateScreenWidth( 6)), Center( child: Consumer< wishlistProvider .WishlistProvider>( builder: (contex, state, _) { if (state.state == wishlistProvider .ResultState .Loading) { return Text(''); } return Text( state.data.contains(widget .dataDetailCourseModel .id) ? '' : '', overflow: TextOverflow.ellipsis, style: primaryTextStyle .copyWith( fontSize: getProportionateScreenWidth( 12), letterSpacing: 0.2, ), ); }, ), ), ], ), ), ), ], ); } initState() { super.initState(); cekadmin(); } return Stack( children: [ Container( width: SizeConfig.screenWidth, child: Column( children: [ imageCourse(), SizedBox(height: getProportionateScreenHeight(10)), Padding( padding: EdgeInsets.symmetric(horizontal: getProportionateScreenWidth(15)), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ // Expanded untuk menghindari overflow pada judul kursus Expanded( child: Text( widget.dataDetailCourseModel.title ?? ' ', style: thirdTextStyle.copyWith( fontSize: widget.dataDetailCourseModel.title!.length > 72 ? getProportionateScreenWidth(13) : getProportionateScreenHeight(14), fontWeight: semiBold, ), maxLines: 3, overflow: TextOverflow.ellipsis, ), ), SizedBox(width: getProportionateScreenWidth(10)), if (widget.coupon == null) widget.dataDetailCourseModel.isMine != 1 ? Column( crossAxisAlignment: CrossAxisAlignment.end, children: [ // Harga promo atau harga diskon Text( widget.dataDetailCourseModel.promoPrice != '0' ? numberFormat(widget.dataDetailCourseModel.promoPrice) : widget.dataDetailCourseModel.discountPrice == '0' && widget.dataDetailCourseModel.price == '0' ? 'Gratis' : widget.dataDetailCourseModel.discountPrice == '0' ? numberFormat(widget.dataDetailCourseModel.price) : numberFormat(widget.dataDetailCourseModel.discountPrice), style: thirdTextStyle.copyWith( fontSize: getProportionateScreenWidth(15), letterSpacing: 0.23, fontWeight: semiBold, ), ), SizedBox(height: getProportionateScreenHeight(3)), // Harga asli yang dicoret jika ada diskon if (widget.dataDetailCourseModel.promoPrice != '0' || widget.dataDetailCourseModel.discountPrice != '0') Text( numberFormat(widget.dataDetailCourseModel.price), style: thirdTextStyle.copyWith( fontSize: getProportionateScreenWidth(13), letterSpacing: 0.23, color: secondaryColor, decoration: TextDecoration.lineThrough, ), ), ], ) : SizedBox.shrink(), if (widget.coupon != null) widget.dataDetailCourseModel.isMine != 1 ? Column( crossAxisAlignment: CrossAxisAlignment.end, children: [ Text( finalPriceCoupon.toString() == "0" ? "Gratis" : numberFormat(finalPriceCoupon.toString()), style: thirdTextStyle.copyWith( fontSize: getProportionateScreenWidth(15), letterSpacing: 0.23, fontWeight: semiBold, ), ), SizedBox(height: getProportionateScreenHeight(3)), Text( finalPriceCoupon.toString() == "0" ? "Gratis" : numberFormat(widget.dataDetailCourseModel.price.toString()), style: thirdTextStyle.copyWith( fontSize: getProportionateScreenWidth(13), letterSpacing: 0.23, color: secondaryColor, decoration: TextDecoration.lineThrough, ), ), ], ) : SizedBox.shrink(), ], ), ), SizedBox(height: getProportionateScreenHeight(7)), MuridAndRating( dataDetailCourseModel: widget.dataDetailCourseModel), Consumer( builder: (context, state, _) { if (state.state == detailCourseProv.ResultState.HasData) { var detailCourse = state.result!.data[0][0]; if (detailCourse.isMine == 1) { return SizedBox(height: getProportionateScreenHeight(30)); } else { return Transform.translate( offset: Offset(0, getProportionateScreenHeight(-30)), child: buttonKuponWishlist(), ); } } else { return Container(); } }, ), ], ), ), ], ); } }