|  |  |  | import 'package:flutter/material.dart'; | 
					
						
							|  |  |  | import 'package:flutter_countdown_timer/index.dart'; | 
					
						
							|  |  |  | import 'package:lottie/lottie.dart'; | 
					
						
							|  |  |  | import 'package:mohem_flutter_app/api/dashboard_api_client.dart'; | 
					
						
							|  |  |  | import 'package:mohem_flutter_app/app_state/app_state.dart'; | 
					
						
							|  |  |  | import 'package:mohem_flutter_app/classes/colors.dart'; | 
					
						
							|  |  |  | import 'package:mohem_flutter_app/classes/lottie_consts.dart'; | 
					
						
							|  |  |  | import 'package:mohem_flutter_app/classes/utils.dart'; | 
					
						
							|  |  |  | import 'package:mohem_flutter_app/extensions/int_extensions.dart'; | 
					
						
							|  |  |  | import 'package:mohem_flutter_app/extensions/string_extensions.dart'; | 
					
						
							|  |  |  | import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; | 
					
						
							|  |  |  | import 'package:mohem_flutter_app/main.dart'; | 
					
						
							|  |  |  | import 'package:mohem_flutter_app/models/itg/advertisement.dart' as ads; | 
					
						
							|  |  |  | import 'package:mohem_flutter_app/widgets/button/default_button.dart'; | 
					
						
							|  |  |  | import 'package:video_player/video_player.dart'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ITGAdsScreen extends StatefulWidget { | 
					
						
							|  |  |  |   const ITGAdsScreen({Key? key}) : super(key: key); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   _ITGAdsScreenState createState() => _ITGAdsScreenState(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class _ITGAdsScreenState extends State<ITGAdsScreen> { | 
					
						
							|  |  |  |   late Future<VideoPlayerController> _futureController; | 
					
						
							|  |  |  |   late VideoPlayerController _controller; | 
					
						
							|  |  |  |   bool skip = false; | 
					
						
							|  |  |  |   bool isVideo = false; | 
					
						
							|  |  |  |   bool isImage = false; | 
					
						
							|  |  |  |   bool isAudio = false; | 
					
						
							|  |  |  |   String ext = ''; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // late File imageFile;
 | 
					
						
							|  |  |  |   late String imageUrl; | 
					
						
							|  |  |  |   ads.Advertisement? advertisementData; | 
					
						
							|  |  |  |   dynamic data; | 
					
						
							|  |  |  |   String? masterID; | 
					
						
							|  |  |  |   int videoDuration = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   bool hasTimerEndedBool = false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   final ValueNotifier<bool> hasTimerEnded = ValueNotifier(false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   late CountdownTimerController timerController; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   void checkFileType() { | 
					
						
							|  |  |  |     String? rFile = advertisementData!.viewAttachFileColl!.first.base64String; | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |       rFile = advertisementData!.viewAttachFileColl!.where((element) => element.languageId == AppState().getLanguageID(context)).toList().first.base64String; | 
					
						
							|  |  |  |     } catch (ex) {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     String? rFileExt = advertisementData!.viewAttachFileColl!.first.fileName; | 
					
						
							|  |  |  |     ext = "." + rFileExt!.split(".").last.toLowerCase(); | 
					
						
							|  |  |  |     if (ext == ".png" || ext == ".jpg" || ext == ".jpeg" || ext == ".gif") { | 
					
						
							|  |  |  |       //  await processImage();
 | 
					
						
							|  |  |  |       imageUrl = rFile!; | 
					
						
							|  |  |  |       isImage = true; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       if (ext == ".aac") { | 
					
						
							|  |  |  |         isAudio = true; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       isVideo = true; | 
					
						
							|  |  |  |       _futureController = createVideoPlayer(rFile!); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // advertisementData?.actionButtonsColl!.forEach((element) {
 | 
					
						
							|  |  |  |     advertisementData?.actionButtonsColl!.removeWhere((element1) => element1.actionButtonId == advertisementData?.skipButtonId); | 
					
						
							|  |  |  |     //});
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // setState(() {});
 | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   void changeTimer(bool isTimerEnd) { | 
					
						
							|  |  |  |     hasTimerEndedBool = isTimerEnd; | 
					
						
							|  |  |  |     hasTimerEnded.value = !hasTimerEnded.value; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   void onTimerEnd() { | 
					
						
							|  |  |  |     changeTimer(true); | 
					
						
							|  |  |  |     timerController.disposeTimer(); | 
					
						
							|  |  |  |     timerController.dispose(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   //
 | 
					
						
							|  |  |  |   // Future processImage(String encodedBytes) async {
 | 
					
						
							|  |  |  |   //   try {
 | 
					
						
							|  |  |  |   //     Uint8List decodedBytes = base64Decode(encodedBytes.split("base64,").last);
 | 
					
						
							|  |  |  |   //     Directory appDocumentsDirectory = await getApplicationDocumentsDirectory(); // 1
 | 
					
						
							|  |  |  |   //     imageFile = Io.File("${appDocumentsDirectory.path}/addImage$ext");
 | 
					
						
							|  |  |  |   //     imageFile.writeAsBytesSync(decodedBytes);
 | 
					
						
							|  |  |  |   //   } catch (e) {
 | 
					
						
							|  |  |  |   //     logger.d(e);
 | 
					
						
							|  |  |  |   //   }
 | 
					
						
							|  |  |  |   // }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Future<VideoPlayerController> createVideoPlayer(String encodedBytes) async { | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |       VideoPlayerController controller = VideoPlayerController.network(advertisementData!.viewAttachFileColl!.first.base64String!); | 
					
						
							|  |  |  |       await controller.initialize(); | 
					
						
							|  |  |  |       await controller.play(); | 
					
						
							|  |  |  |       await controller.setVolume(1.0); | 
					
						
							|  |  |  |       await controller.setLooping(false); | 
					
						
							|  |  |  |       return controller; | 
					
						
							|  |  |  |     } catch (e) { | 
					
						
							|  |  |  |       print(e); | 
					
						
							|  |  |  |       return VideoPlayerController.network("https://apimohemmweb.cloudsolutions.com.sa/ErmAttachment/compressedvideo.mp4"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   void initTimer() { | 
					
						
							|  |  |  |     Future.delayed(const Duration(seconds: 5), () { | 
					
						
							|  |  |  |       skip = true; | 
					
						
							|  |  |  |       // setState(() {});
 | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   void dispose() { | 
					
						
							|  |  |  |     if (_controller != null) _controller.dispose(); | 
					
						
							|  |  |  |     super.dispose(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   Widget build(BuildContext context) { | 
					
						
							|  |  |  |     data = ModalRoute.of(context)!.settings.arguments; | 
					
						
							|  |  |  |     advertisementData ??= data["advertisement"] as ads.Advertisement; | 
					
						
							|  |  |  |     masterID ??= data["masterId"]; | 
					
						
							|  |  |  |     if (advertisementData != null) { | 
					
						
							|  |  |  |       checkFileType(); | 
					
						
							|  |  |  |       videoDuration = advertisementData?.durationInSeconds ?? 0; | 
					
						
							|  |  |  |       timerController = CountdownTimerController(endTime: DateTime.now().millisecondsSinceEpoch + 1000 * videoDuration, onEnd: onTimerEnd); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return Scaffold( | 
					
						
							|  |  |  |       backgroundColor: Colors.black, | 
					
						
							|  |  |  |       body: Stack( | 
					
						
							|  |  |  |         children: [ | 
					
						
							|  |  |  |           if (isVideo) | 
					
						
							|  |  |  |             FutureBuilder( | 
					
						
							|  |  |  |               future: _futureController, | 
					
						
							|  |  |  |               builder: (BuildContext context, AsyncSnapshot<Object?> snapshot) { | 
					
						
							|  |  |  |                 if (snapshot.connectionState == ConnectionState.done && snapshot.data != null) { | 
					
						
							|  |  |  |                   _controller = snapshot.data as VideoPlayerController; | 
					
						
							|  |  |  |                   return Column( | 
					
						
							|  |  |  |                     mainAxisAlignment: MainAxisAlignment.center, | 
					
						
							|  |  |  |                     children: [ | 
					
						
							|  |  |  |                       Center( | 
					
						
							|  |  |  |                         child: isAudio | 
					
						
							|  |  |  |                             ? Lottie.asset(MyLottieConsts.audioPlaybackLottie) | 
					
						
							|  |  |  |                             : AspectRatio( | 
					
						
							|  |  |  |                                 aspectRatio: _controller.value.aspectRatio, | 
					
						
							|  |  |  |                                 child: VideoPlayer(_controller), | 
					
						
							|  |  |  |                               ), | 
					
						
							|  |  |  |                       ), | 
					
						
							|  |  |  |                       30.height, | 
					
						
							|  |  |  |                       CountdownTimer( | 
					
						
							|  |  |  |                         controller: timerController, | 
					
						
							|  |  |  |                         endTime: DateTime.now().millisecondsSinceEpoch + 1000 * videoDuration, | 
					
						
							|  |  |  |                         endWidget: "00:00:00".toText16(color: Colors.white, isBold: true), | 
					
						
							|  |  |  |                         textStyle: const TextStyle(color: Colors.white, fontSize: 16, letterSpacing: -0.48, fontWeight: FontWeight.bold), | 
					
						
							|  |  |  |                       ), | 
					
						
							|  |  |  |                       50.height, | 
					
						
							|  |  |  |                       if (advertisementData?.isOptional ?? false) | 
					
						
							|  |  |  |                         DefaultButton(AppState().isArabic(context) ? "يتخطى" : "Skip", () async { | 
					
						
							|  |  |  |                           Navigator.pop(context); | 
					
						
							|  |  |  |                           DashboardApiClient().setAdvertisementViewed(masterID!, advertisementData!.advertisementId!, "Skip").then((value) { | 
					
						
							|  |  |  |                             logger.d(value); | 
					
						
							|  |  |  |                           }); | 
					
						
							|  |  |  |                         }).paddingOnly(left: 60.0, right: 60.0, top: 8, bottom: 8), | 
					
						
							|  |  |  |                       ValueListenableBuilder<bool>( | 
					
						
							|  |  |  |                         valueListenable: hasTimerEnded, | 
					
						
							|  |  |  |                         builder: (context, val, child) { | 
					
						
							|  |  |  |                           if (hasTimerEndedBool) { | 
					
						
							|  |  |  |                             return GridView.builder( | 
					
						
							|  |  |  |                               padding: EdgeInsets.zero, | 
					
						
							|  |  |  |                               itemCount: advertisementData?.actionButtonsColl!.length, | 
					
						
							|  |  |  |                               shrinkWrap: true, | 
					
						
							|  |  |  |                               physics: const NeverScrollableScrollPhysics(), | 
					
						
							|  |  |  |                               itemBuilder: (context, index) { | 
					
						
							|  |  |  |                                 String? btnText = AppState().isArabic(context) ? advertisementData?.actionButtonsColl![index].btnTextAr : advertisementData?.actionButtonsColl![index].btnTextEn; | 
					
						
							|  |  |  |                                 return DefaultButton(btnText!, () async { | 
					
						
							|  |  |  |                                   Navigator.pop(context); | 
					
						
							|  |  |  |                                   DashboardApiClient().setAdvertisementViewed(masterID!, advertisementData!.advertisementId!, advertisementData?.actionButtonsColl![index].actionValue).then((value) { | 
					
						
							|  |  |  |                                     logger.d(value); | 
					
						
							|  |  |  |                                   }); | 
					
						
							|  |  |  |                                 }).paddingOnly(left: 60.0, right: 60.0, top: 8, bottom: 8); | 
					
						
							|  |  |  |                               }, | 
					
						
							|  |  |  |                               gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( | 
					
						
							|  |  |  |                                 crossAxisCount: 1, | 
					
						
							|  |  |  |                                 childAspectRatio: (7.0), | 
					
						
							|  |  |  |                               ), | 
					
						
							|  |  |  |                             ); | 
					
						
							|  |  |  |                             //   Row(
 | 
					
						
							|  |  |  |                             //   mainAxisAlignment: MainAxisAlignment.center,
 | 
					
						
							|  |  |  |                             //   children: [
 | 
					
						
							|  |  |  |                             //     Container(padding: const EdgeInsets.all(16), decoration: Utils.containerRadius(MyColors.white, 10), child: const Icon(Icons.thumb_up, color: MyColors.gradiantEndColor))
 | 
					
						
							|  |  |  |                             //         .onPress(() {
 | 
					
						
							|  |  |  |                             //       try {
 | 
					
						
							|  |  |  |                             //         Navigator.pop(context);
 | 
					
						
							|  |  |  |                             //         DashboardApiClient().setAdvertisementViewed(masterID!, advertisementData!.advertisementId!, "Like").then((value) {
 | 
					
						
							|  |  |  |                             //           logger.d(value);
 | 
					
						
							|  |  |  |                             //         });
 | 
					
						
							|  |  |  |                             //       } catch (ex) {
 | 
					
						
							|  |  |  |                             //         logger.wtf(ex);
 | 
					
						
							|  |  |  |                             //         Utils.handleException(ex, context, null);
 | 
					
						
							|  |  |  |                             //       }
 | 
					
						
							|  |  |  |                             //     }),
 | 
					
						
							|  |  |  |                             //     20.width,
 | 
					
						
							|  |  |  |                             //     Container(
 | 
					
						
							|  |  |  |                             //             padding: const EdgeInsets.all(16), decoration: Utils.containerRadius(MyColors.white, 10), child: const Icon(Icons.thumb_down, color: MyColors.gradiantEndColor))
 | 
					
						
							|  |  |  |                             //         .onPress(() {
 | 
					
						
							|  |  |  |                             //       try {
 | 
					
						
							|  |  |  |                             //         Navigator.pop(context);
 | 
					
						
							|  |  |  |                             //         DashboardApiClient().setAdvertisementViewed(masterID!, advertisementData!.advertisementId!, "Dislike").then((value) {
 | 
					
						
							|  |  |  |                             //           logger.d(value);
 | 
					
						
							|  |  |  |                             //         });
 | 
					
						
							|  |  |  |                             //       } catch (ex) {
 | 
					
						
							|  |  |  |                             //         logger.wtf(ex);
 | 
					
						
							|  |  |  |                             //         Utils.handleException(ex, context, null);
 | 
					
						
							|  |  |  |                             //       }
 | 
					
						
							|  |  |  |                             //     }),
 | 
					
						
							|  |  |  |                             //   ],
 | 
					
						
							|  |  |  |                             // );
 | 
					
						
							|  |  |  |                           } else { | 
					
						
							|  |  |  |                             return Container(); | 
					
						
							|  |  |  |                           } | 
					
						
							|  |  |  |                         }, | 
					
						
							|  |  |  |                       ), | 
					
						
							|  |  |  |                       20.height, | 
					
						
							|  |  |  |                       // if (advertisementData?.isOptional ?? false)
 | 
					
						
							|  |  |  |                       // GridView.builder(
 | 
					
						
							|  |  |  |                       //   padding: EdgeInsets.zero,
 | 
					
						
							|  |  |  |                       //   itemCount: advertisementData?.actionButtonsColl!.length,
 | 
					
						
							|  |  |  |                       //   shrinkWrap: true,
 | 
					
						
							|  |  |  |                       //   physics: const NeverScrollableScrollPhysics(),
 | 
					
						
							|  |  |  |                       //   itemBuilder: (context, index) {
 | 
					
						
							|  |  |  |                       //     String? btnText = AppState().isArabic(context) ? advertisementData?.actionButtonsColl![index].btnTextAr : advertisementData?.actionButtonsColl![index].btnTextEn;
 | 
					
						
							|  |  |  |                       //     return DefaultButton(btnText!, () async {
 | 
					
						
							|  |  |  |                       //       Navigator.pop(context);
 | 
					
						
							|  |  |  |                       //       DashboardApiClient().setAdvertisementViewed(masterID!, advertisementData!.advertisementId!, advertisementData?.actionButtonsColl![index].actionValue).then((value) {
 | 
					
						
							|  |  |  |                       //         logger.d(value);
 | 
					
						
							|  |  |  |                       //       });
 | 
					
						
							|  |  |  |                       //     }).paddingAll(8);
 | 
					
						
							|  |  |  |                       //   },
 | 
					
						
							|  |  |  |                       //   gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
 | 
					
						
							|  |  |  |                       //     crossAxisCount: 2,
 | 
					
						
							|  |  |  |                       //     childAspectRatio: (4.0),
 | 
					
						
							|  |  |  |                       //   ),
 | 
					
						
							|  |  |  |                       // )
 | 
					
						
							|  |  |  |                       // DefaultButton(AppState().isArabic(context) ? advertisementData?.skipButtonTextAr ?? "Skip" : advertisementData?.skipButtonTextEn ?? "Skip", () async {
 | 
					
						
							|  |  |  |                       //   Navigator.pop(context);
 | 
					
						
							|  |  |  |                       //   DashboardApiClient().setAdvertisementViewed(masterID!, advertisementData!.advertisementId!, "Skip").then((value) {
 | 
					
						
							|  |  |  |                       //     logger.d(value);
 | 
					
						
							|  |  |  |                       //   });
 | 
					
						
							|  |  |  |                       // }).paddingOnly(left: 100, right: 100)
 | 
					
						
							|  |  |  |                     ], | 
					
						
							|  |  |  |                   ); | 
					
						
							|  |  |  |                 } else { | 
					
						
							|  |  |  |                   return const Center( | 
					
						
							|  |  |  |                     child: CircularProgressIndicator(), | 
					
						
							|  |  |  |                   ); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |               }, | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |           if (isImage) | 
					
						
							|  |  |  |             SingleChildScrollView( | 
					
						
							|  |  |  |               padding: const EdgeInsets.only(top: 60, left: 12, right: 12), | 
					
						
							|  |  |  |               child: Column( | 
					
						
							|  |  |  |                 crossAxisAlignment: CrossAxisAlignment.center, | 
					
						
							|  |  |  |                 mainAxisAlignment: MainAxisAlignment.center, | 
					
						
							|  |  |  |                 children: [ | 
					
						
							|  |  |  |                   Image.network(imageUrl), | 
					
						
							|  |  |  |                   50.height, | 
					
						
							|  |  |  |                   Container(padding: const EdgeInsets.all(16), decoration: Utils.containerRadius(MyColors.white, 10), child: const Icon(Icons.thumb_up, color: MyColors.gradiantEndColor)).onPress( | 
					
						
							|  |  |  |                     () { | 
					
						
							|  |  |  |                       try { | 
					
						
							|  |  |  |                         Navigator.pop(context); | 
					
						
							|  |  |  |                         DashboardApiClient().setAdvertisementViewed(masterID!, advertisementData!.advertisementId!, "Like").then((value) { | 
					
						
							|  |  |  |                           logger.d(value); | 
					
						
							|  |  |  |                         }); | 
					
						
							|  |  |  |                       } catch (ex) { | 
					
						
							|  |  |  |                         logger.wtf(ex); | 
					
						
							|  |  |  |                         Utils.handleException(ex, context, null); | 
					
						
							|  |  |  |                       } | 
					
						
							|  |  |  |                     }, | 
					
						
							|  |  |  |                   ), | 
					
						
							|  |  |  |                 ], | 
					
						
							|  |  |  |               ), | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |       ), | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } |