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

500 lines
19 KiB
Dart

import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
import 'package:diplomaticquarterapp/core/model/geofencing/requests/GeoZonesRequestModel.dart';
import 'package:diplomaticquarterapp/core/service/AuthenticatedUserObject.dart';
import 'package:diplomaticquarterapp/core/service/geofencing/GeofencingServices.dart';
import 'package:diplomaticquarterapp/core/viewModels/appointment_rate_view_model.dart';
import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/locator.dart';
import 'package:diplomaticquarterapp/models/Appointments/toDoCountProviderModel.dart';
import 'package:diplomaticquarterapp/models/Authentication/check_activation_code_response.dart';
import 'package:diplomaticquarterapp/models/Authentication/check_paitent_authentication_req.dart';
import 'package:diplomaticquarterapp/models/InPatientServices/get_admission_info_response_model.dart';
import 'package:diplomaticquarterapp/models/InPatientServices/get_admission_request_info_response_model.dart';
import 'package:diplomaticquarterapp/pages/landing/landing_page.dart';
import 'package:diplomaticquarterapp/pages/login/confirm-login.dart';
import 'package:diplomaticquarterapp/pages/login/login-type.dart';
import 'package:diplomaticquarterapp/pages/login/register_new.dart';
import 'package:diplomaticquarterapp/pages/rateAppointment/rate_appointment_doctor.dart';
import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart';
import 'package:diplomaticquarterapp/services/clinic_services/get_clinic_service.dart';
import 'package:diplomaticquarterapp/services/family_files/family_files_provider.dart';
import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
import 'package:diplomaticquarterapp/uitl/date_uitl.dart';
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/uitl/utils.dart';
import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart';
import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart';
import 'package:diplomaticquarterapp/widgets/habib_logo_widget.dart';
import 'package:diplomaticquarterapp/widgets/mobile-no/mobile_no.dart';
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:provider/provider.dart';
class Login extends StatefulWidget {
@override
_Login createState() => _Login();
}
class _Login extends State<Login> {
final util = Utils();
final nationalIDorFile = TextEditingController();
final mobileNumberController = TextEditingController();
int loginType = LoginType.loginType;
String? mobileNo;
String countryCode = '966';
bool isButtonDisabled = true;
final authService = AuthProvider();
var sharedPref = AppSharedPreferences();
bool isLoading = false;
AppointmentRateViewModel appointmentRateViewModel =
locator<AppointmentRateViewModel>();
PharmacyModuleViewModel pharmacyModuleViewModel =
locator<PharmacyModuleViewModel>();
AuthenticatedUserObject authenticatedUserObject =
locator<AuthenticatedUserObject>();
late ProjectViewModel projectViewModel;
late ToDoCountProviderModel toDoProvider;
var familyFileProvider = FamilyFilesProvider();
@override
void initState() {
// getDeviceToken();
super.initState();
// if (BASE_URL.contains("uat.")) {
// nationalIDorFile.text = "2001273";
// mobileNumberController.text = mobileNo = "0555416043";
// }
getRegisterData();
/* else {
nationalIDorFile.text = "3376044";
mobileNumberController.text = mobileNo = "0555416575";
}*/
}
getDeviceToken() async {
setState(() async {
nationalIDorFile.text = await sharedPref.getString(PUSH_TOKEN);
});
}
@override
Widget build(BuildContext context) {
projectViewModel = Provider.of(context);
toDoProvider = Provider.of<ToDoCountProviderModel>(context);
return Scaffold(
backgroundColor: Color(0xfff8f8f8),
appBar: AppBar(
backgroundColor: Colors.transparent,
leading: IconButton(
icon: Icon(Icons.arrow_back_ios),
color: Color(0xff2B353E),
onPressed: () => Navigator.pop(context),
),
),
body: Padding(
padding: EdgeInsets.only(bottom: 20, left: 21, right: 21),
child: Column(children: [
Expanded(
child: ListView(
padding: EdgeInsets.zero,
physics: BouncingScrollPhysics(),
children: [
SizedBox(height: 12),
HabibLogoWidget(),
SizedBox(height: 50),
Text(
loginType == 1
? TranslationBase.of(context).enterNationalId
: TranslationBase.of(context).enterFile,
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
color: Color(0xff2B353E),
letterSpacing: -0.64,
height: 23 / 16,
),
),
SizedBox(height: 20),
PhoneNumberSelectorWidget(
onNumberChange: (value) => {mobileNo = value, validateForm()},
onCountryChange: (value) => countryCode = value,
mobileNo: this.mobileNo,
),
SizedBox(height: 12),
Directionality(
textDirection: TextDirection.ltr,
child: inputWidget(
loginType == 1
? TranslationBase.of(context).nationalIdNumber
: TranslationBase.of(context).medicalFileNumber,
"Xxxxxxxxx",
nationalIDorFile,
),
),
],
),
),
SizedBox(
height: 12,
),
DefaultButton(
TranslationBase.of(context).login,
() {
if (isButtonDisabled) {
AppToast.showErrorToast(message: "National ID can only contain numbers");
} else {
this.startLogin();
}
},
disabledColor: Color(0xff575757),
),
]),
),
);
}
Widget inputWidget(
String _labelText, String _hintText, TextEditingController _controller,
{String? prefix, bool isEnable = true, bool hasSelection = false}) {
return Container(
padding: EdgeInsets.only(left: 16, right: 16, bottom: 15, top: 15),
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(15),
color: Colors.white,
border: Border.all(
color: Color(0xffefefef),
width: 1,
),
),
child: InkWell(
onTap: hasSelection ? () {} : null,
child: Row(
children: [
Expanded(
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
_labelText,
style: TextStyle(
fontSize: 11,
fontWeight: FontWeight.w600,
color: Color(0xff2B353E),
letterSpacing: -0.44,
),
),
TextField(
enabled: isEnable,
scrollPadding: EdgeInsets.zero,
keyboardType: TextInputType.number,
controller: _controller,
onChanged: (value) => {validateForm()},
style: TextStyle(
fontSize: 14,
height: 21 / 14,
fontWeight: FontWeight.w400,
color: Color(0xff2B353E),
letterSpacing: -0.44,
),
decoration: InputDecoration(
isDense: true,
hintText: _hintText,
hintStyle: TextStyle(
fontSize: 14,
height: 21 / 14,
fontWeight: FontWeight.w400,
color: Color(0xff575757),
letterSpacing: -0.56,
),
prefixIconConstraints: BoxConstraints(minWidth: 50),
prefixIcon: prefix == null
? null
: Text(
"+" + prefix,
style: TextStyle(
fontSize: 14,
height: 21 / 14,
fontWeight: FontWeight.w500,
color: Color(0xff2E303A),
letterSpacing: -0.56,
),
),
contentPadding: EdgeInsets.zero,
border: InputBorder.none,
focusedBorder: InputBorder.none,
enabledBorder: InputBorder.none,
),
),
],
),
),
if (hasSelection) Icon(Icons.keyboard_arrow_down_outlined),
],
),
),
);
}
startLogin() {
if (isButtonDisabled == false) {
checkUserAuthentication();
}
}
void validateForm() {
if (util.validateIDBox(nationalIDorFile.text, loginType) == true &&
(countryCode == "971" ? true : util.isSAUDIIDValid(nationalIDorFile.text, loginType) == true)) {
setState(() {
isButtonDisabled = false;
});
} else {
setState(() {
isButtonDisabled = true;
});
}
}
checkUserAuthentication() {
// showLoader(true);
var request = CheckPatientAuthenticationReq();
request.isRegister = false;
request.patientMobileNumber = int.parse(mobileNo!);
request.zipCode = countryCode;
request.searchType = this.loginType;
request.deviceTypeID = this.loginType;
if (this.loginType == 1) {
request.patientIdentificationID = this.nationalIDorFile.text;
request.patientID = 0;
} else {
request.patientIdentificationID = '';
request.patientID = int.parse(nationalIDorFile.text);
}
sharedPref.setObject(REGISTER_DATA_FOR_REGISTER, request);
GifLoaderDialogUtils.showMyDialog(context);
authService.checkPatientAuthentication(request).then((value) {
// if (value['UserAccountIsActivated']) {
if (value['isSMSSent']) {
sharedPref.setString(LOGIN_TOKEN_ID, value['LogInTokenID']);
sharedPref.setObject(REGISTER_DATA_FOR_LOGIIN, request);
GifLoaderDialogUtils.hideDialog(context);
Navigator.of(context).push(FadePage(page: ConfirmLogin()));
} else {
if (value['IsAuthenticated']) {
this.checkActivationCode();
}
}
// } else {
// ConfirmDialog activationDialog = new ConfirmDialog(
// context: context,
// confirmMessage: TranslationBase.of(context).accountDeactivatedMsg,
// okText: TranslationBase.of(context).yes,
// cancelText: TranslationBase.of(context).no,
// okFunction: () => {ConfirmDialog.closeAlertDialog(context), this.activatePatientFile()},
// cancelFunction: () => {});
// GifLoaderDialogUtils.hideDialog(context);
// activationDialog.showAlertDialog(context);
// }
}).catchError((err) {
GifLoaderDialogUtils.hideDialog(context);
ConfirmDialog dialog = new ConfirmDialog(
context: context,
confirmMessage: err,
okText: TranslationBase.of(context).confirm,
cancelText: TranslationBase.of(context).cancel_nocaps,
okFunction: () => {
ConfirmDialog.closeAlertDialog(context),
Navigator.of(context).push(FadePage(page: RegisterNew())),
},
cancelFunction: () => {});
dialog.showAlertDialog(context);
projectViewModel.analytics.loginRegistration
.login_fail(error: err.toString());
});
}
activatePatientFile() {
GifLoaderDialogUtils.showMyDialog(context);
Map<String, dynamic> request = {};
request["IsActive"] = true;
if (this.loginType == 1) {
request['PatientIdentificationID'] = int.parse(nationalIDorFile.text);
} else {
request['PatientID'] = int.parse(nationalIDorFile.text);
}
request["PatientMobileNumber"] = mobileNo;
authService.deactivateAccount(request, true).then((result) {
GifLoaderDialogUtils.hideDialog(context);
checkUserAuthentication();
}).catchError((err) {
GifLoaderDialogUtils.hideDialog(context);
AppToast.showErrorToast(message: err);
});
}
checkActivationCode({code}) async {
Map<String, dynamic> request = {};
if (code == null) request['PatientMobileNumber'] = int.parse(mobileNo!);
request['ZipCode'] = countryCode;
request['SearchType'] = loginType;
request['LoginType'] = loginType;
if (this.loginType == 1) {
request['PatientIdentificationID'] = this.nationalIDorFile.text;
request['PatientID'] = 0;
} else {
request['PatientIdentificationID'] = '';
request['PatientID'] = int.parse(nationalIDorFile.text);
}
this.authService.checkActivationCode(request, code).then((result) async {
sharedPref.remove(FAMILY_FILE);
// registerGeoZones();
projectViewModel.setPrivilege(privilegeList: result);
result = CheckActivationCode.fromJson(result);
result.list.isFamily = false;
this.sharedPref.setString(BLOOD_TYPE,
result.patientBloodType != null ? result.patientBloodType : "");
this.sharedPref.setObject(USER_PROFILE, result.list);
this.sharedPref.setObject(MAIN_USER, result.list);
this.sharedPref.setObject(LOGIN_TOKEN_ID, result.logInTokenID);
this.sharedPref.setString(TOKEN, result.authenticationTokenID);
await authenticatedUserObject.getUser(getUser: true);
authenticatedUserObject.isLogin = true;
appointmentRateViewModel.isLogin = true;
projectViewModel.isLogin = true;
authenticatedUserObject.user = result.list;
projectViewModel.user = authenticatedUserObject.user;
// GifLoaderDialogUtils.hideDialog(context);
//
// getToDoCount();
//
// Navigator.pushAndRemoveUntil(
// context,
// FadePage(
// page: LandingPage(),
// ),
// (r) => false);
getToDoCount();
appointmentRateViewModel
.getIsLastAppointmentRatedList(projectViewModel.isArabic ? 1 : 2)
.then((value) => {
GifLoaderDialogUtils.hideDialog(context),
if (appointmentRateViewModel.isHaveAppointmentNotRate)
{
Navigator.pushAndRemoveUntil(
context,
FadePage(
page: RateAppointmentDoctor(),
),
(r) => false)
}
else
{
Navigator.pushAndRemoveUntil(
context,
FadePage(
page: LandingPage(),
),
(r) => false)
}
})
.catchError((err) {
print(err);
GifLoaderDialogUtils.hideDialog(context);
});
});
}
getToDoCount() {
toDoProvider.setState(0, 0, true, toDoProvider.notificationsCount);
ClinicListService service = new ClinicListService();
service.getActiveAppointmentNo(context).then((res) {
//print(res['AppointmentActiveNumber']);
if (res['MessageStatus'] == 1) {
// toDoProvider.setState(res['AppointmentActiveNumber'], true, toDoProvider.notificationsCount);
toDoProvider.setState(res['AppointmentActiveNumber'], res['AncillaryOrderListCount'], true, toDoProvider.notificationsCount);
} else {}
}).catchError((err) {
print(err);
});
}
checkIfIsInPatient() async {
bool isAdmitted = false;
bool hasAdmissionRequest = false;
GetAdmissionInfoResponseModel getAdmissionInfoResponseModel;
GetAdmissionRequestInfoResponseModel getAdmissionRequestInfoResponseModel;
ClinicListService? service = new ClinicListService();
dynamic res = await service.checkIfInPatientAPI(context);
if (res != null) {
if (res['MessageStatus'] == 1) {
isAdmitted = res['isAdmitted'];
hasAdmissionRequest = res['hasAdmissionRequests'];
print("IS ADMITTED: $isAdmitted");
print("Has Admission Request: $hasAdmissionRequest");
if (isAdmitted) {
if (res['PatientAdmittedInformation'].length != 0) {
getAdmissionInfoResponseModel =
GetAdmissionInfoResponseModel.fromJson(
res['PatientAdmittedInformation'][0]);
projectViewModel.setInPatientProjectID(
res['PatientAdmittedInformation'][0]['ProjectID']);
projectViewModel
.setInPatientAdmissionInfo(getAdmissionInfoResponseModel);
projectViewModel.setIsPatientAdmitted(true);
}
}
if (hasAdmissionRequest) {
if (res['MedicalInstruction'].length != 0) {
getAdmissionRequestInfoResponseModel =
GetAdmissionRequestInfoResponseModel.fromJson(
res['MedicalInstruction'][0]);
projectViewModel.setInPatientProjectID(
res['MedicalInstruction'][0]['ProjectID']);
projectViewModel.setInPatientAdmissionRequest(
getAdmissionRequestInfoResponseModel);
projectViewModel.setPatientHasAdmissionRequest(true);
}
}
}
}
}
void registerGeoZones() async {
await locator<GeofencingServices>().getAllGeoZones(GeoZonesRequestModel());
projectViewModel.platformBridge().registerHmgGeofences();
}
getRegisterData() async {
var registerData = await sharedPref.getObject(REGISTER_DATA_FOR_LOGIIN);
await sharedPref.remove(REGISTER_DATA_FOR_LOGIIN);
if (registerData != null) {
setState(() {
this.nationalIDorFile.text =
registerData['PatientIdentificationID'].toString();
this.isButtonDisabled = false;
this.loginType = 1;
this.mobileNo = registerData['PatientMobileNumber'].toString();
});
}
// var voipToken = await sharedPref.getString("VOIPToken");
// setState(() {
// nationalIDorFile.text = voipToken;
// });
}
}