diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index ee8e308..bc93226 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -12,7 +12,7 @@
{
List images = [
"images/createoffer.png",
"images/activeoffer.png",
- "images/inactiveoffer.png",
+ // "images/inactiveoffer.png",
/* "images/reports.png",
"images/prescriptions.png",
@@ -76,16 +78,16 @@ class _DashboardState extends State {
Navigator.push(
context,
MaterialPageRoute(
- builder: (context) => const OffersView()),
+ builder: (context) => const OffersData()),
);
}
- else if(ind==2){
+ /* else if(ind==2){
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const InActiveOffersView()),
);
- }
+ }*/
/*
else if(ind==3){
Navigator.push(
@@ -195,11 +197,15 @@ class _DashboardState extends State {
final image = await _picker.pickImage(source: ImageSource.gallery);
if (image == null) return;
final imageTemp = File(image.path);
+
+ AppSettings.preLoaderDialog(context);
+ var res = await AppSettings.uploadImageHTTPNew(image);
+ print(jsonDecode(res));
+ Navigator.of(context, rootNavigator: true).pop();
setState(() {
- AppSettings.updatedImage = imageTemp;
+ AppSettings.profilePictureUrl = jsonDecode(res)['picture'];
});
- uploadProfileApi(image.path);
- AppSettings.saveProfile(image.path);
+ AppSettings.saveData('profile', jsonDecode(res)['picture'], 'STRING');
} on PlatformException catch (e) {
print('Failed to pick image: $e');
}
@@ -210,12 +216,14 @@ class _DashboardState extends State {
final image = await _picker.pickImage(source: ImageSource.camera);
if (image == null) return;
final imageTemp = File(image.path);
+ AppSettings.preLoaderDialog(context);
+ var res = await AppSettings.uploadImageHTTPNew(image);
+ print(jsonDecode(res));
+ Navigator.of(context, rootNavigator: true).pop();
setState(() {
- AppSettings.updatedImage = imageTemp;
+ AppSettings.profilePictureUrl = jsonDecode(res)['picture'];
});
-
- uploadProfileApi(image.path);
- AppSettings.saveProfile(image.path);
+ AppSettings.saveData('profile', jsonDecode(res)['picture'], 'STRING');
} on PlatformException catch (e) {
print('Failed to pick image: $e');
}
@@ -321,21 +329,22 @@ class _DashboardState extends State {
Expanded(
child: GestureDetector(
child: Container(
- width: MediaQuery.of(context).size.width * .30,
+ width: MediaQuery.of(context).size.width * .60,
height:
- MediaQuery.of(context).size.height * .30,
+ MediaQuery.of(context).size.height * .25,
decoration: BoxDecoration(
shape: BoxShape.rectangle,
- border: Border.all(width: 5, color: Colors.blueGrey),
image: DecorationImage(
- image: (AppSettings.updatedImage !=
- null)
- ? FileImage(
- AppSettings.updatedImage!)
+ image: (AppSettings.profilePictureUrl !=
+ '' &&
+ AppSettings.profilePictureUrl !=
+ 'null')
+ ? NetworkImage(AppSettings
+ .profilePictureUrl)
as ImageProvider
: AssetImage(
"images/mobilebg.png"), // picked file
- fit: BoxFit.cover)),
+ fit: BoxFit.fitWidth)),
),
onTap: () {
showModalBottomSheet(
@@ -584,21 +593,21 @@ class _DashboardState extends State {
const SizedBox(
width: 10,
),
- Text('ActiveOffersView', style: TextStyle(color: Colors.black)),
+ Text('OffersData', style: TextStyle(color: Colors.black)),
],
),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
- builder: (context) => const OffersView()),
+ builder: (context) => const OffersData()),
);
},
),
Divider(
color: Colors.grey,
),
- ListTile(
+ /*ListTile(
title: Row(
children: const [
Image(
@@ -626,7 +635,7 @@ class _DashboardState extends State {
),
Divider(
color: Colors.grey,
- ),
+ ),*/
ListTile(
title: Row(
children: const [
diff --git a/lib/getmedicines.dart b/lib/getmedicines.dart
index bfea93c..fa01e1f 100644
--- a/lib/getmedicines.dart
+++ b/lib/getmedicines.dart
@@ -2,11 +2,13 @@ import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
-import 'package:healthcare_pharmacy/models/medicineview_model.dart';
+import 'package:healthcare_pharmacy/models/GetMedecineDetailsModel.dart';
import 'package:healthcare_pharmacy/settings.dart';
import 'package:flutter/services.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:cloudinary_public/cloudinary_public.dart';
+import 'package:photo_view/photo_view.dart';
+
class GetMedicines extends StatefulWidget {
const GetMedicines({Key? key}) : super(key: key);
@@ -23,13 +25,13 @@ class _GetMedicinesState extends State with TickerProviderStateMix
String userAddress='';
TextEditingController searchController = TextEditingController();
- String dropdownArea = '2';
String medicine_name='';
- List medImages=[];
-
- //String dropdownType = 'Tank';
-
+ String medicine_manufacturers='';
+ String medicine_salt_composition='';
+ String medicine_mrp='';
+ String medicine_primary_use='';
+ List medImages=[];
Future getAllMedecineData(var medicineName) async {
FilteredList=[];
@@ -43,6 +45,10 @@ class _GetMedicinesState extends State with TickerProviderStateMix
if(jsonDecode(medecineResponse)!=''){
setState(() {
medicine_name=jsonDecode(medecineResponse)['medicine'][0]['name'];
+ medicine_manufacturers=jsonDecode(medecineResponse)['medicine'][0]['manufacturers'];
+ medicine_salt_composition=jsonDecode(medecineResponse)['medicine'][0]['salt_composition'];
+ medicine_mrp=jsonDecode(medecineResponse)['medicine'][0]['mrp'];
+ medicine_primary_use=jsonDecode(medecineResponse)['medicine'][0]['primary_use'];
medImages=jsonDecode(medecineResponse)['imageUrls'];
/* medecineList =
((jsonDecode(medecineResponse)['medicine']) as List).map((dynamic model) {
@@ -76,28 +82,211 @@ class _GetMedicinesState extends State with TickerProviderStateMix
}
+
+ showPicDialog(var imageUrl){
+ return showDialog(
+ context: context,
+ barrierDismissible: false,
+ builder: (BuildContext context) {
+ return StatefulBuilder(
+ builder: (BuildContext context, StateSetter setState) {
+ return AlertDialog(
+ title: const Text(''),
+ content: SingleChildScrollView(
+ child: ListBody(
+ children: [
+ Container(
+ width: MediaQuery.of(context).size.width * .10,
+ height: MediaQuery.of(context).size.height * .30,
+ child: PhotoView(
+ imageProvider: NetworkImage(imageUrl) as ImageProvider,
+ maxScale: PhotoViewComputedScale.contained * 4.0,
+ minScale: PhotoViewComputedScale.contained,
+ initialScale: PhotoViewComputedScale.contained,
+ basePosition: Alignment.center,
+
+ )
+ )
+ ],
+ ),
+ ),
+ actions: [
+ TextButton(
+ child: Text('Close', style: textButtonStyle()),
+ onPressed: () {
+ Navigator.of(context).pop();
+ },
+ ),
+ ],
+ );
+ });
+ },
+ );
+ }
+
+
+
+ /*Widget _bindMedicines(){
+ if (medecineList.length != 0) {
+ return Column(
+ crossAxisAlignment: CrossAxisAlignment.end,
+ children: [
+ Expanded(child:ListView.builder(
+ padding: EdgeInsets.all(0),
+ itemCount: medecineList.length,
+ itemBuilder: (BuildContext context, int index) {
+ return Card(
+
+ //color: prescriptionsList[index].cardColor,
+ child: Padding(
+ padding:EdgeInsets.all(8) ,
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ GestureDetector(
+ child: Container(
+ width: MediaQuery.of(context).size.width * .18,
+ height:
+ MediaQuery.of(context).size.height * .10,
+ decoration: BoxDecoration(
+ shape: BoxShape.rectangle,
+ image: DecorationImage(
+ image: NetworkImage(medImages[0]) as ImageProvider, // picked file
+ fit: BoxFit.contain)),
+ ),
+ onTap: (){
+ showPicDialog(medImages[0]);
+
+ },
+ ),
+ SizedBox(width:MediaQuery.of(context).size.width * .02,),
+
+ Container(
+ width: MediaQuery.of(context).size.width * .55,
+ child: Column(
+ mainAxisAlignment: MainAxisAlignment.start,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(("Name :"+ medicine_name).toString().toUpperCase(),style: valuesTextStyle()),
+ Text(("Manufacturers :"+ medicine_manufacturers).toString().toUpperCase(),style: valuesTextStyle()),
+ Text(("Estimate Price :"+ medicine_mrp).toString().toUpperCase(),style: valuesTextStyle()),
+ Text(("Medicine_Use :"+ medicine_primary_use).toString().toUpperCase(),style: valuesTextStyle()),
+ ],
+ ),
+
+
+ ),
+
+ ],
+
+ ),
+ ],
+ ),
+ ),
+ );
+ }) ),
+ ]);
+ }
+ else{
+ return Center(
+ child: Padding(
+ padding: EdgeInsets.fromLTRB(0, 40, 0, 0),
+ child: isSereverIssue
+ ? Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ SizedBox(
+ height: 20,
+ ),
+ Text(
+ 'No medicine found with your search',style:serverIssueTextStyle() ,),
+ ],
+ )
+ : userAddress==''?Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Icon(Icons.search,color: primaryColor,size: 40,),
+ SizedBox(
+ height: 20,
+ ),
+ Text(
+ 'Please enter atleast 4 letters to continue search',style:TextStyle(
+ color: primaryColor,
+ fontWeight: FontWeight.bold,
+ ),),
+ ],
+ ):
+ Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Icon(Icons.dataset_rounded,color: primaryColor,size: 40,),
+ SizedBox(
+ height: 20,
+ ),
+ SizedBox(
+ height: 20,
+ ),
+ Text(
+ 'No medicine found with your search',style:serverIssueTextStyle() ,),
+ ],
+ ),
+ ));
+ }
+ }*/
+
+
Widget _bindMedicines() {
if (medicine_name!='') {
return Padding(padding: EdgeInsets.all(10),
child: Container(
width: double.infinity,
- child: Row(
- crossAxisAlignment: CrossAxisAlignment.start,
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.start,
children: [
- Container(
- width: MediaQuery.of(context).size.width * .18,
- height:
- MediaQuery.of(context).size.height * .10,
- decoration: BoxDecoration(
- shape: BoxShape.rectangle,
- image: DecorationImage(
- image: NetworkImage(medImages[0]) as ImageProvider, // picked file
- fit: BoxFit.contain)),
+
+ GestureDetector(
+ child: Container(
+ width: MediaQuery.of(context).size.width * .18,
+ height:
+ MediaQuery.of(context).size.height * .10,
+ decoration: BoxDecoration(
+ shape: BoxShape.rectangle,
+ image: DecorationImage(
+ image: NetworkImage(medImages[0]) as ImageProvider, // picked file
+ fit: BoxFit.contain)),
+ ),
+ onTap: (){
+ showPicDialog(medImages[0]);
+
+ },
+ ),
+
+ Text(("Name :"+ medicine_name),
+ style: TextStyle(fontWeight: FontWeight.bold),
+ ),
+ Text(("Manufacturers :"+ medicine_manufacturers),
+ style: TextStyle(fontWeight: FontWeight.bold),
+ ),
+ Text(
+ medicine_salt_composition,
+ style: TextStyle(fontWeight: FontWeight.bold),
),
- Text(medicine_name),
+ Text(("Estimate Price :"+ medicine_mrp),
+ style: TextStyle(fontWeight: FontWeight.bold),
+ ),
+ Text(("Medicine_Use :"+ medicine_primary_use),
+ style: TextStyle(fontWeight: FontWeight.bold),
+ ),
+
],
),
+
+
),
);
}
diff --git a/lib/login.dart b/lib/login.dart
index fd3096d..81476b9 100644
--- a/lib/login.dart
+++ b/lib/login.dart
@@ -94,7 +94,7 @@ class _LoginState extends State {
//width: double.infinity,
child: Image(
image: const AssetImage('images/logo.png'),
- height: MediaQuery.of(context).size.height * .25,
+ height: MediaQuery.of(context).size.height * .18,
)),
const SizedBox(
height: 15,
diff --git a/lib/models/GetMedecineDetailsModel.dart b/lib/models/GetMedecineDetailsModel.dart
new file mode 100644
index 0000000..bfbd260
--- /dev/null
+++ b/lib/models/GetMedecineDetailsModel.dart
@@ -0,0 +1,34 @@
+import 'package:flutter/material.dart';
+
+
+class GetMedecineDetailsModel {
+ String name = '';
+ String manufacturers = '';
+ String salt_composition = '';
+ String mrp='';
+ String primary_use='';
+
+
+ String bs64str='';
+ String picture='';
+ Map picture1={};
+ Color text_color=Colors.black;
+
+
+
+ GetMedecineDetailsModel();
+
+ factory GetMedecineDetailsModel.fromJson(Map json){
+ GetMedecineDetailsModel rtvm = new GetMedecineDetailsModel();
+
+ rtvm.name = json['name'] ?? '';
+ rtvm.manufacturers = json['manufacturers'] ?? '';
+ rtvm.salt_composition = json['salt_composition'] ?? '';
+ rtvm.mrp = json['mrp'] ?? '';
+ rtvm.primary_use = json['primary_use'] ??'';
+ rtvm.picture = json['picture'] ?? '';
+
+ return rtvm;
+ }
+
+}
\ No newline at end of file
diff --git a/lib/models/active_orders_model.dart b/lib/models/active_orders_model.dart
new file mode 100644
index 0000000..a62805b
--- /dev/null
+++ b/lib/models/active_orders_model.dart
@@ -0,0 +1,26 @@
+import 'package:flutter/material.dart';
+
+
+class ConnectedCustomersModel {
+ String customer_name = '';
+ String customer_phone_number='';
+ String customer_building_name='';
+ String customer_address='';
+ String customer_id='';
+ Color text_color=Colors.black;
+
+
+ ConnectedCustomersModel();
+
+ factory ConnectedCustomersModel.fromJson(Map json){
+ ConnectedCustomersModel rtvm = new ConnectedCustomersModel();
+
+ rtvm.customer_name = json['username'] ?? '';
+ rtvm.customer_phone_number = json['phone'] ?? '';
+ rtvm.customer_building_name = json['buildingName'] ?? '';
+ rtvm.customer_address = json['profile']['address1'] ?? '';
+ rtvm.customer_id = json['customerId'] ?? '';
+ return rtvm;
+ }
+
+}
\ No newline at end of file
diff --git a/lib/models/pending_orders_model.dart b/lib/models/pending_orders_model.dart
new file mode 100644
index 0000000..b933121
--- /dev/null
+++ b/lib/models/pending_orders_model.dart
@@ -0,0 +1,24 @@
+import 'package:flutter/material.dart';
+
+
+class PendingSuppliersModel {
+ String customer_name = '';
+ String customer_phone_number='';
+ String customer_address='';
+ String customer_id='';
+ Color text_color=Colors.black;
+
+
+ PendingSuppliersModel();
+
+ factory PendingSuppliersModel.fromJson(Map json){
+ PendingSuppliersModel rtvm = new PendingSuppliersModel();
+
+ rtvm.customer_name = json['username'] ?? '';
+ rtvm.customer_phone_number = json['phone'] ?? '';
+ rtvm.customer_address = json['profile']['address1'] ?? '';
+ rtvm.customer_id = json['customerId'] ?? '';
+ return rtvm;
+ }
+
+}
\ No newline at end of file
diff --git a/lib/models/pending_suppliers_model.dart b/lib/models/pending_suppliers_model.dart
new file mode 100644
index 0000000..b933121
--- /dev/null
+++ b/lib/models/pending_suppliers_model.dart
@@ -0,0 +1,24 @@
+import 'package:flutter/material.dart';
+
+
+class PendingSuppliersModel {
+ String customer_name = '';
+ String customer_phone_number='';
+ String customer_address='';
+ String customer_id='';
+ Color text_color=Colors.black;
+
+
+ PendingSuppliersModel();
+
+ factory PendingSuppliersModel.fromJson(Map json){
+ PendingSuppliersModel rtvm = new PendingSuppliersModel();
+
+ rtvm.customer_name = json['username'] ?? '';
+ rtvm.customer_phone_number = json['phone'] ?? '';
+ rtvm.customer_address = json['profile']['address1'] ?? '';
+ rtvm.customer_id = json['customerId'] ?? '';
+ return rtvm;
+ }
+
+}
\ No newline at end of file
diff --git a/lib/offersdata.dart b/lib/offersdata.dart
new file mode 100644
index 0000000..021deb3
--- /dev/null
+++ b/lib/offersdata.dart
@@ -0,0 +1,899 @@
+
+import 'dart:convert';
+
+import 'package:flutter/material.dart';
+import 'package:healthcare_pharmacy/models/offersview_model.dart';
+import 'package:healthcare_pharmacy/offers.dart';
+import 'package:healthcare_pharmacy/settings.dart';
+import 'package:intl/intl.dart';
+import 'package:flutter_cupertino_datetime_picker/flutter_cupertino_datetime_picker.dart';
+
+
+class OffersData extends StatefulWidget {
+ const OffersData({Key? key}) : super(key: key);
+
+ @override
+ State createState() => _OffersDataState();
+}
+
+class _OffersDataState extends State with TickerProviderStateMixin {
+ bool isOfferDataLoading=false;
+ bool isSereverIssue = false;
+ bool isSereverIssueConnected = false;
+ bool isSereverIssuePending = false;
+ var startdate;
+ var enddate;
+ TextEditingController updateOfferNameController = TextEditingController();
+ TextEditingController updateOfferCodeController = TextEditingController();
+ TextEditingController updateOfferDescriptionController = TextEditingController();
+ TextEditingController updateDiscountController = TextEditingController();
+ TextEditingController updateOfferStartDateController = TextEditingController();
+ TextEditingController updateOfferEndDateController = TextEditingController();
+ List activeOffersList = [];
+ List inactiveOffersList = [];
+
+
+ late TabController _controller;
+ bool isActiveDataLoading=false;
+ bool isinactiveDataLoading=false;
+
+
+
+ final List topTabs = [
+ Tab(
+ child: Column(
+ children: [Text('Active Offers')],
+ ),
+ ),
+ Tab(
+ child: Column(
+ children: [Text('InActive Offers')],
+ ),
+ ),
+
+ ];
+
+
+
+ Future getActiveOffersViewData() async {
+ isActiveDataLoading = true;
+ try {
+ var response = await AppSettings.getOffers();
+ setState(() {
+ activeOffersList =
+ ((jsonDecode(response)['data']) as List).map((dynamic model) {
+ return GetOffersDetailsModel.fromJson(model);
+ }).toList();
+ isActiveDataLoading = false;
+ });
+
+
+ } catch (e) {
+ setState(() {
+ isActiveDataLoading = false;
+ isSereverIssueConnected = true;
+ });
+ }
+ }
+
+
+ Future getInactiveOffersViewData() async {
+ isinactiveDataLoading = true;
+ try {
+ var response = await AppSettings.getinactiveOffers();
+ setState(() {
+ inactiveOffersList =
+ ((jsonDecode(response)['data']) as List).map((dynamic model) {
+ return GetOffersDetailsModel.fromJson(model);
+ }).toList();
+ isinactiveDataLoading = false;
+ });
+
+
+ } catch (e) {
+ setState(() {
+ isinactiveDataLoading = false;
+ isSereverIssueConnected = true;
+ });
+ }
+ }
+
+ showUpdateOfferDialog(var object) async {
+ updateOfferNameController.text = object.offer_name;
+ updateOfferCodeController.text = object.offer_code;
+ updateOfferDescriptionController.text = object.description;
+ updateDiscountController.text = object.discount_percentage;
+ updateOfferStartDateController.text=object.starting_date;
+ updateOfferEndDateController.text=object.ending_date;
+ return showDialog(
+ context: context,
+ barrierDismissible: false,
+ builder: (BuildContext context) {
+ return StatefulBuilder(
+ builder: (BuildContext context, StateSetter setState) {
+ return AlertDialog(
+ title: const Text('Update Offer'),
+ content: SingleChildScrollView(
+ child: ListBody(
+ children: [
+ Container(
+ padding: const EdgeInsets.fromLTRB(0, 0, 0, 0),
+ child: TextFormField(
+ cursorColor: greyColor,
+ controller: updateOfferNameController,
+ textCapitalization: TextCapitalization.characters,
+ 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: 'Enter 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.characters,
+ 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: 'Enter 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.characters,
+ 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: 'Enter Offer Description',
+ 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,
+ maxLength: 2,
+ controller: updateDiscountController,
+ textCapitalization: TextCapitalization.characters,
+ decoration: const InputDecoration(
+ prefixIcon: Icon(
+ Icons.percent_outlined,
+ color: primaryColor,
+ ),
+ border: OutlineInputBorder(
+ borderSide: BorderSide(color: greyColor)),
+ focusedBorder: OutlineInputBorder(
+ borderSide: BorderSide(color: greyColor),
+ ),
+ enabledBorder: OutlineInputBorder(
+ borderSide: BorderSide(color: greyColor),
+ ),
+ labelText: 'Enter Offer Discount',
+ labelStyle: TextStyle(
+ color: greyColor, //<-- SEE HERE
+ ),
+ ),
+ ), //tanker name
+ ),
+ 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 HH:mm',
+ initialDateTime: DateTime.now(),
+ minDateTime:DateTime.now(),
+ maxDateTime: DateTime.now().add(Duration(days: 15)),
+ 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 - HH:mm').format(selectdate);
+ });
+
+ if(startdate!=''){
+ setState(() {
+ updateOfferStartDateController.text=startdate.toString();
+ });
+ }
+ else {
+ AppSettings.longFailedToast('please select 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 HH:mm',
+ initialDateTime: DateTime.now(),
+ minDateTime:DateTime.now(),
+ maxDateTime: DateTime.now().add(Duration(days: 15)),
+ 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 - HH:mm').format(selectdate);
+ });
+
+ if(enddate!=''){
+ setState(() {
+ updateOfferEndDateController.text=enddate.toString();
+ });
+ }
+ else {
+ AppSettings.longFailedToast('please select 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);
+ var payload = new Map();
+
+ payload["offer_name"] = updateOfferNameController.text.toString();
+ payload["offer_code"] = updateOfferCodeController.text.toString();
+ payload["description"] = updateOfferDescriptionController.text.toString();
+ payload["discount_percentage"] = updateDiscountController.text.toString();
+ payload["starting_date"] = updateOfferStartDateController.text.toString();
+ payload["ending_date"] = updateOfferEndDateController.text.toString();
+ payload["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 = '';
+ updateDiscountController.text = '';
+ updateOfferStartDateController.text = '';
+ updateOfferEndDateController.text = '';
+
+ Navigator.of(context).pop();
+ await getActiveOffersViewData();
+ } else {
+ Navigator.of(context, rootNavigator: true).pop();
+ AppSettings.longFailedStyledToast(
+ "Offer upadtion failed", context);
+ Navigator.of(context).pop();
+ }
+ } catch (exception) {
+ Navigator.of(context).pop();
+ print(exception);
+ }
+ } else {
+ AppSettings.longFailedStyledToast("enter details", context);
+ }
+ },
+ ),
+ ],
+ );
+ });
+ },
+ );
+ }
+
+ @override
+ void initState() {
+ // TODO: implement initState
+ _controller = TabController(vsync: this, length: 2);
+ getActiveOffersViewData();
+ getInactiveOffersViewData();
+ super.initState();
+ }
+ Widget renderzActiveUi(){
+ if(activeOffersList.length!=0){
+
+ return Column(
+ crossAxisAlignment: CrossAxisAlignment.end,
+ children: [
+ Expanded(child:ListView.builder(
+ padding: EdgeInsets.all(0),
+ itemCount: activeOffersList.length,
+ itemBuilder: (BuildContext context, int index) {
+ return Card(
+
+ color: activeOffersList[index].cardColor,
+ child: Padding(
+ padding:EdgeInsets.all(8) ,
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+
+ Container(
+ //width: MediaQuery.of(context).size.width * .55,
+ child: Column(
+ children: [
+ Row(
+ mainAxisAlignment: MainAxisAlignment.start,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Column(
+ mainAxisAlignment: MainAxisAlignment.start,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text('OfferName :',style: labelTextStyle()),
+ Text('OfferCode :',style: labelTextStyle()),
+ Text('OfferDes :' ,style: labelTextStyle()),
+ Text('OfferDis(%) :' ,style: labelTextStyle()),
+ Text('StartDate :',style: labelTextStyle()),
+ Text('EndDate :' ,style: labelTextStyle()),
+
+ ],
+ ),
+ SizedBox(width: 5,),
+ Column(
+ mainAxisAlignment: MainAxisAlignment.start,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(activeOffersList[index].offer_name,style: valuesTextStyle()),
+ Text(activeOffersList[index].offer_code,style: valuesTextStyle()),
+ Text(activeOffersList[index].description,style: valuesTextStyle()),
+ Text(activeOffersList[index].discount_percentage,style: valuesTextStyle()),
+ Text(activeOffersList[index].starting_date,style: valuesTextStyle()),
+ Text(activeOffersList[index].ending_date,style: valuesTextStyle())
+
+ ],
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+
+ Expanded(child:IconButton(
+ icon: const Icon(Icons.edit,color: primaryColor,),
+ onPressed: () {
+ showUpdateOfferDialog(activeOffersList[index]);
+ },
+ ),),
+ Expanded(child:IconButton(
+ icon: const Icon(Icons.hide_source_rounded,color: primaryColor,),
+
+ onPressed: () async{
+ showDialog(
+ //if set to true allow to close popup by tapping out of the popup
+ //barrierDismissible: false,
+ context: context,
+ builder: (BuildContext context) => AlertDialog(
+ title: const Text('Do you want In_Active Offer??',
+ style: TextStyle(
+ color: primaryColor,
+ fontSize: 16,
+ )),
+ actionsAlignment: MainAxisAlignment.spaceBetween,
+ actions: [
+ TextButton(
+ onPressed: ()async {
+ bool deleteOfferStatus = await AppSettings.deleteOffers(activeOffersList[index].offer_code);
+ if(deleteOfferStatus){
+ getActiveOffersViewData();
+ AppSettings.longSuccessToast('Offer In_Active Successfully!!');
+ getInactiveOffersViewData();
+ Navigator.of(context).pop(true);
+ }
+ else{
+ AppSettings.longFailedToast('Offer In_Active failed');
+ }
+ },
+ child: const Text('Yes',
+ style: TextStyle(
+ color: primaryColor,
+ fontSize: 18,
+ )),
+ ),
+ TextButton(
+ onPressed: () {
+ Navigator.of(context).pop(true);
+ },
+ child: const Text('No',
+ style: TextStyle(
+ color: primaryColor,
+ fontSize: 18,
+ )),
+ ),
+ ],
+ ),
+ );
+
+
+
+ },
+ ),)
+
+ ],
+
+ ),
+ ),
+ );
+ }) ),
+ Padding(
+ padding: EdgeInsets.fromLTRB(8, 8, 8, 8),
+ child: CircleAvatar(
+ backgroundColor: primaryColor,
+ radius: 40,
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ IconButton(
+ iconSize: 40,
+ icon: const Icon(
+ Icons.add,
+ color: Colors.white,
+ ),
+ onPressed: () async{
+ Navigator.pop(context);
+ await Navigator.push(
+ context,
+ MaterialPageRoute(
+ builder: (context) => offers()),
+ );
+ //showBoreAddingDialog();
+ },
+ ),
+ /* Padding(
+ padding: EdgeInsets.fromLTRB(5, 0, 5, 5),
+ child: Text(
+ 'Add Tanks ',
+ style: TextStyle(color: Colors.white),
+ ),
+ )*/
+ ],
+ ),
+ ),
+ ),
+ ]);
+ }
+ else{
+ return Center(
+ child: Padding(
+ padding: EdgeInsets.fromLTRB(0, 40, 0, 0),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ SizedBox(height: MediaQuery.of(context).size.height * .25,),
+ Text('Click below icon to add new Offer'),
+ SizedBox(
+ height: 20,
+ ),
+ CircleAvatar(
+ backgroundColor: primaryColor,
+ radius: 40,
+ child: IconButton(
+ iconSize: 40,
+ icon: const Icon(
+ Icons.add,
+ color: Colors.white,
+ ),
+ onPressed: () async {
+ Navigator.pop(context);
+ await Navigator.push(
+ context,
+ MaterialPageRoute(
+ builder: (context) => offers()),
+ );
+ },
+ ),
+ )
+ ],
+ ),
+ )
+ );
+ }
+ }
+
+ Widget renderzInactiveUi(){
+ if(inactiveOffersList.length!=0){
+
+ return Column(
+ crossAxisAlignment: CrossAxisAlignment.end,
+ children: [
+ Expanded(child:ListView.builder(
+ padding: EdgeInsets.all(0),
+ itemCount: inactiveOffersList.length,
+ itemBuilder: (BuildContext context, int index) {
+ return Card(
+
+ color: inactiveOffersList[index].cardColor,
+ child: Padding(
+ padding:EdgeInsets.all(8) ,
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+
+ Container(
+ //width: MediaQuery.of(context).size.width * .55,
+ child: Column(
+ children: [
+ Row(
+ mainAxisAlignment: MainAxisAlignment.start,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Column(
+ mainAxisAlignment: MainAxisAlignment.start,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text('OfferName :',style: labelTextStyle()),
+ Text('OfferCode :',style: labelTextStyle()),
+ Text('OfferDes :' ,style: labelTextStyle()),
+ Text('OfferDis(%) :' ,style: labelTextStyle()),
+ Text('StartDate :',style: labelTextStyle()),
+ Text('EndDate :' ,style: labelTextStyle()),
+
+ ],
+ ),
+ SizedBox(width: 5,),
+ Column(
+ mainAxisAlignment: MainAxisAlignment.start,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(inactiveOffersList[index].offer_name,style: valuesTextStyle()),
+ Text(inactiveOffersList[index].offer_code,style: valuesTextStyle()),
+ Text(inactiveOffersList[index].description,style: valuesTextStyle()),
+ Text(inactiveOffersList[index].discount_percentage,style: valuesTextStyle()),
+ Text(inactiveOffersList[index].starting_date,style: valuesTextStyle()),
+ Text(inactiveOffersList[index].ending_date,style: valuesTextStyle())
+
+ ],
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+
+ Expanded(child:TextButton(
+ onPressed: () {
+ showDialog(
+ //if set to true allow to close popup by tapping out of the popup
+ //barrierDismissible: false,
+ context: context,
+ builder: (BuildContext context) => AlertDialog(
+ title: const Text('Do you want to Re_Active offer ??',
+ style: TextStyle(
+ color: primaryColor,
+ fontSize: 16,
+ )),
+ actionsAlignment: MainAxisAlignment.spaceBetween,
+ actions: [
+ TextButton(
+ onPressed: ()async {
+ bool deleteTankStatus = await AppSettings.reactiveOffers(inactiveOffersList[index].offer_code);
+
+ if(deleteTankStatus){
+ getInactiveOffersViewData();
+ AppSettings.longSuccessToast('offer Re_Active successfully');
+ getActiveOffersViewData();
+ Navigator.of(context).pop(true);
+
+ }
+ else{
+ AppSettings.longFailedToast('offer Re_Active failed');
+ }
+ },
+ child: const Text('Yes',
+ style: TextStyle(
+ color: primaryColor,
+ fontSize: 18,
+ )),
+ ),
+ TextButton(
+ onPressed: () {
+ Navigator.of(context).pop(true);
+ },
+ child: const Text('No',
+ style: TextStyle(
+ color: primaryColor,
+ fontSize: 18,
+ )),
+ ),
+ ],
+ ),
+ );
+ },
+ child: const Text(
+ 'RE_ACTIVE',
+ style: TextStyle(
+ color: primaryColor,
+ fontSize: 15,
+ fontWeight: FontWeight.bold
+ /* decoration: TextDecoration.underline,*/
+
+ ),
+ ),
+ ),
+
+ ),
+
+ ],
+
+ ),
+ ),
+ );
+ }) ),
+ Padding(
+ padding: EdgeInsets.fromLTRB(8, 8, 8, 8),
+ child: CircleAvatar(
+ backgroundColor: primaryColor,
+ radius: 40,
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ IconButton(
+ iconSize: 40,
+ icon: const Icon(
+ Icons.add,
+ color: Colors.white,
+ ),
+ onPressed: () async{
+ Navigator.pop(context);
+ await Navigator.push(
+ context,
+ MaterialPageRoute(
+ builder: (context) => offers()),
+ );
+ //showBoreAddingDialog();
+ },
+ ),
+ /* Padding(
+ padding: EdgeInsets.fromLTRB(5, 0, 5, 5),
+ child: Text(
+ 'Add Tanks ',
+ style: TextStyle(color: Colors.white),
+ ),
+ )*/
+ ],
+ ),
+ ),
+ ),
+ ]);
+ }
+ else{
+ return Center(
+ child: Padding(
+ padding: EdgeInsets.fromLTRB(0, 40, 0, 0),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ SizedBox(height: MediaQuery.of(context).size.height * .25,),
+ Text('Click below icon to add new Offer'),
+ SizedBox(
+ height: 20,
+ ),
+ CircleAvatar(
+ backgroundColor: primaryColor,
+ radius: 40,
+ child: IconButton(
+ iconSize: 40,
+ icon: const Icon(
+ Icons.add,
+ color: Colors.white,
+ ),
+ onPressed: () async {
+ Navigator.pop(context);
+ await Navigator.push(
+ context,
+ MaterialPageRoute(
+ builder: (context) => offers()),
+ );
+ },
+ ),
+ )
+ ],
+ ),
+ )
+ );
+ }
+ }
+
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(
+ title: Text('Offers'),
+ backgroundColor: primaryColor,
+ bottom: TabBar(
+ controller: _controller,
+ tabs: topTabs,
+ indicatorColor: Colors.blue,
+ unselectedLabelColor: Colors.white60,
+ indicatorWeight: 2,
+ ),),
+ /* body: */
+ body: TabBarView(controller: _controller, children: [
+ /*Container(
+ // color: Colors.lightGreenAccent,
+ child: isTankerDataLoading?Center(
+ child: CircularProgressIndicator(
+ color: primaryColor,
+ strokeWidth: 5.0,
+ ),
+ ):_tanker(),
+ ),*/
+ Container(
+ //color: Colors.lightBlueAccent,
+ child: isActiveDataLoading?Center(
+ child: CircularProgressIndicator(
+ color: primaryColor,
+ strokeWidth: 5.0,
+ ),
+ ):renderzActiveUi(),
+ ),
+ Container(
+ //color: Colors.lightBlueAccent,
+ child: isinactiveDataLoading?Center(
+ child: CircularProgressIndicator(
+ color: primaryColor,
+ strokeWidth: 5.0,
+ ),
+ ):renderzInactiveUi(),
+ ),
+
+
+ ]),
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/lib/request_customers.dart b/lib/request_customers.dart
new file mode 100644
index 0000000..d2a4bde
--- /dev/null
+++ b/lib/request_customers.dart
@@ -0,0 +1,226 @@
+import 'dart:convert';
+
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:healthcare_pharmacy/models/pending_suppliers_model.dart';
+import 'package:healthcare_pharmacy/settings.dart';
+
+
+
+class PendingCustomers extends StatefulWidget {
+
+
+
+ @override
+ State createState() => _PendingCustomersState();
+}
+
+class _PendingCustomersState extends State {
+
+ TextEditingController tankerNameController = TextEditingController();
+ TextEditingController tankerPhoneController = TextEditingController();
+ TextEditingController tankerAlterPhoneController = TextEditingController();
+
+ bool isPendingDataLoading=false;
+ List pendingSuppliersList = [];
+ bool isSereverIssuePending = false;
+ bool isLoading=false;
+
+
+
+
+
+
+
+
+ Future getPendingSuppliersData() async {
+ isPendingDataLoading = true;
+
+ try {
+ /* var response = await AppSettings.getPendingSuppliers();
+
+ setState(() {
+ pendingSuppliersList =
+ ((jsonDecode(response)['data']) as List).map((dynamic model) {
+ return PendingSuppliersModel.fromJson(model);
+ }).toList();
+ isPendingDataLoading = false;
+ });*/
+
+
+ } catch (e) {
+ setState(() {
+ isPendingDataLoading = false;
+ isSereverIssuePending = true;
+ });
+ }
+ }
+
+ @override
+ void initState() {
+ isLoading=true;
+ getPendingSuppliersData();
+ super.initState();
+ }
+
+
+
+ Widget renderzUi(){
+ if(pendingSuppliersList.length!=0){
+
+ return Column(
+ crossAxisAlignment: CrossAxisAlignment.end,
+ children: [
+ Expanded(child:ListView.builder(
+ padding: EdgeInsets.all(0),
+ itemCount: pendingSuppliersList.length,
+ itemBuilder: (BuildContext context, int index) {
+ return Card(
+ child: Padding(
+ padding:EdgeInsets.all(8) ,
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ Container(
+ width: MediaQuery.of(context).size.width * .50,
+ child: Row(
+ children: [
+ Column(
+ mainAxisAlignment:
+ MainAxisAlignment.spaceBetween,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text('username :',
+ style: labelTextStyle()),
+
+ SizedBox(height: 10,),
+ Text('contactNumber:',
+ style: labelTextStyle()),
+ SizedBox(height: 10,),
+ Text('address:',
+ style: labelTextStyle()),
+ ],
+ ),
+ SizedBox(width: 10,),
+ Expanded(child:Column(
+ mainAxisAlignment:
+ MainAxisAlignment.spaceBetween,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(
+ pendingSuppliersList[index]
+ .customer_name
+ .toUpperCase(),
+ style: valuesTextStyle()),
+ SizedBox(height: 10,),
+ Text(
+ pendingSuppliersList[index]
+ .customer_phone_number
+ .toUpperCase(),
+ style: valuesTextStyle()),
+ SizedBox(height: 10,),
+ Text(
+ pendingSuppliersList[index]
+ .customer_address
+ .toUpperCase(),
+ style: valuesTextStyle())
+ ],
+ ),)
+ ],
+ )
+ ),
+
+
+ TextButton(
+ child: Text(
+ 'Accept',
+ style: TextStyle(fontSize: 15,
+ color:primaryColor/*FilteredList[index].text_color*/ ),
+ ),
+ onPressed: () async{
+ var payload = new Map();
+ payload["supplierId"] =AppSettings.pharmacyId;
+ payload["customerId"] = pendingSuppliersList[index].customer_id;
+ /* bool requestStatus = await AppSettings.acceptRequest(payload);
+
+ if(requestStatus){
+ AppSettings.longSuccessToast("Request Accepted Successfully");
+ // await getConnectedSuppliersData();
+ await getPendingSuppliersData();
+
+ }
+ else{
+ }*/
+
+ },
+ ),
+
+ TextButton(
+ child: Text(
+ 'Reject',
+ style: TextStyle(fontSize: 15,
+ color:primaryColor/*FilteredList[index].text_color*/ ),
+ ),
+ onPressed: () async{
+ var payload = new Map();
+ payload["supplierId"] =AppSettings.pharmacyId;
+ payload["customerId"] = pendingSuppliersList[index].customer_id;
+
+ /* bool requestStatus = await AppSettings.rejectRequest(payload);
+ if(requestStatus){
+ AppSettings.longSuccessToast("Request Sent Successfully");
+ await getPendingSuppliersData();
+
+ }
+ else{
+
+ }*/
+
+
+
+
+ },
+ ),
+ ],
+
+ ),
+ ),
+ );
+ }) ),
+ ]);
+ }
+ else{
+ return Center(
+ child: Padding(
+ padding: EdgeInsets.fromLTRB(0, 40, 0, 0),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ SizedBox(height: MediaQuery.of(context).size.height * .25,),
+ Text('No Data Found'),
+ SizedBox(
+ height: 20,
+ ),
+
+ ],
+ ),
+ )
+ );
+ }
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return SafeArea(
+ child: Scaffold(
+ appBar: AppSettings.appBar('Pending Customers'),
+ body: isPendingDataLoading?Center(
+ child: CircularProgressIndicator(
+ color: primaryColor,
+ strokeWidth: 5.0,
+ ),
+ ):renderzUi(),
+ ));
+ }
+}
diff --git a/lib/settings.dart b/lib/settings.dart
index d0af6ef..7dff2f8 100644
--- a/lib/settings.dart
+++ b/lib/settings.dart
@@ -166,6 +166,7 @@ class AppSettings {
static String updatePharmacyUrl = host + 'update/currentPharmacy';
static String verifyPhnUrl = host + 'phone';
static String profilePicUrl = host + 'users/profile-picture';
+ static String uploadPicUrl = host + 'uploadsPharmacy';
static String resetTokenUrl = host + 'reset_token';
static String forgotPasswordUrl = host + 'forgotpassword';
static String resetPasswordUrl = host + 'resetpassword';
@@ -189,8 +190,10 @@ class AppSettings {
+
static File? updatedImage;
static String image = '';
+ static String profilePictureUrl = '';
static var api = {
'signIn': host + '/login',
};
@@ -256,7 +259,6 @@ class AppSettings {
}
}
-
static getData(String _key, type) async {
sharedPreferences = await SharedPreferences.getInstance();
if (type == 'STRING') {
@@ -270,6 +272,7 @@ class AppSettings {
}
}
+
static clearSharedPreferences() async {
sharedPreferences = await SharedPreferences.getInstance();
await sharedPreferences.clear();
@@ -346,6 +349,18 @@ class AppSettings {
}
}
+
+ static Future uploadImageHTTPNew(file) async {
+
+ var request = http.MultipartRequest('POST', Uri.parse(uploadPicUrl + '/' + healthpharmaIdsign));
+ request.files.add(await http.MultipartFile.fromPath('picture', file.path));
+ var res = await request.send();
+ var response = await http.Response.fromStream(res);
+ return response.body;
+
+ }
+
+
static Future updatePharmaData(payload) async {
try {
var response = await http.put(
@@ -359,6 +374,10 @@ class AppSettings {
phoneNumber = _response['phone'];
email = _response['emails'][0]['email'];
pharmacyDescription = _response['description'];
+ await saveData('pharmacyname', _response['simplydata']['pharmacyname'], 'STRING');
+ await saveData('phone', _response['simplydata']['phone'], 'STRING');
+ await saveData('email', _response['simplydata']['email'][0]['email'], 'STRING');
+ await loadDataFromMemory();
return true;
} else {
return false;
@@ -635,7 +654,6 @@ class AppSettings {
var uri = Uri.parse(profilePicUrl + '/' + pharmacyId);
var response = await http.post(uri,
body: json.encode(payload), headers: await buildRequestHeaders());
-
if (response.statusCode == 200) {
try {
var _response = json.decode(response.body);
@@ -674,13 +692,13 @@ class AppSettings {
dynamic input) async {
// save login name information
await saveData('pharmacyname', input['simplydata']['pharmacyname'], 'STRING');
+ await saveData('phone', input['simplydata']['phone'], 'STRING');
+ await saveData('email', input['simplydata']['email'][0]['email'], 'STRING');
await saveData(
'access_token', input['simplydata']['access_token'], 'STRING');
- await saveData('phone', input['simplydata']['phone'], 'STRING');
await saveData('pharmacyId', input['simplydata']['pharmacyId'], 'STRING');
- await saveData('email', input['simplydata']['email'][0]['email'], 'STRING');
// await saveData('customerId', input['simplydata']['customerId'], 'STRING');
- // await saveData('profile', input['simplydata']['picture'], 'STRING');
+ await saveData('profile', input['simplydata']['picture'], 'STRING');
await saveData('pharmacy_address', input['simplydata']['pharmacy_address'], 'STRING');
await saveData('latitude', input['simplydata']['latitude'], 'DOUBLE');
await saveData('longitude', input['simplydata']['longitude'], 'DOUBLE');
@@ -707,6 +725,7 @@ class AppSettings {
phoneNumber = await getData('phone', 'STRING');
healthpharmaIdsign = await getData('pharmacyId', 'STRING');
userLatitude = await getData('latitude', 'DOUBLE');
+ profilePictureUrl=await getData('profile', 'STRING');
userLongitude =await getData('longitude', 'DOUBLE');
fcmId =await getData('fcmId', 'STRING');
}
diff --git a/lib/updateprofile.dart b/lib/updateprofile.dart
index 0a352ae..9fc0aab 100644
--- a/lib/updateprofile.dart
+++ b/lib/updateprofile.dart
@@ -1,4 +1,4 @@
-
+import 'dart:convert';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
@@ -6,6 +6,8 @@ import 'package:healthcare_pharmacy/dashboard.dart';
import 'package:healthcare_pharmacy/settings.dart';
import 'package:image_picker/image_picker.dart';
import 'dart:io';
+import 'package:photo_view/photo_view.dart';
+
class UpdateProfile extends StatefulWidget {
@@ -16,6 +18,7 @@ class UpdateProfile extends StatefulWidget {
class _UpdateprofileState extends State {
+ String Url = '';
bool isPwdObscureText=true;
bool isConfirmPwdObscureText=true;
TextEditingController nameController = TextEditingController();
@@ -36,18 +39,22 @@ class _UpdateprofileState extends State {
super.initState();
}
final ImagePicker _picker = ImagePicker();
+
Future pickImageFromGallery() 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.uploadImageHTTPNew(image);
+ print(jsonDecode(res));
+ Navigator.of(context, rootNavigator: true).pop();
setState(() {
- AppSettings.updatedImage = imageTemp;
+ AppSettings.profilePictureUrl = jsonDecode(res)['picture'];
});
- //uploadProfileApi(AppSettings.updatedImage);
- AppSettings.saveProfile(image.path);
-
-
+ AppSettings.saveData('profile', jsonDecode(res)['picture'], 'STRING');
} on PlatformException catch (e) {
print('Failed to pick image: $e');
}
@@ -58,11 +65,15 @@ class _UpdateprofileState extends State {
final image = await _picker.pickImage(source: ImageSource.camera);
if (image == null) return;
final imageTemp = File(image.path);
+ AppSettings.preLoaderDialog(context);
+ var res = await AppSettings.uploadImageHTTPNew(image);
+ print(jsonDecode(res));
+ Navigator.of(context, rootNavigator: true).pop();
setState(() {
- AppSettings.updatedImage = imageTemp;
+ AppSettings.profilePictureUrl = jsonDecode(res)['picture'];
});
-
- // uploadProfileApi(AppSettings.updatedImage);
+ AppSettings.saveData('profile', jsonDecode(res)['picture'], 'STRING');
+ // uploadProfileApi(AppSettings.updatedImage);
AppSettings.saveProfile(image.path);
} on PlatformException catch (e) {
@@ -78,7 +89,7 @@ class _UpdateprofileState extends State {
body: Stack(children: [
Container(
decoration: const BoxDecoration(
- /* image: DecorationImage(
+ /* image: DecorationImage(
image: AssetImage("images/backgroundimage.png"),
fit: BoxFit.cover,
),*/
@@ -103,20 +114,13 @@ class _UpdateprofileState extends State {
Container(child: GestureDetector(
child: Container(
width: MediaQuery.of(context).size.width * .60,
- height:
- MediaQuery.of(context).size.height * .15,
+ height: MediaQuery.of(context).size.height * .15,
decoration: BoxDecoration(
shape: BoxShape.rectangle,
border: Border.all(width: 5, color: Colors.blueGrey),
image: DecorationImage(
- image: (AppSettings.updatedImage !=
- null)
- ? FileImage(
- AppSettings.updatedImage!)
- as ImageProvider
- : AssetImage(
- "images/mobilebg.png"), // picked file
- fit: BoxFit.cover)),
+ image: (AppSettings.profilePictureUrl != ''&& AppSettings.profilePictureUrl != 'null') ? NetworkImage(AppSettings.profilePictureUrl) as ImageProvider : AssetImage("images/mobilebg.png"), // picked file
+ fit: BoxFit.fitWidth)),
),
onTap: () {
showModalBottomSheet(
@@ -126,14 +130,13 @@ class _UpdateprofileState extends State {
height: 200,
child: Center(
child: Row(
- mainAxisAlignment:
- MainAxisAlignment.center,
+ mainAxisAlignment: MainAxisAlignment.center,
children: [
GestureDetector(
child: Icon(
Icons.camera_alt_outlined,
size: 100,
- color: greyColor,
+ color: primaryColor,
),
onTap: () async {
await takeImageFromCamera();
@@ -141,16 +144,14 @@ class _UpdateprofileState extends State {
},
),
SizedBox(
- width: MediaQuery.of(context)
- .size
- .width *
- .20,
+ width:
+ MediaQuery.of(context).size.width * .20,
),
GestureDetector(
child: Icon(
Icons.photo,
size: 100,
- color: greyColor,
+ color: primaryColor,
),
onTap: () async {
await pickImageFromGallery();
diff --git a/lib/user_request_orders.dart b/lib/user_request_orders.dart
new file mode 100644
index 0000000..1662052
--- /dev/null
+++ b/lib/user_request_orders.dart
@@ -0,0 +1,449 @@
+import 'dart:convert';
+import 'dart:io';
+import 'package:flutter_svg/flutter_svg.dart';import 'package:flutter/material.dart';
+
+import 'package:geolocator/geolocator.dart';
+import 'package:google_maps_flutter/google_maps_flutter.dart';
+import 'package:google_maps_flutter_android/google_maps_flutter_android.dart';
+import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart';
+import 'package:healthcare_pharmacy/models/active_orders_model.dart';
+import 'package:healthcare_pharmacy/models/pending_orders_model.dart';
+import 'package:healthcare_pharmacy/settings.dart';
+import 'package:location/location.dart' as locationmap;
+import 'google_maps_place_picker_mb/src/models/pick_result.dart';
+import 'google_maps_place_picker_mb/src/place_picker.dart';
+import 'package:url_launcher/url_launcher.dart';
+
+/*class ConectedPendingCustomers extends StatefulWidget {
+ const ConectedPendingCustomers({Key? key}) : super(key: key);
+
+ @override
+ State createState() => _ConectedPendingCustomersState();
+}
+
+class _ConectedPendingCustomersState extends State with TickerProviderStateMixin {
+ bool isSupplierDataLoading=false;
+ bool isSereverIssue = false;
+ bool isSereverIssueConnected = false;
+ bool isSereverIssuePending = false;
+
+ List connectedCustomersList = [];
+ List pendingSuppliersList = [];
+
+
+ late TabController _controller;
+ bool isConnectedDataLoading=false;
+ bool isPendingDataLoading=false;
+
+
+
+ final List topTabs = [
+ Tab(
+ child: Column(
+ children: [Text('Pending Customers')],
+ ),
+ ),
+ Tab(
+ child: Column(
+ children: [Text('Conected Customers')],
+ ),
+ ),
+
+ ];
+
+
+
+ Future getConnectedSuppliersData() async {
+ isConnectedDataLoading = true;
+
+ try {
+ var response = await AppSettings.getConnectedCustomers();
+
+ setState(() {
+ connectedCustomersList =
+ ((jsonDecode(response)['data']) as List).map((dynamic model) {
+ return ConnectedCustomersModel.fromJson(model);
+ }).toList();
+ isConnectedDataLoading = false;
+ });
+
+
+ } catch (e) {
+ setState(() {
+ isConnectedDataLoading = false;
+ isSereverIssuePending = true;
+ });
+ }
+ }
+
+
+ Future getPendingSuppliersData() async {
+ isPendingDataLoading = true;
+
+ try {
+ var response = await AppSettings.getPendingSuppliers();
+
+ setState(() {
+ pendingSuppliersList =
+ ((jsonDecode(response)['data']) as List).map((dynamic model) {
+ return PendingSuppliersModel.fromJson(model);
+ }).toList();
+ isPendingDataLoading = false;
+ });
+
+
+ } catch (e) {
+ setState(() {
+ isPendingDataLoading = false;
+ isSereverIssuePending = true;
+ });
+ }
+ }
+ @override
+ void initState() {
+ // TODO: implement initState
+ _controller = TabController(vsync: this, length: 2);
+ getConnectedSuppliersData();
+ getPendingSuppliersData();
+ super.initState();
+ }
+ Widget connectedCustomers(){
+ if(connectedCustomersList.length!=0){
+
+ return Column(
+ crossAxisAlignment: CrossAxisAlignment.end,
+ children: [
+ Expanded(child:ListView.builder(
+ padding: EdgeInsets.all(0),
+ itemCount: connectedCustomersList.length,
+ itemBuilder: (BuildContext context, int index) {
+ return Card(
+ child: Padding(
+ padding:EdgeInsets.all(8) ,
+ child: Container(
+ //width: MediaQuery.of(context).size.width * .50,
+ child: Row(
+ children: [
+ *//* Column(
+ mainAxisAlignment:
+ MainAxisAlignment.spaceBetween,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text('username :',
+ style: labelTextStyle()),
+
+ SizedBox(height: 10,),
+ Text('phone:',
+ style: labelTextStyle()),
+ SizedBox(height: 10,),
+ Text('buildingname:',
+ style: labelTextStyle()),
+ SizedBox(height: 10,),
+ Text('address:',
+ style: labelTextStyle()),
+ ],
+ ),
+ SizedBox(width: 10,),*//*
+ Expanded(child:Column(
+ mainAxisAlignment:
+ MainAxisAlignment.spaceBetween,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ *//* children: [
+ Text(
+ connectedCustomersList[index]
+ .customer_name
+ .toUpperCase(),
+ style: valuesTextStyle()),
+ SizedBox(height: 10,),
+ Text(
+ connectedCustomersList[index]
+ .customer_phone_number
+ .toUpperCase(),
+ style: valuesTextStyle()),
+ SizedBox(height: 10,),
+ Text(
+ connectedCustomersList[index]
+ .customer_building_name
+ .toUpperCase(),
+ style: valuesTextStyle()),
+ SizedBox(height: 10,),
+ Text(maxLines:3,
+ connectedCustomersList[index]
+ .customer_address
+ .toUpperCase(),
+ style: valuesTextStyle())
+ ],*//*
+ children: [
+ Text(
+ connectedCustomersList[index]
+ .customer_name
+ .toUpperCase(),
+ style: valuesTextStyle()),
+ SizedBox(height: 10,),
+ Text(
+ connectedCustomersList[index]
+ .customer_phone_number
+ .toUpperCase(),
+ style: valuesTextStyle()),
+ SizedBox(height: 10,),
+ Text(
+ connectedCustomersList[index]
+ .customer_building_name
+ .toUpperCase(),
+ style: valuesTextStyle()),
+ SizedBox(height: 10,),
+ Text(
+ connectedCustomersList[index]
+ .customer_address
+ .toUpperCase(),
+ style: valuesTextStyle())
+ ],
+ ),),
+ Column(
+ children: [
+ IconButton(
+ iconSize: 30,
+ icon: const Icon(
+ Icons.phone,
+ color: primaryColor,
+ ),
+ onPressed: () async {
+ final Uri _phoneUri = Uri(
+ scheme: "tel",
+ path: connectedCustomersList[index]
+ .customer_phone_number);
+ try {
+ await launch(
+ _phoneUri.toString());
+ } catch (error) {
+ throw ("Cannot dial");
+ }
+ },
+ ),
+ Text(
+ 'Call now',
+ style: iconBelowTextStyle(),
+ ),
+ ],
+ ),
+
+ ],
+
+ )
+ ),
+ ),
+ );
+ }) ),
+ ]);
+ }
+ else{
+ return Center(
+ child: Padding(
+ padding: EdgeInsets.fromLTRB(0, 40, 0, 0),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ SizedBox(height: MediaQuery.of(context).size.height * .25,),
+ Text('No Data Found'),
+ SizedBox(
+ height: 20,
+ ),
+
+ ],
+ ),
+ )
+ );
+ }
+ }
+
+ Widget pendingCustomers(){
+ if(pendingSuppliersList.length!=0){
+ return Column(
+ crossAxisAlignment: CrossAxisAlignment.end,
+ children: [
+ Expanded(child:ListView.builder(
+ padding: EdgeInsets.all(0),
+ itemCount: pendingSuppliersList.length,
+ itemBuilder: (BuildContext context, int index) {
+ return Card(
+ child: Padding(
+ padding:EdgeInsets.all(8) ,
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ Container(
+ width: MediaQuery.of(context).size.width * .50,
+ child: Row(
+ children: [
+ *//* Column(
+ mainAxisAlignment:
+ MainAxisAlignment.spaceBetween,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text('username :',
+ style: labelTextStyle()),
+
+ SizedBox(height: 10,),
+ Text('contactNumber:',
+ style: labelTextStyle()),
+ SizedBox(height: 10,),
+ Text('address:',
+ style: labelTextStyle()),
+ ],
+ ),
+ SizedBox(width: 10,),*//*
+ Expanded(child:Column(
+ mainAxisAlignment:
+ MainAxisAlignment.spaceBetween,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(
+ pendingSuppliersList[index]
+ .customer_name
+ .toUpperCase(),
+ style: valuesTextStyle()),
+ SizedBox(height: 10,),
+ Text(
+ pendingSuppliersList[index]
+ .customer_phone_number
+ .toUpperCase(),
+ style: valuesTextStyle()),
+ SizedBox(height: 10,),
+ Text(
+ pendingSuppliersList[index]
+ .customer_address
+ .toUpperCase(),
+ style: valuesTextStyle())
+ ],
+ ),)
+ ],
+ )
+ ),
+
+ TextButton(
+ child: Text(
+ 'Accept',
+ style: TextStyle(fontSize: 15,
+ color:primaryColor*//*FilteredList[index].text_color*//* ),
+ ),
+ onPressed: () async{
+ var payload = new Map();
+ payload["supplierId"] =AppSettings.supplierId;
+ payload["customerId"] = pendingSuppliersList[index].customer_id;
+ bool requestStatus = await AppSettings.acceptRequest(payload);
+
+ if(requestStatus){
+ AppSettings.longSuccessToast("Request Accepted Successfully");
+
+ await getPendingSuppliersData();
+ await getConnectedSuppliersData();
+
+ }
+ else{
+ }
+
+ },
+ ),
+
+ TextButton(
+ child: Text(
+ 'Reject',
+ style: TextStyle(fontSize: 15,
+ color:primaryColor*//*FilteredList[index].text_color*//* ),
+ ),
+ onPressed: () async{
+ var payload = new Map();
+ payload["supplierId"] =AppSettings.supplierId;
+ payload["customerId"] = pendingSuppliersList[index].customer_id;
+
+ bool requestStatus = await AppSettings.rejectRequest(payload);
+ if(requestStatus){
+ AppSettings.longSuccessToast("Rejected request Successfully");
+ await getPendingSuppliersData();
+
+ }
+ else{
+
+ }
+
+ },
+ ),
+ ],
+
+ ),
+ ),
+ );
+ }) ),
+ ]);
+ }
+ else{
+ return Center(
+ child: Padding(
+ padding: EdgeInsets.fromLTRB(0, 40, 0, 0),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ SizedBox(height: MediaQuery.of(context).size.height * .25,),
+ Text('No Data Found'),
+ SizedBox(
+ height: 20,
+ ),
+
+ ],
+ ),
+ )
+ );
+ }
+ }
+
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(
+ title: Text('Costumers'),
+ backgroundColor: primaryColor,
+ bottom: TabBar(
+ controller: _controller,
+ tabs: topTabs,
+ indicatorColor: Colors.blue,
+ unselectedLabelColor: Colors.white60,
+ indicatorWeight: 2,
+ ),),
+ *//* body: *//*
+ body: TabBarView(controller: _controller, children: [
+ *//*Container(
+ // color: Colors.lightGreenAccent,
+ child: isTankerDataLoading?Center(
+ child: CircularProgressIndicator(
+ color: primaryColor,
+ strokeWidth: 5.0,
+ ),
+ ):_tanker(),
+ ),*//*
+ Container(
+ //color: Colors.lightBlueAccent,
+ child: isPendingDataLoading?Center(
+ child: CircularProgressIndicator(
+ color: primaryColor,
+ strokeWidth: 5.0,
+ ),
+ ):pendingCustomers(),
+ ),
+ Container(
+ //color: Colors.lightBlueAccent,
+ child: isConnectedDataLoading?Center(
+ child: CircularProgressIndicator(
+ color: primaryColor,
+ strokeWidth: 5.0,
+ ),
+ ):connectedCustomers(),
+ ),
+
+
+ ]),
+ );
+ }
+
+}*/