You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pharmacy/lib/createoffers.dart

584 lines
27 KiB

import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:healthcare_pharmacy/dashboard.dart';
import 'package:healthcare_pharmacy/settings.dart';
import 'package:healthcare_pharmacy/zoomable_image.dart';
import 'package:intl/intl.dart';
import 'package:flutter_cupertino_datetime_picker/flutter_cupertino_datetime_picker.dart';
import 'package:image_picker/image_picker.dart';
import 'package:image/image.dart' as Img;
class offers extends StatefulWidget {
const offers({Key? key}) : super(key: key);
@override
State<offers> createState() => _offersState();
}
class _offersState extends State<offers> {
TextEditingController offer_nameController = TextEditingController();
TextEditingController offer_codeController = TextEditingController();
TextEditingController descriptionController = TextEditingController();
TextEditingController starting_dateController = TextEditingController();
TextEditingController ending_dateController = TextEditingController();
String dropdownTypeOfCategory = 'A {1 - 500}';
var typeOfCategoryItems = [
'A {1 - 500}',
'B {501 - 1000}',
'C {1001 - 2000}',
'D {Above 2000}',
'S {Special offer}',
];
var selIOS;
final ImagePicker _picker = ImagePicker();
String offerUrl='';
File? _imageFile;
Future<void> pickImageFromGallery() async {
try {
final image = await _picker.pickImage(source: ImageSource.gallery);
if (image == null) return;
final File imageFile = File(image.path);
// Read the image from file
List<int> imageBytes = await imageFile.readAsBytes();
Img.Image? decodedImage = Img.decodeImage(imageBytes);
// Compress the image
List<int> compressedImage = Img.encodeJpg(decodedImage!, quality: 45);
// Save the compressed image back to file
await imageFile.writeAsBytes(compressedImage);
AppSettings.preLoaderDialog(context);
var res = await AppSettings.offeruploadImageHTTPNew(imageFile);
print(jsonDecode(res));
setState(() {
offerUrl = jsonDecode(res)['picture'][0]['url'];
print(offerUrl);
});
Navigator.of(context, rootNavigator: true).pop();
} on PlatformException catch (e) {
print('Failed to pick image: $e');
}
}
Future takeImageFromCamera() async {
try {
final image = await _picker.pickImage(source: ImageSource.camera);
if (image == null) return;
final File imageFile = File(image.path);
// Read the image from file
List<int> imageBytes = await imageFile.readAsBytes();
Img.Image? decodedImage = Img.decodeImage(imageBytes);
// Compress the image
List<int> compressedImage = Img.encodeJpg(decodedImage!, quality: 45);
// Save the compressed image back to file
await imageFile.writeAsBytes(compressedImage);
AppSettings.preLoaderDialog(context);
var res = await AppSettings.offeruploadImageHTTPNew(imageFile);
print(jsonDecode(res));
setState(() {
offerUrl = jsonDecode(res)['picture'][0]['url'];
print(offerUrl);
});
Navigator.of(context, rootNavigator: true).pop();
} on PlatformException catch (e) {
print('Failed to pick image: $e');
}
}
@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
appBar: AppSettings.appBar('Cteate Offers'),
body: Stack(children: <Widget>[
GestureDetector(
onTap: () {
FocusManager.instance.primaryFocus?.unfocus();
},
child: SafeArea(
child: SingleChildScrollView(
child: Column(
children: <Widget>[
SizedBox(
height: 20,
),
Container(child: GestureDetector(
child: Container(
width: MediaQuery.of(context).size.width * .60,
height: MediaQuery.of(context).size.height * .15,
decoration: BoxDecoration(
shape: BoxShape.rectangle,
border: Border.all(width: 2, color: Colors.blueGrey),
image: DecorationImage(
image: (offerUrl!= ''&&
offerUrl!= 'null') ?
NetworkImage(offerUrl) as ImageProvider : AssetImage("images/mobilebg.png"), // picked file
fit: BoxFit.cover)),
),
onTap: () {
showModalBottomSheet<void>(
context: context,
builder: (BuildContext context) {
return SizedBox(
height: 200,
child: Center(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
GestureDetector(
child: Icon(
Icons.camera_alt_outlined,
size: 100,
color: primaryColor,
),
onTap: () async {
await takeImageFromCamera();
Navigator.pop(context);
},
),
SizedBox(
width:
MediaQuery.of(context).size.width * .20,
),
GestureDetector(
child: Icon(
Icons.photo,
size: 100,
color: primaryColor,
),
onTap: () async {
await pickImageFromGallery();
Navigator.pop(context);
},
),
],
),
),
);
});
},
),),
SizedBox(
height: 15,
),
GestureDetector(
child: Container(
child: Center(
child: Text(
'Preview Image',
style: TextStyle(
color: primaryColor,
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => ZoomableImage(offerUrl),
),
);
},
),
SizedBox(
height: 20,
),
Container(
padding: const EdgeInsets.all(10),
child: TextFormField(
cursorColor: greyColor,
controller: offer_nameController,
textCapitalization: TextCapitalization.sentences,
decoration: const InputDecoration(
prefixIcon: Icon(
Icons.person,
color: primaryColor,
),
border: OutlineInputBorder(
borderSide: BorderSide(color: primaryColor)),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: primaryColor),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: primaryColor),
),
labelText: 'Enter Offer Name',
labelStyle: TextStyle(
color: greyColor, //<-- SEE HERE
),
),
),
), //name
SizedBox(
height: 05,
),
Container(
padding: const EdgeInsets.all(10),
child: TextFormField(
cursorColor: greyColor,
controller: offer_codeController,
textCapitalization: TextCapitalization.sentences,
decoration: const InputDecoration(
prefixIcon: Icon(
Icons.numbers,
color: primaryColor,
),
border: OutlineInputBorder(
borderSide: BorderSide(color: primaryColor)),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: primaryColor),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: primaryColor),
),
labelText: 'Enter Offer Code',
labelStyle: TextStyle(
color: greyColor, //<-- SEE HERE
),
),
),
),
const SizedBox(
height: 5,
),
Container(
padding: const EdgeInsets.all(10),
child: TextFormField(
cursorColor: greyColor,
controller: descriptionController,
textCapitalization: TextCapitalization.sentences,
keyboardType: TextInputType.multiline,
maxLines: null,
decoration: const InputDecoration(
prefixIcon: Icon(
Icons.description,
color:primaryColor,
),
contentPadding: const EdgeInsets.symmetric(vertical:40.0, horizontal:30.0),
border: OutlineInputBorder(
borderSide: BorderSide(color: greyColor)),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: greyColor),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: greyColor),
),
labelText: 'Enter Offer Description',
labelStyle: TextStyle(
color: greyColor, //<-- SEE HERE
),
),
),
),
const SizedBox(
height: 30,
),
Container(
padding: const EdgeInsets.fromLTRB(10, 10, 10, 0),
child: DropdownButtonFormField(
// Initial Value
value: dropdownTypeOfCategory,
isExpanded: true,
decoration: const InputDecoration(
prefixIcon: Icon(
Icons.water,
color: greyColor,
),
border: OutlineInputBorder(
borderSide: BorderSide(color: greyColor)),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: greyColor),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: greyColor),
),
labelText: 'Type of water storage',
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: 5,
),
Container(
padding: const EdgeInsets.fromLTRB(10, 10, 10, 0),
child: TextFormField(
readOnly: true,
cursorColor: greyColor,
controller: starting_dateController,
decoration: InputDecoration(
labelText: 'Select Start Date',
prefixIcon: const Icon(Icons.date_range, color: primaryColor,),
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),
),
suffixIcon: IconButton(
icon: Icon(
Icons.date_range,
),
onPressed: () async {
DateTime? pickedDate = await showDatePicker(
context: context,
/* initialDate: DateTime.now(),
firstDate: DateTime(1950),
lastDate: DateTime.now(),*/
initialDate: DateTime.now(),
firstDate: DateTime(1950), // Set the first selectable date to a past date
lastDate: DateTime(2100), // Set the last selectable date to a future date
builder: (BuildContext context, Widget? child) {
return Theme(
data: ThemeData.dark().copyWith(
colorScheme: ColorScheme.dark(
primary: buttonColors,
onPrimary: Colors.white,
surface: buttonColors,
onSurface: Colors.white,
),
dialogBackgroundColor: primaryColor,
),
child: child!,
);
},
);
if (pickedDate != null) {
print(
pickedDate); //pickedDate output format => 2021-03-10 00:00:00.000
String formattedDate =
DateFormat('dd-MM-yyyy').format(pickedDate);
print(
formattedDate); //formatted date output using intl package => 2021-03-16
setState(() {
starting_dateController.text=formattedDate.toString();
});
} else {}
},
),
),
),
),
const SizedBox(
height: 5,
),
Container(
padding: const EdgeInsets.fromLTRB(10, 10, 10, 0),
child: TextFormField(
readOnly: true,
cursorColor: greyColor,
controller: ending_dateController,
decoration: InputDecoration(
labelText: 'Select End Date',
prefixIcon: const Icon(Icons.date_range, color: primaryColor,),
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),
),
suffixIcon: IconButton(
icon: Icon(
Icons.date_range,
),
onPressed: () async {
DateTime? pickedDate = await showDatePicker(
context: context,
initialDate: DateTime.now(),
firstDate: DateTime(1950), // Set the first selectable date to a past date
lastDate: DateTime(2100), // Set the last selectable date to a future date
builder: (BuildContext context, Widget? child) {
return Theme(
data: ThemeData.dark().copyWith(
colorScheme: ColorScheme.dark(
primary: buttonColors,
onPrimary: Colors.white,
surface: buttonColors,
onSurface: Colors.white,
),
dialogBackgroundColor: primaryColor,
),
child: child!,
);
},
);
if (pickedDate != null) {
print(
pickedDate); //pickedDate output format => 2021-03-10 00:00:00.000
String formattedDate =
DateFormat('dd-MM-yyyy').format(pickedDate);
print(
formattedDate); //formatted date output using intl package => 2021-03-16
setState(() {
ending_dateController.text=formattedDate.toString();
});
} else {}
},
),
),
),
),//address description
const SizedBox(
height:15,
),
Container(
width:MediaQuery.of(context).size.width * .99,
height: 55,
padding: const EdgeInsets.fromLTRB(3, 0, 3, 0),
child: ElevatedButton(
style: ElevatedButton.styleFrom(
primary: buttonColor, // background
onPrimary: Colors.white, // foreground
),
onPressed: () async {
if (offer_nameController.text != '' &&
offer_codeController.text != '' &&
descriptionController.text != ''&&
starting_dateController.text != '' &&
ending_dateController.text != '') {
AppSettings.preLoaderDialog(context);
/* var payload = new Map<String, dynamic>();
payload["offer_name"] = offer_nameController.text.toString();
payload["offer_code"] = offer_codeController.text.toString();
payload["description"] = descriptionController.text.toString();;
payload["starting_date"] = starting_dateController.text.toString();
payload["ending_date"] = ending_dateController.text.toString();
payload["picture"] = [offerUrl];
payload["offer_status"] ="active";
print(payload);*/
Map<String, dynamic> payload = {
"offer_name": offer_nameController.text.toString(),
"offer_code": offer_codeController.text.toString(),
"description":descriptionController.text.toString(),
"starting_date":starting_dateController.text.toString(),
"ending_date": ending_dateController.text.toString(),
"category":dropdownTypeOfCategory.toString(),
"picture": [
{
"url": offerUrl
}
],
"offer_status": "active",
};
bool offerStatus = await AppSettings.createOffers(payload);
try{
if (offerStatus) {
Navigator.pop(context);
Navigator.of(context,rootNavigator: true).pop();
Navigator.push(
context,
MaterialPageRoute(builder: (context) => Dashboard()),
);
AppSettings.longSuccessToast("Offer Created Succesfully!!");
} else {
Navigator.of(context,rootNavigator: true).pop();
AppSettings.longFailedToast("Please enter all fields");
}
}
catch(exception){
print(exception);
AppSettings.longFailedToast("Please enter valid details");
Navigator.of(context,rootNavigator: true).pop();
}
} else {
AppSettings.longFailedToast("Offer Not Created!!");
Navigator.of(context,rootNavigator: true).pop();
}
},
child: Text('Create'),
)),//login button
const SizedBox(
height: 10,
),
],
),
)),
),
])), );
}
}