import 'dart:convert'; import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:healthcare_pharmacy/ZoomedImageView.dart'; import 'package:healthcare_pharmacy/models/offersview_model.dart'; import 'package:healthcare_pharmacy/offerstabdata.dart'; import 'package:healthcare_pharmacy/settings.dart'; import 'package:intl/intl.dart'; import 'package:image_picker/image_picker.dart'; import 'package:photo_view/photo_view.dart'; import 'package:flutter_cupertino_datetime_picker/flutter_cupertino_datetime_picker.dart'; class Viewpager extends StatefulWidget { List userdata; int position; Viewpager(this.userdata, this.position); @override State createState() => _ViewpagerState(); } class _ViewpagerState extends State { late PageController _pageController; int _currentPageIndex = 0; String selectedOption = 'Option 1'; bool isActiveDataLoading=false; bool isSereverIssue = false; bool isSereverIssueConnected = false; bool isSereverIssuePending = false; bool switchValue = false; TextEditingController updateOfferNameController = TextEditingController(); TextEditingController updateOfferCodeController = TextEditingController(); TextEditingController updateOfferDescriptionController = TextEditingController(); TextEditingController updateDiscountController = TextEditingController(); TextEditingController updateOfferStartDateController = TextEditingController(); TextEditingController updateOfferEndDateController = TextEditingController(); String dropdownTypeOfCategory = 'A {1 - 500}'; var typeOfCategoryItems = [ 'A {1 - 500}', 'B {501 - 1000}', 'C {1001 - 2000}', 'D {Above 2000}', 'S {Special offer}', ]; List updateCategoryTypes = []; var startdate; var enddate; String updateofferUrl=''; final ImagePicker _picker = ImagePicker(); List activeOffersList = []; Future pickImageFromGallery(var offerCode) async { try { final image = await _picker.pickImage(source: ImageSource.gallery); if (image == null) return ''; final imageTemp = File(image.path); AppSettings.preLoaderDialog(context); var res = await AppSettings.offerupdateuploadImageHTTPNew(image, offerCode); print(jsonDecode(res)); setState(() { updateofferUrl = jsonDecode(res)['picture'][0]['url']; print("update url: $updateofferUrl"); }); Navigator.of(context, rootNavigator: true).pop(); if(res.contains("error")){ return 'some thing went wrong please try again'; } else{ return jsonDecode(res)['picture'][0]['url']; } } on PlatformException catch (e) { print('Failed to pick image: $e'); return 'some thing went wrong please try again'; } } Future takeImageFromCamera(String offerCode) async { try { final image = await _picker.pickImage(source: ImageSource.camera); if (image == null) return ''; final imageTemp = File(image.path); AppSettings.preLoaderDialog(context); var res = await AppSettings.offerupdateuploadImageHTTPNew(image, offerCode); print(jsonDecode(res)); setState(() { updateofferUrl = jsonDecode(res)['picture'][0]['url']; print("update url: $updateofferUrl"); }); Navigator.of(context, rootNavigator: true).pop(); if(res.contains("error")){ return 'some thing went wrong please try again'; } else{ return jsonDecode(res)['picture'][0]['url']; } } on PlatformException catch (e) { print('Failed to pick image: $e'); return 'some thing went wrong please try again'; } } showUpdateOfferDialog(GetOffersDetailsModel object, int index) async { updateOfferNameController.text = object.offer_name!; updateOfferCodeController.text = object.offer_code!; updateOfferDescriptionController.text = object.description!; updateOfferStartDateController.text=object.starting_date!; updateOfferEndDateController.text=object.ending_date!; updateofferUrl=object.picture[0].url; return showDialog( context: context, barrierDismissible: false, builder: (BuildContext context) { return StatefulBuilder( builder: (BuildContext context, StateSetter setState) { var data=activeOffersList[index]; print("result$updateofferUrl"); return AlertDialog( title: const Text('Update Offer'), content: SingleChildScrollView( child: ListBody( children: [ // ImageView InkWell( onTap: () { showModalBottomSheet( context: context, builder: (BuildContext context) { return SizedBox( height: 200, child: Center( child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ GestureDetector( child: Icon( Icons.camera_alt_outlined, size: 100, color: primaryColor, ), onTap: () async { await takeImageFromCamera(object.offer_code!).then((value) { print("datatatttta$value"); setState(() { updateofferUrl = value; // print(updateofferUrl); }); }); Navigator.pop(context); }, ), SizedBox( width: MediaQuery.of(context).size.width * .20, ), GestureDetector( child: Icon( Icons.photo, size: 100, color: primaryColor, ), onTap: () async { await pickImageFromGallery(object.offer_code).then((value) { print("datatatttta$value"); setState(() { updateofferUrl = value; // print(updateofferUrl); }); });; Navigator.pop(context); }, ), ], ), ), ); }); }, child: Container( width: MediaQuery.of(context).size.width, height: 150, child: updateofferUrl.isEmpty ? Image.network( "https://assets.aboutamazon.com/dims4/default/1db03c8/2147483647/strip/false/crop/2000x1125+0+0/resize/1200x675!/quality/90/?url=https%3A%2F%2Famazon-blogs-brightspot.s3.amazonaws.com%2Fa3%2Fc2%2F5c0b93db41d789be1bec015003bd%2Fpharmacy-hero-2000x1125.jpg", fit: BoxFit.cover, ) : Image.network( updateofferUrl, fit: BoxFit.cover, ), ), ), const SizedBox( height: 20, ), // Offer Name Container( padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), child: TextFormField( cursorColor: greyColor, controller: updateOfferNameController, textCapitalization: TextCapitalization.words, decoration: const InputDecoration( prefixIcon: Icon( Icons.person, color: primaryColor, ), border: OutlineInputBorder( borderSide: BorderSide(color: greyColor)), focusedBorder: OutlineInputBorder( borderSide: BorderSide(color: greyColor), ), enabledBorder: OutlineInputBorder( borderSide: BorderSide(color: greyColor), ), labelText: 'Offer name', labelStyle: TextStyle( color: greyColor, //<-- SEE HERE ), ), ), //tanker name ), const SizedBox( height: 20, ), Container( //padding: const EdgeInsets.fromLTRB(10, 10, 10, 0), child: TextFormField( cursorColor: greyColor, controller: updateOfferCodeController, textCapitalization: TextCapitalization.words, decoration: const InputDecoration( prefixIcon: Icon( Icons.numbers, color: primaryColor, ), border: OutlineInputBorder( borderSide: BorderSide(color: greyColor)), focusedBorder: OutlineInputBorder( borderSide: BorderSide(color: greyColor), ), enabledBorder: OutlineInputBorder( borderSide: BorderSide(color: greyColor), ), labelText: 'Offer Code', labelStyle: TextStyle( color: greyColor, //<-- SEE HERE ), ), ), //tanker name ), const SizedBox( height: 20, ), Container( //padding: const EdgeInsets.fromLTRB(10, 10, 10, 0), child: TextFormField( cursorColor: greyColor, controller: updateOfferDescriptionController, textCapitalization: TextCapitalization.words, decoration: const InputDecoration( prefixIcon: Icon( Icons.description, color: primaryColor, ), border: OutlineInputBorder( borderSide: BorderSide(color: greyColor)), focusedBorder: OutlineInputBorder( borderSide: BorderSide(color: greyColor), ), enabledBorder: OutlineInputBorder( borderSide: BorderSide(color: greyColor), ), labelText: 'Offer Description', labelStyle: TextStyle( color: greyColor, //<-- SEE HERE ), ), ), //tanker name ), const SizedBox( height: 30, ), Container( child: DropdownButtonFormField( // Initial Value value: dropdownTypeOfCategory, isExpanded: true, decoration: const InputDecoration( prefixIcon: Icon( Icons.type_specimen, color: primaryColor, ), border: OutlineInputBorder( borderSide: BorderSide(color: greyColor)), focusedBorder: OutlineInputBorder( borderSide: BorderSide(color: greyColor), ), enabledBorder: OutlineInputBorder( borderSide: BorderSide(color: greyColor), ), labelText: 'Type of category', labelStyle: TextStyle( color: greyColor, //<-- SEE HERE ), ), hint: Text('Select Type of category'), // Down Arrow Icon icon: const Icon(Icons.keyboard_arrow_down), // Array list of items items: typeOfCategoryItems.map((String items) { return DropdownMenuItem( value: items, child: Text(items), ); }).toList(), // After selecting the desired option,it will // change button value to selected value onChanged: (String? newValue) { setState(() { dropdownTypeOfCategory = newValue!; }); }, ), ), const SizedBox( height: 20, ), Container( child: TextFormField( readOnly: true, cursorColor: greyColor, controller: updateOfferStartDateController, decoration: InputDecoration( labelText: 'Select Start Date', prefixIcon: IconButton( icon: Icon( Icons.date_range, color: primaryColor, ), onPressed: () async { DatePicker.showDatePicker( context, dateFormat: 'dd MMMM yyyy', initialDateTime: DateTime.now(), minDateTime:DateTime.now(), maxDateTime: DateTime.now().add(Duration(days: 365)), onMonthChangeStartWithFirstDate: true, pickerMode: DateTimePickerMode.datetime, pickerTheme: DateTimePickerTheme( // backgroundColor: Colors.white, cancelTextStyle: labelTextStyle(), confirmTextStyle: labelTextStyle(), // showTitle: true, //title: Text('Pick date and time'), itemTextStyle: valuesTextStyle(), ), onConfirm: (dateTime, List index)async { DateTime selectdate = dateTime; setState(() { startdate = DateFormat('dd-MMM-yyyy').format(selectdate); }); if(startdate!=''){ setState(() { updateOfferStartDateController.text=startdate.toString(); }); } else { AppSettings.longFailedToast('Select start date'); } }, ); }, ), labelStyle: const TextStyle( color: greyColor, //<-- SEE HERE ), border: const OutlineInputBorder( borderSide: BorderSide(color: primaryColor)), focusedBorder: const OutlineInputBorder( borderSide: BorderSide(color: primaryColor), ), enabledBorder: const OutlineInputBorder( borderSide: BorderSide(color: primaryColor), ), ), ), ), const SizedBox( height: 20, ), Container( child: TextFormField( readOnly: true, cursorColor: greyColor, controller: updateOfferEndDateController, decoration: InputDecoration( labelText: 'Select end Date', prefixIcon: IconButton( icon: Icon( Icons.date_range, color: primaryColor, ), onPressed: () async { DatePicker.showDatePicker( context, dateFormat: 'dd MMMM yyyy', initialDateTime: DateTime.now(), minDateTime:DateTime.now(), maxDateTime: DateTime.now().add(Duration(days: 365)), onMonthChangeStartWithFirstDate: true, pickerMode: DateTimePickerMode.datetime, pickerTheme: DateTimePickerTheme( // backgroundColor: Colors.white, cancelTextStyle: labelTextStyle(), confirmTextStyle: labelTextStyle(), // showTitle: true, //title: Text('Pick date and time'), itemTextStyle: valuesTextStyle(), ), onConfirm: (dateTime, List index)async { DateTime selectdate = dateTime; setState(() { enddate = DateFormat('dd-MMM-yyyy').format(selectdate); }); if(enddate!=''){ setState(() { updateOfferEndDateController.text=enddate.toString(); }); } else { AppSettings.longFailedToast('Select end date'); } }, ); }, ), labelStyle: const TextStyle( color: greyColor, //<-- SEE HERE ), border: const OutlineInputBorder( borderSide: BorderSide(color: primaryColor)), focusedBorder: const OutlineInputBorder( borderSide: BorderSide(color: primaryColor), ), enabledBorder: const OutlineInputBorder( borderSide: BorderSide(color: primaryColor), ), ), ), ),//address description const SizedBox( height: 30, ), ], ), ), actions: [ TextButton( child: Text('Cancel', style: textButtonStyle()), onPressed: () { Navigator.of(context).pop(); }, ), TextButton( child: Text('Update', style: textButtonStyle()), onPressed: () async { if (updateOfferNameController.text != '' ) { AppSettings.preLoaderDialog(context); Map payload = { "offer_name": updateOfferNameController.text.toString(), "offer_code": updateOfferCodeController.text.toString(), "description":updateOfferDescriptionController.text.toString(), "category":dropdownTypeOfCategory.toString(), "starting_date":updateOfferStartDateController.text.toString(), "ending_date": updateOfferEndDateController.text.toString(), "picture": [ { "url":updateofferUrl } ], "offer_status": "active", }; bool offerStatus = await AppSettings.updateOffers(object.offer_code, payload); try { if (offerStatus) { Navigator.of(context, rootNavigator: true).pop(); AppSettings.longSuccessToast( "Offer Updated Successfully"); updateOfferNameController.text = ''; updateOfferCodeController.text = ''; updateOfferDescriptionController.text = ''; updateOfferStartDateController.text = ''; updateOfferEndDateController.text = ''; await getActiveOffersViewData(); await Navigator.push( context, MaterialPageRoute( builder: (context) => const OffersData()), ); } else { Navigator.of(context, rootNavigator: true).pop(); AppSettings.longFailedToast( "Offer upadtion failed"); Navigator.of(context).pop(); } } catch (exception) { Navigator.of(context).pop(); print(exception); } } else { AppSettings.longFailedToast("enter details"); } }, ), ], ); }, ); }, ); } Future getActiveOffersViewData() async { isActiveDataLoading = true; try { var data = await AppSettings.getOffers(); setState(() { List responseData = jsonDecode(data)['data']; activeOffersList = responseData .map((jsonObject) => GetOffersDetailsModel.fromJson(jsonObject)) .toList(); isActiveDataLoading = false; }); } catch (error) { setState(() { isActiveDataLoading = false; isSereverIssueConnected = true; }); } } @override void initState() { super.initState(); getActiveOffersViewData(); _pageController = PageController(initialPage: widget.position); } void removeItem(int index) { setState(() { widget.userdata.removeAt(index); if (_currentPageIndex > 0) { _currentPageIndex--; } }); _pageController = PageController(initialPage: _currentPageIndex); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Offers Details'), backgroundColor: primaryColor, leading: IconButton( icon: Icon(Icons.arrow_back), onPressed: () async { await Navigator.push( context, MaterialPageRoute( builder: (context) => const OffersData()), ); }, ), ), body: PageView.builder( controller: _pageController, itemCount: widget.userdata.length, onPageChanged: (int index) { setState(() { _currentPageIndex = index; }); }, itemBuilder: (BuildContext context, int index) { var object = widget.userdata[index]; return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Stack( children: [ Container( width: MediaQuery.of(context).size.width, // Set width to screen width height: 350, // Set your desired height child: GestureDetector( onTap: () { Navigator.push( context, MaterialPageRoute( builder: (context) => ZoomedImageView( imageUrl: widget.userdata[index].picture.isEmpty ? "https://assets.aboutamazon.com/dims4/default/1db03c8/2147483647/strip/false/crop/2000x1125+0+0/resize/1200x675!/quality/90/?url=https%3A%2F%2Famazon-blogs-brightspot.s3.amazonaws.com%2Fa3%2Fc2%2F5c0b93db41d789be1bec015003bd%2Fpharmacy-hero-2000x1125.jpg" : widget.userdata[index].picture[0].url, ), ), ); }, child: widget.userdata[index].picture.isEmpty ? Image.network( "https://assets.aboutamazon.com/dims4/default/1db03c8/2147483647/strip/false/crop/2000x1125+0+0/resize/1200x675!/quality/90/?url=https%3A%2F%2Famazon-blogs-brightspot.s3.amazonaws.com%2Fa3%2Fc2%2F5c0b93db41d789be1bec015003bd%2Fpharmacy-hero-2000x1125.jpg", fit: BoxFit.cover, ) : Image.network( widget.userdata[index].picture[0].url, fit: BoxFit.cover, ), ), ), Positioned( left: 5.0, // Adjust this value as needed top: MediaQuery.of(context).size.height / 5 - 16.0, // Center vertically child: IconButton( icon: Icon(Icons.arrow_back_ios, color: Colors.white), onPressed: () { if (_pageController.page! > 0) { _pageController.previousPage( duration: Duration(milliseconds: 300), curve: Curves.easeInOut, ); } }, ), ), Positioned( right: 5.0, // Adjust this value as needed top: MediaQuery.of(context).size.height / 5 - 16.0, // Center vertically child: IconButton( icon: Icon(Icons.arrow_forward_ios, color: Colors.white), onPressed: () { if (_pageController.page! < widget.userdata.length - 1) { _pageController.nextPage( duration: Duration(milliseconds: 300), curve: Curves.easeInOut, ); } }, ), ), ], ), const SizedBox( height: 10, ), Padding( padding: EdgeInsets.only(left: 16.0), // Add left padding to all RichText widgets child: RichText( text: TextSpan( style: DefaultTextStyle.of(context).style, children: [ TextSpan( text: 'Name: ', style: TextStyle( color: Colors.black, fontSize: 20, fontWeight: FontWeight.bold, ), ), TextSpan( text: widget.userdata[index].offer_name, style: TextStyle( color: primaryColor, fontSize: 20, fontWeight: FontWeight.bold, ), ), ], ), ), ), const SizedBox( height: 5, ), Padding( padding: EdgeInsets.only(left: 16.0), // Add left padding to all RichText widgets child: RichText( text: TextSpan( style: DefaultTextStyle.of(context).style, children: [ TextSpan( text: 'Code: ', style: TextStyle( color: Colors.black, fontSize: 20, fontWeight: FontWeight.bold, ), ), TextSpan( text: widget.userdata[index].offer_code, style: TextStyle( color: primaryColor, fontSize: 20, fontWeight: FontWeight.bold, ), ), ], ), ), ), const SizedBox( height: 5, ), Padding( padding: EdgeInsets.only(left: 16.0), // Add left padding to all RichText widgets child: RichText( text: TextSpan( style: DefaultTextStyle.of(context).style, children: [ TextSpan( text: 'Description: ', style: TextStyle( color: Colors.black, fontSize: 20, fontWeight: FontWeight.bold, ), ), TextSpan( text: widget.userdata[index].description ?? "", style: TextStyle( fontSize: 20, fontWeight: FontWeight.bold, color: primaryColor, ), ), ], ), ), ), const SizedBox( height: 5, ), Padding( padding: EdgeInsets.only(left: 16.0), // Add left padding to all RichText widgets child: RichText( text: TextSpan( style: DefaultTextStyle.of(context).style, children: [ TextSpan( text: 'Category: ', style: TextStyle( color: Colors.black, fontSize: 20, fontWeight: FontWeight.bold, ), ), TextSpan( text: widget.userdata[index].category ?? "", style: TextStyle( fontSize: 20, fontWeight: FontWeight.bold, color: primaryColor, ), ), ], ), ), ), const SizedBox( height: 5, ), Padding( padding: EdgeInsets.only(left: 16.0), // Add left padding to all RichText widgets child: RichText( text: TextSpan( style: DefaultTextStyle.of(context).style, children: [ TextSpan( text: 'StartDate: ', style: TextStyle( fontSize: 20, color: Colors.black, fontWeight: FontWeight.bold, ), ), TextSpan( text: widget.userdata[index].starting_date ?? "", style: TextStyle( color: primaryColor, fontSize: 20, fontWeight: FontWeight.bold, ), ), ], ), ), ), const SizedBox( height: 5, ), Padding( padding: EdgeInsets.only(left: 16.0), // Add left padding to all RichText widgets child: RichText( text: TextSpan( style: DefaultTextStyle.of(context).style, children: [ TextSpan( text: 'EndDate: ', style: TextStyle( fontSize: 20, color: Colors.black, fontWeight: FontWeight.bold, ), ), TextSpan( text: widget.userdata[index].ending_date ?? "", style: TextStyle( color: primaryColor, fontSize: 20, fontWeight: FontWeight.bold, ), ), ], ), ), ), const SizedBox( height: 15, ), Padding( padding: EdgeInsets.only(left: 16.0), // Add left padding child: Row( children: [ Switch( value: false, onChanged: (value) { setState(() { switchValue = value; showDialog( context: context, builder: (BuildContext context) { return AlertDialog( title: const Text('Are you sure you want to in_active this Offer?', style: TextStyle( color: primaryColor, fontSize: 20, )), actionsAlignment: MainAxisAlignment.spaceBetween, actions: [ TextButton( onPressed: () async { // Perform the action print("offercode${widget.userdata[index].offer_code}"); bool deleteOfferStatus = await AppSettings.deleteOffers( widget.userdata[index].offer_code); if(deleteOfferStatus){ widget.userdata.remove(widget.userdata[index]); switchValue=false; } else{ switchValue=false; } await Navigator.push( context, MaterialPageRoute( builder: (context) => const OffersData()), ); // Close the dialog }, child: const Text('Yes', style: TextStyle( color: primaryColor, fontSize: 20, )), ), TextButton( onPressed: () { Navigator.of(context).pop(false); }, child: const Text('No', style: TextStyle( color: primaryColor, fontSize: 20, )), ), ], ); }, ); }); }, ), const SizedBox( width: 100, ), IconButton( icon: Icon(Icons.edit), onPressed: () { showUpdateOfferDialog(object, index); }, ), ], ), ), ], ); }, ), ); } }