latest code committed

master
Sneha 11 months ago
parent 8ffabfa11f
commit a771c0829a

@ -1,5 +1,19 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.arminta.doctor">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<application
android:label="doctor"
android:name="${applicationName}"
@ -30,5 +44,7 @@
<meta-data
android:name="flutterEmbedding"
android:value="2" />
<meta-data android:name="com.google.android.geo.API_KEY"
android:value="AIzaSyDJpK9RVhlBejtJu9xSGfneuTN6HOfJgSM"/>
</application>
</manifest>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 544 B

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 442 B

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 721 B

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.7 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 935 KiB

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 662 KiB

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 650 KiB

After

Width:  |  Height:  |  Size: 219 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 564 B

After

Width:  |  Height:  |  Size: 817 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

@ -1,4 +1,7 @@
import 'dart:convert';
import 'package:doctor/common/qrcode_display.dart';
import 'package:doctor/common/updateprofile.dart';
import 'package:doctor/connected_patients/connected_patients.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:image_picker/image_picker.dart';
@ -129,24 +132,24 @@ class _DashboardState extends State<Dashboard> {
shape: BoxShape.circle,
image: DecorationImage(
image: AssetImage(
"images/seekopinion.png"), // picked file
"images/myconnections.png"), // picked file
fit: BoxFit.fitWidth)),
),
onTap: () {
/* Navigator.push(
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const SeekOpinion()),
);*/
builder: (context) => const ConnectedPatients()),
);
},
),
Text(
'Seek Opinion',
'My Connections',
style: dashboardTextStyle(),
),
],
),
Column(
/*Column(
children: [
GestureDetector(
child: Container(
@ -161,11 +164,11 @@ class _DashboardState extends State<Dashboard> {
fit: BoxFit.fitWidth)),
),
onTap: () {
/*Navigator.push(
*//*Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const AllReports()),
);*/
);*//*
},
),
Text(
@ -173,11 +176,11 @@ class _DashboardState extends State<Dashboard> {
style: dashboardTextStyle(),
),
],
),
),*/
],
),
),
Padding(
/*Padding(
padding: EdgeInsets.all(10),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
@ -288,7 +291,7 @@ class _DashboardState extends State<Dashboard> {
),
],
),
)
)*/
]));
}
@ -298,16 +301,9 @@ class _DashboardState extends State<Dashboard> {
devicedetection();
}
/*Future<void> uploadProfileApi(image) async {
var payload = new Map<String, dynamic>();
payload["formData"] = image.toString();
var response1 = await AppSettings.updateProfilePicture(payload);
print(response1);
}*/
Future pickImageFromGallery() async {
/* try {
try {
final image = await _picker.pickImage(source: ImageSource.gallery);
if (image == null) return;
final imageTemp = File(image.path);
@ -322,11 +318,11 @@ class _DashboardState extends State<Dashboard> {
AppSettings.saveData('profile', jsonDecode(res)['picture'], 'STRING');
} on PlatformException catch (e) {
print('Failed to pick image: $e');
}*/
}
}
Future takeImageFromCamera() async {
/*try {
try {
final image = await _picker.pickImage(source: ImageSource.camera);
if (image == null) return;
final imageTemp = File(image.path);
@ -340,7 +336,7 @@ class _DashboardState extends State<Dashboard> {
AppSettings.saveData('profile', jsonDecode(res)['picture'], 'STRING');
} on PlatformException catch (e) {
print('Failed to pick image: $e');
}*/
}
}
showLogoutAlertDialog(context) {
@ -427,15 +423,20 @@ class _DashboardState extends State<Dashboard> {
children: [
DrawerHeader(
decoration: const BoxDecoration(
color: buttonColors,
color: secondaryColor,
),
child: Row(
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: GestureDetector(
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
GestureDetector(
child: Container(
width: MediaQuery.of(context).size.width * .20,
height:
@ -500,9 +501,65 @@ class _DashboardState extends State<Dashboard> {
});
},
),
Container(
child: AppSettings.qrCode==''?TextButton(
child: Text(
'GetQR',
style: TextStyle(
fontSize: 15,
color: Colors.white,
decoration: TextDecoration.underline,
),
),
onPressed: () async{
AppSettings.preLoaderDialog(context);
try{
var value = await AppSettings.generateQRCode();
var valueResponse = jsonDecode(value);
String dataUri = jsonDecode(value)['qrCodeData'];
List<String> parts = dataUri.split(",");
String? base64String = parts.length == 2 ? parts[1] : null;
if (base64String != null) {
print(base64String);
AppSettings.qrCode=base64String;
} else {
print("Invalid data URI");
}
Navigator.of(context, rootNavigator: true).pop();
}
catch(e){
Navigator.of(context, rootNavigator: true).pop();
}
},
):GestureDetector(
onTap: (){
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const DisplayQrCode()),
);
},
child: Container(
height:MediaQuery.of(context).size.height * .20,
width:MediaQuery.of(context).size.width * .1,
child: Image.memory(Uint8List.fromList(base64.decode(AppSettings.qrCode))),
),
),
)
],
),
),
Text(
AppSettings.userName,
AppSettings.doctorName,
style: drawerHeaderTextStyleNew(),
),
Text(
@ -536,7 +593,8 @@ class _DashboardState extends State<Dashboard> {
)
],
),
Container()
],
)),
ListTile(
@ -557,14 +615,14 @@ class _DashboardState extends State<Dashboard> {
],
),
onTap: () {
/*Navigator.push(
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const UpdateProfile()),
);*/
);
},
),
Divider(
/*Divider(
color: Colors.grey,
),
ListTile(
@ -757,6 +815,7 @@ class _DashboardState extends State<Dashboard> {
},
),
*/
Divider(
color: Colors.grey,
),

@ -104,6 +104,7 @@ class _LoginState extends State<Login> {
child: TextFormField(
cursorColor: greyColor,
controller: mobileNumberController,
style: textFormFieldFilledTextStyle(),
keyboardType: TextInputType.number,
decoration: textFormFieldDecoration(Icons.phone,'Enter MobileNumber'),
@ -112,29 +113,30 @@ class _LoginState extends State<Login> {
SizedBox(height:MediaQuery.of(context).size.height * .02,),
Container(
child: TextFormField(
cursorColor: greyColor,
cursorColor: secondaryColor,
obscureText: isObscureText,
controller: passwordController,
style: textFormFieldFilledTextStyle(),
decoration: InputDecoration(
fillColor: Colors.white,
fillColor: primaryColor,
filled: true,
labelText: 'Password',
prefixIcon: const Icon(Icons.password, color: greyColor,),
prefixIcon: const Icon(Icons.lock, color: secondaryColor,),
labelStyle: const TextStyle(
color: Colors.black, //<-- SEE HERE
color: secondaryColor,fontWeight: FontWeight.bold //<-- SEE HERE
),
border: const OutlineInputBorder(
borderSide: BorderSide(color: primaryColor)),
borderSide: BorderSide(color: secondaryColor)),
focusedBorder: const OutlineInputBorder(
borderSide: BorderSide(color: primaryColor),
borderSide: BorderSide(color: secondaryColor),
),
enabledBorder: const OutlineInputBorder(
borderSide: BorderSide(color: primaryColor),
borderSide: BorderSide(color: secondaryColor),
),
suffixIcon: IconButton(
icon: Icon(
Icons.visibility_off_outlined,
color: isObscureText==true?greyColor:primaryColor,
color: isObscureText==true?greyColor:secondaryColor,
),
onPressed: () {
@ -181,7 +183,7 @@ class _LoginState extends State<Login> {
),
onPressed: () async{
/* if (mobileNumberController.text != '' &&
if (mobileNumberController.text != '' &&
passwordController.text != '') {
AppSettings.preLoaderDialog(context);
@ -227,7 +229,7 @@ class _LoginState extends State<Login> {
else{
AppSettings.longFailedToast("Please enter valid details");
}*/
}
},
child: const Text('Login'),

@ -162,7 +162,7 @@ class _OtpScreenState extends State<OtpScreen> {
_fieldSix.text;
});
/*if (_otp!.length == 6) {
if (_otp!.length == 6) {
AppSettings.preLoaderDialog(context);
bool isOnline = await AppSettings.internetConnectivity();
@ -200,7 +200,7 @@ class _OtpScreenState extends State<OtpScreen> {
}
else{
}*/
}
},
child: const Text('Submit')),
)

@ -0,0 +1,123 @@
import 'dart:convert';
import 'dart:io';
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart';
import 'package:doctor/common/settings.dart';
import 'package:flutter_share/flutter_share.dart';
import 'package:share/share.dart';
import 'dart:typed_data';
import 'package:path_provider/path_provider.dart';
import 'package:http/http.dart' as http;
class DisplayQrCode extends StatefulWidget {
const DisplayQrCode({Key? key}) : super(key: key);
@override
State<DisplayQrCode> createState() => _DisplayQrCodeState();
}
class _DisplayQrCodeState extends State<DisplayQrCode> {
Future<void> share(var qr) async {
await FlutterShare.share(
title: 'Example share',
text: 'Example share text',
linkUrl: qr,
chooserTitle: 'Example Chooser Title');
}
Future<void> shareQRCodeImage1(qrData) async {
final tempDir = await getTemporaryDirectory();
final file = File('${tempDir.path}/qr_code.png');
await file.writeAsBytes(Uint8List.fromList(base64.decode(qrData)));
// Share the image using the share package
Share.shareFiles([file.path], text: 'Check out this QR code');
}
String imagePath = '';
Future<void> downloadQRImage() async {
final response = await http.get(Uri.parse(AppSettings.qrCode));
if (response.statusCode == 200) {
final directory = await getApplicationDocumentsDirectory();
final filePath = '${directory.path}/qr_image.png';
final File file = File(filePath);
await file.writeAsBytes(response.bodyBytes);
setState(() {
imagePath = filePath;
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppSettings.appBar('Qr Code'),
body: Container(
child: Padding(padding: EdgeInsets.all(10),
child: Column(
children: [
Center(
child: Container(
padding: EdgeInsets.fromLTRB(0, 20, 0, 0),
width: MediaQuery.of(context).size.width * .60, // Set the desired width
height: MediaQuery.of(context).size.height * .35, // Set the desired height
child:
Image.memory(Uint8List.fromList(base64.decode(AppSettings.qrCode),),
fit: BoxFit.fill),
),
),
SizedBox(
height:MediaQuery.of(context).size.height * .05,
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
IconButton(
onPressed: () {
//share(AppSettings.qrCode);
shareQRCodeImage1(AppSettings.qrCode);
},
icon: Icon(
Icons.share,
color: primaryColor,
size: 40,
),
),
/*IconButton(
onPressed: () {
downloadQRImage();
},
icon: Icon(
Icons.download,
color: primaryColor,
size: 40,
),
),*/
],
)
/*Container(
padding: EdgeInsets.fromLTRB(0, 20, 0, 0),
child: Center(child: Image.memory(Uint8List.fromList(base64.decode(AppSettings.qrCode),),),),
)*/
],
),),
),
);
}
}

@ -1,20 +1,19 @@
import 'dart:io';
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'dart:convert';
import 'package:flutter/services.dart';
import 'package:doctor/common/preloader.dart';
import 'package:http/http.dart' as http;
import 'package:shared_preferences/shared_preferences.dart';
import 'package:intl/intl.dart';
import 'dart:async';
import 'package:geolocator/geolocator.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:http/http.dart' as http;
//const Color primaryColor = Color(0XFF1786A3);
const Color primaryColor = Color(0XFF99405B);
const Color secondaryColor = Color(0XFFA0C899);
const Color buttonColors = Color(0XFFFFAC1C);
const Color secondaryColor = Color(0XFFD9D9D9);
const Color buttonColors = Color(0XFF1786A3);
const Color greyColor = Color(0XFF8F8E8E);
const Color textFieldStartColor = Colors.grey;
const Color screenBackgroundColor = Color(0XFFEAF6FF);
@ -22,10 +21,10 @@ const Color screenBackgroundColord = Colors.black12;
const Color dashboardbackground = Color(0XFFF5F5F5);
//Color AppBarGradient_1 = Color(0XFF1258F6);
Color AppBarGradient_1 = Color(0XFF68A85D);
Color AppBarGradient_1 = Color(0XFF99405B);
TextStyle PreloaderText() {
return TextStyle(color: Color(0XFF68A85D));
return TextStyle(color: Color(0XFF99405B));
}
TextStyle labelTextStyle() {
@ -170,24 +169,32 @@ TextStyle drawerHeaderTextStyleNew() {
return TextStyle(color: Colors.black, fontSize: 15);
}
TextStyle textFormFieldFilledTextStyle() {
return TextStyle(color: secondaryColor);
}
InputDecoration textFormFieldDecoration(IconData icon, var text) {
return InputDecoration(
filled: true,
fillColor: Colors.white,
fillColor: primaryColor,
prefixIcon: Icon(
icon,
color: greyColor,
color: secondaryColor,
),
border: OutlineInputBorder(borderSide: BorderSide(color: primaryColor)),
border: OutlineInputBorder(borderSide: BorderSide(color: secondaryColor)),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: primaryColor),
borderSide: BorderSide(color: secondaryColor),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: primaryColor),
borderSide: BorderSide(color: secondaryColor),
),
labelText: text,
/*labelStyle: TextStyle(
color: myFocusNode.hasFocus ? Colors.blue : Colors.black
)*/
labelStyle: TextStyle(
color: Colors.black, //<-- SEE HERE
color: secondaryColor,fontWeight: FontWeight.bold //<-- SEE HERE
),
);
}
@ -224,19 +231,28 @@ Future<void> preloaderWindow(BuildContext context) async {
class AppSettings {
static SharedPreferences sharedPreferences =
SharedPreferences.getInstance() as SharedPreferences;
static String userName = '';
static String userAddress = '';
static String doctorName = '';
static String specialization = '';
static String qualification = '';
static List placeOfPractices = [];
static String placeOfPractice1 = '';
static String placeOfPractice2 = '';
static String placeOfPractice3 = '';
static String placeOfPracticeAddress1 = '';
static String placeOfPracticeAddress2 = '';
static String placeOfPracticeAddress3 = '';
static String doctorAddress = '';
static String email = '';
static String age = '';
static String gender = '';
static String phoneNumber = '';
static String accessToken = '';
static String customerId = '';
static double userLatitude = 0;
static double userLongitude = 0;
static String doctorId = '';
static double doctorLatitude = 0;
static double doctorLongitude = 0;
static String customerIdsign = '';
static String profileImage = '';
static List<String> storedPreferenceValidKeys = ['username', 'access_token'];
static List<String> storedPreferenceValidKeys = ['doctorname', 'access_token'];
static String preloadText = 'Please wait';
static String latitude = '';
static String longitude = '';
@ -250,75 +266,31 @@ class AppSettings {
static String serverToken =
'AAAAA66BLaA:APA91bHcmbyiNN8hCL-t-M9oH-u7ZMOl74fcImMM2DQZLgdyY98Wu9XxME-CTPcjpjU6Yy48ouxISrOMb9lpa3PJofh8qciUKMNxV2al-bDvGvPP_VVaH0mrTHzR56hdkGy1Zl-0frDO';
static String qrCode = '';
static String originalQrCode = '';
//api urls
static String host = 'http://35.200.129.165:4000/api/';
static String loginUrl = host + 'login';
static String signUpUrl = host + 'users';
//static String host = 'http://35.200.129.165:4000/api/';
static String host = 'http://cloudh.in:4000/api/';
static String loginUrl = host + 'doctorlogin';
static String signUpUrl = host + 'addDoctor';
static String sendSmsUrl = host + 'sendSms';
static String phoneVerificationUrl = host + 'phone';
static String verifyPhnUrl = host + 'phone';
static String phoneVerificationUrl = host + 'doctorphone';
static String uploadPicUrl = host + 'uploadsDoctorProfilePicture';
static String updateProfileUrl = host + 'updateDoctor';
static String resetTokenUrl = host + 'reset_token';
static String bmiCaluculateUrl = host + 'insertBMI';
static String bpCaluculateUrl = host + 'insertBP';
static String sugarCaluculateUrl = host + 'insertSugar';
static String profilePicUrl = host + 'users/profile-picture';
static String inviteFriendUrl = host + 'sendInviteLink';
static String updateProfileUrl = host + 'update/currentUser';
static String updateLocationUrl = host + 'updateLocation';
static String uploadPicUrl = host + 'uploads';
static String getBmiHistoryUrl = host + 'usersbmi';
static String getBpHistoryUrl = host + 'usersbp';
static String getSugarHistoryUrl = host + 'userssugar';
static String addMedicineTimingsUrl = host + 'medicine-timing';
static String updateMedicineTimingsUrl = host + 'update-medicine-timing';
static String getMedicineTimingsUrl = host + 'getmedicineztiming';
static String findingsUploadPicUrl = host + 'uploads-findings-prescription';
static String addFindingsUrl = host + 'update-uploads-findingsPictureId-prescription';
static String addReportsUrl = host + 'update-uploads-reportsPictureId-prescription';
static String addPrescriptionsUrl = host + 'update-uploads-prescriptionPictureId-prescription';
static String updateFindingsUploadPicUrl = host + 'update-uploads-findings-prescription';
static String updateReportsUploadPicUrl = host + 'update-uploads-reports-prescription';
static String reportsUploadPicUrl = host + 'uploads-reports-prescription';
static String prescriptionUploadPicUrl = host + 'uploads-prescription-prescription';
static String updatePrescriptionPicUrl = host + 'update-uploads-prescription-prescription';
static String recordPrescriptionsUploadPicUrl = host + 'uploads-prescription-prescription';
static String getAllpharmaciesDataUrl = host + 'getAllPharmacylist';
static String getAllQuotationRequestsUrl = host + 'userprecription';
static String getQuotationUrl = host + 'submitPicture';
static String addPrescriptionUrl = host + 'add-prescription-details';
static String addRecordsUrl = host + 'add-record';
static String updateRecordsUrl = host + 'records';
static String reportMySelfVideoUploadUrl = host + 'reportProblemVideo';
static String uploadReportMyselfPictureUrl = host + 'reportProblemPicture';
//static String getAllPrescriptionsDataUrl = host + 'usersinglerprecription';
static String getAllPrescriptionsDataUrl = host + 'getAllPrescriptionDetails';
static String generateQRCodeUrl = host + 'generate-qrcode-doctor';
static String getAllConectedPatientsDataUrl = host + 'customerDetails';
static String getRecordsDataUrl = host + 'getAllRecords';
static String deleteRecordUrl = host + 'deleteRecord';
static String deleteFindingsUrl = host + 'delete-uploads-findings';
static String deletePrescriptionsUrl = host + 'delete-prescription';
static String deleteReportsUrl = host + 'delete-report';
static String deleteRecordsUrl = host + 'delete-url';
static String deleteBMIDetailsUrl = host + 'deleteBMI';
static String deleteBPDetailsUrl = host + 'deleteBP';
static String deleteSugarDetailsUrl = host + 'deleteSugar';
static String addReportMySelfProblemUrl = host + 'insertReport';
static String getAllReportProblemDetalisUrl = host + 'userreport';
static String deleteReportMySelfProblemUrl = host + 'deleteReportProblem';
static String getDynamicCodeUrl = host + 'records';
static String dynamicCodeVerificationUrl = host + 'verifyDynamicCode';
static File? updatedImage;
static String image = '';
static String profilePictureUrl = '';
static var api = {
'signIn': host + '/login',
};
/*Formatter*/
static String formNum(String s) {
@ -337,6 +309,7 @@ class AppSettings {
/* Preloader */
static GlobalKey<State> preLoaderKey = new GlobalKey<State>();
static Future<void> preLoaderDialog(BuildContext context) async {
try {
preLoaderKey = new GlobalKey<State>();
@ -359,8 +332,7 @@ class AppSettings {
return _headers;
}
static Future<Map<String, String>>
buildPutRequestHeadersForResetToken() async {
static Future<Map<String, String>> buildPutRequestHeadersForResetToken() async {
Map<String, String> _headers = new Map<String, String>();
return _headers;
}
@ -378,6 +350,9 @@ class AppSettings {
} else if (type == 'DOUBLE') {
await sharedPreferences.setDouble(_key, _value);
}
else if (type == 'LIST') {
await sharedPreferences.setStringList(_key, _value);
}
}
static getData(String _key, type) async {
@ -391,6 +366,9 @@ class AppSettings {
} else if (type == 'DOUBLE') {
return sharedPreferences.getDouble(_key) ?? -1;
}
else if (type == 'LIST') {
return sharedPreferences.getStringList(_key) ?? -1;
}
}
static clearSharedPrefeences() async {
@ -423,19 +401,279 @@ class AppSettings {
/*Apis Starts here*/
static Future<bool> signUp(payload) async {
var response = await http.post(Uri.parse(signUpUrl),
body: json.encode(payload),
headers: {'Content-type': 'application/json'});
if (response.statusCode == 200) {
try {
var _response = json.decode(response.body);
print(_response);
return true;
} catch (e) {
// display error toast
return false;
}
} else {
return false;
}
}
static Future<bool> sendSms(payload) async {
var response = await http.post(Uri.parse(sendSmsUrl),
body: json.encode(payload),
headers: {'Content-type': 'application/json'});
if (response.statusCode == 200) {
return true;
} else {
return false;
}
}
static Future<bool> phoneVerification(payload) async {
var response = await http.post(Uri.parse(phoneVerificationUrl),
body: json.encode(payload),
headers: {'Content-type': 'application/json'});
if (response.statusCode == 200) {
return true;
} else {
return false;
}
}
static Future<bool> login(payload) async {
var response = await http.post(Uri.parse(loginUrl),
body: json.encode(payload),
headers: {'Content-type': 'application/json'});
if (response.statusCode == 200) {
try {
var _response = json.decode(response.body);
if (_response['simplydata']['error'] == false) {
await saveAvailableReportAndLocationsInMemory(_response);
//await saveProfilePic(_response);
return true;
} else {
return false;
}
} catch (e) {
// display error toast
return false;
}
} else {
return false;
}
}
static Future<bool> resetToken() async {
var uri = Uri.parse(resetTokenUrl + '/' + doctorId);
try {
// var response = await http.get(uri, headers: await buildPutRequestHeaders());
var response = await http.get(uri,
headers: await buildPutRequestHeadersForResetToken());
if (response.statusCode == 200) {
print(response.body);
var res = jsonDecode(response.body);
print(res);
accessToken = res['access_token'];
return true;
} else {
return false;
}
} catch (e) {
print(e);
return false;
}
}
static Future<String> uploadImageHTTPNew(file) async {
var request = http.MultipartRequest(
'POST', Uri.parse(uploadPicUrl + '/' + doctorId));
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<bool> updateProfile(payload) async {
var uri = Uri.parse(updateProfileUrl + '/' + doctorId);
try {
var response = await http.put(uri,
body: json.encode(payload), headers: await buildRequestHeaders());
if (response.statusCode == 200) {
var _response = json.decode(response.body);
doctorName = _response['armintahealthdata']['doctorName'];
phoneNumber = _response['armintahealthdata']['phone'];
email = _response['armintahealthdata']['emails'][0]['email'];
age = _response['armintahealthdata']['age'].toString();
gender=_response['armintahealthdata']['gender'].toString();
specialization=_response['armintahealthdata']['specialization'].toString();
qualification=_response['armintahealthdata']['qualification'].toString();
if(_response['armintahealthdata']['placeOfPractice'].length>0){
placeOfPractice1=_response['armintahealthdata']['placeOfPractice'][0]['hospitalName']??'';
placeOfPracticeAddress1=_response['armintahealthdata']['placeOfPractice'][0]['address']??'';
}
await saveData('phone', _response['armintahealthdata']['phone'], 'STRING');
await saveData('email', _response['armintahealthdata']['emails'][0]['email'], 'STRING');
await saveData('doctorname', _response['armintahealthdata']['doctorName'], 'STRING');
await saveData('age', _response['armintahealthdata']['age'].toString(), 'STRING');
await saveData('specialization', _response['armintahealthdata']['specialization'], 'STRING');
await saveData('qualification', _response['armintahealthdata']['qualification'], 'STRING');
await saveData('gender', _response['armintahealthdata']['gender'], 'STRING');
if(_response['armintahealthdata']['placeOfPractice'].length>0){
await saveData('placeOfPractice1',_response['armintahealthdata']['placeOfPractice'][0]['hospitalName']??'', 'STRING');
await saveData('placeOfPracticeAddress1', _response['armintahealthdata']['placeOfPractice'][0]['address']??'', 'STRING');
}
await loadDataFromMemory();
return true;
} else {
return false;
}
} catch (e) {
print(e);
return false;
}
}
static Future<String> generateQRCode() async {
var uri = Uri.parse(generateQRCodeUrl + '/' + doctorId);
var response = await http.post(uri, headers: await buildPutRequestHeaders());
if (response.statusCode == 200) {
return response.body;
} else if (response.statusCode == 401) {
bool status = await AppSettings.resetToken();
if (status) {
response = await http.post(uri, headers: await buildPutRequestHeaders());
if (response.statusCode == 200) {
return response.body;
} else {
return '';
}
} else {
return '';
}
} else {
return '';
}
}
static Future<String> getAllConectedPatients() async {
var uri = Uri.parse(getAllConectedPatientsDataUrl + '/' + doctorId);
//uri = uri.replace(query: 'customerId=$customerId');
var response = await http.get(uri, headers: await buildRequestHeaders());
if (response.statusCode == 200) {
return response.body;
} else if (response.statusCode == 401) {
bool status = await AppSettings.resetToken();
if (status) {
response = await http.get(uri, headers: await buildRequestHeaders());
if (response.statusCode == 200) {
return response.body;
} else {
return '';
}
} else {
return '';
}
} else {
return '';
}
}
static Future<String> getAllRecords(customerId) async {
var uri = Uri.parse(getRecordsDataUrl + '/' + customerId);
//uri = uri.replace(query: 'customerId=$customerId');
var response = await http.get(uri, headers: await buildRequestHeaders());
if (response.statusCode == 200) {
return response.body;
} else if (response.statusCode == 401) {
bool status = await AppSettings.resetToken();
if (status) {
response = await http.get(uri, headers: await buildRequestHeaders());
if (response.statusCode == 200) {
return response.body;
} else {
return '';
}
} else {
return '';
}
} else {
return '';
}
}
static Future<String> getDynamicCode(payload) async {
var uri = Uri.parse(getDynamicCodeUrl );
//uri = uri.replace(query: 'customerId=$customerId');
var response = await http.post(uri,body: json.encode(payload), headers: await buildRequestHeaders());
if (response.statusCode == 200) {
return response.body;
} else if (response.statusCode == 401) {
bool status = await AppSettings.resetToken();
if (status) {
response = await http.post(uri,body: json.encode(payload), headers: await buildRequestHeaders());
if (response.statusCode == 200) {
return response.body;
} else {
return '';
}
} else {
return '';
}
} else {
return '';
}
}
static Future<bool> dynamicCodeVerification(payload) async {
var uri = Uri.parse(dynamicCodeVerificationUrl + '/'+doctorId);
var response = await http.post(uri, body: json.encode(payload), headers: await buildRequestHeaders());
if (response.statusCode == 200) {
return true;
}
else if (response.statusCode == 401) {
bool status = await AppSettings.resetToken();
if (status) {
response = await http.post(uri, body: json.encode(payload), headers: await buildRequestHeaders());
if (response.statusCode == 200) {
return true;
} else {
return false;
}
} else {
return false;
}
}else {
return false;
}
}
/*Apis ends here*/
//save data local
static Future<void> saveAvailableReportAndLocationsInMemory(
dynamic input) async {
static Future<void> saveAvailableReportAndLocationsInMemory(dynamic input) async {
// save login name information
await saveData('username', input['simplydata']['username'], 'STRING');
await saveData(
'access_token', input['simplydata']['access_token'], 'STRING');
await saveData('doctorname', input['simplydata']['doctorName'], 'STRING');
await saveData('access_token', input['simplydata']['access_token'], 'STRING');
await saveData('phone', input['simplydata']['phone'], 'STRING');
await saveData('email', input['simplydata']['email'][0]['email'], 'STRING');
await saveData('customerId', input['simplydata']['customerId'], 'STRING');
await saveData('doctorId', input['simplydata']['doctorId'], 'STRING');
await saveData('profile', input['simplydata']['picture'], 'STRING');
await saveData('user_address', input['simplydata']['address1'], 'STRING');
await saveData('latitude', input['simplydata']['latitude'], 'DOUBLE');
@ -443,24 +681,56 @@ class AppSettings {
await saveData('fcmId', input['simplydata']['fcmId'], 'STRING');
await saveData('age', input['simplydata']['age'], 'STRING');
await saveData('gender', input['simplydata']['gender'], 'STRING');
await saveData('qrCode', input['simplydata']['qrCode'], 'STRING');
await saveData('specialization', input['simplydata']['specialization'], 'STRING');
await saveData('qualification', input['simplydata']['qualification'], 'STRING');
if(input['simplydata']['placeOfPractice'].length>0){
await saveData('placeOfPractice1', input['simplydata']['placeOfPractice'][0]['hospitalName']??'', 'STRING');
await saveData('placeOfPractice2', input['simplydata']['placeOfPractice'][1]['hospitalName']??'', 'STRING');
await saveData('placeOfPractice3', input['simplydata']['placeOfPractice'][2]['hospitalName']??'', 'STRING');
await saveData('placeOfPracticeAddress1', input['simplydata']['placeOfPractice'][0]['address']??'', 'STRING');
await saveData('placeOfPracticeAddress2', input['simplydata']['placeOfPractice'][1]['address']??'', 'STRING');
await saveData('placeOfPracticeAddress3', input['simplydata']['placeOfPractice'][2]['address']??'', 'STRING');
}
//await saveData('age', input['simplydata']['age'], 'STRING');
//latitude,longitude
await loadDataFromMemory();
}
static Future<void> loadDataFromMemory() async {
userName = await getData('username', 'STRING');
doctorName = await getData('doctorname', 'STRING');
accessToken = await getData('access_token', 'STRING');
email = await getData('email', 'STRING');
userAddress = await getData('user_address', 'STRING');
doctorAddress = await getData('user_address', 'STRING');
phoneNumber = await getData('phone', 'STRING');
customerId = await getData('customerId', 'STRING');
userLatitude = await getData('latitude', 'DOUBLE');
userLongitude = await getData('longitude', 'DOUBLE');
doctorId = await getData('doctorId', 'STRING');
doctorLatitude = await getData('latitude', 'DOUBLE');
doctorLongitude = await getData('longitude', 'DOUBLE');
profilePictureUrl = await getData('profile', 'STRING');
specialization= await getData('specialization', 'STRING');
qualification= await getData('qualification', 'STRING');
fcmId = await getData('fcmId', 'STRING');
age = await getData('age', 'STRING');
gender = await getData('gender', 'STRING');
originalQrCode = await getData('qrCode', 'STRING');
String dataUri = originalQrCode;
// Split the data URI at the comma to extract the Base64 part
List<String> parts = dataUri.split(",");
String? base64String = parts.length == 2 ? parts[1] : null;
if (base64String != null) {
qrCode=base64String;
} else {
print("Invalid data URI");
}
placeOfPractice1= await getData('placeOfPractice1', 'STRING');
placeOfPractice2= await getData('placeOfPractice2', 'STRING');
placeOfPractice3= await getData('placeOfPractice3', 'STRING');
placeOfPracticeAddress1= await getData('placeOfPracticeAddress1', 'STRING');
placeOfPracticeAddress2= await getData('placeOfPracticeAddress2', 'STRING');
placeOfPracticeAddress3= await getData('placeOfPracticeAddress3', 'STRING');
}

@ -36,6 +36,10 @@ class _SignUpState extends State<SignUp> {
TextEditingController userAddressCapturingController = TextEditingController();
TextEditingController passwordController = TextEditingController();
TextEditingController confirmPasswordController = TextEditingController();
FocusNode myFocusNode = new FocusNode();
String? gender;
var genderUnitItems = [
'Male',
'Female',
@ -65,11 +69,6 @@ class _SignUpState extends State<SignUp> {
isConfirmPwdObscureText = true;
super.initState();
}
PickResult? selectedPlace;
bool _mapsInitialized = false;
@ -163,6 +162,7 @@ class _SignUpState extends State<SignUp> {
child: Padding(
padding: EdgeInsets.all(10),
child: Column(
children: <Widget>[
SizedBox(
@ -180,15 +180,15 @@ class _SignUpState extends State<SignUp> {
),
Container(
child: TextFormField(
cursorColor: greyColor,
cursorColor: secondaryColor,
controller: nameController,
style: textFormFieldFilledTextStyle(),
textCapitalization: TextCapitalization.words,
decoration: textFormFieldDecoration(Icons.person,'Enter Name'),
),
), //name
SizedBox(height:MediaQuery.of(context).size.height * .02,),
Container(
/*Container(
child: DropdownButtonFormField(
// Initial Value
value: genderUnit,
@ -235,13 +235,14 @@ class _SignUpState extends State<SignUp> {
genderUnit = newValue!;
});
},
),),
),),*/
SizedBox(height:MediaQuery.of(context).size.height * .02,),
Container(
child: TextFormField(
cursorColor: greyColor,
cursorColor: secondaryColor,
controller: mobileNumberController,
keyboardType: TextInputType.phone,
style: textFormFieldFilledTextStyle(),
maxLength: 10,
decoration: textFormFieldDecoration(Icons.phone_android,'Enter Mobile Number'),
),
@ -250,8 +251,9 @@ class _SignUpState extends State<SignUp> {
GestureDetector(
child: Container(
child: TextFormField(
cursorColor: greyColor,
cursorColor: secondaryColor,
controller: userAddressCapturingController,
style: textFormFieldFilledTextStyle(),
onTap:()
{
@ -356,6 +358,7 @@ class _SignUpState extends State<SignUp> {
},
keyboardType: TextInputType.streetAddress,
readOnly: true,
decoration:textFormFieldDecoration(Icons.location_on_rounded,'Click to select address(map)'),
),
@ -367,42 +370,85 @@ class _SignUpState extends State<SignUp> {
SizedBox(height:MediaQuery.of(context).size.height * .02,),
Container(
child: TextFormField(
cursorColor: greyColor,
cursorColor: secondaryColor,
controller: userAddressDescriptionController,
keyboardType: TextInputType.emailAddress,
style: textFormFieldFilledTextStyle(),
decoration: textFormFieldDecoration(Icons.plagiarism_outlined,'Address Description (Ex: Flat No)'),
),
),//address description
SizedBox(height:MediaQuery.of(context).size.height * .02,),
Text('Select Gender',style: textFormFieldFilledTextStyle(),),
Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(child: RadioListTile(
title: Text("Male",style: TextStyle(color: secondaryColor,fontSize: 11)),
value: "male",
groupValue: gender,
activeColor: secondaryColor,
onChanged: (value){
setState(() {
gender = value.toString();
});
},
),),
Expanded(child: RadioListTile(
title: Text("Female",style:TextStyle(color: secondaryColor,fontSize: 11)),
value: "female",
groupValue: gender,
activeColor: secondaryColor,
onChanged: (value){
setState(() {
gender = value.toString();
});
},
),),
Expanded(child: RadioListTile(
title: Text("Others",style: TextStyle(color: secondaryColor,fontSize: 11)),
value: "other",
groupValue: gender,
activeColor: secondaryColor,
onChanged: (value){
setState(() {
gender = value.toString();
});
},
),),
],
),
Container(
child: TextFormField(
cursorColor: greyColor,
cursorColor: secondaryColor,
obscureText: isPwdObscureText,
controller: passwordController,
style: textFormFieldFilledTextStyle(),
decoration: InputDecoration(
fillColor: Colors.white,
fillColor: primaryColor,
filled: true,
labelText: 'Create Password',
prefixIcon: const Icon(
Icons.lock,
color: greyColor,
color: secondaryColor,
),
labelStyle: const TextStyle(
color: Colors.black, //<-- SEE HERE
color: secondaryColor,fontWeight: FontWeight.bold //<-- SEE HERE
),
border: const OutlineInputBorder(
borderSide: BorderSide(color: primaryColor)),
borderSide: BorderSide(color: secondaryColor)),
focusedBorder: const OutlineInputBorder(
borderSide: BorderSide(color: primaryColor),
borderSide: BorderSide(color: secondaryColor),
),
enabledBorder: const OutlineInputBorder(
borderSide: BorderSide(color: primaryColor),
borderSide: BorderSide(color: secondaryColor),
),
suffixIcon: IconButton(
icon: Icon(
Icons.visibility_off_outlined,
color: isPwdObscureText?greyColor:primaryColor,
color: isPwdObscureText?greyColor:secondaryColor,
),
onPressed: () {
setState(() {
@ -423,35 +469,32 @@ class _SignUpState extends State<SignUp> {
onPrimary: Colors.black, // foreground
),
onPressed: () async {
/* if (nameController.text != '' &&
if (nameController.text != '' &&
passwordController.text != '' &&
mobileNumberController.text != '') {
mobileNumberController.text != ''&&gender!='') {
bool isOnline = await AppSettings.internetConnectivity();
if(isOnline){
AppSettings.preLoaderDialog(context);
var payload = new Map<String, dynamic>();
payload["username"] = nameController.text.toString();
payload["doctorName"] = nameController.text.toString();
payload["password"] =
passwordController.text.toString();
payload["phone"] =
mobileNumberController.text.toString();
payload["firstName"] = nameController.text.toString();
payload["emails"] = [
{"email": emailController.text.toString()}
];
payload["lastName"] = '';
payload["address1"] = userAddressCapturingController.text;
payload["address2"] = '';
payload["city"] = '';
payload["state"] = '';
payload["zip"] = '';
payload["country"] = '';
payload["notes"] = '';
payload["latitude"] = lat;
payload["longitude"] = lng;
payload["fcmId"] = AppSettings.fcmId;
payload["age"] = 0;
payload["gender"] = genderUnit.toString();
payload["gender"] = gender.toString();
bool signUpStatus = await AppSettings.signUp(payload);
@ -487,9 +530,14 @@ class _SignUpState extends State<SignUp> {
AppSettings.longFailedToast("Please enter valid details");
}
}
else{
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text('Please check your internet connection'),));
}
}
else {
AppSettings.longFailedToast("details should not be empty");
}*/
}
},
child: Text('Sign Up'),
)),//login button

@ -1,6 +1,7 @@
import 'dart:convert';
import 'package:doctor/common/zoom_image.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
@ -19,11 +20,25 @@ class UpdateProfile extends StatefulWidget {
class _UpdateprofileState extends State<UpdateProfile> {
bool isPwdObscureText=true;
bool isFirstAddButtonShow=false;
bool isSecondAddButtonShow=false;
bool is2ndPlaceOfPracticeControllerVisible=false;
bool is3rdPlaceOfPracticeControllerVisible=false;
bool isConfirmPwdObscureText=true;
TextEditingController nameController = TextEditingController();
TextEditingController mobileNumberController = TextEditingController();
TextEditingController emailController = TextEditingController();
TextEditingController ageController = TextEditingController();
TextEditingController specializationController = TextEditingController();
TextEditingController qualificationController = TextEditingController();
TextEditingController hospitalNameController1 = TextEditingController();
TextEditingController hospitalNameController2 = TextEditingController();
TextEditingController hospitalNameController3 = TextEditingController();
TextEditingController practiceAddressController1 = TextEditingController();
TextEditingController practiceAddressController2 = TextEditingController();
TextEditingController practiceAddressController3 = TextEditingController();
String? gender;
List placeOfPractices=[];
@ -32,10 +47,19 @@ class _UpdateprofileState extends State<UpdateProfile> {
void initState() {
isPwdObscureText=true;
isConfirmPwdObscureText=true;
nameController.text=AppSettings.userName;
nameController.text=AppSettings.doctorName;
mobileNumberController.text=AppSettings.phoneNumber;
emailController.text=AppSettings.email;
specializationController.text=AppSettings.specialization;
qualificationController.text=AppSettings.qualification;
ageController.text=AppSettings.age;
gender=AppSettings.gender;
hospitalNameController1.text=AppSettings.placeOfPractice1;
hospitalNameController2.text=AppSettings.placeOfPractice2;
hospitalNameController3.text=AppSettings.placeOfPractice3;
practiceAddressController1.text=AppSettings.placeOfPracticeAddress1;
practiceAddressController2.text=AppSettings.placeOfPracticeAddress2;
practiceAddressController3.text=AppSettings.placeOfPracticeAddress3;
super.initState();
@ -45,7 +69,7 @@ class _UpdateprofileState extends State<UpdateProfile> {
final ImagePicker _picker = ImagePicker();
Future pickImageFromGallery() async {
/* try {
try {
final image = await _picker.pickImage(source: ImageSource.gallery);
if (image == null) return;
final imageTemp = File(image.path);
@ -59,11 +83,11 @@ class _UpdateprofileState extends State<UpdateProfile> {
AppSettings.saveData('profile', jsonDecode(res)['picture'], 'STRING');
} on PlatformException catch (e) {
print('Failed to pick image: $e');
}*/
}
}
Future takeImageFromCamera() async {
/*try {
try {
final image = await _picker.pickImage(source: ImageSource.camera);
if (image == null) return;
final imageTemp = File(image.path);
@ -77,7 +101,7 @@ class _UpdateprofileState extends State<UpdateProfile> {
AppSettings.saveData('profile', jsonDecode(res)['picture'], 'STRING');
} on PlatformException catch (e) {
print('Failed to pick image: $e');
}*/
}
}
@ -101,16 +125,13 @@ class _UpdateprofileState extends State<UpdateProfile> {
},
child: SafeArea(
child: SingleChildScrollView(
child: Padding(
padding: EdgeInsets.all(10),
child: Column(
children: <Widget>[
SizedBox(
height: 40,
height:MediaQuery.of(context).size.height * .02,
),
/*Container(
child: Image(
image: AssetImage('images/logo.png'),
height: MediaQuery.of(context).size.height * .10,
)),*/
Container(child: GestureDetector(
child: Container(
width: MediaQuery.of(context).size.width * .30,
@ -123,6 +144,19 @@ class _UpdateprofileState extends State<UpdateProfile> {
fit: BoxFit.fitWidth)),
),
onTap: () {
Navigator.push(
context,
new MaterialPageRoute(
builder: (__) => new ImageZoomPage(imageName:'Profile',imageDetails:AppSettings.profilePictureUrl)));
},
),),
TextButton(
child: const Text(
'Change',
style: TextStyle(decoration: TextDecoration.underline,color: primaryColor,fontSize: 12),
),
onPressed: () {
showModalBottomSheet<void>(
context: context,
builder: (BuildContext context) {
@ -163,13 +197,11 @@ class _UpdateprofileState extends State<UpdateProfile> {
),
);
});
//signup screen
},
),),
SizedBox(
height: 10,
),
SizedBox(height:MediaQuery.of(context).size.height * .02,),
Container(
padding: const EdgeInsets.all(10),
child: TextFormField(
cursorColor: greyColor,
controller: nameController,
@ -186,21 +218,19 @@ class _UpdateprofileState extends State<UpdateProfile> {
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: greyColor),
),
labelText: 'Username',
labelText: 'DoctorName',
labelStyle: TextStyle(
color: greyColor, //<-- SEE HERE
),
),
),
),//name
const SizedBox(
height: 15,
),
SizedBox(height:MediaQuery.of(context).size.height * .02,),
Container(
padding: const EdgeInsets.all(10),
child: TextFormField(
cursorColor: greyColor,
controller: emailController,
keyboardType: TextInputType.emailAddress,
decoration: const InputDecoration(
prefixIcon: Icon(
Icons.email,
@ -221,14 +251,12 @@ class _UpdateprofileState extends State<UpdateProfile> {
),
),
), //email
SizedBox(
height: 10,
),
SizedBox(height:MediaQuery.of(context).size.height * .02,),
Container(
padding: const EdgeInsets.all(10),
child: TextFormField(
cursorColor: greyColor,
controller: mobileNumberController,
keyboardType: TextInputType.number,
decoration: const InputDecoration(
prefixIcon: Icon(
Icons.phone_android,
@ -249,18 +277,12 @@ class _UpdateprofileState extends State<UpdateProfile> {
),
),
), //mobile
SizedBox(
height: 10,
),
SizedBox(
height: 10,
),
SizedBox(height:MediaQuery.of(context).size.height * .02,),
Container(
padding: const EdgeInsets.all(10),
child: TextFormField(
cursorColor: greyColor,
controller: ageController,
keyboardType: TextInputType.number,
decoration: const InputDecoration(
prefixIcon: Icon(
Icons.person,
@ -281,27 +303,374 @@ class _UpdateprofileState extends State<UpdateProfile> {
),
),
),
SizedBox(height:MediaQuery.of(context).size.height * .02,),
Text('Select Gender',style: TextStyle(color: primaryColor,fontSize: 14,fontWeight: FontWeight.bold),),
Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(child: RadioListTile(
title: Text("Male",style: TextStyle(color: primaryColor,fontSize: 11)),
value: "male",
groupValue: gender,
activeColor: primaryColor,
onChanged: (value){
setState(() {
gender = value.toString();
});
},
),),
Expanded(child: RadioListTile(
title: Text("Female",style:TextStyle(color: primaryColor,fontSize: 11)),
value: "female",
groupValue: gender,
activeColor: primaryColor,
onChanged: (value){
setState(() {
gender = value.toString();
});
},
),),
Expanded(child: RadioListTile(
title: Text("Others",style: TextStyle(color: primaryColor,fontSize: 11)),
value: "other",
groupValue: gender,
activeColor: primaryColor,
onChanged: (value){
setState(() {
gender = value.toString();
});
},
),),
],
),
SizedBox(height:MediaQuery.of(context).size.height * .02,),
Container(
child: TextFormField(
cursorColor: greyColor,
controller: qualificationController,
decoration: const InputDecoration(
prefixIcon: Icon(
Icons.quickreply,
color: greyColor,
),
border: OutlineInputBorder(
borderSide: BorderSide(color: greyColor)),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: greyColor),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: greyColor),
),
labelText: 'Enter qualification',
labelStyle: TextStyle(
color: greyColor, //<-- SEE HERE
),
),
),
),
SizedBox(height:MediaQuery.of(context).size.height * .02,),
Container(
child: TextFormField(
cursorColor: greyColor,
controller: specializationController,
decoration: const InputDecoration(
prefixIcon: Icon(
Icons.folder_special,
color: greyColor,
),
border: OutlineInputBorder(
borderSide: BorderSide(color: greyColor)),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: greyColor),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: greyColor),
),
labelText: 'Enter specialization',
labelStyle: TextStyle(
color: greyColor, //<-- SEE HERE
),
),
),
),
SizedBox(height:MediaQuery.of(context).size.height * .02,),
Text('Place of practice',style: TextStyle(color: primaryColor,fontSize: 14,fontWeight: FontWeight.bold),),
SizedBox(height:MediaQuery.of(context).size.height * .02,),
Container(
padding: const EdgeInsets.fromLTRB(10, 0, 10, 0),
width: double.infinity,
decoration: BoxDecoration(
color: secondaryColor,
border: Border.all(
//width: 10,
color: Colors.white,
),
borderRadius: BorderRadius.circular(
20,
)),
child: Padding(
padding: EdgeInsets.all(10),
child: Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
TextFormField(
cursorColor: greyColor,
controller: hospitalNameController1,
decoration: const InputDecoration(
prefixIcon: Icon(
Icons.location_city,
color: greyColor,
),
border: OutlineInputBorder(
borderSide: BorderSide(color: greyColor)),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: greyColor),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: greyColor),
),
labelText: 'Enter hospital name',
labelStyle: TextStyle(
color: greyColor, //<-- SEE HERE
),
),
),
SizedBox(height:MediaQuery.of(context).size.height * .02,),
TextFormField(
cursorColor: greyColor,
controller: practiceAddressController1,
decoration: const InputDecoration(
prefixIcon: Icon(
Icons.location_on,
color: greyColor,
),
border: OutlineInputBorder(
borderSide: BorderSide(color: greyColor)),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: greyColor),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: greyColor),
),
labelText: 'Enter practice address',
labelStyle: TextStyle(
color: greyColor, //<-- SEE HERE
),
),
),
Visibility(
visible: hospitalNameController1.text!='',
child: IconButton(
onPressed: (){
setState(() {
is2ndPlaceOfPracticeControllerVisible=true;
});
},
icon: Icon(Icons.add_box, color: primaryColor,)))
],
),
),
),
SizedBox(height:MediaQuery.of(context).size.height * .02,),
Visibility(
visible:hospitalNameController2.text!=''&&hospitalNameController2.text!='null'||is2ndPlaceOfPracticeControllerVisible,
child: Container(
width: double.infinity,
decoration: BoxDecoration(
color: secondaryColor,
border: Border.all(
//width: 10,
color: Colors.white,
),
borderRadius: BorderRadius.circular(
20,
)),
child: Padding(
padding: EdgeInsets.all(10),
child: Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
TextFormField(
cursorColor: greyColor,
controller: hospitalNameController2,
decoration: const InputDecoration(
prefixIcon: Icon(
Icons.location_city,
color: greyColor,
),
border: OutlineInputBorder(
borderSide: BorderSide(color: greyColor)),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: greyColor),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: greyColor),
),
labelText: 'Enter hospital name',
labelStyle: TextStyle(
color: greyColor, //<-- SEE HERE
),
),
),
SizedBox(height:MediaQuery.of(context).size.height * .02,),
TextFormField(
cursorColor: greyColor,
controller: practiceAddressController2,
decoration: const InputDecoration(
prefixIcon: Icon(
Icons.location_on,
color: greyColor,
),
border: OutlineInputBorder(
borderSide: BorderSide(color: greyColor)),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: greyColor),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: greyColor),
),
labelText: 'Enter practice place',
labelStyle: TextStyle(
color: greyColor, //<-- SEE HERE
),
),
),
Visibility(
visible: hospitalNameController2.text!='',
child: IconButton(
onPressed: (){
setState(() {
is3rdPlaceOfPracticeControllerVisible=true;
});
},
icon: Icon(Icons.add_box, color: primaryColor,)))
],
),
),
),),
SizedBox(height:MediaQuery.of(context).size.height * .02,),
Visibility(
visible: hospitalNameController3.text!=''&&hospitalNameController3.text!='null'||is3rdPlaceOfPracticeControllerVisible,
child: Container(
width: double.infinity,
decoration: BoxDecoration(
color: secondaryColor,
border: Border.all(
//width: 10,
color: Colors.white,
),
borderRadius: BorderRadius.circular(
20,
)),
child: Padding(
padding: EdgeInsets.all(10),
child: Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
TextFormField(
cursorColor: greyColor,
controller: hospitalNameController3,
decoration: const InputDecoration(
prefixIcon: Icon(
Icons.location_city,
color: greyColor,
),
border: OutlineInputBorder(
borderSide: BorderSide(color: greyColor)),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: greyColor),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: greyColor),
),
labelText: 'Enter hospital name',
labelStyle: TextStyle(
color: greyColor, //<-- SEE HERE
),
),
),
SizedBox(height:MediaQuery.of(context).size.height * .02,),
TextFormField(
cursorColor: greyColor,
controller: practiceAddressController3,
onChanged:(val) {
},
decoration: const InputDecoration(
prefixIcon: Icon(
Icons.location_on,
color: greyColor,
),
border: OutlineInputBorder(
borderSide: BorderSide(color: greyColor)),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: greyColor),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: greyColor),
),
labelText: 'Enter practice place',
labelStyle: TextStyle(
color: greyColor, //<-- SEE HERE
),
),
),
],
),
),
),),
SizedBox(height:MediaQuery.of(context).size.height * .02,),
Container(
width:double.infinity,
height: MediaQuery.of(context).size.height * .06,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
primary: primaryColor, // background
onPrimary: Colors.white, // foreground
),
onPressed: () async{
if(hospitalNameController1!=''){
placeOfPractices.add({
'hospitalName': hospitalNameController1.text,
'address': practiceAddressController1.text
});
}
if(hospitalNameController2!=''){
placeOfPractices.add({
'hospitalName': hospitalNameController2.text,
'address': practiceAddressController2.text
});
}
if(hospitalNameController3!=''){
placeOfPractices.add({
'hospitalName': hospitalNameController3.text,
'address': practiceAddressController3.text
});
}
/*int age=0;
if(ageController.text.toString()!=''){
int age=0;
if(ageController.text.toString()!=''||ageController.text.toString()!='null'){
age=int.parse(ageController.text.toString());
}
else{
age=0;
}
var payload = new Map<String, dynamic>();
payload["username"] = nameController.text.toString();
payload["doctorName"] = nameController.text.toString();
payload["phone"] = mobileNumberController.text.toString();
payload["age"] = age;
payload["gender"] = gender;
payload["specialization"] = specializationController.text;
payload["qualification"] =qualificationController.text ;
payload["placeOfPractice"] =placeOfPractices ;
payload["emails"] = [{"email":emailController.text.toString()}];
bool signUpStatus = await AppSettings.updateProfile(payload);
try{
@ -320,15 +689,17 @@ class _UpdateprofileState extends State<UpdateProfile> {
catch(exception){
print(exception);
AppSettings.longFailedToast("Please enter valid details");
}*/
}
},
child: Text('Update'),
)
),
],
),
)
)),
),
]));

@ -15,10 +15,33 @@ class _ImageZoomPageState extends State<ImageZoomPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppSettings.appBar(widget.imageName),
appBar:AppBar(
backgroundColor: primaryColor,
title: Text(widget.imageName),
actions: [
IconButton(
onPressed: () {
Navigator.pop(context);
},
icon: Icon(
Icons.cancel,
color: buttonColors,
size: 30,
),
),
],
),
body: Container(
//width: MediaQuery.of(context).size.width * .10,
//height: MediaQuery.of(context).size.height * .50,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(padding:EdgeInsets.fromLTRB(10,10,10,0),
child: Text('Use two fingers to zoom/double tap',style: TextStyle(color: Colors.black,fontSize: 12),),),
SizedBox(height:MediaQuery.of(context).size.height * .02,),
Expanded(
child: PhotoView(
imageProvider: NetworkImage(widget.imageDetails) as ImageProvider,
maxScale: PhotoViewComputedScale.contained * 4.0,
@ -26,6 +49,9 @@ class _ImageZoomPageState extends State<ImageZoomPage> {
initialScale: PhotoViewComputedScale.contained,
basePosition: Alignment.center,
),
)
],
)
),

@ -0,0 +1,230 @@
import 'dart:convert';
import 'package:doctor/common/settings.dart';
import 'package:doctor/connected_patients/patient_records.dart';
import 'package:doctor/models/connected_patients_model.dart';
import 'package:flutter/material.dart';
class ConnectedPatients extends StatefulWidget {
const ConnectedPatients({Key? key}) : super(key: key);
@override
State<ConnectedPatients> createState() => _ConnectedPatientsState();
}
class _ConnectedPatientsState extends State<ConnectedPatients> {
bool isConnectedPatientsDataLoading=false;
bool isSereverIssue=false;
List<GetConnectedPatientsModel> connectedPatientsList = [];
Future<void> getAllConnectedPatients() async {
isConnectedPatientsDataLoading=true;
try {
var response = await AppSettings.getAllConectedPatients();
setState(() {
connectedPatientsList = ((jsonDecode(response)) as List)
.map((dynamic model) {
return GetConnectedPatientsModel.fromJson(model);
}).toList();
connectedPatientsList=connectedPatientsList.reversed.toList();
isConnectedPatientsDataLoading = false;
});
} catch (e) {
setState(() {
isConnectedPatientsDataLoading = false;
isSereverIssue = true;
});
}
}
@override
void initState() {
getAllConnectedPatients();
super.initState();
}
Widget _patients(){
if(connectedPatientsList.length!=0){
return ListView.builder(
padding: EdgeInsets.all(0),
itemCount: connectedPatientsList.length,
itemBuilder: (BuildContext context, int index) {
return GestureDetector(
onTap: (){
Navigator.push(
context,
new MaterialPageRoute(
builder: (__) => new PatientRecords(patientDetails: connectedPatientsList[index],)));
},
child: Card(
//color: prescriptionsList[index].cardColor,
child: Padding(
padding:EdgeInsets.all(8) ,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Patient Name',
style: labelTextStyle(),
),
SizedBox(height:MediaQuery.of(context).size.height * .01,),
Text(
'Phone Number',
style: labelTextStyle(),
),
SizedBox(height:MediaQuery.of(context).size.height * .01,),
Text(
'Age',
style: labelTextStyle(),
),
SizedBox(height:MediaQuery.of(context).size.height * .01,),
Text(
'Gender',
style: labelTextStyle(),
),
SizedBox(height:MediaQuery.of(context).size.height * .01,),
],
),
SizedBox(width:MediaQuery.of(context).size.width * .01,),
Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
':',
style: labelTextStyle(),
),
SizedBox(height:MediaQuery.of(context).size.height * .01,),
Text(
':',
style: labelTextStyle(),
),
SizedBox(height:MediaQuery.of(context).size.height * .01,),
Text(
':',
style: labelTextStyle(),
),
SizedBox(height:MediaQuery.of(context).size.height * .01,),
Text(
':',
style: labelTextStyle(),
),
],
),
SizedBox(width:MediaQuery.of(context).size.width * .01,),
Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(connectedPatientsList[index].user_name.toString().toUpperCase(),style: valuesTextStyle()),
SizedBox(height:MediaQuery.of(context).size.height * .01,),
Text(
connectedPatientsList[index].phone_number,
style: valuesTextStyle(),
),
SizedBox(height:MediaQuery.of(context).size.height * .01,),
Text(
connectedPatientsList[index].age+' Yrs',
style: valuesTextStyle(),
),
SizedBox(height:MediaQuery.of(context).size.height * .01,),
Text(
connectedPatientsList[index].gender,
style: valuesTextStyle(),
),
],
),
],
),
),
],
),
],
),
),
),
);
});
}
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 Connected patients available'),
SizedBox(
height: 20,
),
CircleAvatar(
backgroundColor: primaryColor,
radius: 40,
child: IconButton(
iconSize: 40,
icon: const Icon(
Icons.info,
color: Colors.white,
),
onPressed: () async {
/*Navigator.push(context, MaterialPageRoute(builder: (context) => AddReports())).then((value) {
getAllRecords();
});*/
},
),
)
],
),
)
);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppSettings.appBar('Connected Patients'),
body: Container(
child: isConnectedPatientsDataLoading?Center(
child: CircularProgressIndicator(
color: primaryColor,
strokeWidth: 5.0,
),
): _patients(),
),
);
}
}

File diff suppressed because it is too large Load Diff

@ -0,0 +1,281 @@
import 'package:flutter/services.dart';
import 'package:image_picker/image_picker.dart';
import 'package:flutter/material.dart';
import 'package:doctor/common/settings.dart';
import 'package:doctor/common/zoom_image.dart';
class AllRecordsOnClick extends StatefulWidget {
var recordDetails;
var initialIndex;
AllRecordsOnClick({this.recordDetails,this.initialIndex});
@override
State<AllRecordsOnClick> createState() => _AllRecordsOnClickState();
}
class _AllRecordsOnClickState extends State<AllRecordsOnClick>
with TickerProviderStateMixin {
final ImagePicker imagePicker = ImagePicker();
List imageFileList = [];
final ImagePicker _picker = ImagePicker();
@override
void initState() {
super.initState();
}
Widget findings(var obj){
if(obj.findingsImages.length!=0){
return Container(
//color: secondaryColor,
width: double.infinity,
height: MediaQuery.of(context).size.height * .20,
child: Row(
children: [
Expanded(child: ListView.builder(
scrollDirection: Axis.horizontal,
itemCount: obj.findingsImages.length,
itemBuilder: (context, index) {
return Row(
children: [
Card(
child: GestureDetector(
onTap: (){
//showPicDialog(obj.prescriptionImages[index]['url']);
Navigator.push(
context,
new MaterialPageRoute(
builder: (__) => new ImageZoomPage(imageName:'Findings',imageDetails:obj.findingsImages[index]['url'])));},
child: Container(
width: MediaQuery.of(context).size.width * .30,
height: MediaQuery.of(context).size.height * .15,
decoration: BoxDecoration(
shape: BoxShape.rectangle,
image: DecorationImage(
image: NetworkImage(
obj.findingsImages[index]['url'])
as ImageProvider, // picked file
fit: BoxFit.fill)),
),
),
)
],
);
}),),
],
)
);
}
else{
return GestureDetector(
child: Row(
children: [
Icon(
Icons.info,
color: Colors.green,
size: 40,
),
Text('No Findings found',style: textButtonStyle(),)
],
),
);
}
}
Widget reports(var obj){
if(obj.reportImages.length!=0){
return Container(
//color: secondaryColor,
width: double.infinity,
height: MediaQuery.of(context).size.height * .20,
child: Row(
children: [
Expanded(child: ListView.builder(
scrollDirection: Axis.horizontal,
itemCount: obj.reportImages.length,
itemBuilder: (context, index) {
return Row(
children: [
Card(
child: GestureDetector(
onTap: (){
//showPicDialog(obj.prescriptionImages[index]['url']);
Navigator.push(
context,
new MaterialPageRoute(
builder: (__) => new ImageZoomPage(imageName:'Findings',imageDetails:obj.reportImages[index]['url'])));},
child: Container(
width: MediaQuery.of(context).size.width * .30,
height: MediaQuery.of(context).size.height * .15,
decoration: BoxDecoration(
shape: BoxShape.rectangle,
image: DecorationImage(
image: NetworkImage(
obj.reportImages[index]['url'])
as ImageProvider, // picked file
fit: BoxFit.fill)),
),
),
)
],
);
}),),
],
)
);
}
else{
return GestureDetector(
child: Row(
children: [
Icon(
Icons.info,
color: Colors.green,
size: 40,
),
Text('No Reports found',style: textButtonStyle(),)
],
),
);
}
}
Widget prescriptions(var obj){
if(obj.prescriptionImages.length!=0){
return Container(
//color: secondaryColor,
width: double.infinity,
height: MediaQuery.of(context).size.height * .20,
child: Row(
children: [
Expanded(child: ListView.builder(
scrollDirection: Axis.horizontal,
itemCount: obj.prescriptionImages.length,
itemBuilder: (context, index) {
return Row(
children: [
Card(
child: GestureDetector(
onTap: (){
//showPicDialog(obj.prescriptionImages[index]['url']);
Navigator.push(
context,
new MaterialPageRoute(
builder: (__) => new ImageZoomPage(imageName:'Prescriptions',imageDetails:obj.prescriptionImages[index]['url'])));},
child: Container(
width: MediaQuery.of(context).size.width * .30,
height: MediaQuery.of(context).size.height * .15,
decoration: BoxDecoration(
shape: BoxShape.rectangle,
image: DecorationImage(
image: NetworkImage(
obj.prescriptionImages[index]['url'])
as ImageProvider, // picked file
fit: BoxFit.fill)),
),
),
)
],
);
}),),
],
)
);
}
else{
return GestureDetector(
child: Row(
children: [
Icon(
Icons.info,
color: Colors.green,
size: 40,
),
Text('No Prescriptions found',style: textButtonStyle(),)
],
),
);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppSettings.appBar('Records'),
body: Padding(
padding: EdgeInsets.all(10),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
height: MediaQuery.of(context).size.height * .15,
width: double.infinity,
child: Padding(
padding: EdgeInsets.all(0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Problem: ' +
widget.recordDetails.problem.toString().toUpperCase(),
style: problemTextStyle()),
Text(widget.recordDetails.doctorName.toString().toUpperCase(),
style: valuesTextStyle()),
Text(
widget.recordDetails.hospitalName
.toString()
.toUpperCase(),
style: valuesTextStyle()),
Text(widget.recordDetails.date.toString().toUpperCase(),
style: valuesTextStyle()),
Text('Patient details: ', style: problemTextStyle()),
Text(
widget.recordDetails.patient_name
.toString()
.toUpperCase(),
style: valuesTextStyle()),
Row(
children: [
Text(widget.recordDetails.gender.toString().toUpperCase(),
style: valuesTextStyle()),
SizedBox(
width: MediaQuery.of(context).size.width * .05,
),
Text(
widget.recordDetails.age.toString().toUpperCase() +
" Yrs",
style: valuesTextStyle()),
],
),
],
),
),
),
Text('Findings',style: TextStyle(color: Colors.red,fontSize: 16,fontWeight: FontWeight.bold),),
findings(widget.recordDetails),
Text('Reports',style: TextStyle(color: Colors.red,fontSize: 16,fontWeight: FontWeight.bold),),
reports(widget.recordDetails),
Text('Prescriptions',style: TextStyle(color: Colors.red,fontSize: 16,fontWeight: FontWeight.bold),),
prescriptions(widget.recordDetails)
],
),
),
);
}
}

@ -1,4 +1,5 @@
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:uuid/uuid.dart';

@ -0,0 +1,32 @@
import 'package:flutter/material.dart';
import 'helper.dart';
class AppColors {
AppColors._();
static const Color primaryColor = Color(0xffed1846);
static const Color secondaryColor = Color(0xff5bcb84);
static const Color tColor = Color(0xfff087ca);
static const Color rColor = Color(0xfff08c87);
static const Color statusColorPending = Color(0xfff8c942);
static const Color statusColorInProgress = Color(0xff587add);
static const Color statusColorConfirm = Color(0xff30d300);
static const Color pageBgColor = Color(0xFFF6F6F6);
static const Color grey100Color = Color(0xFFEEEEEE);
static const Color grey200Color = Color(0xFFEEEEEE);
static const Color grey300Color = Color(0xFFE0E0E0);
static const Color grey400Color = Color(0xFFBDBDBD);
static const Color grey500Color = Color(0xFF9E9E9E);
static const Color grey600Color = Color(0xFF757575);
static const Color grey700Color = Color(0xFF616161);
static const Color grey800Color = Color(0xFF424242);
static const Color grey900Color = Color(0xFF212121);
static const Color errorColor = Color(0xFFD50000);
static const Color error100Color = Color(0xffFF5252);
static const Color mainBgColor = Color(0xfff7f7f7);
static const Color logoColor = Color(0xfff1ea0c);
static MaterialColor primaryMaterialColor = getSwatch(primaryColor);
static MaterialColor errorMaterialColor = getSwatch(errorColor);
static MaterialColor tableRowMaterialColor = getSwatch(grey500Color);
}

@ -0,0 +1,4 @@
class AppImages {
static const String pickupMarker = "assets/images/pickup_marker.png";
static const String dropMarker = "assets/images/drop_marker.png";
}

@ -0,0 +1,25 @@
import 'dart:ui';
import 'package:get/get.dart';
class AppSizes {
// get height and width from getX
static final double deviceHeight = Get.height;
static final double deviceWidth = Get.width;
static const int height1060 = 1060;
static const int height880 = 880;
static const int height740 = 740;
static const int height490 = 490;
static const int width1060 = 1060;
static const int width880 = 880;
static const int width740 = 740;
static const int width490 = 490;
static const int screen720x1280 = 490;
static final double mapPinSize = (deviceWidth * window.devicePixelRatio);
}

@ -0,0 +1,34 @@
import 'package:flutter/material.dart';
MaterialColor getSwatch(Color color) {
final hslColor = HSLColor.fromColor(color);
final lightness = hslColor.lightness;
/// if [500] is the default color, there are at LEAST five
/// steps below [500]. (i.e. 400, 300, 200, 100, 50.) A
/// divisor of 5 would mean [50] is a lightness of 1.0 or
/// a color of #ffffff. A value of six would be near white
/// but not quite.
const lowDivisor = 6;
/// if [500] is the default color, there are at LEAST four
/// steps above [500]. A divisor of 4 would mean [900] is
/// a lightness of 0.0 or color of #000000
const highDivisor = 5;
final lowStep = (1.0 - lightness) / lowDivisor;
final highStep = lightness / highDivisor;
return MaterialColor(color.value, {
50: (hslColor.withLightness(lightness + (lowStep * 5))).toColor(),
100: (hslColor.withLightness(lightness + (lowStep * 4))).toColor(),
200: (hslColor.withLightness(lightness + (lowStep * 3))).toColor(),
300: (hslColor.withLightness(lightness + (lowStep * 2))).toColor(),
400: (hslColor.withLightness(lightness + lowStep)).toColor(),
500: (hslColor.withLightness(lightness)).toColor(),
600: (hslColor.withLightness(lightness - highStep)).toColor(),
700: (hslColor.withLightness(lightness - (highStep * 2))).toColor(),
800: (hslColor.withLightness(lightness - (highStep * 3))).toColor(),
900: (hslColor.withLightness(lightness - (highStep * 4))).toColor(),
});
}

@ -0,0 +1,120 @@
import 'dart:developer';
import 'dart:ui' as ui;
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:get/get.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:location/location.dart';
import 'app_images.dart';
import 'app_sizes.dart';
import 'permission_alert.dart';
class LocationController<T> extends GetxController {
Location location = Location();
// final Rx<LatLng?> locationPosition = const LatLng(0.0, 0.0).obs;
/*final Rx<LatLng?> locationPosition =
const LatLng(12.90618717, 77.5844983).obs;*/
final Rx<LatLng?> locationPosition =
const LatLng(0, 0).obs;
bool locationServiceActive = true;
BitmapDescriptor? pickupMarker;
BitmapDescriptor? dropMarker;
@override
void onInit() async {
await _getBytesFromAsset(AppImages.pickupMarker, AppSizes.mapPinSize * 0.1);
await _getBytesFromAsset(AppImages.dropMarker, AppSizes.mapPinSize * 0.05);
super.onInit();
refreshToLiveLocation();
}
Future<void> _getBytesFromAsset(String path, double size) async {
ByteData data = await rootBundle.load(path);
ui.Codec codec = await ui.instantiateImageCodec(
data.buffer.asUint8List(),
targetWidth: size.toInt(),
allowUpscaling: true,
);
ui.FrameInfo fi = await codec.getNextFrame();
if (path == AppImages.pickupMarker) {
pickupMarker = BitmapDescriptor.fromBytes(
(await fi.image.toByteData(format: ui.ImageByteFormat.png))!
.buffer
.asUint8List());
} else if (path == AppImages.dropMarker) {
dropMarker = BitmapDescriptor.fromBytes(
(await fi.image.toByteData(format: ui.ImageByteFormat.png))!
.buffer
.asUint8List());
} else {}
}
refreshToLiveLocation() async {
log("initiating");
bool serviceEnabled;
PermissionStatus permissionGranted;
serviceEnabled = await location.serviceEnabled();
if (!serviceEnabled) {
serviceEnabled = await location.requestService();
locationPosition.value = null;
return;
}
log("permission check");
permissionGranted = await location.hasPermission();
if (permissionGranted == PermissionStatus.denied) {
permissionGranted = await location.requestPermission();
if (permissionGranted != PermissionStatus.granted) {
showPermissionAlertDialog(
requestMsg:
"Location access needed. Go to Android settings, tap App permissions and tap Allow.",
barrierDismissible: false,
);
} else {
await location.changeSettings(
accuracy: LocationAccuracy.high,
interval: 2000,
distanceFilter: 2);
location.onLocationChanged.listen((LocationData currentLocation) async {
var lat = currentLocation.latitude;
var long = currentLocation.longitude;
if (lat != null && long != null) {
locationPosition.value = LatLng(
lat,
long,
);
log("live location ${locationPosition.value}");
}
});
}
} else {
await location.changeSettings(
accuracy: LocationAccuracy.high,
interval: 2000,
distanceFilter: 2);
location.onLocationChanged.listen((LocationData currentLocation) async {
var lat = currentLocation.latitude;
var long = currentLocation.longitude;
if (lat != null && long != null) {
locationPosition.value = LatLng(
lat,
long,
);
log("live location ${locationPosition.value}");
}
});
}
}
}

@ -0,0 +1,252 @@
import 'dart:async';
import 'dart:developer';
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter_polyline_points/flutter_polyline_points.dart';
import 'package:get/get.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:location/location.dart';
import 'location_controller.dart';
class OrderTrackingPage extends StatefulWidget {
var lat;
var lng;
var d_lat;
var d_lng;
var u_address;
OrderTrackingPage({
this.lat,
this.lng,
this.d_lat,
this.d_lng,
this.u_address
});
@override
OrderTrackingPageState createState() => OrderTrackingPageState();
}
class OrderTrackingPageState extends State<OrderTrackingPage> {
final Completer<GoogleMapController> mapController = Completer();
PolylinePoints polylinePoints = PolylinePoints();
double latitude=0;
double longitude=0;
double d_latitude=0;
double d_longitude=0;
String u_address = '';
LocationData? currentLocation;
String googleAPiKey ="AIzaSyDJpK9RVhlBejtJu9xSGfneuTN6HOfJgSM";
Set<Marker> markers = {};
Map<PolylineId, Polyline> polylines = {};
late LatLng startLocation ;
late LatLng user_location;
LocationController locationController = Get.put(LocationController());
double distance = 0.0;
@override
void initState() {
super.initState();
latitude=widget.lat;
longitude=widget.lng;
d_latitude=widget.d_lat;
d_longitude=widget.d_lng;
u_address=widget.u_address;
user_location = LatLng(widget.lat,widget.lng);
startLocation = LatLng(widget.d_lat,widget.d_lng);
LatLng delivery_Location = LatLng(widget.d_lat,widget.d_lng);
//LatLng endLocation = LatLng(17.4968,78.3614);
ever<LatLng?>(locationController.locationPosition, (value) {
if (value != null) {
// log("${value.latitude} ${value.longitude}");
var latitude = value.latitude;
var longitude = value.longitude;
startLocation = LatLng(widget.d_lat, widget.d_lng);
getDirections(user_location);
}
});
getDirections(user_location); //fetch direction polylines from Google API
}
getDirections(user_location) async {
markers.clear();
markers.add(Marker(
markerId: MarkerId(startLocation.toString()),
position: startLocation,
infoWindow: const InfoWindow(
title: 'Starting Point',
snippet: 'Start Marker',
),
icon: locationController.pickupMarker ?? BitmapDescriptor.defaultMarker,
));
markers.add(Marker(
markerId: MarkerId(user_location.toString()),
position: user_location, //position of marker
infoWindow: const InfoWindow(
title: 'Destination Point ',
snippet: 'Destination Marker',
),
icon: locationController.dropMarker ?? BitmapDescriptor.defaultMarker,
));
List<LatLng> polylineCoordinates = [];
PolylineResult result = await polylinePoints.getRouteBetweenCoordinates(
googleAPiKey,
PointLatLng(startLocation.latitude, startLocation.longitude),
PointLatLng(user_location.latitude, user_location.longitude),
travelMode: TravelMode.driving,
);
if (result.points.isNotEmpty) {
for (var point in result.points) {
polylineCoordinates.add(LatLng(point.latitude, point.longitude));
}
} else {
// log(result.errorMessage ?? "Something went wrong");
}
//polulineCoordinates is the List of longitute and latidtude.
double totalDistance = 0;
for(var i = 0; i < polylineCoordinates.length-1; i++){
totalDistance += calculateDistance(
polylineCoordinates[i].latitude,
polylineCoordinates[i].longitude,
polylineCoordinates[i+1].latitude,
polylineCoordinates[i+1].longitude);
}
print(totalDistance);
setState(() {
distance = totalDistance;
});
addPolyLine(polylineCoordinates);
}
addPolyLine(List<LatLng> polylineCoordinates) async {
PolylineId id = const PolylineId("poly");
Polyline polyline = Polyline(
polylineId: id,
color: Colors.deepPurpleAccent,
points: polylineCoordinates,
width:8,
);
polylines[id] =polyline;
var position = CameraPosition(
target: LatLng(latitude,longitude),
zoom: 16);
final GoogleMapController controller = await mapController.future;
controller.animateCamera(CameraUpdate.newCameraPosition(position));
setState(() {});
}
double calculateDistance(lat1, lon1, lat2, lon2){
var p = 0.017453292519943295;
var a = 0.5 - cos((lat2 - lat1) * p)/2 +
cos(lat1 * p) * cos(lat2 * p) *
(1 - cos((lon2 - lon1) * p))/2;
return 12742 * asin(sqrt(a));
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Stack(
children: [
GoogleMap(
//Map widget from google_maps_flutter package
zoomGesturesEnabled: true,
//enable Zoom in, out on map
initialCameraPosition: CameraPosition(
//innital position in map
target: startLocation, //initial position
zoom: 8.0, //initial zoom level
),
markers: markers,
//markers to show on map
polylines: Set<Polyline>.of(polylines.values),
//polylines
mapType: MapType.normal,
//map type
onMapCreated: (controller) {
//method called when map is created
if (!mapController.isCompleted) {
mapController.complete(controller);
}
},
),
const SizedBox(
height: 95,
),
Positioned(
bottom: 100,
left: 50,
child: Container(
child: Card(
child: Container(
padding: EdgeInsets.all(20),
child: Text("Total Distance: " + distance.toStringAsFixed(2) + " KM",
style: TextStyle(fontSize: 20, fontWeight:FontWeight.bold))
),
)
)),
/* const SizedBox(
height: 30,
),
Positioned(
bottom: 80,
left: 0,
child: Container(
child: Card(
child: Container(
padding: EdgeInsets.all(20),
child: Text("User Address: " + u_address.toString() ,
style: TextStyle(fontSize: 15, fontWeight:FontWeight.bold,overflow: TextOverflow.ellipsis))
),
)
)),
const SizedBox(
height: 30,
),
Positioned(
bottom: 10,
left: 50,
child: Container(
child: Card(
child: Container(
padding: EdgeInsets.all(20),
child: Text("Total DistanceD: " + distance.toStringAsFixed(2) + " KM",
style: TextStyle(fontSize: 20, fontWeight:FontWeight.bold))
),
)
)),*/
],
)
);
}
}

@ -0,0 +1 @@
enum PaddingType { symmetric, only }

@ -0,0 +1,53 @@
import 'package:flutter/material.dart';
import 'package:get/get_core/src/get_main.dart';
import 'package:get/get_navigation/get_navigation.dart';
import 'package:permission_handler/permission_handler.dart';
import 'app_colors.dart';
import 'primary_button.dart';
import 'primary_text.dart';
void showPermissionAlertDialog({
String title = "Need Permission",
required String requestMsg,
bool barrierDismissible = true,
}) {
Get.defaultDialog(
title: title,
middleText: "",
backgroundColor: Colors.white,
contentPadding: const EdgeInsets.only(top: 30, bottom: 30.0),
radius: 10,
barrierDismissible: barrierDismissible,
titlePadding: const EdgeInsets.only(top: 15),
titleStyle: const TextStyle(
color: AppColors.grey900Color,
fontSize: 18,
fontWeight: FontWeight.w600,
),
/*cancel: PrimaryButton(
title: "DISMISS",
onPressed: () {},
textSize: AppSizes.font_13,
bgColor: AppColors.grey500Color,
),*/
confirm: PrimaryButton(
title: "GO TO SETTINGS",
onPressed: () {
openAppSettings();
Get.back();
},
textSize: 13,
),
content: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8.0),
child: PrimaryText(
requestMsg,
textAlign: TextAlign.center,
fontColor: AppColors.grey800Color,
fontSize: 15,
fontWeight: FontWeight.w500,
),
),
);
}

@ -0,0 +1,65 @@
import 'package:flutter/material.dart';
import 'app_colors.dart';
import 'primary_text.dart';
class PrimaryButton extends StatelessWidget {
final String title;
final VoidCallback onPressed;
final double verticalPadding;
final bool textAllCaps;
final double textSize;
final FontWeight textWeight;
final Color textColor;
final TextDecoration textDecoration;
final int letterSpacing;
final bool isResponsive;
final Color bgColor;
final double horizontalPadding;
const PrimaryButton({
Key? key,
required this.title,
required this.onPressed,
this.verticalPadding = 10.0,
this.textAllCaps = true,
this.textSize = 14,
this.textWeight = FontWeight.w500,
this.textColor = Colors.white,
this.textDecoration = TextDecoration.none,
this.letterSpacing = 1,
this.isResponsive = true,
this.bgColor = AppColors.primaryColor,
this.horizontalPadding = 25.0,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Card(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(40),
),
color: bgColor,
child: InkWell(
onTap: onPressed,
child: Padding(
padding: EdgeInsets.symmetric(
vertical: verticalPadding,
horizontal: horizontalPadding,
),
child: PrimaryText(
textAllCaps ? title.toUpperCase() : title,
// title.toUpperCase(),
textAlign: TextAlign.center,
fontSize: textSize,
fontWeight: textWeight,
fontColor: textColor,
textDecoration: textDecoration,
isResponsive: isResponsive,
),
),
),
);
}
}

@ -0,0 +1,88 @@
import 'package:flutter/material.dart';
import 'app_sizes.dart';
import 'padding_type_enum.dart';
class PrimaryText extends StatelessWidget {
final String text;
final Color? fontColor;
final double fontSize;
final FontWeight fontWeight;
final double horizontalPadding;
final double verticalPadding;
final TextAlign textAlign;
final bool isResponsive;
final TextDecoration? textDecoration;
final PaddingType paddingType;
final double leftPadding;
final double rightPadding;
final double lineHeight;
final FontStyle fontStyle;
final TextOverflow textOverflow;
final bool textAllCaps;
final double letterSpacing;
const PrimaryText(
this.text, {
Key? key,
this.fontColor = Colors.black,
this.fontSize = 16,
this.fontWeight = FontWeight.w600,
this.horizontalPadding = 0.0,
this.verticalPadding = 0.0,
this.textAlign = TextAlign.start,
this.isResponsive = true,
this.textDecoration,
this.paddingType = PaddingType.symmetric,
this.leftPadding = 0.0,
this.rightPadding = 0.0,
this.lineHeight = 1.5,
this.fontStyle = FontStyle.normal,
this.textOverflow = TextOverflow.visible,
this.textAllCaps = false,
this.letterSpacing = 0,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Padding(
padding: paddingType == PaddingType.symmetric
? EdgeInsets.symmetric(
horizontal: horizontalPadding,
vertical: verticalPadding,
)
: EdgeInsets.only(
left: leftPadding,
right: rightPadding,
),
child: Text(
textAllCaps ? text.toUpperCase() : text,
style: TextStyle(
fontSize: responsiveTextSize(),
fontWeight: fontWeight,
color: fontColor,
decoration: textDecoration,
height: lineHeight,
fontStyle: fontStyle,
letterSpacing: letterSpacing,
),
textScaleFactor: 1,
textAlign: textAlign,
),
);
}
double responsiveTextSize() {
if (isResponsive) {
if (AppSizes.deviceHeight < AppSizes.height490) {
return fontSize - 3;
} else if (AppSizes.deviceHeight < AppSizes.height740) {
return fontSize - 2;
} else if (AppSizes.deviceHeight < AppSizes.height880) {
return fontSize - 1;
}
}
return fontSize;
}
}

@ -0,0 +1,27 @@
class GetConnectedPatientsModel {
String user_name='';
String customer_id='';
String phone_number='';
String age='';
String gender='';
GetConnectedPatientsModel();
factory GetConnectedPatientsModel.fromJson(Map<String, dynamic> json){
GetConnectedPatientsModel rtvm = new GetConnectedPatientsModel();
rtvm.user_name = json['username'] ?? '';
rtvm.customer_id = json['customerId'] ?? '';
rtvm.phone_number = json['phone'] ?? '';
rtvm.age = json['age'].toString() ?? '';
rtvm.gender = json['gender'] ?? '';
return rtvm;
}
}

@ -0,0 +1,66 @@
import 'package:flutter/material.dart';
import 'package:doctor/common/settings.dart';
import 'package:intl/intl.dart';
class PatientRecordsModel {
String patient_name='';
String age='';
String gender='';
String patient_type='';
String problem='';
String doctorName='';
String hospitalName='';
String date='';
String recordId='';
String customerId='';
String problem_category='';
String doctorId='';
bool isDoctorVerify=false;
bool isDynamicDigitsVisible=false;
bool isDoctorPinVerify=false;
bool isReportVisible=false;
List findingsImages = [];
List reportImages = [];
List prescriptionImages = [];
DateTime dateForFilter=new DateTime.now();
PatientRecordsModel();
factory PatientRecordsModel.fromJson(Map<String, dynamic> json){
PatientRecordsModel rtvm = new PatientRecordsModel();
rtvm.patient_type = json['patientType'] ?? '';
rtvm.doctorName = json['doctorName'] ?? '';
rtvm.hospitalName = json['hospitalName'] ?? '';
rtvm.problem = json['problem'] ?? '';
rtvm.date = json['date'] ?? '';
rtvm.recordId = json['recordId'] ?? '';
rtvm.doctorId = json['doctorId'] ?? '';
rtvm.customerId = json['customerId'] ?? '';
rtvm.problem_category = json['problemCategory'] ?? '';
rtvm.findingsImages = json['findings'] ?? [];
rtvm.reportImages = json['reports'] ?? [];
rtvm.prescriptionImages = json['prescription'] ?? [];
rtvm.isDoctorVerify = json['isDoctorVerify'] ?? false;
rtvm.dateForFilter = DateFormat('dd-MM-yyyy').parse(rtvm.date);
if(rtvm.patient_type.toString().toLowerCase()=='self'){
}
else{
rtvm.age=json['others']['age'].toString();
rtvm.gender=json['others']['gender'];
rtvm.patient_name=json['others']['name'];
}
if(rtvm.doctorId==AppSettings.doctorId || rtvm.problem_category.toString().toLowerCase()=='general'){
rtvm.isReportVisible=true;
rtvm.isDoctorPinVerify=true;
}
return rtvm;
}
}

@ -392,7 +392,7 @@ packages:
source: hosted
version: "0.4.0"
flutter_launcher_icons:
dependency: "direct dev"
dependency: "direct main"
description:
name: flutter_launcher_icons
url: "https://pub.dartlang.org"
@ -447,6 +447,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
flutter_share:
dependency: "direct main"
description:
name: flutter_share
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
flutter_slidable:
dependency: "direct main"
description:
@ -1059,6 +1066,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
share:
dependency: "direct main"
description:
name: share
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.4"
shared_preferences:
dependency: "direct main"
description:

@ -58,6 +58,9 @@ dependencies:
assets_audio_player: ^3.0.3+3
path: ^1.8.0
visibility_detector: ^0.4.0+2
flutter_launcher_icons: ^0.11.0
share: ^2.0.4
flutter_share: ^2.0.0
dev_dependencies:
flutter_test:
@ -65,7 +68,11 @@ dev_dependencies:
flutter_lints: ^2.0.0
flutter_launcher_icons: ^0.11.0
flutter_icons:
image_path: "images/appicon.png" # Update this path as necessary
android: true
ios: true
flutter:

Loading…
Cancel
Save