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

712 lines
32 KiB

import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:healthcare_user/common/login.dart';
import 'package:healthcare_user/google_maps_place_picker_mb/google_maps_place_picker.dart';
import 'package:healthcare_user/keys.dart';
import 'package:healthcare_user/common/settings.dart';
import 'package:geolocator/geolocator.dart';
import 'package:flutter/services.dart';
import 'dart:io' show File, Platform;
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 'otpscreen.dart';
class SignUp extends StatefulWidget {
const SignUp({super.key});
@override
State<SignUp> createState() => _SignUpState();
}
class _SignUpState extends State<SignUp> {
bool isPwdObscureText=true;
bool isConfirmPwdObscureText = true;
TextEditingController nameController = TextEditingController();
TextEditingController custmerid = TextEditingController();
TextEditingController buildingNameController = TextEditingController();
TextEditingController emailController = TextEditingController();
TextEditingController mobileNumberController = TextEditingController();
TextEditingController userAddressDescriptionController = TextEditingController();
TextEditingController userAddressCapturingController = TextEditingController();
TextEditingController passwordController = TextEditingController();
TextEditingController confirmPasswordController = TextEditingController();
var genderUnitItems = [
'Male',
'Female',
'Other',
];
var genderUnit = 'Male';
String _currentAddress ='';
Position? _currentPosition;
String address1 = '';
String address2 = '';
String city = '';
String state = '';
String zip = '';
String country = '';
double lat=0;
double lng=0;
@override
void initState() {
isPwdObscureText = true;
isConfirmPwdObscureText = true;
super.initState();
}
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;
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;
});
}
Future<bool> onWillPop() async {
final shouldPop = await showDialog<bool>(context: context, builder: (context) {
return AlertDialog(
title: const Text('Do you want to exit app?',
style: TextStyle(
color: primaryColor,
fontSize: 20,
)),
actionsAlignment: MainAxisAlignment.spaceBetween,
actions: [
TextButton(
onPressed: () {
SystemNavigator.pop();
},
child: const Text('Yes',
style: TextStyle(
color: primaryColor,
fontSize: 20,
)),
),
TextButton(
onPressed: () {
Navigator.of(context).pop(false);
},
child: const Text('No',
style: TextStyle(
color: primaryColor,
fontSize: 20,
)),
),
],
);
},
);
return shouldPop!;
}
@override
Widget build(BuildContext context) {
return WillPopScope(
onWillPop:()async=>onWillPop(),
child: Scaffold(
backgroundColor: primaryColor,
body: Stack(children: <Widget>[
/* Container(
decoration: const BoxDecoration(
image: DecorationImage(image: AssetImage("images/background.png"), fit: BoxFit.cover,),
),
),*/
GestureDetector(
onTap: () {
FocusManager.instance.primaryFocus?.unfocus();
},
child: SafeArea(
child: SingleChildScrollView(
child: Padding(
padding: EdgeInsets.all(10),
child: Column(
children: <Widget>[
SizedBox(
height: 20,
),
Container(
//width: double.infinity,
child: Image(
image: const AssetImage('images/logo.png'),
height: MediaQuery.of(context).size.height * .18,
)),
SizedBox(
height:MediaQuery.of(context).size.height * .05,
),
Container(
child: TextFormField(
cursorColor: greyColor,
controller: nameController,
textCapitalization: TextCapitalization.words,
decoration: textFormFieldDecoration(Icons.person,'Enter Name'),
),
), //name
SizedBox(height:MediaQuery.of(context).size.height * .02,),
Container(
child: DropdownButtonFormField(
// Initial Value
value: genderUnit,
isExpanded: true,
decoration: const InputDecoration(
filled: true,
fillColor: Colors.white,
prefixIcon: Icon(
Icons.female,
color: greyColor,
),
border: OutlineInputBorder(
borderSide: BorderSide(color: primaryColor)),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: primaryColor),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: primaryColor),
),
labelText: 'Select Gender',
labelStyle: TextStyle(color: Colors.black)
),
hint: Text('Units'),
// Down Arrow Icon
//icon: const Icon(Icons.keyboard_arrow_down),
// Array list of items
items: genderUnitItems.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(() {
genderUnit = newValue!;
});
},
),),
SizedBox(height:MediaQuery.of(context).size.height * .02,),
Container(
child: TextFormField(
cursorColor: greyColor,
controller: mobileNumberController,
keyboardType: TextInputType.phone,
maxLength: 10,
decoration: textFormFieldDecoration(Icons.phone_android,'Enter Mobile Number'),
),
), //mobile
SizedBox(height:MediaQuery.of(context).size.height * .02,),
GestureDetector(
child: Container(
child: TextFormField(
cursorColor: greyColor,
controller: userAddressCapturingController,
onTap:()
{
//=============================================================================================
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) {
setState(() {
selectedPlace = result;
lat=selectedPlace!.geometry!.location.lat;
lng=selectedPlace!.geometry!.location.lng;
if(selectedPlace!.types!.length==1){
userAddressCapturingController.text =
selectedPlace!.formattedAddress!;
}
else{
userAddressCapturingController.text =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"),
),
],
),
),
),
),
),
);
},
);
}
});
//=====================================================================================
// _getCurrentPosition();
},
keyboardType: TextInputType.streetAddress,
readOnly: true,
decoration:textFormFieldDecoration(Icons.location_on_rounded,'Click to select address(map)'),
),
),
/* onTap: ()
{
},*///address
),//address capturing
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)'),
),
),//address description
SizedBox(height:MediaQuery.of(context).size.height * .02,),
Container(
child: TextFormField(
cursorColor: greyColor,
obscureText: isPwdObscureText,
controller: passwordController,
decoration: InputDecoration(
fillColor: Colors.white,
filled: true,
labelText: 'Create Password',
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: isPwdObscureText?greyColor:primaryColor,
),
onPressed: () {
setState(() {
isPwdObscureText = !isPwdObscureText;
});
},
),
),
),
), //pwd
SizedBox(height:MediaQuery.of(context).size.height * .02,),
Container(
width:double.infinity,
height: MediaQuery.of(context).size.height * .06,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
primary: buttonColors, // background
onPrimary: Colors.black, // foreground
),
onPressed: () async {
if (nameController.text != '' &&
passwordController.text != '' &&
mobileNumberController.text != '') {
AppSettings.preLoaderDialog(context);
var payload = new Map<String, dynamic>();
payload["username"] = nameController.text.toString();
payload["password"] =
passwordController.text.toString();
payload["phone"] =
mobileNumberController.text.toString();
payload["firstName"] = nameController.text.toString();
payload["emails"] = [
{"email": emailController.text.toString()}
];
payload["lastName"] = '';
payload["address1"] = userAddressCapturingController.text;
payload["address2"] = userAddressDescriptionController.text;
payload["city"] = '';
payload["state"] = '';
payload["zip"] = '';
payload["country"] = '';
payload["notes"] = '';
payload["latitude"] = lat;
payload["longitude"] = lng;
payload["fcmId"] = AppSettings.fcmId;
payload["age"] = 0;
payload["gender"] = genderUnit.toString();
bool signUpStatus = await AppSettings.signUp(payload);
try {
if (signUpStatus) {
var smsPayload = new Map<String, dynamic>();
smsPayload["mobileNumbers"] = mobileNumberController.text.toString();
bool sendSms = await AppSettings.sendSms(smsPayload);
if(sendSms){
Navigator.of(context, rootNavigator: true).pop();
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => OtpScreen(myObject: mobileNumberController.text.toString(),)),
);
}
else{
Navigator.of(context, rootNavigator: true).pop();
}
}
else {
Navigator.of(context, rootNavigator: true).pop();
AppSettings.longFailedToast(
"Mobile number already exists");
}
} catch (exception) {
print(exception);
Navigator.of(context, rootNavigator: true).pop();
AppSettings.longFailedToast("Please enter valid details");
}
}
else {
AppSettings.longFailedToast("details should not be empty");
}
},
child: Text('Sign Up'),
)),//login button
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
'Are you a Member?',
style: TextStyle(
color: Colors.white,
),
),
TextButton(
child: const Text(
'Login?',
style: TextStyle(
fontSize: 20,
color: Colors.white,
decoration: TextDecoration.underline,
),
),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const Login()),
);
},
)
],
),
],
),
)
)),
),
])), );
}
showUserSignUSuccessDialog() async {
custmerid.text=AppSettings.customerIdsign;
return showDialog(
context: context,
barrierDismissible: false,
useSafeArea: true,
builder: (BuildContext context) {
return StatefulBuilder(
builder: (BuildContext context, StateSetter setState) {
return AlertDialog(
title: const Text('User SignUp Successfully!!'),
content: SingleChildScrollView(
child: ListBody(
children: <Widget>[
Container(
padding: const EdgeInsets.fromLTRB(10, 10, 10, 0),
child: TextFormField(
cursorColor: greyColor,
readOnly: true,
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: 'User Name',
labelStyle: TextStyle(
color: greyColor, //<-- SEE HERE
),
),
),
),
Container(
padding: const EdgeInsets.fromLTRB(10, 10, 10, 0),
child: TextFormField(
cursorColor: greyColor,
readOnly: true,
controller:custmerid,
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: 'User Id',
labelStyle: TextStyle(
color: greyColor, //<-- SEE HERE
),
),
),
),
// AppSettings.saveAvailableReportAndLocationsInMemorysignup('customerId');
const SizedBox(
height:10,
),
Container(
padding: const EdgeInsets.fromLTRB(10, 10, 10, 0),
child: TextFormField(
cursorColor: greyColor,
readOnly: true,
controller: buildingNameController,
decoration: const InputDecoration(
prefixIcon: Icon(
Icons.home_filled,
color: greyColor,
),
border: OutlineInputBorder(
borderSide: BorderSide(color: greyColor)),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: greyColor),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: greyColor),
),
labelText: 'Building Name',
labelStyle: TextStyle(
color: greyColor, //<-- SEE HERE
),
),
),
),
const SizedBox(
height:10,
),
Container(
padding: const EdgeInsets.fromLTRB(10, 10, 10, 0),
child: TextFormField(
cursorColor: greyColor,
readOnly: true,
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: 'Email',
labelStyle: TextStyle(
color: greyColor, //<-- SEE HERE
),
),
),
),
],
),
),
actions: <Widget>[
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: () async{
await Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const Login()),
);
},
child: const Text('OK'),
)),
/* Padding(
// padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16 ),
padding: EdgeInsets.only(left:75, bottom: 20, right: 70, top:10),
child: TextFormField(
cursorColor: greyColor,
controller: nameController,
decoration: const InputDecoration(
border: UnderlineInputBorder(),
labelText: 'Enter your username',
),
),
),*/
],
);
});
},
);
}
}