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.
384 lines
15 KiB
Dart
384 lines
15 KiB
Dart
import 'package:diplomaticquarterapp/config/config.dart';
|
|
import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
|
|
import 'package:diplomaticquarterapp/core/service/AuthenticatedUserObject.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/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/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();
|
|
final int loginType = LoginType.loginType;
|
|
String mobileNo;
|
|
String countryCode = '966';
|
|
bool isButtonDisabled = true;
|
|
final authService = new AuthProvider();
|
|
var sharedPref = new AppSharedPreferences();
|
|
bool isLoading = false;
|
|
AppointmentRateViewModel appointmentRateViewModel = locator<AppointmentRateViewModel>();
|
|
PharmacyModuleViewModel pharmacyModuleViewModel = locator<PharmacyModuleViewModel>();
|
|
|
|
AuthenticatedUserObject authenticatedUserObject = locator<AuthenticatedUserObject>();
|
|
|
|
ProjectViewModel projectViewModel;
|
|
ToDoCountProviderModel toDoProvider;
|
|
|
|
var familyFileProvider = FamilyFilesProvider();
|
|
|
|
@override
|
|
void initState() {
|
|
// getDeviceToken();
|
|
super.initState();
|
|
|
|
if (BASE_URL.contains("uat.")) {
|
|
nationalIDorFile.text = "2001273";
|
|
mobileNumberController.text = mobileNo = "0555416043";
|
|
}/* 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),
|
|
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,
|
|
isButtonDisabled
|
|
? null
|
|
: () {
|
|
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 && 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) => {
|
|
//showLoader(false),
|
|
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()}
|
|
}
|
|
})
|
|
.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: () => {ConfirmDialog.closeAlertDialog(context)});
|
|
dialog.showAlertDialog(context);
|
|
});
|
|
// SMSOTP.showLoadingDialog(context, false),
|
|
}
|
|
|
|
checkActivationCode({code}) async {
|
|
Map<String, dynamic> request = {};
|
|
// request.logInTokenID = await sharedPref.getString(LOGIN_TOKEN_ID);
|
|
// request.activationCode = code ?? "0000";
|
|
// request.isSilentLogin = code != null ? false : true;
|
|
if (code == null)
|
|
//showLoader(true);
|
|
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);
|
|
}
|
|
// request.isRegister = false;
|
|
this.authService.checkActivationCode(request, code).then((result) async {
|
|
sharedPref.remove(FAMILY_FILE);
|
|
// Register GeoZones after login
|
|
registerGeoZones();
|
|
projectViewModel.setPrivilege(privilegeList: result);
|
|
result = CheckActivationCode.fromJson(result);
|
|
result.list.isFamily = false;
|
|
this.sharedPref.setString(BLOOD_TYPE, 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;
|
|
// authenticatedUserObject.user.cRSVerificationStatus =
|
|
// result['CRSVerificationStatus'];
|
|
projectViewModel.user = authenticatedUserObject.user;
|
|
|
|
//await familyFileProvider.getSharedRecordByStatus();
|
|
// await pharmacyModuleViewModel.generatePharmacyToken().then((value) async {
|
|
// if (pharmacyModuleViewModel.error.isNotEmpty) await pharmacyModuleViewModel.createUser();
|
|
// });
|
|
|
|
appointmentRateViewModel
|
|
.getIsLastAppointmentRatedList()
|
|
.then((value) => {
|
|
getToDoCount(),
|
|
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, 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);
|
|
} else {}
|
|
}).catchError((err) {
|
|
print(err);
|
|
});
|
|
}
|
|
|
|
void registerGeoZones() {
|
|
projectViewModel.platformBridge().registerHmgGeofences();
|
|
}
|
|
|
|
// showLoader(bool isTrue) {
|
|
// setState(() {
|
|
// isLoading = isTrue;
|
|
// });
|
|
// }
|
|
}
|