diff --git a/lib/BMI/bmi_caluculator.dart b/lib/BMI/bmi_caluculator.dart index cc1d7e4..295cd79 100644 --- a/lib/BMI/bmi_caluculator.dart +++ b/lib/BMI/bmi_caluculator.dart @@ -12,7 +12,6 @@ class BMICalculator extends StatefulWidget { } class _BMICalculatorState extends State { - TextEditingController heightController = TextEditingController(); TextEditingController inchesController = TextEditingController(); TextEditingController cmsController = TextEditingController(); @@ -22,6 +21,7 @@ class _BMICalculatorState extends State { String bmiValue = ''; String bmiText = ''; + Color bmiTextColor = Colors.black; var heightUnitItems = [ 'feet', 'cm', @@ -32,101 +32,101 @@ class _BMICalculatorState extends State { ]; var weightUnits = 'kg'; - @override void initState() { - ageController.text=AppSettings.age; + ageController.text = AppSettings.age; super.initState(); } + @override Widget build(BuildContext context) { return Scaffold( - appBar: AppSettings.appBar('Calculate BMI'), - body: SingleChildScrollView( - child: Container( - child: Padding( - padding: EdgeInsets.all(10), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - TextFormField( - cursorColor: greyColor, - controller: ageController, - textCapitalization: TextCapitalization.characters, - keyboardType: TextInputType.number, - decoration: const InputDecoration( - prefixIcon: Icon( - Icons.person, - color: primaryColor, - ), - suffixText: "Yrs", - border: OutlineInputBorder( - borderSide: BorderSide(color: primaryColor)), - focusedBorder: OutlineInputBorder( - borderSide: BorderSide(color: primaryColor), - ), - enabledBorder: OutlineInputBorder( - borderSide: BorderSide(color: primaryColor), - ), - labelText: 'Age', - labelStyle: TextStyle( - color: greyColor, //<-- SEE HERE - ), + appBar: AppSettings.appBar('Calculate BMI'), + body: SingleChildScrollView( + child: Container( + child: Padding( + padding: EdgeInsets.all(10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + TextFormField( + cursorColor: greyColor, + controller: ageController, + textCapitalization: TextCapitalization.characters, + keyboardType: TextInputType.number, + decoration: const InputDecoration( + prefixIcon: Icon( + Icons.person, + color: primaryColor, + ), + suffixText: "Yrs", + border: OutlineInputBorder( + borderSide: BorderSide(color: primaryColor)), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide(color: primaryColor), + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide(color: primaryColor), + ), + labelText: 'Age', + labelStyle: TextStyle( + color: greyColor, //<-- SEE HERE ), ), - SizedBox(height: 10), - DropdownButtonFormField( - // Initial Value - value: heightUnits, - isExpanded: true, - decoration: const InputDecoration( - prefixIcon: Icon( - Icons.ac_unit_outlined, - color: primaryColor, - ), - border: OutlineInputBorder( - borderSide: BorderSide(color: primaryColor)), - focusedBorder: OutlineInputBorder( - borderSide: BorderSide(color: primaryColor), - ), - enabledBorder: OutlineInputBorder( - borderSide: BorderSide(color: primaryColor), - ), - labelText: 'Select Height units', - labelStyle: TextStyle( - color: greyColor, //<-- SEE HERE - ), + ), + SizedBox(height: 10), + DropdownButtonFormField( + // Initial Value + value: heightUnits, + isExpanded: true, + decoration: const InputDecoration( + prefixIcon: Icon( + Icons.ac_unit_outlined, + color: primaryColor, + ), + border: OutlineInputBorder( + borderSide: BorderSide(color: primaryColor)), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide(color: primaryColor), + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide(color: primaryColor), + ), + labelText: 'Select Height units', + labelStyle: TextStyle( + color: greyColor, //<-- SEE HERE ), + ), - hint: Text('Units'), - // Down Arrow Icon - //icon: const Icon(Icons.keyboard_arrow_down), + hint: Text('Units'), + // Down Arrow Icon + //icon: const Icon(Icons.keyboard_arrow_down), - // Array list of items - items: heightUnitItems.map((String items) { - return DropdownMenuItem( - value: items, - child: Text( - items, - style: TextStyle( - fontSize: 16, - ), - textAlign: TextAlign.center, - )); - }).toList(), - // After selecting the desired option,it will - // change button value to selected value - onChanged: (String? newValue) { - setState(() { - heightUnits = newValue!; - }); - }, - ), - SizedBox(height: 10), - Visibility( - visible:heightUnits=='feet', - child: Container( + // Array list of items + items: heightUnitItems.map((String items) { + return DropdownMenuItem( + value: items, + child: Text( + items, + style: TextStyle( + fontSize: 16, + ), + textAlign: TextAlign.center, + )); + }).toList(), + // After selecting the desired option,it will + // change button value to selected value + onChanged: (String? newValue) { + setState(() { + heightUnits = newValue!; + }); + }, + ), + SizedBox(height: 10), + Visibility( + visible: heightUnits == 'feet', + child: Container( //height: 60, child: Row( children: [ @@ -184,61 +184,25 @@ class _BMICalculatorState extends State { ), ), SizedBox(width: 5), - ], ), - ),), - Visibility( - visible:heightUnits=='cm', - child: Container( - //height: 60, - child: Row( - children: [ - Expanded( - child: TextFormField( - cursorColor: greyColor, - controller: cmsController, - textCapitalization: TextCapitalization.characters, - keyboardType: TextInputType.number, - decoration: const InputDecoration( - prefixIcon: Icon( - Icons.height, - color: primaryColor, - ), - border: OutlineInputBorder( - borderSide: BorderSide(color: primaryColor)), - focusedBorder: OutlineInputBorder( - borderSide: BorderSide(color: primaryColor), - ), - enabledBorder: OutlineInputBorder( - borderSide: BorderSide(color: primaryColor), - ), - labelText: 'Enter height in cms', - labelStyle: TextStyle( - color: greyColor, //<-- SEE HERE - ), - ), - ), - ), - - ], - ), - ),), - SizedBox(height: 10), - Container( - //height: 40, - padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), + ), + ), + Visibility( + visible: heightUnits == 'cm', + child: Container( + //height: 60, child: Row( children: [ Expanded( child: TextFormField( cursorColor: greyColor, - controller: weightController, + controller: cmsController, textCapitalization: TextCapitalization.characters, keyboardType: TextInputType.number, decoration: const InputDecoration( prefixIcon: Icon( - Icons.line_weight_outlined, + Icons.height, color: primaryColor, ), border: OutlineInputBorder( @@ -249,148 +213,199 @@ class _BMICalculatorState extends State { enabledBorder: OutlineInputBorder( borderSide: BorderSide(color: primaryColor), ), - labelText: 'Weight', + labelText: 'Enter height in cms', labelStyle: TextStyle( color: greyColor, //<-- SEE HERE ), ), ), ), - SizedBox(width: 5), - Expanded( - child: DropdownButtonFormField( - // Initial Value - value: weightUnits, - isExpanded: true, - decoration: const InputDecoration( - prefixIcon: Icon( - Icons.ac_unit_outlined, - color: primaryColor, - ), - border: OutlineInputBorder( - borderSide: BorderSide(color: primaryColor)), - focusedBorder: OutlineInputBorder( - borderSide: BorderSide(color: primaryColor), - ), - enabledBorder: OutlineInputBorder( - borderSide: BorderSide(color: primaryColor), - ), - labelText: 'Units', - labelStyle: TextStyle( - color: greyColor, //<-- SEE HERE - ), + ], + ), + ), + ), + SizedBox(height: 10), + Container( + //height: 40, + padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), + child: Row( + children: [ + Expanded( + child: TextFormField( + cursorColor: greyColor, + controller: weightController, + textCapitalization: TextCapitalization.characters, + keyboardType: TextInputType.number, + decoration: const InputDecoration( + prefixIcon: Icon( + Icons.line_weight_outlined, + color: primaryColor, + ), + border: OutlineInputBorder( + borderSide: BorderSide(color: primaryColor)), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide(color: primaryColor), + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide(color: primaryColor), + ), + labelText: 'Weight', + labelStyle: TextStyle( + color: greyColor, //<-- SEE HERE + ), + ), + ), + ), + SizedBox(width: 5), + Expanded( + child: DropdownButtonFormField( + // Initial Value + value: weightUnits, + isExpanded: true, + decoration: const InputDecoration( + prefixIcon: Icon( + Icons.ac_unit_outlined, + color: primaryColor, + ), + border: OutlineInputBorder( + borderSide: BorderSide(color: primaryColor)), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide(color: primaryColor), ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide(color: primaryColor), + ), + labelText: 'Units', + labelStyle: TextStyle( + color: greyColor, //<-- SEE HERE + ), + ), - hint: Text('Units'), - // Down Arrow Icon - //icon: const Icon(Icons.keyboard_arrow_down), + hint: Text('Units'), + // Down Arrow Icon + //icon: const Icon(Icons.keyboard_arrow_down), - // Array list of items - items: weightUnitItems.map((String items) { - return DropdownMenuItem( - value: items, - child: Text( - items, - style: TextStyle( - fontSize: 16, - ), - textAlign: TextAlign.center, - )); - }).toList(), - // After selecting the desired option,it will - // change button value to selected value - onChanged: (String? newValue) { - setState(() { - weightUnits = newValue!; - }); - }, - ), - ) - ], - ), + // Array list of items + items: weightUnitItems.map((String items) { + return DropdownMenuItem( + value: items, + child: Text( + items, + style: TextStyle( + fontSize: 16, + ), + textAlign: TextAlign.center, + )); + }).toList(), + // After selecting the desired option,it will + // change button value to selected value + onChanged: (String? newValue) { + setState(() { + weightUnits = newValue!; + }); + }, + ), + ) + ], ), - SizedBox(height: 10), - Container( - child: TextFormField( - cursorColor: greyColor, - controller: dateInput, - decoration: textFormFieldDecorationBMI( - Icons.calendar_today, 'Enter Date'), - readOnly: true, - onTap: () async { - DateTime? pickedDate = await showDatePicker( - context: context, - initialDate: DateTime.now(), - firstDate: DateTime(1950), - lastDate: DateTime.now(), - builder: (BuildContext context, Widget? child) { - return Theme( - data: ThemeData.dark().copyWith( - colorScheme: ColorScheme.dark( - primary: buttonColors, - onPrimary: Colors.white, - surface: buttonColors, - onSurface: Colors.white, - ), - dialogBackgroundColor: primaryColor, + ), + SizedBox(height: 10), + Container( + child: TextFormField( + cursorColor: greyColor, + controller: dateInput, + decoration: textFormFieldDecorationBMI( + Icons.calendar_today, 'Enter Date'), + readOnly: true, + onTap: () async { + DateTime? pickedDate = await showDatePicker( + context: context, + initialDate: DateTime.now(), + firstDate: DateTime(1950), + lastDate: DateTime.now(), + builder: (BuildContext context, Widget? child) { + return Theme( + data: ThemeData.dark().copyWith( + colorScheme: ColorScheme.dark( + primary: buttonColors, + onPrimary: Colors.white, + surface: buttonColors, + onSurface: Colors.white, ), - child: child!, - ); - }, - ); + dialogBackgroundColor: primaryColor, + ), + child: child!, + ); + }, + ); - if (pickedDate != null) { - print( - pickedDate); //pickedDate output format => 2021-03-10 00:00:00.000 - String formattedDate = - DateFormat('dd-MM-yyyy').format(pickedDate); - print( - formattedDate); //formatted date output using intl package => 2021-03-16 - setState(() { - dateInput.text = - formattedDate; //set output date to TextField value. - }); - } else {} - }, - ), + if (pickedDate != null) { + print( + pickedDate); //pickedDate output format => 2021-03-10 00:00:00.000 + String formattedDate = + DateFormat('dd-MM-yyyy').format(pickedDate); + print( + formattedDate); //formatted date output using intl package => 2021-03-16 + setState(() { + dateInput.text = + formattedDate; //set output date to TextField value. + }); + } else {} + }, ), - SizedBox(height: 10), - Container( - width: double.infinity, - height: - MediaQuery.of(context).size.height * .05, - child: ElevatedButton( - style: ElevatedButton.styleFrom( - primary: buttonColors, // background - onPrimary: Colors.black, // foreground - ), - onPressed: () async { - if (ageController.text != '' && - heightController.text != '' ||cmsController.text!=''&& - weightController.text != ''&&dateInput.text!='') { - + ), + SizedBox(height: 10), + Container( + width: double.infinity, + height: MediaQuery.of(context).size.height * .05, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + primary: buttonColors, // background + onPrimary: Colors.black, // foreground + ), + onPressed: () async { + if (ageController.text != '' && + heightController.text != '' || + cmsController.text != '' && + weightController.text != '' && + dateInput.text != '') { + if (int.parse(heightController.text) > 7) { + AppSettings.longFailedToast( + 'Please enter feet below 8 feets'); + } else if (int.parse(inchesController.text) > 12) { + AppSettings.longFailedToast( + 'Please enter inches below 12'); + } else if (int.parse(heightController.text) == 0 && + int.parse(inchesController.text) < 6) { + AppSettings.longFailedToast( + 'Please enter inches above 6'); + } else { AppSettings.preLoaderDialog(context); var payload = new Map(); - if(heightUnits.toString().toLowerCase()=='feet'){ - cmsController.text=''; - } - else{ - heightController.text=''; - inchesController.text=''; + if (heightUnits.toString().toLowerCase() == + 'feet') { + cmsController.text = ''; + } else { + heightController.text = ''; + inchesController.text = ''; } - payload["age"] = int.parse(ageController.text.toString()); + payload["age"] = + int.parse(ageController.text.toString()); payload["feet"] = heightController.text.toString(); - payload["inches"] = inchesController.text.toString(); + payload["inches"] = + inchesController.text.toString(); payload["height"] = cmsController.text.toString(); - payload["weight"] = weightController.text.toString(); + payload["weight"] = + weightController.text.toString(); payload["heightUnit"] = heightUnits.toString(); payload["weightUnit"] = weightUnits.toString(); payload["date"] = dateInput.text.toString(); - try{ - var value = await AppSettings.calculateBmi(payload); + try { + var value = + await AppSettings.calculateBmi(payload); var valueResponse = jsonDecode(value); Navigator.of(context, rootNavigator: true).pop(); heightController.clear(); @@ -399,92 +414,125 @@ class _BMICalculatorState extends State { weightController.clear(); dateInput.clear(); setState(() { - bmiValue = valueResponse['userDetails']['bmivalue'].toString(); - if(double.parse(bmiValue)<18.5){ - bmiText='Underweight'; - } - else if(double.parse(bmiValue)>=18.5&&double.parse(bmiValue)<=24.9){ - bmiText='Normal weight'; - } - else if(double.parse(bmiValue)>=25&&double.parse(bmiValue)<=29.9){ - bmiText='Overweight'; - } - else if(double.parse(bmiValue)>=30){ - bmiText='Obesity'; + bmiValue = valueResponse['userDetails'] + ['bmivalue'] + .toString(); + if (double.parse(bmiValue) < 18.5) { + bmiText = 'Underweight'; + bmiTextColor=Colors.red; + } else if (double.parse(bmiValue) >= 18.5 && + double.parse(bmiValue) <= 24.9) { + bmiText = 'Normal weight'; + bmiTextColor=buttonColors; + } else if (double.parse(bmiValue) >= 25 && + double.parse(bmiValue) <= 29.9) { + bmiText = 'Overweight'; + bmiTextColor=Colors.red; + } else if (double.parse(bmiValue) >= 30) { + bmiText = 'Obesity'; + bmiTextColor=Colors.red; } - - }); - - - - } - catch(e){ + } catch (e) { Navigator.of(context, rootNavigator: true).pop(); - AppSettings.longFailedToast('Calculating BMI failed'); + AppSettings.longFailedToast( + 'Calculating BMI failed'); } - - - - } - else{ - AppSettings.longFailedToast('Please enter valid details'); } - }, - child: const Text('Calculate BMI'), - )), - SizedBox(height: 20), - Container( - child: Row( - children: [ - Text('Your BMI value: $bmiValue',style: TextStyle(fontSize:15,fontWeight: FontWeight.bold),), - SizedBox(width: 10,), - Text(bmiText,style: TextStyle(color: Colors.red,fontWeight: FontWeight.bold)), - ], - ) - ), - SizedBox(height: 30), - Container( - child: Text('Underweight = <18.5',style: bmiTextStyle(),), - ), - SizedBox(height: 10), - Container( - child: Text('Normal weight = 18.5–24.9',style: bmiTextStyle()), - ), - SizedBox(height: 10), - Container( - child: Text('Overweight = 25–29.9',style: bmiTextStyle()), - ), - SizedBox(height: 10), - Container( - child: Text('Obesity = BMI of 30 or greater',style: bmiTextStyle()), - ), - SizedBox(height: 20), - IconButton( - onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => BMIHistory()), - ); - }, - icon: Icon( - Icons.history, - color: primaryColor, - size: 40, + } else { + AppSettings.longFailedToast( + 'Please enter valid details'); + } + }, + child: const Text('Calculate BMI'), + )), + SizedBox(height: 20), + Container( + child: Row( + children: [ + Text( + 'Your BMI value: $bmiValue', + style: + TextStyle(fontSize: 15, fontWeight: FontWeight.bold), ), + SizedBox( + width: 10, + ), + Text(bmiText, + style: TextStyle( + color: bmiTextColor, fontWeight: FontWeight.bold,fontSize: 20)), + ], + )), + SizedBox(height: 30), + Container( + child: Text( + 'Underweight = <18.5', + style: bmiTextStyle(), ), - SizedBox(height: 10), - Padding(padding: EdgeInsets.fromLTRB(10,0,0,0), - child: Container( - child: Text('History',style:TextStyle(color:Colors.black,fontSize: 12,fontWeight: FontWeight.bold,)), - ),) - - ], - ), - ) - ), - ) - ); + ), + SizedBox(height: 10), + Container( + child: + Text('Normal weight = 18.5–24.9', style: bmiTextStyle()), + ), + SizedBox(height: 10), + Container( + child: Text('Overweight = 25–29.9', style: bmiTextStyle()), + ), + SizedBox(height: 10), + Container( + child: Text('Obesity = BMI of 30 or greater', + style: bmiTextStyle()), + ), + SizedBox(height: 20), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + children: [ + IconButton( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => BMIHistory()), + ); + }, + icon: Icon( + Icons.history, + color: primaryColor, + size: 40, + ), + ), + SizedBox(height: 10), + Padding( + padding: EdgeInsets.fromLTRB(10, 0, 0, 0), + child: Container( + child: Text('History', + style: TextStyle( + color: Colors.black, + fontSize: 12, + fontWeight: FontWeight.bold, + )), + ), + ) + ], + ), + ElevatedButton( + style: ElevatedButton.styleFrom( + primary: buttonColors, // background + onPrimary: Colors.black, // foreground + ), + onPressed: () async { + Navigator.pop(context); + }, + child: const Text('Cancel'), + ) + ], + ) + ], + ), + )), + )); } } diff --git a/lib/BMI/bmi_history.dart b/lib/BMI/bmi_history.dart index 52a99b6..e5a159b 100644 --- a/lib/BMI/bmi_history.dart +++ b/lib/BMI/bmi_history.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'package:healthcare_user/BMI/bmi_caluculator.dart'; import 'package:healthcare_user/chart/bmi_chart.dart'; import 'package:flutter/material.dart'; import 'package:healthcare_user/models/bmi_history_model.dart'; @@ -44,17 +45,20 @@ class _BMIHistoryState extends State { return now_1w.isBefore(date); //reportsList=reportsListOriginal.reversed.toList(); }).toList(); - } else if (selectedRange.toString().toUpperCase() == 'LAST ONE MONTH') { + } + else if (selectedRange.toString().toUpperCase() == 'LAST ONE MONTH') { FilteredList = bmiHistoryList.where((product) { final date = product.dateForFilter; return now_1m.isBefore(date); }).toList(); - } else if (selectedRange.toString().toUpperCase() == 'LAST ONE YEAR') { + } + else if (selectedRange.toString().toUpperCase() == 'LAST ONE YEAR') { FilteredList = bmiHistoryList.where((product) { final date = product.dateForFilter; return now_1y.isBefore(date); }).toList(); - } else { + } + else { FilteredList = bmiHistoryList; } @@ -90,7 +94,8 @@ class _BMIHistoryState extends State { } Widget renderzUi() { - if (bmiHistoryList.length != 0) { + if (FilteredList.length != 0) { + FilteredList.sort((a, b) => a.actualDate.compareTo(b.actualDate)); return Column(crossAxisAlignment: CrossAxisAlignment.end, children: [ Padding( padding: EdgeInsets.fromLTRB(10, 10, 10, 10), @@ -315,7 +320,10 @@ class _BMIHistoryState extends State { FilteredList[index].bmiText .toString() .toUpperCase(), - style: valuesTextStyle()), + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.bold,color: FilteredList[index].bmiTextColor + )), ) ], ), @@ -330,7 +338,8 @@ class _BMIHistoryState extends State { })), ]); - } else { + } + else { return Center( child: Padding( padding: EdgeInsets.fromLTRB(0, 40, 0, 0), @@ -350,10 +359,14 @@ class _BMIHistoryState extends State { child: IconButton( iconSize: 40, icon: const Icon( - Icons.info, + Icons.add, color: Colors.white, ), - onPressed: () async {}, + onPressed: () async { + Navigator.push(context, MaterialPageRoute(builder: (context) => BMICalculator())).then((value) { + getBmiHistoryDetails(dateItemsVariable); + }); + }, ), ) ], @@ -374,6 +387,37 @@ class _BMIHistoryState extends State { ), ) : renderzUi(), + floatingActionButton: Visibility( + visible:FilteredList.length!=0, + child: CircleAvatar( + backgroundColor: buttonColors, + radius: 40, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + IconButton( + iconSize: 40, + icon: const Icon( + Icons.add, + color: Colors.black, + ), + onPressed: () async { + Navigator.push(context, MaterialPageRoute(builder: (context) => BMICalculator())).then((value) { + getBmiHistoryDetails(dateItemsVariable); + }); + }, + ), + /* Padding( + padding: EdgeInsets.fromLTRB(5, 0, 5, 5), + child: Text( + 'Add Tanks ', + style: TextStyle(color: Colors.white), + ), + )*/ + ], + ), + ), + ), ); } } diff --git a/lib/BP/bp_calculator.dart b/lib/BP/bp_calculator.dart index 4a2a512..8b913cf 100644 --- a/lib/BP/bp_calculator.dart +++ b/lib/BP/bp_calculator.dart @@ -138,23 +138,29 @@ class _BPCalculatorState extends State { onPressed: () async { if (systoloicController.text != '' && diastolicController.text != ''&&dateInput.text!='') { - AppSettings.preLoaderDialog(context); - var payload = new Map(); - payload["Systolic"] = double.parse(systoloicController.text.toString()); - payload["Diastolic"] = double.parse(diastolicController.text.toString()); - payload["date"] =dateInput.text.toString(); + if(int.parse(systoloicController.text)>int.parse(diastolicController.text)){ + AppSettings.preLoaderDialog(context); + var payload = new Map(); - var value = await AppSettings.calculateBP(payload); - var valueResponse = jsonDecode(value); - print(valueResponse); - setState(() { - bpValue = valueResponse['userDetails']['bpCategory'].toString(); - }); - systoloicController.clear(); - diastolicController.clear(); - dateInput.clear(); - Navigator.of(context,rootNavigator: true).pop(); + payload["Systolic"] = double.parse(systoloicController.text.toString()); + payload["Diastolic"] = double.parse(diastolicController.text.toString()); + payload["date"] =dateInput.text.toString(); + + var value = await AppSettings.calculateBP(payload); + var valueResponse = jsonDecode(value); + print(valueResponse); + setState(() { + bpValue = valueResponse['userDetails']['bpCategory'].toString(); + }); + systoloicController.clear(); + diastolicController.clear(); + dateInput.clear(); + Navigator.of(context,rootNavigator: true).pop(); + } + else{ + AppSettings.longFailedToast('Please enter diastolic value less than systolic value'); + } } else{ AppSettings.longFailedToast('Please enter valid details'); @@ -171,25 +177,45 @@ class _BPCalculatorState extends State { ) ), SizedBox(height: 20), - IconButton( - onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => BPHistory()), - ); - }, - icon: Icon( - Icons.history, - color: primaryColor, - size: 40, - ), - ), - SizedBox(height: 10), - Padding(padding: EdgeInsets.fromLTRB(10,0,0,0), - child: Container( - child: Text('History',style:TextStyle(color:Colors.black,fontSize: 12,fontWeight: FontWeight.bold,)), - ),) + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + children: [ + IconButton( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => BPHistory()), + ); + }, + icon: Icon( + Icons.history, + color: primaryColor, + size: 40, + ), + ), + SizedBox(height: 10), + Padding(padding: EdgeInsets.fromLTRB(10,0,0,0), + child: Container( + child: Text('History',style:TextStyle(color:Colors.black,fontSize: 12,fontWeight: FontWeight.bold,)), + ),) + ], + ), + ElevatedButton( + style: ElevatedButton.styleFrom( + primary: buttonColors, // background + onPrimary: Colors.black, // foreground + ), + onPressed: () async { + Navigator.pop(context); + }, + child: const Text('Cancel'), + ) + ], + ) + ], ), diff --git a/lib/BP/bp_history.dart b/lib/BP/bp_history.dart index 9bc2293..bbcce86 100644 --- a/lib/BP/bp_history.dart +++ b/lib/BP/bp_history.dart @@ -1,5 +1,6 @@ import 'dart:convert'; import 'package:flutter/material.dart'; +import 'package:healthcare_user/BP/bp_calculator.dart'; import 'package:healthcare_user/chart/bpchart.dart'; import 'package:healthcare_user/common/settings.dart'; import 'package:healthcare_user/models/bp_history_model.dart'; @@ -84,7 +85,8 @@ class _BPHistoryState extends State { } Widget renderzUi() { - if (BpHistoryList.length != 0) { + if (FilteredList.length != 0) { + FilteredList.sort((a, b) => b.actualDate.compareTo(a.actualDate)); return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: EdgeInsets.fromLTRB(10, 10, 10, 10), @@ -306,10 +308,14 @@ class _BPHistoryState extends State { child: IconButton( iconSize: 40, icon: const Icon( - Icons.info, + Icons.add, color: Colors.white, ), - onPressed: () async {}, + onPressed: () async { + Navigator.push(context, MaterialPageRoute(builder: (context) => BPCalculator())).then((value) { + getBPHistoryDetails(dateItemsVariable); + }); + }, ), ) ], @@ -330,6 +336,37 @@ class _BPHistoryState extends State { ), ) : renderzUi(), + floatingActionButton: Visibility( + visible:FilteredList.length!=0, + child: CircleAvatar( + backgroundColor: buttonColors, + radius: 40, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + IconButton( + iconSize: 40, + icon: const Icon( + Icons.add, + color: Colors.black, + ), + onPressed: () async { + Navigator.push(context, MaterialPageRoute(builder: (context) => BPCalculator())).then((value) { + getBPHistoryDetails(dateItemsVariable); + }); + }, + ), + /* Padding( + padding: EdgeInsets.fromLTRB(5, 0, 5, 5), + child: Text( + 'Add Tanks ', + style: TextStyle(color: Colors.white), + ), + )*/ + ], + ), + ), + ), ); } } diff --git a/lib/Reports/add_reports.dart b/lib/Reports/add_reports.dart index c01ac85..d43ba3a 100644 --- a/lib/Reports/add_reports.dart +++ b/lib/Reports/add_reports.dart @@ -5,6 +5,7 @@ import 'package:flutter/services.dart'; import 'package:healthcare_user/common/settings.dart'; import 'package:healthcare_user/common/zoom_image.dart'; import 'package:healthcare_user/models/get_connected_doctors_model.dart'; +import 'package:healthcare_user/my_connections/add-doctor.dart'; import 'package:intl/intl.dart'; import 'package:image_picker/image_picker.dart'; import 'package:multi_image_picker/multi_image_picker.dart'; @@ -350,7 +351,7 @@ class _AddReportsState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Container(child: DropdownButtonFormField( + Container(child: connectedDoctorsListOriginal.length!=0?DropdownButtonFormField( // Initial Value value: doctorNameVariable, isExpanded: true, @@ -396,7 +397,69 @@ class _AddReportsState extends State { doctorNameVariable = newValue; }); }, + ):IconButton( + onPressed: () { + Navigator.push(context, MaterialPageRoute(builder: (context) => AddDoctor())).then((value) { + getAllConnectedDoctors(); + }); + }, + icon: Icon( + Icons.add, + color: primaryColor, + size: 40, + ), ),), + Visibility( + visible: connectedDoctorsListOriginal.length!=0, + child: Container(child: DropdownButtonFormField( + // Initial Value + value: doctorNameVariable, + isExpanded: true, + decoration: const InputDecoration( + prefixIcon: Icon( + Icons.person, + color: greyColor, + ), + border: OutlineInputBorder( + borderSide: BorderSide(color: primaryColor)), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide(color: primaryColor), + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide(color: primaryColor), + ), + labelText: 'Select Doctor', + labelStyle: TextStyle( + color: greyColor, //<-- SEE HERE + ), + ), + + hint: Text('Please Select Doctor'), + // Down Arrow Icon + //icon: const Icon(Icons.keyboard_arrow_down), + + // Array list of items + items: connectedDoctorsListOriginal.map((items) { + return DropdownMenuItem( + value: items, + child: Text( + items.doctor_name, + style: TextStyle( + fontSize: 16, + ), + textAlign: TextAlign.center, + )); + }).toList(), + // After selecting the desired option,it will + // change button value to selected value + onChanged: ( newValue) { + setState(() { + doctorNameVariable = newValue; + }); + }, + ),), + ), + SizedBox( height: MediaQuery.of(context).size.height * .02, ), diff --git a/lib/Reports/allreports.dart b/lib/Reports/allreports.dart index a8f7b23..ca3c289 100644 --- a/lib/Reports/allreports.dart +++ b/lib/Reports/allreports.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:carousel_slider/carousel_slider.dart'; import 'package:flutter/material.dart'; import 'package:healthcare_user/Reports/add_reports.dart'; import 'package:healthcare_user/Reports/all_records_tab.dart'; @@ -40,6 +41,12 @@ class _AllReportsState extends State { 'Doctor', 'Date', ]; + final List imgList = [ + 'images/mobilebg.png', + 'images/mobilebg2.png', + 'images/mobilebg3.png' + ]; + List images = ['img1', 'img2', 'img3']; Future getAllRecords() async { isReportsDataLoading=true; @@ -62,7 +69,6 @@ class _AllReportsState extends State { } } - Future getRecordsByProblemName(var problem) async { isReportsDataLoading=true; @@ -138,7 +144,6 @@ class _AllReportsState extends State { } } - Future getRecordsByDateRange(var fromDate,var toDate) async { isReportsDataLoading = true; @@ -192,49 +197,6 @@ class _AllReportsState extends State { super.initState(); } - - 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 * .50, - 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 findings(var obj){ return Container( width: double.infinity, @@ -387,9 +349,51 @@ class _AllReportsState extends State { Widget _filtereddata(){ if(reportsList.length!=0){ reportsList.sort((a, b) => b.date.compareTo(a.date)); - return ListView.builder( + return ListView.separated( padding: EdgeInsets.all(0), itemCount: reportsList.length, + separatorBuilder: (context, index) { + if ((index + 1) % 2 == 0) { + return CarouselSlider( + options: CarouselOptions( + height: MediaQuery.of(context).size.height * .200, + aspectRatio: 16 / 9, + viewportFraction: 0.8, + initialPage: 0, + enableInfiniteScroll: true, + reverse: false, + autoPlay: true, + autoPlayInterval: Duration(seconds: 3), + autoPlayAnimationDuration: Duration(milliseconds: 800), + autoPlayCurve: Curves.ease, + enlargeCenterPage: true, + enlargeFactor: 0.2, + scrollDirection: Axis.horizontal, + ), + items: imgList.map((i) { + return Builder( + builder: (BuildContext context) { + return Container( + height: MediaQuery.of(context).size.height * .250, + width: double.infinity, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(0), + ), + //color: Colors.red, + child: FittedBox( + child: Image( + image: AssetImage(i), + ), + fit: BoxFit.fill, + )); + }, + ); + }).toList(), + ); + } else { + return Container(); + } + }, itemBuilder: (BuildContext context, int index) { return GestureDetector( onTap: (){ diff --git a/lib/Sugar/sugar_calculator.dart b/lib/Sugar/sugar_calculator.dart index a031be0..a4e34f6 100644 --- a/lib/Sugar/sugar_calculator.dart +++ b/lib/Sugar/sugar_calculator.dart @@ -18,6 +18,7 @@ class _SugarCalculatorState extends State { TextEditingController postParandialValueController = TextEditingController(); TextEditingController dateInput = TextEditingController(); String sugarValue = ''; + Color sugarValueColor = Colors.black; @override Widget build(BuildContext context) { return Scaffold( @@ -48,7 +49,7 @@ class _SugarCalculatorState extends State { enabledBorder: OutlineInputBorder( borderSide: BorderSide(color: primaryColor), ), - labelText: 'Enter fasting sugar value', + labelText: 'Enter fasting blood sugar value', labelStyle: TextStyle( color: greyColor, //<-- SEE HERE ), @@ -138,24 +139,50 @@ class _SugarCalculatorState extends State { onPressed: () async { if (fastingValueController.text != '' && postParandialValueController.text != ''&& dateInput.text!='') { - AppSettings.preLoaderDialog(context); - var payload = new Map(); - payload["fasting"] = double.parse(fastingValueController.text.toString()); - payload["postPrandial"] = double.parse(postParandialValueController.text.toString()); - payload["date"] = dateInput.text.toString(); + if(int.parse(fastingValueController.text)>int.parse(postParandialValueController.text)){ + AppSettings.longFailedToast('Please enter post parandial value is higher than fasting blood sugar value details'); + } + else{ + AppSettings.preLoaderDialog(context); + var payload = new Map(); + + payload["fasting"] = double.parse(fastingValueController.text.toString()); + payload["postPrandial"] = double.parse(postParandialValueController.text.toString()); + payload["date"] = dateInput.text.toString(); + + var value = await AppSettings.calculateSugar(payload); + var valueResponse = jsonDecode(value); + print(valueResponse); + setState(() { + sugarValue = valueResponse['userSugarDetails']['sugarCategory'].toString(); + if(sugarValue.toUpperCase().toUpperCase()=='VERY HIGH BLOOD SUGAR'){ + sugarValueColor=Colors.red; + } + else if(sugarValue.toUpperCase().toUpperCase()=='HIGH BLOOD SUGAR'){ + sugarValueColor=Colors.red; + } + else if(sugarValue.toUpperCase().toUpperCase()=='PREDIABETES (IMPAIRED FASTING GLUCOSE)'){ + sugarValueColor=Colors.red; + } + else if(sugarValue.toUpperCase().toUpperCase()=='VERY LOW BLOOD SUGAR'){ + sugarValueColor=Colors.red; + } + else if(sugarValue.toUpperCase().toUpperCase()=='LOW BLOOD SUGAR'){ + sugarValueColor=Colors.red; + } + else if(sugarValue.toUpperCase().toUpperCase()=='NORMAL BLOOD SUGAR (HEALTHY RANGE)'){ + sugarValueColor=buttonColors; + } + + }); + fastingValueController.clear(); + postParandialValueController.clear(); + dateInput.clear(); + Navigator.of(context,rootNavigator: true).pop(); + } - var value = await AppSettings.calculateSugar(payload); - var valueResponse = jsonDecode(value); - print(valueResponse); - setState(() { - sugarValue = valueResponse['userSugarDetails']['sugarCategory'].toString(); - }); - fastingValueController.clear(); - postParandialValueController.clear(); - dateInput.clear(); - Navigator.of(context,rootNavigator: true).pop(); } else{ AppSettings.longFailedToast('Please enter valid details'); @@ -167,30 +194,57 @@ class _SugarCalculatorState extends State { Container( child: Row( children: [ - Text(sugarValue,style: TextStyle(color: Colors.red,fontWeight: FontWeight.bold,fontSize: 15),), + Text(sugarValue,style: TextStyle(color: sugarValueColor,fontWeight: FontWeight.bold,fontSize: 20),), + Visibility( + visible:sugarValue!='' , + child: Icon( + Icons.emoji_emotions_outlined, + color: buttonColors, + size: 40, + ),) ], ) ), SizedBox(height: 20), - IconButton( - onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => SugarHistory()), - ); - }, - icon: Icon( - Icons.history, - color: primaryColor, - size: 40, - ), - ), - SizedBox(height: 10), - Padding(padding: EdgeInsets.fromLTRB(10,0,0,0), - child: Container( - child: Text('History',style:TextStyle(color:Colors.black,fontSize: 12,fontWeight: FontWeight.bold,)), - ),) + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + children: [ + IconButton( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => SugarHistory()), + ); + }, + icon: Icon( + Icons.history, + color: primaryColor, + size: 40, + ), + ), + SizedBox(height: 10), + Padding(padding: EdgeInsets.fromLTRB(10,0,0,0), + child: Container( + child: Text('History',style:TextStyle(color:Colors.black,fontSize: 12,fontWeight: FontWeight.bold,)), + ),) + ], + ), + ElevatedButton( + style: ElevatedButton.styleFrom( + primary: buttonColors, // background + onPrimary: Colors.black, // foreground + ), + onPressed: () async { + Navigator.pop(context); + }, + child: const Text('Cancel'), + ) + ], + ) + ], ), diff --git a/lib/Sugar/sugar_history.dart b/lib/Sugar/sugar_history.dart index 48c8410..0341a84 100644 --- a/lib/Sugar/sugar_history.dart +++ b/lib/Sugar/sugar_history.dart @@ -1,5 +1,6 @@ import 'dart:convert'; import 'package:flutter/material.dart'; +import 'package:healthcare_user/Sugar/sugar_calculator.dart'; import 'package:healthcare_user/common/settings.dart'; import 'package:healthcare_user/models/sugar_history_model.dart'; import 'package:flutter_slidable/flutter_slidable.dart'; @@ -83,7 +84,8 @@ class _SugarHistoryState extends State { } Widget renderzUi() { - if (sugarHistoryList.length != 0) { + if (FilteredList.length != 0) { + FilteredList.sort((a, b) => b.actualDate.compareTo(a.actualDate)); return Column(crossAxisAlignment: CrossAxisAlignment.end, children: [ Padding( padding: EdgeInsets.fromLTRB(10, 10, 10, 10), @@ -191,11 +193,6 @@ class _SugarHistoryState extends State { style: labelTextStyle(), ), SizedBox(height:MediaQuery.of(context).size.height * .01,), - Text( - 'Actual Sugar Value', - style: labelTextStyle(), - ), - SizedBox(height:MediaQuery.of(context).size.height * .01,), Text( 'Sugar Status', style: labelTextStyle(), @@ -231,11 +228,6 @@ class _SugarHistoryState extends State { ':', style: labelTextStyle(), ), - SizedBox(height:MediaQuery.of(context).size.height * .01,), - Text( - ':', - style: labelTextStyle(), - ), ], ), SizedBox(width:MediaQuery.of(context).size.width * .01,), @@ -257,19 +249,18 @@ class _SugarHistoryState extends State { .toUpperCase(), style: valuesTextStyle()), SizedBox(height:MediaQuery.of(context).size.height * .01,), - Text( - FilteredList[index] - .sugarValue - .toString() - .toUpperCase(), - style: valuesTextStyle()), - SizedBox(height:MediaQuery.of(context).size.height * .01,), Text( FilteredList[index] .sugartText .toString() .toUpperCase(), - style: wrapTextStyleBlack()), + style: TextStyle( + color: FilteredList[index] + .sugarValueColor, + fontSize: 12, + fontWeight: FontWeight.bold, + overflow: TextOverflow.ellipsis, + )), SizedBox(height:MediaQuery.of(context).size.height * .01,), Text( FilteredList[index] @@ -279,126 +270,6 @@ class _SugarHistoryState extends State { style: valuesTextStyle()), ], ),) - - - /*Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - *//*Image( - image: const AssetImage( - 'images/height.png'), - height: 25, - width: 25, - fit: BoxFit.fill),*//* - Text( - 'Fasting Sugar Value', - style: TextStyle(color: primaryColor), - ), - Padding( - padding: EdgeInsets.all(5), - child: Text( - FilteredList[index] - .fasting - .toString() - .toUpperCase(), - style: valuesTextStyle()), - ) - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Text( - 'PostPrandial Sugar Value', - style: TextStyle(color: primaryColor), - ), - Padding( - padding: EdgeInsets.all(5), - child: Text( - FilteredList[index] - .postPrandial - .toString() - .toUpperCase(), - style: valuesTextStyle()), - ) - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Image( - image: const AssetImage( - 'images/height.png'), - height: 25, - width: 25, - fit: BoxFit.fill), - Padding( - padding: EdgeInsets.all(5), - child: Text( - FilteredList[index] - .sugarValue - .toString() - .toUpperCase(), - style: valuesTextStyle()), - ) - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Image( - image: const AssetImage( - 'images/height.png'), - height: 25, - width: 25, - fit: BoxFit.fill), - Padding( - padding: EdgeInsets.all(5), - child: Text( - FilteredList[index] - .sugartText - .toString() - .toUpperCase(), - style: valuesTextStyle()), - ) - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Image( - image: const AssetImage( - 'images/date.png'), - height: 25, - width: 25, - fit: BoxFit.fill), - Padding( - padding: EdgeInsets.all(5), - child: Text( - FilteredList[index] - .actualDate - .toString() - .toUpperCase(), - style: valuesTextStyle()), - ) - ], - ), - ], - ),*/ ], ), ), @@ -425,10 +296,14 @@ class _SugarHistoryState extends State { child: IconButton( iconSize: 40, icon: const Icon( - Icons.info, + Icons.add, color: Colors.white, ), - onPressed: () async {}, + onPressed: () async { + Navigator.push(context, MaterialPageRoute(builder: (context) => SugarCalculator())).then((value) { + getSugarHistoryDetails(dateItemsVariable); + }); + }, ), ) ], @@ -449,6 +324,30 @@ class _SugarHistoryState extends State { ), ) : renderzUi(), + floatingActionButton: Visibility( + visible:FilteredList.length!=0, + child: CircleAvatar( + backgroundColor: buttonColors, + radius: 40, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + IconButton( + iconSize: 40, + icon: const Icon( + Icons.add, + color: Colors.black, + ), + onPressed: () async { + Navigator.push(context, MaterialPageRoute(builder: (context) => SugarCalculator())).then((value) { + getSugarHistoryDetails(dateItemsVariable); + }); + }, + ), + ], + ), + ), + ), ); } } diff --git a/lib/common/dashboard.dart b/lib/common/dashboard.dart index 4b6975f..ae93cc0 100644 --- a/lib/common/dashboard.dart +++ b/lib/common/dashboard.dart @@ -19,6 +19,7 @@ import 'package:healthcare_user/report_problem/all_problems.dart'; import 'package:healthcare_user/seekopinion.dart'; import 'package:healthcare_user/common/settings.dart'; import 'package:healthcare_user/updates/update_location.dart'; +import 'package:healthcare_user/updates/update_pin.dart'; import 'package:image_picker/image_picker.dart'; import 'package:carousel_slider/carousel_slider.dart'; import 'dart:ui' as ui; @@ -773,7 +774,7 @@ class _DashboardState extends State { const SizedBox( width: 10, ), - Text('My Health', style: drawerListItemsTextStyle()), + Text('My Health (Sugar/BP/BMI)', style: drawerListItemsTextStyle()), ], ), onTap: () { @@ -917,7 +918,13 @@ class _DashboardState extends State { Text('Update Pin', style: drawerListItemsTextStyle()), ], ), - onTap: () {}, + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const UpdatePin()), + ); + }, ), Divider( color: Colors.grey, diff --git a/lib/common/forgotpassword.dart b/lib/common/forgotpassword.dart new file mode 100644 index 0000000..541d2e4 --- /dev/null +++ b/lib/common/forgotpassword.dart @@ -0,0 +1,93 @@ +import 'package:flutter/material.dart'; +import 'package:healthcare_user/common/settings.dart'; + +class Forgotpassword extends StatefulWidget { + @override + State createState() => _ForgotpasswordState(); +} + +class _ForgotpasswordState extends State { + TextEditingController emailController = TextEditingController(); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: primaryColor, + body: Stack(children: [ + /*Container( + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage("images/backgroundimage.png"), + fit: BoxFit.cover, + ), + ), + ),*/ + GestureDetector( + onTap: () { + FocusScope.of(context).requestFocus(new FocusNode()); + }, + child: SafeArea( + child: SingleChildScrollView( + child: Column(children: [ + const SizedBox( + height: 50, + ), + Container( + child: Image( + image: const AssetImage('images/logo.png'), + height: MediaQuery.of(context).size.height * .20, + )), + const SizedBox( + height: 10, + ), + Container( + padding: const EdgeInsets.all(10), + child: const Text( + 'Enter Your Email Address and we will send a link to reset your password', + style: TextStyle(fontSize: 12, color: greyColor), + ), + ), + Container( + padding: const EdgeInsets.all(10), + child: TextFormField( + cursorColor: greyColor, + controller: emailController, + decoration: const InputDecoration( + prefixIcon: Icon( + Icons.email, + color: greyColor, + ), + border: OutlineInputBorder( + borderSide: BorderSide(color: greyColor)), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide(color: greyColor), + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide(color: greyColor), + ), + labelText: 'Enter email ID', + labelStyle: TextStyle( + color: greyColor, //<-- SEE HERE + ), + ), + ), + ), + const SizedBox( + height: 20, + ), + Container( + width: 400, + height: 50, + padding: const EdgeInsets.fromLTRB(10, 0, 10, 0), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + primary: primaryColor, // background + onPrimary: Colors.white, // foreground + ), + onPressed: () {}, + child: const Text('Send'), + )), + ])))), + ])); + } +} diff --git a/lib/common/login.dart b/lib/common/login.dart index e479574..6cad141 100644 --- a/lib/common/login.dart +++ b/lib/common/login.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:healthcare_user/common/dashboard.dart'; +import 'package:healthcare_user/common/forgotpassword.dart'; +import 'package:healthcare_user/common/otpscreen_forgotpassword.dart'; import 'package:healthcare_user/common/settings.dart'; import 'package:healthcare_user/common/signup.dart'; import 'package:path/path.dart' as Path; @@ -102,7 +104,8 @@ class _LoginState extends State { ), Container( child: TextFormField( - cursorColor: greyColor, + cursorColor: Colors.white, + style: TextStyle(color: Colors.white), controller: mobileNumberController, keyboardType: TextInputType.number, decoration: textFormFieldDecoration(Icons.phone,'Enter MobileNumber'), @@ -112,29 +115,30 @@ class _LoginState extends State { SizedBox(height:MediaQuery.of(context).size.height * .02,), Container( child: TextFormField( - cursorColor: greyColor, + cursorColor: Colors.white, + style: TextStyle(color: Colors.white), obscureText: isObscureText, controller: passwordController, decoration: InputDecoration( - fillColor: Colors.white, + fillColor: primaryColor, filled: true, labelText: 'Password', - prefixIcon: const Icon(Icons.password, color: greyColor,), + prefixIcon: const Icon(Icons.password, color: Colors.white,), labelStyle: const TextStyle( - color: Colors.black, //<-- SEE HERE + color: Colors.white, //<-- SEE HERE ), border: const OutlineInputBorder( - borderSide: BorderSide(color: primaryColor)), + borderSide: BorderSide(color: Colors.white)), focusedBorder: const OutlineInputBorder( - borderSide: BorderSide(color: primaryColor), + borderSide: BorderSide(color: Colors.white), ), enabledBorder: const OutlineInputBorder( - borderSide: BorderSide(color: primaryColor), + borderSide: BorderSide(color: Colors.white), ), suffixIcon: IconButton( icon: Icon( Icons.visibility_off_outlined, - color: isObscureText==true?greyColor:primaryColor, + color: isObscureText==true?buttonColors:Colors.white, ), onPressed: () { @@ -155,10 +159,10 @@ class _LoginState extends State { child: Padding(padding: const EdgeInsets.fromLTRB(0, 0, 0,0), child: TextButton( onPressed: () { - /*Navigator.push( + Navigator.push( context, - MaterialPageRoute(builder: (context) => OtpScreen()), - );*/ + MaterialPageRoute(builder: (context) => OtpScreencForgotPassword()), + ); }, child: const Text( 'Forgot Password?', diff --git a/lib/common/otpscreen_forgotpassword.dart b/lib/common/otpscreen_forgotpassword.dart new file mode 100644 index 0000000..14b115c --- /dev/null +++ b/lib/common/otpscreen_forgotpassword.dart @@ -0,0 +1,269 @@ +import 'package:flutter/material.dart'; +import 'package:healthcare_user/common/login.dart'; +import 'package:healthcare_user/common/settings.dart'; +class OtpScreencForgotPassword extends StatefulWidget { + const OtpScreencForgotPassword({Key? key}) : super(key: key); + + @override + State createState() => _OtpScreencForgotPasswordState(); +} + +class _OtpScreencForgotPasswordState extends State { + + final TextEditingController _fieldOne = TextEditingController(); + final TextEditingController _fieldTwo = TextEditingController(); + final TextEditingController _fieldThree = TextEditingController(); + final TextEditingController _fieldFour = TextEditingController(); + final TextEditingController _fieldFive = TextEditingController(); + final TextEditingController _fieldSix = TextEditingController(); + TextEditingController mobileNumberController = TextEditingController(); + TextEditingController passwordController = TextEditingController(); + + bool isTextfieldVisible=true; + bool isOtpVisible=false; + bool isObscureText=true; + + // This is the entered code + // It will be displayed in a Text widget + String? _otp; + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: primaryColor, + body: Padding( + padding: EdgeInsets.all(10), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text('Phone Number Verification',style: TextStyle(color: Colors.white),), + SizedBox( + height:MediaQuery.of(context).size.height * .02, + ), + + Visibility( + visible: isTextfieldVisible, + child: Container( + child: TextFormField( + cursorColor: Colors.white, + style: TextStyle(color: Colors.white), + controller: mobileNumberController, + keyboardType: TextInputType.number, + decoration: textFormFieldDecoration(Icons.phone,'Enter MobileNumber'), + ), + ),), + const SizedBox( + height: 30, + ), + Visibility( + visible: isTextfieldVisible, + child: Container( + width:double.infinity, + height: MediaQuery.of(context).size.height * .05, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + primary: buttonColors, // background + onPrimary: Colors.black, // foreground + ), + onPressed: ()async { + + + if(mobileNumberController.text.length>=10){ + var payload = new Map(); + payload["phone"] = mobileNumberController.text.toString(); + + bool forgotPwd = await AppSettings.forgotPassword(payload); + + if(forgotPwd){ + setState(() { + isTextfieldVisible=false; + isOtpVisible=true; + }); + + } + else{ + AppSettings.longFailedToast('Please enter valid registered mobile number'); + } + + } + else{ + AppSettings.longFailedToast('Please enter 10 digits of mobile number'); + } + + }, + child: const Text('Submit')), + ),), + // Implement 4 input fields + Visibility( + visible:isOtpVisible, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + OtpInput(_fieldOne, true), // auto focus + OtpInput(_fieldTwo, false), + OtpInput(_fieldThree, false), + OtpInput(_fieldFour, false), + OtpInput(_fieldFive, false), + OtpInput(_fieldSix, false), + ], + ),), + const SizedBox( + height: 30, + ), + Visibility( + visible: isOtpVisible, + child: Container( + padding: const EdgeInsets.fromLTRB(10, 10, 10, 0), + child: TextFormField( + cursorColor: Colors.white, + style: TextStyle(color: Colors.white), + obscureText: isObscureText, + controller: passwordController, + decoration: InputDecoration( + filled: true, + fillColor: primaryColor, + labelText: 'Password', + prefixIcon: const Icon(Icons.password, color: Colors.white,), + labelStyle: const TextStyle( + color: Colors.white, //<-- SEE HERE + ), + border: const OutlineInputBorder( + borderSide: BorderSide(color: Colors.white)), + focusedBorder: const OutlineInputBorder( + borderSide: BorderSide(color: Colors.white), + ), + enabledBorder: const OutlineInputBorder( + borderSide: BorderSide(color: Colors.white), + ), + suffixIcon: IconButton( + icon: Icon( + Icons.visibility_off_outlined, + color: isObscureText==true?buttonColors:Colors.white, + ), + onPressed: () { + + print("show password"); + setState(() { + isObscureText = !isObscureText; + }); + }, + ), + + ), + + ), + ),), + const SizedBox( + height: 30, + ), + Visibility( + visible: isOtpVisible, + child: Container( + width:double.infinity, + height: MediaQuery.of(context).size.height * .05, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + primary: buttonColors, // background + onPrimary: Colors.black, // foreground + ), + onPressed: ()async { + setState(() { + _otp = _fieldOne.text + + _fieldTwo.text + + _fieldThree.text + + _fieldFour.text+ + _fieldFive.text + + _fieldSix.text; + }); + + if (_otp!.length == 6&&passwordController.text!='') { + AppSettings.preLoaderDialog(context); + + bool isOnline = await AppSettings.internetConnectivity(); + + if(isOnline){ + var payload = new Map(); + payload["phone"] = mobileNumberController.text.toString(); + payload["resetPasswordCode"] = _otp.toString(); + payload["newPassword"] = passwordController.text.toString(); + + bool signinStatus = await AppSettings.resetPassword(payload); + try{ + if (signinStatus) { + Navigator.of(context,rootNavigator: true).pop(); + await Navigator.push( + context, + MaterialPageRoute(builder: (context) => Login()), + ); + AppSettings.longSuccessToast("Password reset successfully"); + + } else { + Navigator.of(context,rootNavigator: true).pop(); + AppSettings.longFailedToast("Please enter valid details"); + } + } + catch(exception){ + Navigator.of(context,rootNavigator: true).pop(); + print(exception); + } + } + else{ + Navigator.of(context,rootNavigator: true).pop(); + AppSettings.longFailedToast("Please Check internet"); + } + + + } + else{ + + AppSettings.longFailedToast("Please enter valid details"); + } + }, + child: const Text('Submit')), + ) + ) + ], + ), + ) + ); + } +} + +// Create an input widget that takes only one digit +class OtpInput extends StatelessWidget { + final TextEditingController controller; + final bool autoFocus; + const OtpInput(this.controller, this.autoFocus, {Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 60, + width: 50, + child: TextField( + autofocus: autoFocus, + textAlign: TextAlign.center, + keyboardType: TextInputType.number, + controller: controller, + maxLength: 1, + cursorColor: Colors.black, + decoration: const InputDecoration( + filled: true, + fillColor: Colors.white, + border: OutlineInputBorder(borderSide: BorderSide(color: primaryColor)), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide(color: primaryColor), + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide(color: primaryColor), + ), + counterText: '', + hintStyle: TextStyle(color: Colors.black, fontSize: 20.0)), + onChanged: (value) { + if (value.length == 1) { + FocusScope.of(context).nextFocus(); + } + }, + ), + ); + } +} diff --git a/lib/common/settings.dart b/lib/common/settings.dart index 17fa76d..71c8439 100644 --- a/lib/common/settings.dart +++ b/lib/common/settings.dart @@ -171,29 +171,59 @@ TextStyle drawerHeaderTextStyle() { TextStyle drawerHeaderTextStyleNew() { return TextStyle(color: Colors.black, fontSize: 15); } +TextStyle radioHeadingTextStyle() { + return TextStyle(color: Colors.white); +} +TextStyle radioItemsTextStyle() { + return TextStyle(color: Colors.white,fontSize: 11); +} + + InputDecoration textFormFieldDecoration(IconData icon, var text) { return InputDecoration( filled: true, - fillColor: Colors.white, + fillColor: primaryColor, + prefixIcon: Icon( + icon, + color: Colors.white, + ), + border: OutlineInputBorder(borderSide: BorderSide(color: Colors.white)), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide(color: Colors.white), + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide(color: Colors.white), + ), + labelText: text, + labelStyle: TextStyle( + color: Colors.white, //<-- SEE HERE + ), + ); +} + +InputDecoration textFormFieldDecorationGrey(IconData icon, var text) { + return InputDecoration( prefixIcon: Icon( icon, color: greyColor, ), - border: OutlineInputBorder(borderSide: BorderSide(color: primaryColor)), + border: OutlineInputBorder( + borderSide: BorderSide(color: greyColor)), focusedBorder: OutlineInputBorder( - borderSide: BorderSide(color: primaryColor), + borderSide: BorderSide(color: greyColor), ), enabledBorder: OutlineInputBorder( - borderSide: BorderSide(color: primaryColor), + borderSide: BorderSide(color: greyColor), ), labelText: text, labelStyle: TextStyle( - color: Colors.black, //<-- SEE HERE + color: greyColor, //<-- SEE HERE ), ); } + InputDecoration textFormFieldDecorationBMI(IconData icon, var text) { return InputDecoration( //filled: true, @@ -211,7 +241,7 @@ InputDecoration textFormFieldDecorationBMI(IconData icon, var text) { ), labelText: text, labelStyle: TextStyle( - //color: Colors.black, //<-- SEE HERE + color: Colors.grey, //<-- SEE HERE ), ); } @@ -229,6 +259,13 @@ class AppSettings { static String userName = ''; static String userAddress = ''; static String detailedAddress = ''; + static String emergencyContactNumber1 = ''; + static String emergencyContactNumber2 = ''; + static String emergencyRelation1 = ''; + static String emergencyRelation2 = ''; + static String emergencyRelationName1 = ''; + static String emergencyRelationName2 = ''; + static String bloodGroup = ''; static String email = ''; static String age = ''; static String gender = ''; @@ -256,12 +293,15 @@ class AppSettings { 'AAAAA66BLaA:APA91bHcmbyiNN8hCL-t-M9oH-u7ZMOl74fcImMM2DQZLgdyY98Wu9XxME-CTPcjpjU6Yy48ouxISrOMb9lpa3PJofh8qciUKMNxV2al-bDvGvPP_VVaH0mrTHzR56hdkGy1Zl-0frDO'; //api urls - static String host = 'http://35.200.129.165:4000/api/'; + //static String host = 'http://35.200.129.165:4000/api/'; + static String host = 'http://cloudh.in:4000/api/'; static String loginUrl = host + 'login'; static String signUpUrl = host + 'users'; static String generateQRCodeUrl = host + 'generate-qrcode'; static String sendSmsUrl = host + 'sendSms'; static String phoneVerificationUrl = host + 'phone'; + static String forgotPasswordUrl = host + 'forgotpassword'; + static String resetPasswordUrl = host + 'resetpassword'; static String verifyPhnUrl = host + 'phone'; static String resetTokenUrl = host + 'reset_token'; static String bmiCaluculateUrl = host + 'insertBMI'; @@ -271,7 +311,9 @@ class AppSettings { static String inviteFriendUrl = host + 'sendInviteLink'; static String updateProfileUrl = host + 'update/currentUser'; static String updateLocationUrl = host + 'updateLocation'; + static String updatePinUrl = host + 'updateUserProfile'; static String uploadPicUrl = host + 'uploads'; + static String uploadBloodGroupPicUrl = host + 'uploads-bloodGroup'; static String getBmiHistoryUrl = host + 'usersbmi'; static String getBpHistoryUrl = host + 'usersbp'; static String getSugarHistoryUrl = host + 'userssugar'; @@ -316,16 +358,10 @@ class AppSettings { static String getDynamicCodeDataUrl = host + 'getDoctorInfo'; - - - - - - - static File? updatedImage; static String image = ''; static String profilePictureUrl = ''; + static String bloodGroupPictureUrl = ''; static var api = { 'signIn': host + '/login', }; @@ -502,7 +538,6 @@ class AppSettings { } } - static Future sendSms(payload) async { var response = await http.post(Uri.parse(sendSmsUrl), body: json.encode(payload), @@ -513,6 +548,7 @@ class AppSettings { return false; } } + static Future phoneVerification(payload) async { var response = await http.post(Uri.parse(phoneVerificationUrl), body: json.encode(payload), @@ -524,6 +560,70 @@ class AppSettings { } } + static Future forgotPassword(payload) async { + var uri = Uri.parse(forgotPasswordUrl); + var response = await http.post(uri, + body: json.encode(payload), headers: await buildRequestHeaders()); + + if (response.statusCode == 200) { + try { + var _response = json.decode(response.body); + print(_response); + return true; + } catch (e) { + // display error toast + return false; + } + } 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; + } + } + + static Future resetPassword(payload) async { + var uri = Uri.parse(resetPasswordUrl); + var response = await http.post(uri, + body: json.encode(payload), headers: await buildRequestHeaders()); + + if (response.statusCode == 200) { + try { + var _response = json.decode(response.body); + print(_response); + return true; + } catch (e) { + // display error toast + return false; + } + } 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; + } + } + static Future calculateBmi(payload) async { var uri = Uri.parse(bmiCaluculateUrl + '/' + customerId); @@ -723,11 +823,28 @@ class AppSettings { userName = _response['username']; phoneNumber = _response['phone']; email = _response['emails'][0]['email']; + emergencyContactNumber1 = _response['emergencyContacts'][0]['contactNumber']; + emergencyContactNumber2 = _response['emergencyContacts'][1]['contactNumber']; + emergencyRelation1 = _response['emergencyContacts'][0]['relationship']; + emergencyRelation2 = _response['emergencyContacts'][1]['relationship']; + emergencyRelationName1 = _response['emergencyContacts'][0]['name']; + emergencyRelationName2 = _response['emergencyContacts'][1]['name']; + bloodGroup = _response['bloodGroup']; age = _response['age'].toString(); + await saveData('phone', _response['phone'], 'STRING'); await saveData('email', _response['emails'][0]['email'], 'STRING'); await saveData('username', _response['username'], 'STRING'); await saveData('age', _response['age'].toString(), 'STRING'); + + await saveData('emergencyContactNumber1', _response['emergencyContacts'][0]['contactNumber'].toString(), 'STRING'); + await saveData('emergencyContactNumber2',_response['emergencyContacts'][1]['contactNumber'].toString(), 'STRING'); + await saveData('emergencyRelation1', _response['emergencyContacts'][0]['relationship'].toString(), 'STRING'); + await saveData('emergencyRelation2', _response['emergencyContacts'][1]['relationship'].toString(), 'STRING'); + await saveData('emergencyRelationName1', _response['emergencyContacts'][0]['name'].toString(), 'STRING'); + await saveData('emergencyRelationName2', _response['emergencyContacts'][1]['name'].toString(), 'STRING'); + await saveData('bloodGroup', _response['bloodGroup'].toString(), 'STRING'); + await saveData('bloodGroupPicture', _response['blood_Group_picture'].toString(), 'STRING'); await loadDataFromMemory(); return true; } else { @@ -741,6 +858,42 @@ class AppSettings { static Future updateLocation(payload) async { var uri = Uri.parse(updateLocationUrl + '/' + customerId); + try { + var response = await http.put(uri, + body: json.encode(payload), headers: await buildRequestHeaders()); + + if (response.statusCode == 200) { + var _response = json.decode(response.body); + print(_response); + + userAddress = _response['user']['profile']['address1']; + detailedAddress = _response['user']['profile']['address2']; + userLatitude = _response['user']['latitude']; + userLongitude =_response['user']['longitude']; + + await saveData('user_address', _response['user']['profile']['address1'], 'STRING'); + await saveData('detailedAddress', _response['user']['profile']['address2'], 'STRING'); + if(_response['user']['latitude']==0){ + _response['user']['latitude']=0.0; + } + if(_response['user']['longitude']==0){ + _response['user']['longitude']=0.0; + } + await saveData('latitude', _response['user']['latitude'], 'DOUBLE'); + await saveData('longitude', _response['user']['longitude'], 'DOUBLE'); + await loadDataFromMemory(); + return true; + } else { + return false; + } + } catch (e) { + print(e); + return false; + } + } + + static Future updatePin(payload) async { + var uri = Uri.parse(updatePinUrl + '/' + customerId); try { var response = await http.put(uri, body: json.encode(payload), headers: await buildRequestHeaders()); @@ -852,6 +1005,14 @@ class AppSettings { var response = await http.Response.fromStream(res); return response.body; } + static Future uploadBloodGroupImage(file) async { + var request = http.MultipartRequest( + 'POST', Uri.parse(uploadBloodGroupPicUrl + '/' + customerId)); + 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 uploadImageHTTPForPrescriptions(file) async { var request = http.MultipartRequest( @@ -1899,12 +2060,29 @@ class AppSettings { await saveData('profile', input['simplydata']['picture'], 'STRING'); await saveData('user_address', input['simplydata']['address1'], 'STRING'); await saveData('detailedAddress', input['simplydata']['address2'], 'STRING'); + if(input['simplydata']['latitude']==0){ + input['simplydata']['latitude']=0.0; + } + if(input['simplydata']['longitude']==0){ + input['simplydata']['longitude']=0.0; + } await saveData('latitude', input['simplydata']['latitude'], 'DOUBLE'); await saveData('longitude', input['simplydata']['longitude'], 'DOUBLE'); 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'); + + if(input['simplydata']['emergencyContacts'].length!=0){ + await saveData('emergencyContactNumber1', input['simplydata']['emergencyContacts'][0]['contactNumber'].toString(), 'STRING'); + await saveData('emergencyContactNumber2',input['simplydata']['emergencyContacts'][1]['contactNumber'].toString(), 'STRING'); + await saveData('emergencyRelation1', input['simplydata']['emergencyContacts'][0]['relationship'].toString(), 'STRING'); + await saveData('emergencyRelation2', input['simplydata']['emergencyContacts'][1]['relationship'].toString(), 'STRING'); + await saveData('emergencyRelationName1', input['simplydata']['emergencyContacts'][0]['name'].toString(), 'STRING'); + await saveData('emergencyRelationName2', input['simplydata']['emergencyContacts'][1]['name'].toString(), 'STRING'); + } + await saveData('bloodGroup', input['simplydata']['bloodGroup'].toString(), 'STRING'); + await saveData('bloodGroupPicture', input['simplydata']['blood_Group_picture'].toString(), 'STRING'); //await saveData('age', input['simplydata']['age'], 'STRING'); //latitude,longitude await loadDataFromMemory(); @@ -1935,6 +2113,14 @@ class AppSettings { age = await getData('age', 'STRING'); gender = await getData('gender', 'STRING'); originalQrCode = await getData('qrCode', 'STRING'); + emergencyContactNumber1 =await getData('emergencyContactNumber1', 'STRING'); + emergencyContactNumber2 = await getData('emergencyContactNumber2', 'STRING'); + emergencyRelation1 = await getData('emergencyRelation1', 'STRING'); + emergencyRelation2 = await getData('emergencyRelation2', 'STRING'); + emergencyRelationName1 = await getData('emergencyRelationName1', 'STRING'); + emergencyRelationName2 =await getData('emergencyRelationName2', 'STRING'); + bloodGroup = await getData('bloodGroup', 'STRING'); + bloodGroupPictureUrl= await getData('bloodGroupPicture', 'STRING'); String dataUri = originalQrCode; // Split the data URI at the comma to extract the Base64 part diff --git a/lib/common/signup.dart b/lib/common/signup.dart index 2d5679e..7e4434a 100644 --- a/lib/common/signup.dart +++ b/lib/common/signup.dart @@ -42,7 +42,7 @@ class _SignUpState extends State { 'Other', ]; var genderUnit = 'Male'; - + String? gender; String _currentAddress =''; Position? _currentPosition; @@ -180,7 +180,8 @@ class _SignUpState extends State { ), Container( child: TextFormField( - cursorColor: greyColor, + cursorColor: Colors.white, + style: TextStyle(color: Colors.white), controller: nameController, textCapitalization: TextCapitalization.words, decoration: textFormFieldDecoration(Icons.person,'Enter Name'), @@ -188,28 +189,70 @@ class _SignUpState extends State { ), ), //name SizedBox(height:MediaQuery.of(context).size.height * .02,), - Container( + Text('Select Gender',style: radioHeadingTextStyle(),), + Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + + Expanded(child: RadioListTile( + title: Text("Male",style: radioItemsTextStyle()), + value: "male", + groupValue: gender, + activeColor: Colors.white, + onChanged: (value){ + setState(() { + gender = value.toString(); + }); + }, + ),), + Expanded(child: RadioListTile( + title: Text("Female",style:radioItemsTextStyle()), + value: "female", + groupValue: gender, + activeColor: Colors.white, + onChanged: (value){ + setState(() { + gender = value.toString(); + }); + }, + ),), + Expanded(child: RadioListTile( + title: Text("Others",style: radioItemsTextStyle()), + value: "other", + groupValue: gender, + activeColor: Colors.white, + + onChanged: (value){ + setState(() { + gender = value.toString(); + }); + }, + ),), + ], + ), + /*Container( child: DropdownButtonFormField( // Initial Value value: genderUnit, isExpanded: true, decoration: const InputDecoration( filled: true, - fillColor: Colors.white, + fillColor: primaryColor, prefixIcon: Icon( Icons.female, - color: greyColor, + color: Colors.white, ), border: OutlineInputBorder( - borderSide: BorderSide(color: primaryColor)), + borderSide: BorderSide(color: Colors.white)), focusedBorder: OutlineInputBorder( - borderSide: BorderSide(color: primaryColor), + borderSide: BorderSide(color: Colors.white), ), enabledBorder: OutlineInputBorder( - borderSide: BorderSide(color: primaryColor), + borderSide: BorderSide(color: Colors.white), ), labelText: 'Select Gender', - labelStyle: TextStyle(color: Colors.black) + labelStyle: TextStyle(color: Colors.white), ), hint: Text('Units'), @@ -223,7 +266,7 @@ class _SignUpState extends State { child: Text( items, style: TextStyle( - fontSize: 16, + fontSize: 16,color: primaryColor ), textAlign: TextAlign.center, )); @@ -235,11 +278,12 @@ class _SignUpState extends State { genderUnit = newValue!; }); }, - ),), + ),),*/ SizedBox(height:MediaQuery.of(context).size.height * .02,), Container( child: TextFormField( - cursorColor: greyColor, + cursorColor: Colors.white, + style: TextStyle(color: Colors.white), controller: mobileNumberController, keyboardType: TextInputType.phone, maxLength: 10, @@ -250,7 +294,9 @@ class _SignUpState extends State { GestureDetector( child: Container( child: TextFormField( - cursorColor: greyColor, + cursorColor: Colors.white, + style: TextStyle(color: Colors.white), + textCapitalization: TextCapitalization.words, controller: userAddressCapturingController, onTap:() { @@ -367,7 +413,9 @@ class _SignUpState extends State { SizedBox(height:MediaQuery.of(context).size.height * .02,), Container( child: TextFormField( - cursorColor: greyColor, + cursorColor: Colors.white, + style: TextStyle(color: Colors.white), + textCapitalization: TextCapitalization.words, controller: userAddressDescriptionController, keyboardType: TextInputType.emailAddress, decoration: textFormFieldDecoration(Icons.plagiarism_outlined,'Address Description (Ex: Flat No)'), @@ -377,32 +425,33 @@ class _SignUpState extends State { SizedBox(height:MediaQuery.of(context).size.height * .02,), Container( child: TextFormField( - cursorColor: greyColor, + cursorColor: Colors.white, + style: TextStyle(color: Colors.white), obscureText: isPwdObscureText, controller: passwordController, decoration: InputDecoration( - fillColor: Colors.white, + fillColor: primaryColor, filled: true, labelText: 'Create Password', prefixIcon: const Icon( Icons.lock, - color: greyColor, + color: Colors.white, ), labelStyle: const TextStyle( - color: Colors.black, //<-- SEE HERE + color: Colors.white, //<-- SEE HERE ), border: const OutlineInputBorder( - borderSide: BorderSide(color: primaryColor)), + borderSide: BorderSide(color: Colors.white)), focusedBorder: const OutlineInputBorder( - borderSide: BorderSide(color: primaryColor), + borderSide: BorderSide(color: Colors.white), ), enabledBorder: const OutlineInputBorder( - borderSide: BorderSide(color: primaryColor), + borderSide: BorderSide(color: Colors.white), ), suffixIcon: IconButton( icon: Icon( Icons.visibility_off_outlined, - color: isPwdObscureText?greyColor:primaryColor, + color: isPwdObscureText?buttonColors:Colors.white, ), onPressed: () { setState(() { @@ -425,7 +474,7 @@ class _SignUpState extends State { onPressed: () async { if (nameController.text != '' && passwordController.text != '' && - mobileNumberController.text != '') { + mobileNumberController.text != ''&&gender!='') { AppSettings.preLoaderDialog(context); var payload = new Map(); @@ -451,7 +500,8 @@ class _SignUpState extends State { payload["longitude"] = lng; payload["fcmId"] = AppSettings.fcmId; payload["age"] = 0; - payload["gender"] = genderUnit.toString(); + /* payload["gender"] = genderUnit.toString();*/ + payload["gender"] = gender.toString(); bool signUpStatus = await AppSettings.signUp(payload); diff --git a/lib/common/splash_screen.dart b/lib/common/splash_screen.dart index 4bd1939..6165004 100644 --- a/lib/common/splash_screen.dart +++ b/lib/common/splash_screen.dart @@ -73,7 +73,7 @@ class _SplashScreenState extends State { children: [ Container( decoration: const BoxDecoration( - image: DecorationImage(image: AssetImage("images/splash_screen_new.gif"), fit: BoxFit.fill,), + image: DecorationImage(image: AssetImage("images/splashscreen.png"), fit: BoxFit.fill,), ), ), diff --git a/lib/common/updateprofile.dart b/lib/common/updateprofile.dart index c5c4c34..9975e92 100644 --- a/lib/common/updateprofile.dart +++ b/lib/common/updateprofile.dart @@ -1,6 +1,4 @@ - import 'dart:convert'; - import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -8,7 +6,14 @@ import 'package:healthcare_user/common/dashboard.dart'; import 'package:healthcare_user/common/settings.dart'; import 'package:image_picker/image_picker.dart'; import 'dart:io'; - +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: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:google_maps_flutter/google_maps_flutter.dart'; +import 'package:healthcare_user/google_maps_place_picker_mb/google_maps_place_picker.dart'; +import 'package:healthcare_user/keys.dart'; class UpdateProfile extends StatefulWidget { const UpdateProfile({Key? key}) : super(key: key); @@ -17,29 +22,80 @@ class UpdateProfile extends StatefulWidget { } class _UpdateprofileState extends State { - - bool isPwdObscureText=true; - bool isConfirmPwdObscureText=true; + bool isPwdObscureText = true; + bool isConfirmPwdObscureText = true; TextEditingController nameController = TextEditingController(); TextEditingController mobileNumberController = TextEditingController(); TextEditingController emailController = TextEditingController(); TextEditingController ageController = TextEditingController(); + PickResult? selectedPlace; + bool _mapsInitialized = false; + final String _mapsRenderer = "latest"; + var kInitialPosition = const LatLng(15.462477, 78.717401); + locationmap.Location location = locationmap.Location(); + final GoogleMapsFlutterPlatform mapsImplementation = + GoogleMapsFlutterPlatform.instance; + double lat = 0; + double lng = 0; + String address = ''; + TextEditingController userAddressDescriptionController = + TextEditingController(); + TextEditingController emergencyContactName1Controller = + TextEditingController(); + TextEditingController emergencyContactRelation1Controller = + TextEditingController(); + TextEditingController emergencyContactNumber1Controller = + TextEditingController(); + TextEditingController emergencyContactName2Controller = + TextEditingController(); + TextEditingController emergencyContactRelation2Controller = + TextEditingController(); + TextEditingController emergencyContactNumber2Controller = + TextEditingController(); + TextEditingController bloodGroupController = TextEditingController(); + List emergenyContacts = []; - - + void initRenderer() { + if (_mapsInitialized) return; + if (mapsImplementation is GoogleMapsFlutterAndroid) { + switch (_mapsRenderer) { + case "legacy": + (mapsImplementation as GoogleMapsFlutterAndroid) + .initializeWithRenderer(AndroidMapRenderer.legacy); + break; + case "latest": + (mapsImplementation as GoogleMapsFlutterAndroid) + .initializeWithRenderer(AndroidMapRenderer.latest); + break; + } + } + setState(() { + _mapsInitialized = true; + }); + } @override void initState() { - isPwdObscureText=true; - isConfirmPwdObscureText=true; - nameController.text=AppSettings.userName; - mobileNumberController.text=AppSettings.phoneNumber; - emailController.text=AppSettings.email; - ageController.text=AppSettings.age; - + isPwdObscureText = true; + isConfirmPwdObscureText = true; + nameController.text = AppSettings.userName; + mobileNumberController.text = AppSettings.phoneNumber; + emailController.text = AppSettings.email; + ageController.text = AppSettings.age; + address = AppSettings.userAddress; + userAddressDescriptionController.text = AppSettings.detailedAddress; + lat = AppSettings.userLatitude; + lng = AppSettings.userLongitude; + emergencyContactName1Controller.text = AppSettings.emergencyRelationName1; + emergencyContactRelation1Controller.text = AppSettings.emergencyRelation1; + emergencyContactNumber1Controller.text = + AppSettings.emergencyContactNumber1; + emergencyContactName2Controller.text = AppSettings.emergencyRelationName2; + emergencyContactRelation2Controller.text = AppSettings.emergencyRelation2; + emergencyContactNumber2Controller.text = + AppSettings.emergencyContactNumber2; + bloodGroupController.text = AppSettings.bloodGroup; super.initState(); - - } final ImagePicker _picker = ImagePicker(); @@ -80,20 +136,56 @@ class _UpdateprofileState extends State { } } + Future pickBloodGroupImageFromGallery() 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.uploadBloodGroupImage(image); + print(jsonDecode(res)); + Navigator.of(context, rootNavigator: true).pop(); + setState(() { + AppSettings.bloodGroupPictureUrl = jsonDecode(res)['blood_Group_picture']; + }); + AppSettings.saveData( + 'bloodGroupPicture', jsonDecode(res)['blood_Group_picture'], 'STRING'); + } on PlatformException catch (e) { + print('Failed to pick image: $e'); + } + } + + Future takeBloodGroupImageFromCamera() async { + try { + final image = await _picker.pickImage(source: ImageSource.camera); + if (image == null) return; + final imageTemp = File(image.path); + AppSettings.preLoaderDialog(context); + var res = await AppSettings.uploadBloodGroupImage(image); + print(jsonDecode(res)); + Navigator.of(context, rootNavigator: true).pop(); + setState(() { + AppSettings.bloodGroupPictureUrl = jsonDecode(res)['blood_Group_picture']; + }); + AppSettings.saveData( + 'bloodGroupPicture', jsonDecode(res)['blood_Group_picture'], 'STRING'); + } on PlatformException catch (e) { + print('Failed to pick image: $e'); + } + } @override Widget build(BuildContext context) { - return Scaffold( - appBar:AppSettings.appBar('Edit Profile'), + appBar: AppSettings.appBar('Edit Profile'), body: Stack(children: [ Container( decoration: const BoxDecoration( - /* image: DecorationImage( + /* image: DecorationImage( image: AssetImage("images/backgroundimage.png"), fit: BoxFit.cover, ),*/ - ), + ), ), GestureDetector( onTap: () { @@ -101,25 +193,32 @@ class _UpdateprofileState extends State { }, child: SafeArea( child: SingleChildScrollView( - child: Column( - children: [ - SizedBox( - height: 40, - ), - /*Container( + child: Padding( + padding: EdgeInsets.all(10), + child: Column( + children: [ + SizedBox(height: MediaQuery.of(context).size.height * .05), + /*Container( child: Image( image: AssetImage('images/logo.png'), height: MediaQuery.of(context).size.height * .10, )),*/ - Container(child: GestureDetector( + Container( + child: GestureDetector( child: Container( width: MediaQuery.of(context).size.width * .30, height: MediaQuery.of(context).size.height * .20, decoration: BoxDecoration( shape: BoxShape.circle, image: DecorationImage( - image: (AppSettings.profilePictureUrl != ''&& AppSettings.profilePictureUrl != 'null') ? - NetworkImage(AppSettings.profilePictureUrl) as ImageProvider : AssetImage("images/profile_pic.png"), // picked file + image: (AppSettings.profilePictureUrl != '' && + AppSettings.profilePictureUrl != + 'null') + ? NetworkImage( + AppSettings.profilePictureUrl) + as ImageProvider + : AssetImage( + "images/profile_pic.png"), // picked file fit: BoxFit.fitWidth)), ), onTap: () { @@ -130,7 +229,8 @@ class _UpdateprofileState extends State { height: 200, child: Center( child: Row( - mainAxisAlignment: MainAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.center, children: [ GestureDetector( child: Icon( @@ -144,8 +244,10 @@ class _UpdateprofileState extends State { }, ), SizedBox( - width: - MediaQuery.of(context).size.width * .20, + width: MediaQuery.of(context) + .size + .width * + .20, ), GestureDetector( child: Icon( @@ -164,172 +266,569 @@ class _UpdateprofileState extends State { ); }); }, - ),), - SizedBox( - height: 10, ), - Container( - padding: const EdgeInsets.all(10), - child: TextFormField( - cursorColor: greyColor, - controller: nameController, - decoration: const InputDecoration( - prefixIcon: Icon( - Icons.person, - color: greyColor, - ), - border: OutlineInputBorder( - borderSide: BorderSide(color: greyColor)), - focusedBorder: OutlineInputBorder( - borderSide: BorderSide(color: greyColor), - ), - enabledBorder: OutlineInputBorder( - borderSide: BorderSide(color: greyColor), - ), - labelText: 'Username', - labelStyle: TextStyle( - color: greyColor, //<-- SEE HERE - ), - ), - ), - ),//name - const SizedBox( - height: 15, + ), + SizedBox( + height: MediaQuery.of(context).size.height * .02, + ), + Container( + child: TextFormField( + cursorColor: greyColor, + controller: nameController, + decoration: textFormFieldDecorationGrey( + Icons.person, 'Username'), + ), + ), //name + SizedBox( + height: MediaQuery.of(context).size.height * .02, + ), + Container( + child: TextFormField( + cursorColor: greyColor, + controller: emailController, + decoration: textFormFieldDecorationGrey( + Icons.mail, 'Enter email ID'), + ), + ), //email + SizedBox( + height: MediaQuery.of(context).size.height * .02, + ), + Container( + child: TextFormField( + cursorColor: greyColor, + controller: mobileNumberController, + decoration: textFormFieldDecorationGrey( + Icons.phone_android, 'Mobile Number'), + ), + ), //mobile + SizedBox( + height: MediaQuery.of(context).size.height * .02, + ), + Container( + child: TextFormField( + cursorColor: greyColor, + controller: ageController, + decoration: textFormFieldDecorationGrey( + Icons.person, 'Enter age'), + ), + ), + SizedBox( + height: MediaQuery.of(context).size.height * .02, + ), + Container( + child: TextFormField( + cursorColor: greyColor, + controller: bloodGroupController, + decoration: textFormFieldDecorationGrey( + Icons.bloodtype, 'Enter Blood Group'), + ), + ), + SizedBox( + height: MediaQuery.of(context).size.height * .02, + ), + + Align( + alignment: Alignment.bottomLeft, + child: Padding( + padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), + child: AppSettings.bloodGroupPictureUrl != '' && + AppSettings.bloodGroupPictureUrl != 'null' + ? Row( + children: [ + Container( + width: + MediaQuery.of(context).size.width * .30, + height: MediaQuery.of(context).size.height * + .20, + decoration: BoxDecoration( + shape: BoxShape.rectangle, + image: DecorationImage( + image: NetworkImage(AppSettings + .bloodGroupPictureUrl) + as ImageProvider, // picked file + fit: BoxFit.fitWidth)), + ), + IconButton( + onPressed: () async { + showModalBottomSheet( + context: context, + builder: (BuildContext context) { + return SizedBox( + height: 200, + child: Center( + child: Row( + mainAxisAlignment: + MainAxisAlignment.center, + children: [ + GestureDetector( + child: Icon( + Icons + .camera_alt_outlined, + size: 100, + color: primaryColor, + ), + onTap: () async { + await takeBloodGroupImageFromCamera(); + Navigator.pop(context); + }, + ), + SizedBox( + width: + MediaQuery.of(context) + .size + .width * + .20, + ), + GestureDetector( + child: Icon( + Icons.photo, + size: 100, + color: primaryColor, + ), + onTap: () async { + await pickBloodGroupImageFromGallery(); + Navigator.pop(context); + }, + ), + ], + ), + ), + ); + }); + }, + icon: Icon( + Icons.edit, + color: Colors.red, + size: 40, + ), + ), + ], + ) + : Visibility( + visible: true, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + primary: primaryColor, // background + onPrimary: Colors.white, // foreground + ), + onPressed: () async { + showModalBottomSheet( + context: context, + builder: (BuildContext context) { + return SizedBox( + height: 200, + child: Center( + child: Row( + mainAxisAlignment: + MainAxisAlignment.center, + children: [ + GestureDetector( + child: Icon( + Icons.camera_alt_outlined, + size: 100, + color: primaryColor, + ), + onTap: () async { + await takeBloodGroupImageFromCamera(); + Navigator.pop(context); + }, + ), + SizedBox( + width: + MediaQuery.of(context) + .size + .width * + .20, + ), + GestureDetector( + child: Icon( + Icons.photo, + size: 100, + color: primaryColor, + ), + onTap: () async { + await pickBloodGroupImageFromGallery(); + Navigator.pop(context); + }, + ), + ], + ), + ), + ); + }); + }, + child: const Text('Upload Blood Group Image'), + ), + ), ), - Container( - padding: const EdgeInsets.all(10), - child: TextFormField( - cursorColor: greyColor, - controller: emailController, - decoration: const InputDecoration( - prefixIcon: Icon( - Icons.email, - color: greyColor, + ), + + SizedBox( + height: MediaQuery.of(context).size.height * .02, + ), + Text( + 'Emergency Contact Details', + style: TextStyle( + color: primaryColor, + fontSize: 14, + fontWeight: FontWeight.bold), + ), + SizedBox( + height: MediaQuery.of(context).size.height * .02, + ), + 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: emergencyContactName1Controller, + decoration: textFormFieldDecorationGrey( + Icons.person, 'Enter Name'), ), - border: OutlineInputBorder( - borderSide: BorderSide(color: greyColor)), - focusedBorder: OutlineInputBorder( - borderSide: BorderSide(color: greyColor), + SizedBox( + height: MediaQuery.of(context).size.height * .02, ), - enabledBorder: OutlineInputBorder( - borderSide: BorderSide(color: greyColor), + TextFormField( + cursorColor: greyColor, + controller: emergencyContactRelation1Controller, + decoration: textFormFieldDecorationGrey( + Icons.reduce_capacity, 'Relation'), ), - labelText: 'Enter email ID', - labelStyle: TextStyle( - color: greyColor, //<-- SEE HERE + SizedBox( + height: MediaQuery.of(context).size.height * .02, ), - ), + TextFormField( + cursorColor: greyColor, + controller: emergencyContactNumber1Controller, + decoration: textFormFieldDecorationGrey( + Icons.phone_android, 'Contact Number'), + ), + ], ), - ), //email - SizedBox( - height: 10, ), - Container( - padding: const EdgeInsets.all(10), - child: TextFormField( - cursorColor: greyColor, - controller: mobileNumberController, - decoration: const InputDecoration( - prefixIcon: Icon( - Icons.phone_android, - color: greyColor, + ), + SizedBox( + height: MediaQuery.of(context).size.height * .02, + ), + 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: emergencyContactName2Controller, + decoration: textFormFieldDecorationGrey( + Icons.person, 'Enter Name'), ), - border: OutlineInputBorder( - borderSide: BorderSide(color: greyColor)), - focusedBorder: OutlineInputBorder( - borderSide: BorderSide(color: greyColor), + SizedBox( + height: MediaQuery.of(context).size.height * .02, ), - enabledBorder: OutlineInputBorder( - borderSide: BorderSide(color: greyColor), + TextFormField( + cursorColor: greyColor, + controller: emergencyContactRelation2Controller, + decoration: textFormFieldDecorationGrey( + Icons.reduce_capacity, 'Relation'), ), - labelText: 'Enter Mobile Number', - labelStyle: TextStyle( - color: greyColor, //<-- SEE HERE + SizedBox( + height: MediaQuery.of(context).size.height * .02, ), - ), + TextFormField( + cursorColor: greyColor, + controller: emergencyContactNumber2Controller, + decoration: textFormFieldDecorationGrey( + Icons.phone_android, 'Contact Number'), + ), + ], ), - ), //mobile - SizedBox( - height: 10, ), + ), + SizedBox( + height: MediaQuery.of(context).size.height * .02, + ), + Row( + children: [ + Text( + 'Current Location :', + style: labelTextStyle(), + ), + SizedBox( + width: MediaQuery.of(context).size.width * .02, + ), + Expanded( + child: Text( + address, + style: valuesTextStyle(), + )) + ], + ), + Align( + alignment: Alignment.bottomRight, + child: Padding( + padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), + child: TextButton( + onPressed: () { + location.serviceEnabled().then((value) { + if (value) { + initRenderer(); + Navigator.push( + context, + MaterialPageRoute( + builder: (context) { + return PlacePicker( + resizeToAvoidBottomInset: false, + hintText: "Find a place ...", + searchingText: "Please wait ...", + selectText: "Select place", + outsideOfPickAreaText: + "Place not in area", + initialPosition: kInitialPosition, + useCurrentLocation: true, + selectInitialPosition: true, + usePinPointingSearch: true, + usePlaceDetailSearch: true, + zoomGesturesEnabled: true, + zoomControlsEnabled: true, + onMapCreated: + (GoogleMapController controller) {}, + onPlacePicked: + (PickResult result) async { + setState(() { + selectedPlace = result; + lat = selectedPlace! + .geometry!.location.lat; + lng = selectedPlace! + .geometry!.location.lng; - SizedBox( - height: 10, - ), - Container( - padding: const EdgeInsets.all(10), - child: TextFormField( - cursorColor: greyColor, - controller: ageController, - decoration: const InputDecoration( - prefixIcon: Icon( - Icons.person, - color: greyColor, - ), - border: OutlineInputBorder( - borderSide: BorderSide(color: greyColor)), - focusedBorder: OutlineInputBorder( - borderSide: BorderSide(color: greyColor), - ), - enabledBorder: OutlineInputBorder( - borderSide: BorderSide(color: greyColor), - ), - labelText: 'Enter age', - labelStyle: TextStyle( - color: greyColor, //<-- SEE HERE + if (selectedPlace!.types!.length == + 1) { + address = selectedPlace! + .formattedAddress!; + } else { + address = selectedPlace!.name! + + ', ' + + selectedPlace! + .formattedAddress!; + } + Navigator.of(context).pop(); + }); + }, + onMapTypeChanged: (MapType mapType) {}, + apiKey: Platform.isAndroid + ? APIKeys.androidApiKey + : APIKeys.iosApiKey, + forceAndroidLocationManager: true, + ); + }, + ), + ); + } else { + showGeneralDialog( + context: context, + pageBuilder: (context, x, y) { + return Scaffold( + backgroundColor: + Colors.grey.withOpacity(.5), + body: Center( + child: Container( + width: double.infinity, + height: 150, + padding: const EdgeInsets.symmetric( + horizontal: 20), + child: Card( + child: Padding( + padding: + const EdgeInsets.all(10.0), + child: Column( + mainAxisAlignment: + MainAxisAlignment.center, + children: [ + const Text( + "Please enable the location", + style: TextStyle( + fontSize: 18, + fontWeight: + FontWeight.w500, + ), + ), + const SizedBox( + height: 20, + ), + ElevatedButton( + onPressed: () { + Navigator.pop(context); + }, + child: const Text("Cancel"), + ), + ], + ), + ), + ), + ), + ), + ); + }, + ); + } + }); + }, + child: const Text( + 'Change', + style: TextStyle( + color: primaryColor, + decoration: TextDecoration.underline, ), ), ), ), - Container( - padding: const EdgeInsets.fromLTRB(10, 0, 10, 0), + ), + SizedBox( + height: MediaQuery.of(context).size.height * .02, + ), + Container( + child: TextFormField( + cursorColor: greyColor, + controller: userAddressDescriptionController, + keyboardType: TextInputType.emailAddress, + decoration: textFormFieldDecorationGrey( + Icons.plagiarism_outlined, + 'Address Description (Ex: Flat No)'), + ), + ), + SizedBox( + height: MediaQuery.of(context).size.height * .04, + ), + /*Container( + width:double.infinity, + height: MediaQuery.of(context).size.height * .05, child: ElevatedButton( style: ElevatedButton.styleFrom( - primary: primaryColor, // background - onPrimary: Colors.white, // foreground + primary: buttonColors, // background + onPrimary: Colors.black, // foreground ), onPressed: () async{ - int age=0; - if(ageController.text.toString()!=''){ - age=int.parse(ageController.text.toString()); - } - else{ - age=0; - } var payload = new Map(); - payload["username"] = nameController.text.toString(); - payload["phone"] = mobileNumberController.text.toString(); - payload["age"] = age; - payload["emails"] = [{"email":emailController.text.toString()}]; - bool signUpStatus = await AppSettings.updateProfile(payload); - try{ - if (signUpStatus) { - Navigator.pop(context); - Navigator.push( - context, - MaterialPageRoute(builder: (context) => Dashboard()), - ); - AppSettings.longSuccessToast("profile updated"); - } else { + payload["latitude"] = lat; + payload["longitude"] = lng; + payload["address1"] = address; + payload["address2"] = userAddressDescriptionController.text; + bool updateStatus = await AppSettings.updateLocation(payload); + if(updateStatus){ + AppSettings.longSuccessToast("Location Updated"); - AppSettings.longFailedToast("profile not updated"); - } } - catch(exception){ - print(exception); - AppSettings.longFailedToast("Please enter valid details"); + else{ + AppSettings.longFailedToast("Failed to update location"); } + + }, - child: Text('Update'), - ) - ), + child: const Text('Update My Location'), + )),*/ + Container( + width: double.infinity, + height: MediaQuery.of(context).size.height * .05, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + primary: primaryColor, // background + onPrimary: Colors.white, // foreground + ), + onPressed: () async { + emergenyContacts = []; + int age = 0; + emergenyContacts.add({ + "name": emergencyContactName1Controller.text, + "relationship": + emergencyContactRelation1Controller.text, + "contactNumber": + emergencyContactNumber1Controller.text, + }); + emergenyContacts.add({ + "name": emergencyContactName2Controller.text, + "relationship": + emergencyContactRelation2Controller.text, + "contactNumber": + emergencyContactNumber2Controller.text, + }); + if (ageController.text.toString() != '') { + age = int.parse(ageController.text.toString()); + } else { + age = 0; + } - ], - ), - )), + var payload = new Map(); + payload["username"] = + nameController.text.toString(); + payload["phone"] = + mobileNumberController.text.toString(); + payload["age"] = age; + payload["latitude"] = lat; + payload["longitude"] = lng; + payload["address1"] = address; + payload["address2"] = + userAddressDescriptionController.text; + payload["bloodGroup"] = bloodGroupController.text; + payload["emails"] = [ + {"email": emailController.text.toString()} + ]; + payload["emergencyContacts"] = emergenyContacts; + payload["blood_Group_picture"] = + AppSettings.bloodGroupPictureUrl; + bool signUpStatus = + await AppSettings.updateProfile(payload); + try { + if (signUpStatus) { + Navigator.pop(context); + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => Dashboard()), + ); + AppSettings.longSuccessToast( + "profile updated"); + } else { + AppSettings.longFailedToast( + "profile not updated"); + } + } catch (exception) { + print(exception); + AppSettings.longFailedToast( + "Please enter valid details"); + } + }, + child: Text('Update'), + )), + ], + ), + ), + )), ), ])); } diff --git a/lib/models/bmi_history_model.dart b/lib/models/bmi_history_model.dart index efe27fc..86395cc 100644 --- a/lib/models/bmi_history_model.dart +++ b/lib/models/bmi_history_model.dart @@ -1,3 +1,5 @@ +import 'package:flutter/material.dart'; +import 'package:healthcare_user/common/settings.dart'; import 'package:intl/intl.dart'; @@ -11,7 +13,7 @@ class BmiHistoryModel { DateTime dateForFilter=new DateTime.now(); String bmiInfoId = ''; String bmiText = ''; - + Color bmiTextColor = Colors.black; var number1; var number2; @@ -19,17 +21,6 @@ class BmiHistoryModel { factory BmiHistoryModel.fromJson(Map json){ BmiHistoryModel rtvm = new BmiHistoryModel(); - /*"heightUnit": "feet", - "weightUnit": "kg",oh - "_id": "6493fe48eca67b71b8444e24", - "bmiinfoid": "BMI1687420488845468", - "customerId": "AHSUSNE2", - "height": "164.592", - "weight": "50", - "age": 27, - "bmivalue": 18.46, - "createdAt": "2023-06-22T07:54:48.847Z", - "updatedAt": "2023-06-22T07:54:48.847Z",*/ rtvm.bmiValue = json['bmivalue'].toString() ?? ''; rtvm.bmiInfoId = json['bmiinfoid'].toString() ?? ''; @@ -42,15 +33,19 @@ class BmiHistoryModel { rtvm.dateForFilter = DateFormat('dd-MM-yyyy').parse(rtvm.actualDate); if(double.parse(rtvm.bmiValue)<18.5){ rtvm.bmiText='Underweight'; + rtvm.bmiTextColor=Colors.red; } else if(double.parse(rtvm.bmiValue)>=18.5&&double.parse(rtvm.bmiValue)<=24.9){ rtvm.bmiText='Normal weight'; + rtvm.bmiTextColor=buttonColors; } else if(double.parse(rtvm.bmiValue)>=25&&double.parse(rtvm.bmiValue)<=29.9){ rtvm.bmiText='Overweight'; + rtvm.bmiTextColor=Colors.red; } else if(double.parse(rtvm.bmiValue)>=30){ rtvm.bmiText='Obesity'; + rtvm.bmiTextColor=Colors.red; } diff --git a/lib/models/sugar_history_model.dart b/lib/models/sugar_history_model.dart index d977bab..5050a97 100644 --- a/lib/models/sugar_history_model.dart +++ b/lib/models/sugar_history_model.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:healthcare_user/common/settings.dart'; import 'package:intl/intl.dart'; @@ -12,6 +13,7 @@ class SugarHistoryModel { String actualDate=''; String sugarInfoId=''; DateTime dateForFilter=new DateTime.now(); + Color sugarValueColor=Colors.black; SugarHistoryModel(); @@ -28,6 +30,28 @@ class SugarHistoryModel { rtvm.actualDate = json['date'].toString() ?? ''; rtvm.sugarInfoId = json['sugarinfoid'].toString() ?? ''; + if(rtvm.sugartText.toUpperCase().toUpperCase()=='VERY HIGH BLOOD SUGAR'){ + rtvm.sugarValueColor=Colors.red; + } + else if(rtvm.sugartText.toUpperCase().toUpperCase()=='HIGH BLOOD SUGAR'){ + rtvm.sugarValueColor=Colors.red; + } + else if(rtvm.sugartText.toUpperCase().toUpperCase()=='PREDIABETES (IMPAIRED FASTING GLUCOSE)'){ + rtvm.sugarValueColor=Colors.red; + } + else if(rtvm.sugartText.toUpperCase().toUpperCase()=='VERY LOW BLOOD SUGAR'){ + rtvm.sugarValueColor=Colors.red; + } + else if(rtvm.sugartText.toUpperCase().toUpperCase()=='LOW BLOOD SUGAR'){ + rtvm.sugarValueColor=Colors.red; + } + else if(rtvm.sugartText.toUpperCase().toUpperCase()=='NORMAL BLOOD SUGAR (HEALTHY RANGE)'){ + rtvm.sugarValueColor=buttonColors; + } + else{ + rtvm.sugarValueColor=Colors.black; + } + //DateTime tempDate = new DateFormat("yyyy-MM-dd hh:mm:ss").parse(rtvm.date); rtvm.dateForFilter = DateFormat('dd-MM-yyyy').parse(rtvm.actualDate); diff --git a/lib/my_connections/add-doctor.dart b/lib/my_connections/add-doctor.dart index 595e2a7..b70a80e 100644 --- a/lib/my_connections/add-doctor.dart +++ b/lib/my_connections/add-doctor.dart @@ -13,12 +13,24 @@ class AddDoctor extends StatefulWidget { class _AddDoctorState extends State { bool isPwdObscureText=true; + TextEditingController doctorIdController = TextEditingController(); bool isFirstAddButtonShow=false; bool isSecondAddButtonShow=false; bool is2ndPlaceOfPracticeControllerVisible=false; bool is3rdPlaceOfPracticeControllerVisible=false; bool isConfirmPwdObscureText=true; - TextEditingController doctorIdController = TextEditingController(); + 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=[]; final GlobalKey qrKey = GlobalKey(debugLabel: 'QR'); @@ -94,6 +106,7 @@ class _AddDoctorState extends State { child: TextFormField( cursorColor: greyColor, controller: doctorIdController, + textCapitalization: TextCapitalization.characters, decoration: const InputDecoration( prefixIcon: Icon( Icons.person, @@ -113,8 +126,406 @@ class _AddDoctorState extends State { ), ), ), + ), + SizedBox(height:MediaQuery.of(context).size.height * .02,), + Container( + child: TextFormField( + cursorColor: greyColor, + controller: nameController, + decoration: const InputDecoration( + prefixIcon: Icon( + Icons.person, + color: greyColor, + ), + border: OutlineInputBorder( + borderSide: BorderSide(color: greyColor)), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide(color: greyColor), + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide(color: greyColor), + ), + labelText: 'DoctorName', + labelStyle: TextStyle( + color: greyColor, //<-- SEE HERE + ), + ), + ), ),//name SizedBox(height:MediaQuery.of(context).size.height * .02,), + Container( + child: TextFormField( + cursorColor: greyColor, + controller: mobileNumberController, + keyboardType: TextInputType.number, + decoration: const InputDecoration( + prefixIcon: Icon( + Icons.phone_android, + color: greyColor, + ), + border: OutlineInputBorder( + borderSide: BorderSide(color: greyColor)), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide(color: greyColor), + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide(color: greyColor), + ), + labelText: 'Enter Mobile Number', + labelStyle: TextStyle( + color: greyColor, //<-- SEE HERE + ), + ), + ), + ), //mobile + /*SizedBox(height:MediaQuery.of(context).size.height * .02,), + Container( + child: TextFormField( + cursorColor: greyColor, + controller: ageController, + keyboardType: TextInputType.number, + decoration: const InputDecoration( + prefixIcon: Icon( + Icons.person, + color: greyColor, + ), + border: OutlineInputBorder( + borderSide: BorderSide(color: greyColor)), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide(color: greyColor), + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide(color: greyColor), + ), + labelText: 'Enter age', + labelStyle: TextStyle( + color: greyColor, //<-- SEE HERE + ), + ), + ), + ),*/ + 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 qualifications', + 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 specializations', + 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( + 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,), + SizedBox(height:MediaQuery.of(context).size.height * .02,), Container( width:double.infinity, height: MediaQuery.of(context).size.height * .06, @@ -124,11 +535,46 @@ class _AddDoctorState extends State { onPrimary: Colors.white, // foreground ), onPressed: () async{ - if(doctorIdController.text!=''){ + if(doctorIdController.text!=''&&nameController.text!=''&&gender!=null){ + 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()!=''||ageController.text.toString()!='null'){ + age=int.parse(ageController.text.toString()); + } + else{ + age=0; + }*/ + + AppSettings.preLoaderDialog(context); var payload = new Map(); payload["doctorId"] =doctorIdController.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 ; bool status = await AppSettings.addDoctor(payload); if(status){ diff --git a/lib/my_connections/all_connections.dart b/lib/my_connections/all_connections.dart index 6a17531..5d75f1d 100644 --- a/lib/my_connections/all_connections.dart +++ b/lib/my_connections/all_connections.dart @@ -44,7 +44,7 @@ class _AllConnectionsState extends State var response = await AppSettings.getAllConnectedDoctors(); setState(() { - connectedDoctorsListOriginal = ((jsonDecode(response)) as List) + connectedDoctorsListOriginal = ((jsonDecode(response)['doctors']) as List) .map((dynamic model) { return GetConnectedDoctorsModel.fromJson(model); }).toList(); diff --git a/lib/my_connections/dynamic_code_doctor.dart b/lib/my_connections/dynamic_code_doctor.dart index cd32420..dc5ea85 100644 --- a/lib/my_connections/dynamic_code_doctor.dart +++ b/lib/my_connections/dynamic_code_doctor.dart @@ -17,7 +17,6 @@ class _DynamicCodeState extends State { bool isDataLoading=false; bool isSereverIssue = false; List originalList = []; - List items = ["1", "2", "3", "4", "5", "6", "7", "8"]; RefreshController _refreshController = RefreshController(initialRefresh: true); @@ -37,7 +36,7 @@ class _DynamicCodeState extends State { .map((dynamic model) { return DynamicCodeModel.fromJson(model); }).toList(); - originalList=originalList.reversed.toList(); + //originalList=originalList.reversed.toList(); isDataLoading = false; }); } catch (e) { @@ -67,15 +66,11 @@ class _DynamicCodeState extends State { // monitor network fetch await Future.delayed(Duration(milliseconds: 1000)); // if failed,use loadFailed(),if no data return,use LoadNodata() - items.add((items.length+1).toString()); - if(mounted) - setState(() { - - }); _refreshController.loadComplete(); } Widget _renderUi(){ + //12. originalList=originalList.reversed.toList(); if(originalList.length!=0){ return ListView.builder( padding: EdgeInsets.all(0), diff --git a/lib/updates/update_location.dart b/lib/updates/update_location.dart index 175f845..c8e7cee 100644 --- a/lib/updates/update_location.dart +++ b/lib/updates/update_location.dart @@ -30,6 +30,8 @@ class _UpdateMyLocationState extends State { final GoogleMapsFlutterPlatform mapsImplementation = GoogleMapsFlutterPlatform.instance; double lat=0; double lng=0; + String address=''; + TextEditingController userAddressDescriptionController = TextEditingController(); void initRenderer() { if (_mapsInitialized) return; @@ -50,6 +52,14 @@ class _UpdateMyLocationState extends State { }); } + @override + void initState() { + address=AppSettings.userAddress; + userAddressDescriptionController.text=AppSettings.detailedAddress; + lat=AppSettings.userLatitude; + lng=AppSettings.userLongitude; + super.initState(); + } @override Widget build(BuildContext context) { @@ -58,28 +68,20 @@ class _UpdateMyLocationState extends State { body: Padding( padding: EdgeInsets.all(10), child: Column( + children: [ Row( children: [ Text('Current Location :',style: labelTextStyle(),), SizedBox(width:MediaQuery.of(context).size.width * .02,), - Expanded(child: Text(AppSettings.userAddress,style:valuesTextStyle(),)) + Expanded(child: Text(address,style:valuesTextStyle(),)) ], ), - SizedBox(height:MediaQuery.of(context).size.height * .04,), - Container( - width:double.infinity, - height: MediaQuery.of(context).size.height * .05, - child: ElevatedButton( - style: ElevatedButton.styleFrom( - primary: buttonColors, // background - onPrimary: Colors.black, // foreground - ), - onPressed: () async{ - - - //============================================================================================= - + Align( + alignment: Alignment.bottomRight, + child: Padding(padding: const EdgeInsets.fromLTRB(0, 0, 0,0), + child: TextButton( + onPressed: () { location.serviceEnabled().then((value) { if (value) { initRenderer(); @@ -110,36 +112,16 @@ class _UpdateMyLocationState extends State { lng=selectedPlace!.geometry!.location.lng; - /*if(selectedPlace!.types!.length==1){ - userAddressCapturingController.text = + if(selectedPlace!.types!.length==1){ + address = selectedPlace!.formattedAddress!; } else{ - userAddressCapturingController.text =selectedPlace!.name!+', '+selectedPlace!.formattedAddress!; - }*/ + address =selectedPlace!.name!+', '+selectedPlace!.formattedAddress!; + } Navigator.of(context).pop(); }); - var payload = new Map(); - payload["latitude"] = lat; - payload["longitude"] = lng; - bool updateStatus = await AppSettings.updateLocation(payload); - if(updateStatus){ - setState(() { - if(selectedPlace!.types!.length==1){ - AppSettings.userAddress = - selectedPlace!.formattedAddress!; - } - else{ - AppSettings.userAddress=selectedPlace!.name!+', '+selectedPlace!.formattedAddress!; - } - }); - - } - else{ - AppSettings.longFailedToast( - "Failed to update location"); - } }, onMapTypeChanged: (MapType mapType) {}, @@ -196,6 +178,54 @@ class _UpdateMyLocationState extends State { ); } }); + }, + child: const Text( + 'Change', + style: TextStyle( + color: primaryColor, + decoration: TextDecoration.underline, + + ), + ), + ),), + ), + SizedBox(height:MediaQuery.of(context).size.height * .02,), + Container( + child: TextFormField( + cursorColor: greyColor, + controller: userAddressDescriptionController, + keyboardType: TextInputType.emailAddress, + decoration: textFormFieldDecoration(Icons.plagiarism_outlined,'Address Description (Ex: Flat No)'), + + ), + ), + SizedBox(height:MediaQuery.of(context).size.height * .04,), + Container( + width:double.infinity, + height: MediaQuery.of(context).size.height * .05, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + primary: buttonColors, // background + onPrimary: Colors.black, // foreground + ), + onPressed: () async{ + + + var payload = new Map(); + payload["latitude"] = lat; + payload["longitude"] = lng; + payload["address1"] = address; + payload["address2"] = userAddressDescriptionController.text; + bool updateStatus = await AppSettings.updateLocation(payload); + if(updateStatus){ + AppSettings.longSuccessToast("Location Updated"); + + } + else{ + AppSettings.longFailedToast("Failed to update location"); + } + + }, child: const Text('Update My Location'), diff --git a/lib/updates/update_pin.dart b/lib/updates/update_pin.dart index bf6b05c..bed9c25 100644 --- a/lib/updates/update_pin.dart +++ b/lib/updates/update_pin.dart @@ -9,11 +9,195 @@ class UpdatePin extends StatefulWidget { } class _UpdatePinState extends State { + bool isOldPinObscureText=true; + bool isConfirmObscureText=true; + bool isNewPinObscureText=true; + TextEditingController oldPinController = TextEditingController(); + TextEditingController newPinController = TextEditingController(); + TextEditingController confirmPinController = TextEditingController(); + @override Widget build(BuildContext context) { return Scaffold( appBar: AppSettings.appBar('Update Pin'), - body: Container(), + body: Padding( + padding: EdgeInsets.all(10), + child: Column( + children: [ + Container( + child: TextFormField( + cursorColor: greyColor, + obscureText: isOldPinObscureText, + controller: oldPinController, + decoration: InputDecoration( + fillColor: Colors.white, + filled: true, + labelText: 'Enter old pin', + prefixIcon: const Icon( + Icons.lock, + color: greyColor, + ), + labelStyle: const TextStyle( + color: Colors.black, //<-- SEE HERE + ), + border: const OutlineInputBorder( + borderSide: BorderSide(color: primaryColor)), + focusedBorder: const OutlineInputBorder( + borderSide: BorderSide(color: primaryColor), + ), + enabledBorder: const OutlineInputBorder( + borderSide: BorderSide(color: primaryColor), + ), + suffixIcon: IconButton( + icon: Icon( + Icons.visibility_off_outlined, + color: isOldPinObscureText?greyColor:primaryColor, + ), + onPressed: () { + setState(() { + isOldPinObscureText = !isOldPinObscureText; + }); + }, + ), + ), + ), + ), + SizedBox(height:MediaQuery.of(context).size.height * .01,), + Container( + child: TextFormField( + cursorColor: greyColor, + obscureText: isNewPinObscureText, + controller: newPinController, + decoration: InputDecoration( + fillColor: Colors.white, + filled: true, + labelText: 'Enter new pin', + prefixIcon: const Icon( + Icons.lock, + color: greyColor, + ), + labelStyle: const TextStyle( + color: Colors.black, //<-- SEE HERE + ), + border: const OutlineInputBorder( + borderSide: BorderSide(color: primaryColor)), + focusedBorder: const OutlineInputBorder( + borderSide: BorderSide(color: primaryColor), + ), + enabledBorder: const OutlineInputBorder( + borderSide: BorderSide(color: primaryColor), + ), + suffixIcon: IconButton( + icon: Icon( + Icons.visibility_off_outlined, + color: isNewPinObscureText?greyColor:primaryColor, + ), + onPressed: () { + setState(() { + isNewPinObscureText = !isNewPinObscureText; + }); + }, + ), + ), + ), + ), + SizedBox(height:MediaQuery.of(context).size.height * .01,), + Container( + child: TextFormField( + cursorColor: greyColor, + obscureText: isConfirmObscureText, + controller: confirmPinController, + decoration: InputDecoration( + fillColor: Colors.white, + filled: true, + labelText: 'Confirm pin', + prefixIcon: const Icon( + Icons.lock, + color: greyColor, + ), + labelStyle: const TextStyle( + color: Colors.black, //<-- SEE HERE + ), + border: const OutlineInputBorder( + borderSide: BorderSide(color: primaryColor)), + focusedBorder: const OutlineInputBorder( + borderSide: BorderSide(color: primaryColor), + ), + enabledBorder: const OutlineInputBorder( + borderSide: BorderSide(color: primaryColor), + ), + suffixIcon: IconButton( + icon: Icon( + Icons.visibility_off_outlined, + color: isConfirmObscureText?greyColor:primaryColor, + ), + onPressed: () { + setState(() { + isConfirmObscureText = !isConfirmObscureText; + }); + }, + ), + ), + ), + ), + SizedBox(height:MediaQuery.of(context).size.height * .04,), + Container( + width:double.infinity, + height: MediaQuery.of(context).size.height * .05, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + primary: buttonColors, // background + onPrimary: Colors.black, // foreground + ), + onPressed: () async{ + if(oldPinController.text!=''&&newPinController.text!=''&&confirmPinController.text!=''){ + + if(newPinController.text==confirmPinController.text){ + + var payload = new Map(); + payload["oldPassword"] = oldPinController.text.toString(); + payload["newPassword"] = newPinController.text.toString(); + payload["phone"] = AppSettings.phoneNumber; + payload["longitude"] = AppSettings.userLongitude; + payload["latitude"] = AppSettings.userLatitude; + bool updateStatus = await AppSettings.updatePin(payload); + try{ + if (updateStatus) { + //Navigator.pop(context); + /*Navigator.push( + context, + MaterialPageRoute(builder: (context) => Dashboard()), + );*/ + oldPinController.clear(); + newPinController.clear(); + confirmPinController.clear(); + AppSettings.longSuccessToast("Password updated"); + } else { + + AppSettings.longFailedToast("Password not updated"); + } + } + catch(exception){ + print(exception); + AppSettings.longFailedToast("Password not updated"); + } + + } + else{ + AppSettings.longFailedToast('Please check new pin and confirm pin'); + } + + } + else{ + AppSettings.longFailedToast('Please enter valid details'); + } + + }, + child: const Text('Update Pin'), + )), + ], + ), + ), ); }