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.
doctor_app_flutter/lib/screens/auth/login_screen.dart

516 lines
29 KiB
Dart

import 'dart:async';
import 'dart:io';
import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/config/shared_pref_kay.dart';
import 'package:doctor_app_flutter/config/size_config.dart';
import 'package:doctor_app_flutter/core/enum/viewstate.dart';
import 'package:doctor_app_flutter/core/service/auth_service.dart';
import 'package:doctor_app_flutter/core/viewModel/hospitals_view_model.dart';
import 'package:doctor_app_flutter/core/viewModel/imei_view_model.dart';
import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart';
import 'package:doctor_app_flutter/models/doctor/user_model.dart';
import 'package:doctor_app_flutter/screens/auth/verification_methods_screen.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/util/helpers.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
import 'package:doctor_app_flutter/widgets/shared/app_loader_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/buttons/app_buttons_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/loader/gif_loader_dialog_utils.dart';
import 'package:doctor_app_flutter/widgets/shared/text_fields/app_text_form_field.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';
import 'package:hexcolor/hexcolor.dart';
import 'package:provider/provider.dart';
import '../../lookups/auth_lookup.dart';
import '../../util/dr_app_shared_pref.dart';
import '../../widgets/auth/auth_header.dart';
import '../../widgets/shared/app_scaffold_widget.dart';
DrAppSharedPreferances sharedPref = new DrAppSharedPreferances();
class Loginsreen extends StatefulWidget {
@override
_LoginsreenState createState() => _LoginsreenState();
}
class _LoginsreenState extends State<Loginsreen> {
String platformImei;
final FirebaseMessaging _firebaseMessaging = FirebaseMessaging();
bool _isLoading = true;
ProjectViewModel projectViewModel;
AuthService authService = AuthService();
//TODO change AppTextFormField to AppTextFormFieldCustom
final loginFormKey = GlobalKey<FormState>();
var projectIdController = TextEditingController();
var projectsList = [];
FocusNode focusPass = FocusNode();
FocusNode focusProject = FocusNode();
// HospitalViewModel hospitalViewModel;
var userInfo = UserModel();
@override
void initState() {
super.initState();
_firebaseMessaging.setAutoInitEnabled(true);
if (Platform.isIOS) {
_firebaseMessaging.requestNotificationPermissions();
}
_firebaseMessaging.getToken().then((String token) async {
if (DEVICE_TOKEN == "" && projectViewModel.isLogin == false) {
DEVICE_TOKEN = token;
changeLoadingState(true);
authService.selectDeviceImei(DEVICE_TOKEN).then((value) {
print(authService.dashboardItemsList);
if (authService.dashboardItemsList.length > 0) {
sharedPref.setObj(
LAST_LOGIN_USER, authService.dashboardItemsList[0]);
Navigator.of(context).pushReplacement(MaterialPageRoute(
builder: (BuildContext context) => VerificationMethodsScreen(
password: null,
)));
} else {
changeLoadingState(false);
}
});
} else {
changeLoadingState(false);
}
}).catchError((err) {
print(err);
});
}
void changeLoadingState(isLoading) {
setState(() {
_isLoading = isLoading;
});
}
@override
Widget build(BuildContext context) {
projectViewModel = Provider.of<ProjectViewModel>(context);
return BaseView<IMEIViewModel>(
onModelReady: (model) => {},
builder: (_, model, w) =>
AppScaffold(
baseViewModel: model,
isShowAppBar: false,
backgroundColor: HexColor('#F8F8F8'),
body: SafeArea(
child: (_isLoading == false)
? ListView(children: <Widget>[
Container(
margin:
EdgeInsetsDirectional.fromSTEB(30, 0, 30, 30),
alignment: Alignment.topLeft,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: <Widget>[
AuthHeader(loginType.knownUser),
SizedBox(
height: 40,
),
Form(
key: loginFormKey,
child: Column(
mainAxisAlignment: MainAxisAlignment
.spaceBetween,
children: <Widget>[
Container(
width: SizeConfig
.realScreenWidth * 0.90,
height: SizeConfig
.realScreenHeight * 0.65,
child:
Column(
crossAxisAlignment: CrossAxisAlignment
.start, children: [
buildSizedBox(),
Padding(
child: AppText(
TranslationBase
.of(context)
.enterCredentials,
fontSize: 18,
fontWeight: FontWeight
.bold,
),
padding: EdgeInsets.only(
top: 10, bottom: 10)),
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius
.all(
Radius.circular(
6.0)),
border: Border.all(
width: 1.0,
color: HexColor(
"#CCCCCC"),
),
color: Colors.white),
child: Column(
crossAxisAlignment: CrossAxisAlignment
.start,
children: [
Padding(
padding: EdgeInsets
.only(
left: 10,
top: 10),
child: AppText(
TranslationBase
.of(context)
.enterId,
fontWeight: FontWeight
.w800,
fontSize: 14,
)),
AppTextFormField(
labelText: '',
borderColor: Colors
.white,
textInputAction: TextInputAction
.next,
validator: (value) {
if (value !=
null && value
.isEmpty) {
return TranslationBase
.of(context)
.pleaseEnterYourID;
}
return null;
},
onSaved: (value) {
if (value !=
null) setState(() {
userInfo
.userID =
value
.trim();
});
},
onChanged: (value) {
if (value != null)
setState(() {
userInfo
.userID =
value
.trim();
});
},
onFieldSubmitted: (
_) {
focusPass
.nextFocus();
},
)
])),
buildSizedBox(),
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius
.all(
Radius.circular(
6.0)),
border: Border.all(
width: 1.0,
color: HexColor(
"#CCCCCC"),
),
color: Colors.white),
child: Column(
crossAxisAlignment: CrossAxisAlignment
.start,
children: [
Padding(
padding: EdgeInsets
.only(
left: 10,
top: 10),
child: AppText(
TranslationBase
.of(context)
.enterPassword,
fontWeight: FontWeight
.w800,
fontSize: 14,
)),
AppTextFormField(
focusNode: focusPass,
obscureText: true,
borderColor: Colors
.white,
textInputAction: TextInputAction
.next,
validator: (value) {
if (value !=
null && value
.isEmpty) {
return TranslationBase
.of(context)
.pleaseEnterPassword;
}
return null;
},
onSaved: (value) {
if (value !=
null)
setState(() {
userInfo
.password =
value;
});
},
onChanged: (value){
if (value !=
null)
setState(() {
userInfo
.password =
value;
});
},
onFieldSubmitted: (
_) {
focusPass
.nextFocus();
Helpers
.showCupertinoPicker(
context,
projectsList,
'facilityName',
onSelectProject);
},
onTap: () {
this.getProjects(
userInfo
.userID, model);
},
)
])),
buildSizedBox(),
projectsList.length > 0
? Container(
decoration: BoxDecoration(
borderRadius: BorderRadius
.all(
Radius.circular(
6.0)),
border: Border.all(
width: 1.0,
color: HexColor(
"#CCCCCC"),
),
color: Colors.white),
child: Column(
crossAxisAlignment: CrossAxisAlignment
.start,
children: [
Padding(
padding: EdgeInsets
.only(
left: 10,
top: 10),
child: AppText(
TranslationBase
.of(context)
.selectYourProject,
fontWeight: FontWeight
.w600,
)),
AppTextFormField(
focusNode: focusProject,
controller: projectIdController,
borderColor: Colors
.white,
suffixIcon: Icons
.arrow_drop_down,
onTap: () {
Helpers
.showCupertinoPicker(
context,
projectsList,
'facilityName',
onSelectProject);
},
validator: (
value) {
if (value !=
null &&
value
.isEmpty) {
return TranslationBase
.of(
context)
.pleaseEnterYourProject;
}
return null;
})
]))
: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius
.all(
Radius.circular(
6.0)),
border: Border.all(
width: 1.0,
color: HexColor(
"#CCCCCC"),
),
color: Colors.white),
child: Column(
crossAxisAlignment: CrossAxisAlignment
.start,
children: [
Padding(
padding: EdgeInsets
.only(
left: 10,
top: 10),
child: AppText(
TranslationBase
.of(context)
.selectYourProject,
fontWeight: FontWeight
.w800,
fontSize: 14,
)),
AppTextFormField(
readOnly: true,
borderColor: Colors
.white,
prefix: IconButton(
icon: Icon(Icons
.arrow_drop_down),
iconSize: 30,
padding: EdgeInsets
.only(
bottom: 30),
),
)
])),
]),
),
Row(
mainAxisAlignment: MainAxisAlignment
.end,
children: <Widget>[
Expanded(
child: AppButton(
title: TranslationBase
.of(context)
.login,
color: HexColor(
'#D02127'),
disabled: userInfo
.userID == null ||
userInfo.password ==
null,
fontWeight: FontWeight
.bold,
onPressed: () {
login(context, model);
},
)),
],
)
],
),
)
],
)
]))
])
: Center(child: AppLoaderWidget()),
),
));
}
SizedBox buildSizedBox() {
return SizedBox(
height: 20,
);
}
login(context,
IMEIViewModel model,) async {
if (loginFormKey.currentState.validate()) {
loginFormKey.currentState.save();
GifLoaderDialogUtils.showMyDialog(context);
sharedPref.setInt(PROJECT_ID, userInfo.projectID);
await model.login(userInfo);
if (model.state == ViewState.ErrorLocal) {
Helpers.showErrorToast(model.error);
} else {
if (model.loginInfo['MessageStatus'] == 1) {
saveObjToString(LOGGED_IN_USER, model.loginInfo);
sharedPref.remove(LAST_LOGIN_USER);
sharedPref.setString(TOKEN, model.loginInfo['LogInTokenID']);
GifLoaderDialogUtils.hideDialog(context);
Navigator.of(context).pushReplacement(MaterialPageRoute(
builder: (BuildContext context) =>
VerificationMethodsScreen(
password: userInfo.password,
)));
}
}
}
}
Future<void> setSharedPref(key, value) async {
sharedPref.setString(key, value).then((success) {
print("sharedPref.setString" + success.toString());
});
}
saveObjToString(String key, value) async {
sharedPref.setObj(key, value);
}
onSelectProject(index) {
setState(() {
userInfo.projectID = projectsList[index]["facilityId"];
projectIdController.text = projectsList[index]['facilityName'];
});
primaryFocus.unfocus();
}
getProjects(memberID, IMEIViewModel model)async {
if (memberID != null && memberID != '') {
if (projectsList.length == 0) {
await model.getHospitalsList(memberID);
if(model.state == ViewState.Idle) {
projectsList = model.hospitals;
setState(() {
userInfo.projectID = projectsList[0]["facilityId"];
projectIdController.text = projectsList[0]['facilityName'];
});
}
}
}
}
}