Merge branch 'sultan_merge' into 'master'
Sultan merge See merge request Cloud_Solution/diplomatic-quarter!5merge-update-with-lab-changes
commit
bbb6dcd913
@ -0,0 +1,42 @@
|
|||||||
|
{
|
||||||
|
"project_info": {
|
||||||
|
"project_number": "815750722565",
|
||||||
|
"firebase_url": "https://api-project-815750722565.firebaseio.com",
|
||||||
|
"project_id": "api-project-815750722565",
|
||||||
|
"storage_bucket": "api-project-815750722565.appspot.com"
|
||||||
|
},
|
||||||
|
"client": [
|
||||||
|
{
|
||||||
|
"client_info": {
|
||||||
|
"mobilesdk_app_id": "1:815750722565:android:62281cd3e5df4063",
|
||||||
|
"android_client_info": {
|
||||||
|
"package_name": "com.cloud.diplomaticquarterapp"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"oauth_client": [
|
||||||
|
{
|
||||||
|
"client_id": "815750722565-3a0gc7neins0eoahdrimrfksk0sqice8.apps.googleusercontent.com",
|
||||||
|
"client_type": 3
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"api_key": [
|
||||||
|
{
|
||||||
|
"current_key": "AIzaSyDUfg6AKM1-00WyzpvLImUBC46wFrq9-qw"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"services": {
|
||||||
|
"analytics_service": {
|
||||||
|
"status": 1
|
||||||
|
},
|
||||||
|
"appinvite_service": {
|
||||||
|
"status": 1,
|
||||||
|
"other_platform_oauth_client": []
|
||||||
|
},
|
||||||
|
"ads_service": {
|
||||||
|
"status": 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"configuration_version": "1"
|
||||||
|
}
|
||||||
@ -0,0 +1 @@
|
|||||||
|
include ':app'
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 3.3 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.9 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 38 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 2.1 KiB |
@ -1,3 +1,7 @@
|
|||||||
const TOKEN = 'token';
|
const TOKEN = 'token';
|
||||||
const APP_LANGUAGE = 'language';
|
const APP_LANGUAGE = 'language';
|
||||||
|
const USER_PROFILE = 'user-profile';
|
||||||
|
const PUSH_TOKEN = 'push-token';
|
||||||
|
const REGISTER_DATA_FOR_REGISTER = 'register-data-for-register';
|
||||||
|
const LOGIN_TOKEN_ID = 'register-data-for-register';
|
||||||
|
const REGISTER_DATA_FOR_LOGIIN = 'register-data-for-login';
|
||||||
|
|||||||
@ -0,0 +1,76 @@
|
|||||||
|
class CheckPatientAuthenticationReq {
|
||||||
|
int patientMobileNumber;
|
||||||
|
String zipCode;
|
||||||
|
bool isRegister;
|
||||||
|
String tokenID;
|
||||||
|
int searchType;
|
||||||
|
String patientIdentificationID;
|
||||||
|
int patientID;
|
||||||
|
double versionID;
|
||||||
|
int channel;
|
||||||
|
int languageID;
|
||||||
|
String iPAdress;
|
||||||
|
String generalid;
|
||||||
|
int patientOutSA;
|
||||||
|
Null sessionID;
|
||||||
|
bool isDentalAllowedBackend;
|
||||||
|
int deviceTypeID;
|
||||||
|
|
||||||
|
CheckPatientAuthenticationReq(
|
||||||
|
{this.patientMobileNumber,
|
||||||
|
this.zipCode,
|
||||||
|
this.isRegister,
|
||||||
|
this.tokenID,
|
||||||
|
this.searchType,
|
||||||
|
this.patientIdentificationID,
|
||||||
|
this.patientID,
|
||||||
|
this.versionID,
|
||||||
|
this.channel,
|
||||||
|
this.languageID,
|
||||||
|
this.iPAdress,
|
||||||
|
this.generalid,
|
||||||
|
this.patientOutSA,
|
||||||
|
this.sessionID,
|
||||||
|
this.isDentalAllowedBackend,
|
||||||
|
this.deviceTypeID});
|
||||||
|
|
||||||
|
CheckPatientAuthenticationReq.fromJson(Map<String, dynamic> json) {
|
||||||
|
patientMobileNumber = json['PatientMobileNumber'];
|
||||||
|
zipCode = json['ZipCode'];
|
||||||
|
isRegister = json['isRegister'];
|
||||||
|
tokenID = json['TokenID'];
|
||||||
|
searchType = json['SearchType'];
|
||||||
|
patientIdentificationID = json['PatientIdentificationID'];
|
||||||
|
patientID = json['PatientID'];
|
||||||
|
versionID = json['VersionID'];
|
||||||
|
channel = json['Channel'];
|
||||||
|
languageID = json['LanguageID'];
|
||||||
|
iPAdress = json['IPAdress'];
|
||||||
|
generalid = json['generalid'];
|
||||||
|
patientOutSA = json['PatientOutSA'];
|
||||||
|
sessionID = json['SessionID'];
|
||||||
|
isDentalAllowedBackend = json['isDentalAllowedBackend'];
|
||||||
|
deviceTypeID = json['DeviceTypeID'];
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||||
|
data['PatientMobileNumber'] = this.patientMobileNumber;
|
||||||
|
data['ZipCode'] = this.zipCode;
|
||||||
|
data['isRegister'] = this.isRegister;
|
||||||
|
data['TokenID'] = this.tokenID;
|
||||||
|
data['SearchType'] = this.searchType;
|
||||||
|
data['PatientIdentificationID'] = this.patientIdentificationID;
|
||||||
|
data['PatientID'] = this.patientID;
|
||||||
|
data['VersionID'] = this.versionID;
|
||||||
|
data['Channel'] = this.channel;
|
||||||
|
data['LanguageID'] = this.languageID;
|
||||||
|
data['IPAdress'] = this.iPAdress;
|
||||||
|
data['generalid'] = this.generalid;
|
||||||
|
data['PatientOutSA'] = this.patientOutSA;
|
||||||
|
data['SessionID'] = this.sessionID;
|
||||||
|
data['isDentalAllowedBackend'] = this.isDentalAllowedBackend;
|
||||||
|
data['DeviceTypeID'] = this.deviceTypeID;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,68 @@
|
|||||||
|
class SelectDeviceIMEIRES {
|
||||||
|
bool biometricEnabled;
|
||||||
|
String createdOn;
|
||||||
|
String editedOn;
|
||||||
|
int iD;
|
||||||
|
String iMEI;
|
||||||
|
String identificationNo;
|
||||||
|
int logInType;
|
||||||
|
String mobile;
|
||||||
|
String name;
|
||||||
|
String nameN;
|
||||||
|
bool outSA;
|
||||||
|
int patientID;
|
||||||
|
int patientType;
|
||||||
|
int preferredLanguage;
|
||||||
|
|
||||||
|
SelectDeviceIMEIRES(
|
||||||
|
{this.biometricEnabled,
|
||||||
|
this.createdOn,
|
||||||
|
this.editedOn,
|
||||||
|
this.iD,
|
||||||
|
this.iMEI,
|
||||||
|
this.identificationNo,
|
||||||
|
this.logInType,
|
||||||
|
this.mobile,
|
||||||
|
this.name,
|
||||||
|
this.nameN,
|
||||||
|
this.outSA,
|
||||||
|
this.patientID,
|
||||||
|
this.patientType,
|
||||||
|
this.preferredLanguage});
|
||||||
|
|
||||||
|
SelectDeviceIMEIRES.fromJson(Map<String, dynamic> json) {
|
||||||
|
biometricEnabled = json['BiometricEnabled'];
|
||||||
|
createdOn = json['CreatedOn'];
|
||||||
|
editedOn = json['EditedOn'];
|
||||||
|
iD = json['ID'];
|
||||||
|
iMEI = json['IMEI'];
|
||||||
|
identificationNo = json['IdentificationNo'];
|
||||||
|
logInType = json['LogInType'];
|
||||||
|
mobile = json['Mobile'];
|
||||||
|
name = json['Name'];
|
||||||
|
nameN = json['NameN'];
|
||||||
|
outSA = json['OutSA'];
|
||||||
|
patientID = json['PatientID'];
|
||||||
|
patientType = json['PatientType'];
|
||||||
|
preferredLanguage = json['PreferredLanguage'];
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||||
|
data['BiometricEnabled'] = this.biometricEnabled;
|
||||||
|
data['CreatedOn'] = this.createdOn;
|
||||||
|
data['EditedOn'] = this.editedOn;
|
||||||
|
data['ID'] = this.iD;
|
||||||
|
data['IMEI'] = this.iMEI;
|
||||||
|
data['IdentificationNo'] = this.identificationNo;
|
||||||
|
data['LogInType'] = this.logInType;
|
||||||
|
data['Mobile'] = this.mobile;
|
||||||
|
data['Name'] = this.name;
|
||||||
|
data['NameN'] = this.nameN;
|
||||||
|
data['OutSA'] = this.outSA;
|
||||||
|
data['PatientID'] = this.patientID;
|
||||||
|
data['PatientType'] = this.patientType;
|
||||||
|
data['PreferredLanguage'] = this.preferredLanguage;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,95 @@
|
|||||||
|
import 'package:diplomaticquarterapp/config/size_config.dart';
|
||||||
|
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/input/text_field.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/mobile-no/mobile_no.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/text/app_texts_widget.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class ForgotPassword extends StatefulWidget {
|
||||||
|
@override
|
||||||
|
_ForgotPassword createState() => _ForgotPassword();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _ForgotPassword extends State<ForgotPassword> {
|
||||||
|
String selectedType = 'Saudi Arabia';
|
||||||
|
final TextEditingController nationalIDorFile = null;
|
||||||
|
final TextEditingController mobileNo = null;
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return AppScaffold(
|
||||||
|
appBarTitle: TranslationBase.of(context).forgotPassword,
|
||||||
|
isShowAppBar: true,
|
||||||
|
body: SingleChildScrollView(
|
||||||
|
child: Container(
|
||||||
|
padding: EdgeInsets.only(top: 10, left: 20, right: 20),
|
||||||
|
height: SizeConfig.realScreenHeight * .8,
|
||||||
|
width: SizeConfig.realScreenWidth,
|
||||||
|
child: Column(children: <Widget>[
|
||||||
|
Expanded(
|
||||||
|
flex: 1,
|
||||||
|
child: AppText(
|
||||||
|
TranslationBase.of(context).forgotDesc,
|
||||||
|
fontSize: SizeConfig.textMultiplier * 3.5,
|
||||||
|
textAlign: TextAlign.left,
|
||||||
|
)),
|
||||||
|
Expanded(
|
||||||
|
flex: 2,
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||||
|
children: <Widget>[
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: <Widget>[
|
||||||
|
Expanded(
|
||||||
|
// add Expanded to have your dropdown button fill remaining space
|
||||||
|
child: DropdownButtonHideUnderline(
|
||||||
|
child: DropdownButton(
|
||||||
|
isExpanded: true,
|
||||||
|
value: selectedType,
|
||||||
|
iconSize: 40,
|
||||||
|
elevation: 16,
|
||||||
|
onChanged: (String newValue) => {
|
||||||
|
setState(() {
|
||||||
|
selectedType = newValue;
|
||||||
|
})
|
||||||
|
},
|
||||||
|
items: <String>[
|
||||||
|
'Saudi Arabia',
|
||||||
|
'Dubai',
|
||||||
|
].map<DropdownMenuItem<String>>(
|
||||||
|
(String value) {
|
||||||
|
return DropdownMenuItem<String>(
|
||||||
|
value: value,
|
||||||
|
child: Text(value),
|
||||||
|
);
|
||||||
|
}).toList()))),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
MobileNo(controller: mobileNo),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
flex: 2,
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.end,
|
||||||
|
children: <Widget>[
|
||||||
|
Row(
|
||||||
|
children: <Widget>[
|
||||||
|
Expanded(
|
||||||
|
child: RaisedButton(
|
||||||
|
color: Colors.grey,
|
||||||
|
textColor: Colors.white,
|
||||||
|
child: Text(TranslationBase.of(context).submit),
|
||||||
|
onPressed: () => {},
|
||||||
|
))
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
))
|
||||||
|
]),
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,162 @@
|
|||||||
|
import 'package:diplomaticquarterapp/config/size_config.dart';
|
||||||
|
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/card/rounded_container.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/text/app_texts_widget.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:diplomaticquarterapp/routes.dart';
|
||||||
|
|
||||||
|
class LoginType extends StatelessWidget {
|
||||||
|
static int loginType = 0;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return AppScaffold(
|
||||||
|
appBarTitle: TranslationBase.of(context).welcome,
|
||||||
|
isShowAppBar: true,
|
||||||
|
body: Padding(
|
||||||
|
padding: EdgeInsets.all(20),
|
||||||
|
child: Column(
|
||||||
|
children: <Widget>[
|
||||||
|
Expanded(
|
||||||
|
flex: 4,
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: <Widget>[
|
||||||
|
Image.asset(
|
||||||
|
'assets/images/habib-logo.png',
|
||||||
|
height: 80,
|
||||||
|
width: 80,
|
||||||
|
),
|
||||||
|
AppText(
|
||||||
|
TranslationBase.of(context).logintypeRadio,
|
||||||
|
fontSize: SizeConfig.textMultiplier * 3.5,
|
||||||
|
textAlign: TextAlign.left,
|
||||||
|
),
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: <Widget>[
|
||||||
|
Expanded(
|
||||||
|
child: InkWell(
|
||||||
|
onTap: () => {
|
||||||
|
LoginType.loginType = 1,
|
||||||
|
Navigator.of(context)
|
||||||
|
.pushNamed(LOGIN_PAGE)
|
||||||
|
},
|
||||||
|
child: RoundedContainer(
|
||||||
|
borderColor: Colors.grey,
|
||||||
|
showBorder: true,
|
||||||
|
child: Padding(
|
||||||
|
padding: EdgeInsets.fromLTRB(
|
||||||
|
20, 10, 20, 10),
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment.center,
|
||||||
|
children: <Widget>[
|
||||||
|
Image.asset(
|
||||||
|
'assets/images/id_card_icon.png',
|
||||||
|
height: SizeConfig
|
||||||
|
.imageSizeMultiplier *
|
||||||
|
12,
|
||||||
|
width: SizeConfig
|
||||||
|
.imageSizeMultiplier *
|
||||||
|
15,
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
height: 20,
|
||||||
|
),
|
||||||
|
AppText(
|
||||||
|
TranslationBase.of(context)
|
||||||
|
.nationalID,
|
||||||
|
fontSize:
|
||||||
|
SizeConfig.textMultiplier *
|
||||||
|
2,
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
)))),
|
||||||
|
Expanded(
|
||||||
|
child: InkWell(
|
||||||
|
onTap: () => {
|
||||||
|
LoginType.loginType = 2,
|
||||||
|
Navigator.of(context)
|
||||||
|
.pushNamed(LOGIN_PAGE)
|
||||||
|
},
|
||||||
|
child: RoundedContainer(
|
||||||
|
borderColor: Colors.grey,
|
||||||
|
showBorder: true,
|
||||||
|
child: Padding(
|
||||||
|
padding: EdgeInsets.fromLTRB(
|
||||||
|
25, 10, 25, 10),
|
||||||
|
child: Column(
|
||||||
|
children: <Widget>[
|
||||||
|
Image.asset(
|
||||||
|
'assets/images/my_file_white_icon.png',
|
||||||
|
height: SizeConfig
|
||||||
|
.imageSizeMultiplier *
|
||||||
|
12,
|
||||||
|
width: SizeConfig
|
||||||
|
.imageSizeMultiplier *
|
||||||
|
15,
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
height: 20,
|
||||||
|
),
|
||||||
|
AppText(
|
||||||
|
TranslationBase.of(context)
|
||||||
|
.fileNo,
|
||||||
|
fontSize:
|
||||||
|
SizeConfig.textMultiplier *
|
||||||
|
2,
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
))))
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Divider(
|
||||||
|
color: Colors.grey,
|
||||||
|
height: 2,
|
||||||
|
),
|
||||||
|
Center(
|
||||||
|
child: InkWell(
|
||||||
|
onTap: () => {
|
||||||
|
Navigator.of(context)
|
||||||
|
.pushNamed(FORGOT_PASSWORD)
|
||||||
|
},
|
||||||
|
child: AppText(
|
||||||
|
TranslationBase.of(context).forgotPassword,
|
||||||
|
fontSize: SizeConfig.textMultiplier * 3,
|
||||||
|
margin: 10,
|
||||||
|
underline: true)))
|
||||||
|
]),
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
flex: 2,
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.end,
|
||||||
|
children: <Widget>[
|
||||||
|
Row(
|
||||||
|
children: <Widget>[
|
||||||
|
Expanded(
|
||||||
|
child: RaisedButton(
|
||||||
|
color: Colors.grey,
|
||||||
|
textColor: Colors.white,
|
||||||
|
child:
|
||||||
|
Text(TranslationBase.of(context).registerNow),
|
||||||
|
onPressed: () => {
|
||||||
|
Navigator.of(context).pushNamed(
|
||||||
|
REGISTER,
|
||||||
|
)
|
||||||
|
},
|
||||||
|
))
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
))
|
||||||
|
],
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,163 @@
|
|||||||
|
import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
|
||||||
|
import 'package:diplomaticquarterapp/config/size_config.dart';
|
||||||
|
import 'package:diplomaticquarterapp/core/model/auth/check_paitent_authentication_req.dart';
|
||||||
|
import 'package:diplomaticquarterapp/core/service/client/base_app_client.dart';
|
||||||
|
import 'package:diplomaticquarterapp/pages/login/login-type.dart';
|
||||||
|
import 'package:diplomaticquarterapp/providers/auth_provider.dart';
|
||||||
|
import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
|
||||||
|
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
|
||||||
|
import 'package:diplomaticquarterapp/uitl/utils.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/buttons/button.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/card/rounded_container.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/input/text_field.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/mobile-no/mobile_no.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/text/app_texts_widget.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class Login extends StatefulWidget {
|
||||||
|
@override
|
||||||
|
_Login createState() => _Login();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _Login extends State<Login> {
|
||||||
|
final util = Utils();
|
||||||
|
final nationalIDorFile = TextEditingController();
|
||||||
|
final int loginType = LoginType.loginType;
|
||||||
|
String mobileNo;
|
||||||
|
String countryCode = '966';
|
||||||
|
bool isButtonDisabled = true;
|
||||||
|
final authService = new AuthProvider();
|
||||||
|
var sharedPref = new AppSharedPreferences();
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return AppScaffold(
|
||||||
|
appBarTitle: TranslationBase.of(context).login,
|
||||||
|
isShowAppBar: true,
|
||||||
|
body: SingleChildScrollView(
|
||||||
|
child: Container(
|
||||||
|
padding: EdgeInsets.only(top: 10, left: 20, right: 20),
|
||||||
|
height: SizeConfig.realScreenHeight * .8,
|
||||||
|
width: SizeConfig.realScreenWidth,
|
||||||
|
child: Column(children: <Widget>[
|
||||||
|
Expanded(
|
||||||
|
flex: 1,
|
||||||
|
child: AppText(
|
||||||
|
TranslationBase.of(context).enterNationalId,
|
||||||
|
fontSize: SizeConfig.textMultiplier * 3.5,
|
||||||
|
textAlign: TextAlign.left,
|
||||||
|
)),
|
||||||
|
Expanded(
|
||||||
|
flex: 2,
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||||
|
children: <Widget>[
|
||||||
|
MobileNo(
|
||||||
|
onNumberChange: (value) =>
|
||||||
|
{mobileNo = value, validateForm()},
|
||||||
|
onCountryChange: (value) => countryCode = value),
|
||||||
|
Container(
|
||||||
|
child: TextFields(
|
||||||
|
controller: nationalIDorFile,
|
||||||
|
onChanged: (value) => {validateForm()},
|
||||||
|
prefixIcon: Icon(
|
||||||
|
loginType == 1
|
||||||
|
? Icons.chrome_reader_mode
|
||||||
|
: Icons.receipt,
|
||||||
|
color: Colors.red),
|
||||||
|
padding: EdgeInsets.only(
|
||||||
|
top: 20, bottom: 20, left: 10, right: 10),
|
||||||
|
hintText: loginType == 1
|
||||||
|
? TranslationBase.of(context).nationalID
|
||||||
|
: TranslationBase.of(context).fileNo,
|
||||||
|
))
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
flex: 2,
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.end,
|
||||||
|
children: <Widget>[
|
||||||
|
Row(
|
||||||
|
children: <Widget>[
|
||||||
|
Expanded(
|
||||||
|
child: RaisedButton(
|
||||||
|
color: isButtonDisabled == true
|
||||||
|
? Colors.grey
|
||||||
|
: Colors.grey[600],
|
||||||
|
textColor: Colors.white,
|
||||||
|
child: Text(TranslationBase.of(context).login),
|
||||||
|
onPressed: () => {this.startLogin()},
|
||||||
|
))
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
))
|
||||||
|
]),
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
|
||||||
|
startLogin() {
|
||||||
|
if (isButtonDisabled == false) {
|
||||||
|
checkUserAuthentication();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void validateForm() {
|
||||||
|
if (validateIDBox(nationalIDorFile.text) == true &&
|
||||||
|
mobileNo != null &&
|
||||||
|
util.isSAUDIIDValid(nationalIDorFile.text) == true) {
|
||||||
|
setState(() {
|
||||||
|
isButtonDisabled = false;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
setState(() {
|
||||||
|
isButtonDisabled = true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool validateIDBox(String value) {
|
||||||
|
Pattern pattern = loginIDPattern(); //r'^\d+(?:\.\d+)?$';
|
||||||
|
|
||||||
|
RegExp regex = new RegExp(pattern);
|
||||||
|
return regex.hasMatch(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
String loginIDPattern() {
|
||||||
|
var length = loginType == 1 ? 10 : 7;
|
||||||
|
return "([0-9]{" + length.toString() + "})";
|
||||||
|
}
|
||||||
|
|
||||||
|
checkUserAuthentication() {
|
||||||
|
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);
|
||||||
|
authService.checkPatientAuthentication(request).then((value) => {
|
||||||
|
if (value.isSMSSent)
|
||||||
|
{
|
||||||
|
sharedPref.setString(LOGIN_TOKEN_ID, value.LogInTokenID),
|
||||||
|
sharedPref.setObject(REGISTER_DATA_FOR_LOGIIN, request),
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (value.IsAuthenticated) {this.checkActivationCode()}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
checkActivationCode() {}
|
||||||
|
}
|
||||||
@ -0,0 +1,139 @@
|
|||||||
|
import 'package:diplomaticquarterapp/config/size_config.dart';
|
||||||
|
import 'package:diplomaticquarterapp/pages/login/login-type.dart';
|
||||||
|
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/buttons/button.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/card/rounded_container.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/input/text_field.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/mobile-no/mobile_no.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/text/app_texts_widget.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class Register extends StatefulWidget {
|
||||||
|
@override
|
||||||
|
_Register createState() => _Register();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _Register extends State<Register> {
|
||||||
|
final TextEditingController nationalIDorFile = null;
|
||||||
|
final int loginType = LoginType.loginType;
|
||||||
|
final TextEditingController mobileNo = null;
|
||||||
|
var isHijri;
|
||||||
|
|
||||||
|
DateTime selectedDate;
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return AppScaffold(
|
||||||
|
appBarTitle: TranslationBase.of(context).login,
|
||||||
|
isShowAppBar: true,
|
||||||
|
body: SingleChildScrollView(
|
||||||
|
child: Container(
|
||||||
|
padding: EdgeInsets.only(top: 10, left: 20, right: 20),
|
||||||
|
height: SizeConfig.realScreenHeight * .8,
|
||||||
|
width: SizeConfig.realScreenWidth,
|
||||||
|
child: Column(children: <Widget>[
|
||||||
|
Expanded(
|
||||||
|
flex: 1,
|
||||||
|
child: AppText(
|
||||||
|
TranslationBase.of(context).enterNationalId,
|
||||||
|
fontSize: SizeConfig.textMultiplier * 3.5,
|
||||||
|
textAlign: TextAlign.left,
|
||||||
|
)),
|
||||||
|
Expanded(
|
||||||
|
flex: 4,
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||||
|
children: <Widget>[
|
||||||
|
MobileNo(controller: mobileNo),
|
||||||
|
Container(
|
||||||
|
child: TextFields(
|
||||||
|
controller: nationalIDorFile,
|
||||||
|
prefixIcon:
|
||||||
|
Icon(Icons.chrome_reader_mode, color: Colors.red),
|
||||||
|
padding: EdgeInsets.only(
|
||||||
|
top: 20, bottom: 20, left: 10, right: 10),
|
||||||
|
hintText: TranslationBase.of(context).nationalID,
|
||||||
|
)),
|
||||||
|
Row(
|
||||||
|
children: <Widget>[
|
||||||
|
Expanded(
|
||||||
|
child: Row(
|
||||||
|
children: <Widget>[
|
||||||
|
Radio(
|
||||||
|
value: 1,
|
||||||
|
groupValue: isHijri,
|
||||||
|
onChanged: (value) {
|
||||||
|
setState(() {
|
||||||
|
isHijri = value;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
Text(TranslationBase.of(context).hijriDate),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: Row(
|
||||||
|
children: <Widget>[
|
||||||
|
Radio(
|
||||||
|
value: 0,
|
||||||
|
groupValue: isHijri,
|
||||||
|
onChanged: (value) {
|
||||||
|
setState(() {
|
||||||
|
isHijri = value;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
Text(TranslationBase.of(context).gregorianDate),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Row(children: <Widget>[
|
||||||
|
Expanded(
|
||||||
|
child: RaisedButton.icon(
|
||||||
|
onPressed: () => {_selectDate(context)},
|
||||||
|
icon: Icon(Icons.date_range),
|
||||||
|
label: Text(selectedDate != null
|
||||||
|
? "${selectedDate.toLocal()}".split(' ')[0]
|
||||||
|
: TranslationBase.of(context).dob)))
|
||||||
|
])
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
flex: 2,
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.end,
|
||||||
|
children: <Widget>[
|
||||||
|
Row(
|
||||||
|
children: <Widget>[
|
||||||
|
Expanded(
|
||||||
|
child: RaisedButton(
|
||||||
|
color: Colors.grey,
|
||||||
|
textColor: Colors.white,
|
||||||
|
child: Text(TranslationBase.of(context).login),
|
||||||
|
onPressed: () => {},
|
||||||
|
))
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
))
|
||||||
|
]),
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<Null> _selectDate(BuildContext context) async {
|
||||||
|
final DateTime picked = await showDatePicker(
|
||||||
|
context: context,
|
||||||
|
initialDate: DateTime.now(),
|
||||||
|
firstDate: DateTime(2015, 8),
|
||||||
|
lastDate: DateTime(2101));
|
||||||
|
if (picked != null && picked != selectedDate)
|
||||||
|
setState(() {
|
||||||
|
selectedDate = picked;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,85 @@
|
|||||||
|
import 'package:diplomaticquarterapp/config/size_config.dart';
|
||||||
|
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/buttons/button.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:diplomaticquarterapp/routes.dart';
|
||||||
|
|
||||||
|
class WelcomeLogin extends StatelessWidget {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return AppScaffold(
|
||||||
|
appBarTitle: TranslationBase.of(context).welcome,
|
||||||
|
isShowAppBar: true,
|
||||||
|
body: Padding(
|
||||||
|
padding: EdgeInsets.all(20),
|
||||||
|
child: Column(
|
||||||
|
children: <Widget>[
|
||||||
|
Expanded(
|
||||||
|
flex: 3,
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: <Widget>[
|
||||||
|
Image.asset(
|
||||||
|
'assets/images/habib-logo.png',
|
||||||
|
height: 80,
|
||||||
|
width: 80,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
TranslationBase.of(context).welcome,
|
||||||
|
style: TextStyle(fontSize: 30),
|
||||||
|
textAlign: TextAlign.left,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
TranslationBase.of(context).welcomeText,
|
||||||
|
style: TextStyle(fontSize: 24),
|
||||||
|
textAlign: TextAlign.left,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
TranslationBase.of(context).welcomeText2,
|
||||||
|
style: TextStyle(fontSize: 24),
|
||||||
|
textAlign: TextAlign.left,
|
||||||
|
)
|
||||||
|
]),
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
flex: 2,
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.end,
|
||||||
|
children: <Widget>[
|
||||||
|
Row(
|
||||||
|
children: <Widget>[
|
||||||
|
Expanded(
|
||||||
|
child: RaisedButton(
|
||||||
|
color: Colors.red[900],
|
||||||
|
textColor: Colors.white,
|
||||||
|
child: Text(TranslationBase.of(context).yes),
|
||||||
|
onPressed: () => {
|
||||||
|
Navigator.of(context).pushNamed(
|
||||||
|
LOGIN_TYPE,
|
||||||
|
)
|
||||||
|
},
|
||||||
|
))
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Row(
|
||||||
|
children: <Widget>[
|
||||||
|
Expanded(
|
||||||
|
child: RaisedButton(
|
||||||
|
child: Text(TranslationBase.of(context).no),
|
||||||
|
onPressed: () => {
|
||||||
|
Navigator.of(context).pushNamed(
|
||||||
|
REGISTER,
|
||||||
|
)
|
||||||
|
},
|
||||||
|
))
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
))
|
||||||
|
],
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,124 @@
|
|||||||
|
import 'package:diplomaticquarterapp/config/config.dart';
|
||||||
|
import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
|
||||||
|
import 'package:diplomaticquarterapp/core/model/auth/check_paitent_authentication_req.dart';
|
||||||
|
import 'package:diplomaticquarterapp/core/model/auth/select_device_imei_res.dart';
|
||||||
|
import 'package:diplomaticquarterapp/core/service/client/base_app_client.dart';
|
||||||
|
import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
|
||||||
|
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
|
||||||
|
// SharedPreferences sharedPref = new SharedPreferences();
|
||||||
|
enum APP_STATUS { LOADING, UNAUTHENTICATED, AUTHENTICATED }
|
||||||
|
AppSharedPreferences sharedPref = new AppSharedPreferences();
|
||||||
|
|
||||||
|
const String INSERT_DEVICE_IMEI = '/Patients.svc/REST/Patient_INSERTDeviceIMEI';
|
||||||
|
const String SELECT_DEVICE_IMEI =
|
||||||
|
'/Patients.svc/REST/Patient_SELECTDeviceIMEIbyIMEI';
|
||||||
|
const String CHECK_PATIENT_AUTH =
|
||||||
|
'/Authentication.svc/REST/CheckPatientAuthentication';
|
||||||
|
|
||||||
|
class AuthProvider with ChangeNotifier {
|
||||||
|
bool isLogin = false;
|
||||||
|
bool isLoading = true;
|
||||||
|
AuthProvider() {
|
||||||
|
getUserAuthentication();
|
||||||
|
}
|
||||||
|
|
||||||
|
void getUserAuthentication() async {
|
||||||
|
Map profile = await sharedPref.getObject(USER_PROFILE);
|
||||||
|
if (profile != null) {
|
||||||
|
isLoading = false;
|
||||||
|
isLogin = true;
|
||||||
|
} else {
|
||||||
|
isLoading = false;
|
||||||
|
isLogin = false;
|
||||||
|
}
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
|
||||||
|
APP_STATUS get stutas {
|
||||||
|
if (isLoading) {
|
||||||
|
return APP_STATUS.LOADING;
|
||||||
|
} else {
|
||||||
|
if (this.isLogin) {
|
||||||
|
return APP_STATUS.AUTHENTICATED;
|
||||||
|
} else {
|
||||||
|
return APP_STATUS.UNAUTHENTICATED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Future<dynamic> login(UserModel userInfo) async {
|
||||||
|
// try {
|
||||||
|
// dynamic localRes;
|
||||||
|
|
||||||
|
// await BaseAppClient.post(LOGIN_URL,
|
||||||
|
// onSuccess: (dynamic response, int statusCode) {
|
||||||
|
// localRes = response;
|
||||||
|
// }, onFailure: (String error, int statusCode) {
|
||||||
|
// throw error;
|
||||||
|
// }, body: userInfo.toJson());
|
||||||
|
|
||||||
|
// return Future.value(localRes);
|
||||||
|
// } catch (error) {
|
||||||
|
// print(error);
|
||||||
|
// throw error;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
Future<dynamic> insertDeviceImei(imei) async {
|
||||||
|
try {
|
||||||
|
dynamic localRes;
|
||||||
|
|
||||||
|
await new BaseAppClient().post(INSERT_DEVICE_IMEI,
|
||||||
|
onSuccess: (dynamic response, int statusCode) {
|
||||||
|
localRes = response;
|
||||||
|
}, onFailure: (String error, int statusCode) {
|
||||||
|
throw error;
|
||||||
|
}, body: imei);
|
||||||
|
return Future.value(localRes);
|
||||||
|
} catch (error) {
|
||||||
|
print(error);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<SelectDeviceIMEIRES> selectDeviceImei(imei) async {
|
||||||
|
try {
|
||||||
|
dynamic localRes;
|
||||||
|
await new BaseAppClient().post(SELECT_DEVICE_IMEI,
|
||||||
|
onSuccess: (dynamic response, int statusCode) {
|
||||||
|
localRes = response;
|
||||||
|
}, onFailure: (String error, int statusCode) {
|
||||||
|
throw error;
|
||||||
|
}, body: imei);
|
||||||
|
return Future.value(localRes);
|
||||||
|
} catch (error) {
|
||||||
|
print(error);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<dynamic> checkPatientAuthentication(
|
||||||
|
CheckPatientAuthenticationReq request) async {
|
||||||
|
request.versionID = VERSION_ID;
|
||||||
|
request.channel = CHANNEL;
|
||||||
|
request.iPAdress = IP_ADDRESS;
|
||||||
|
request.generalid = GENERAL_ID;
|
||||||
|
request.languageID = 2;
|
||||||
|
request.patientOutSA = request.zipCode == '966' ? 0 : 1;
|
||||||
|
try {
|
||||||
|
dynamic localRes;
|
||||||
|
await new BaseAppClient().post(CHECK_PATIENT_AUTH,
|
||||||
|
onSuccess: (dynamic response, int statusCode) {
|
||||||
|
localRes = response;
|
||||||
|
}, onFailure: (String error, int statusCode) {
|
||||||
|
throw error;
|
||||||
|
}, body: request.toJson());
|
||||||
|
return Future.value(localRes);
|
||||||
|
} catch (error) {
|
||||||
|
print(error);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
import 'package:diplomaticquarterapp/pages/landing/landing_page.dart';
|
||||||
|
import 'package:diplomaticquarterapp/pages/login/forgot-password.dart';
|
||||||
|
import 'package:diplomaticquarterapp/pages/login/welcome.dart';
|
||||||
|
import 'package:diplomaticquarterapp/pages/login/login-type.dart';
|
||||||
|
import 'package:diplomaticquarterapp/pages/login/login.dart';
|
||||||
|
import 'package:diplomaticquarterapp/pages/login/register.dart';
|
||||||
|
|
||||||
|
const String INIT_ROUTE = '/';
|
||||||
|
const String ROOT = 'root';
|
||||||
|
const String HOME = '/';
|
||||||
|
const String LOGIN = 'login';
|
||||||
|
const String WELCOME_LOGIN = 'welcome-login';
|
||||||
|
const String LOGIN_TYPE = 'login-type';
|
||||||
|
const String LOGIN_PAGE = 'login-page';
|
||||||
|
const String FORGOT_PASSWORD = 'forgot-password';
|
||||||
|
const String REGISTER = 'register';
|
||||||
|
var routes = {
|
||||||
|
// ROOT: (_) => RootPage(),
|
||||||
|
HOME: (_) => LandingPage(),
|
||||||
|
WELCOME_LOGIN: (_) => WelcomeLogin(),
|
||||||
|
LOGIN_TYPE: (_) => LoginType(),
|
||||||
|
LOGIN_PAGE: (_) => Login(),
|
||||||
|
FORGOT_PASSWORD: (_) => ForgotPassword(),
|
||||||
|
REGISTER: (_) => Register()
|
||||||
|
};
|
||||||
@ -0,0 +1,88 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
// OWNER : Ibrahim albitar
|
||||||
|
// DATE : 05-04-2020
|
||||||
|
// DESCRIPTION : Custom widget for rounded container and custom decoration
|
||||||
|
|
||||||
|
class RoundedContainer extends StatefulWidget {
|
||||||
|
final double width;
|
||||||
|
final double height;
|
||||||
|
final double raduis;
|
||||||
|
final Color backgroundColor;
|
||||||
|
final double margin;
|
||||||
|
final double elevation;
|
||||||
|
final bool showBorder;
|
||||||
|
final Color borderColor;
|
||||||
|
final bool customCornerRaduis;
|
||||||
|
final double topLeft;
|
||||||
|
final double bottomRight;
|
||||||
|
final double topRight;
|
||||||
|
final double bottomLeft;
|
||||||
|
final Widget child;
|
||||||
|
final double borderWidth;
|
||||||
|
|
||||||
|
RoundedContainer(
|
||||||
|
{@required this.child,
|
||||||
|
this.width,
|
||||||
|
this.height,
|
||||||
|
this.raduis = 10,
|
||||||
|
this.backgroundColor = Colors.white,
|
||||||
|
this.margin = 10,
|
||||||
|
this.elevation = 1,
|
||||||
|
this.showBorder = false,
|
||||||
|
this.borderColor = Colors.red,
|
||||||
|
this.customCornerRaduis = false,
|
||||||
|
this.topLeft = 0,
|
||||||
|
this.topRight = 0,
|
||||||
|
this.bottomRight = 0,
|
||||||
|
this.bottomLeft = 0,
|
||||||
|
this.borderWidth = 1});
|
||||||
|
|
||||||
|
@override
|
||||||
|
_RoundedContainerState createState() => _RoundedContainerState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _RoundedContainerState extends State<RoundedContainer> {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Container(
|
||||||
|
width: widget.width,
|
||||||
|
height: widget.height,
|
||||||
|
margin: EdgeInsets.all(widget.margin),
|
||||||
|
decoration: widget.showBorder == true
|
||||||
|
? BoxDecoration(
|
||||||
|
color: Theme.of(context).primaryColor,
|
||||||
|
border: Border.all(
|
||||||
|
color: widget.borderColor, width: widget.borderWidth),
|
||||||
|
borderRadius: widget.customCornerRaduis
|
||||||
|
? BorderRadius.only(
|
||||||
|
topLeft: Radius.circular(widget.topLeft),
|
||||||
|
topRight: Radius.circular(widget.topRight),
|
||||||
|
bottomRight: Radius.circular(widget.bottomRight),
|
||||||
|
bottomLeft: Radius.circular(widget.bottomLeft))
|
||||||
|
: BorderRadius.circular(widget.raduis),
|
||||||
|
boxShadow: [
|
||||||
|
BoxShadow(
|
||||||
|
color: Colors.grey.withOpacity(0.1),
|
||||||
|
spreadRadius: 10,
|
||||||
|
blurRadius: 5,
|
||||||
|
offset: Offset(0, 5), // changes position of shadow
|
||||||
|
),
|
||||||
|
])
|
||||||
|
: null,
|
||||||
|
child: Card(
|
||||||
|
margin: EdgeInsets.all(0),
|
||||||
|
shape: RoundedRectangleBorder(
|
||||||
|
borderRadius: widget.customCornerRaduis
|
||||||
|
? BorderRadius.only(
|
||||||
|
topLeft: Radius.circular(widget.topLeft),
|
||||||
|
topRight: Radius.circular(widget.topRight),
|
||||||
|
bottomRight: Radius.circular(widget.bottomRight),
|
||||||
|
bottomLeft: Radius.circular(widget.bottomLeft))
|
||||||
|
: BorderRadius.circular(widget.raduis),
|
||||||
|
),
|
||||||
|
color: widget.backgroundColor,
|
||||||
|
child: widget.child,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,125 @@
|
|||||||
|
import 'package:diplomaticquarterapp/config/size_config.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
// OWNER : Ibrahim albitar
|
||||||
|
// DATE : 12-04-2020
|
||||||
|
// DESCRIPTION : Customization for Texts in app
|
||||||
|
|
||||||
|
class MobileNo extends StatefulWidget {
|
||||||
|
final bool disabled;
|
||||||
|
// final String data;
|
||||||
|
final List<Countries> countries = [
|
||||||
|
new Countries(name: 'Saudi Arabia', code: '966'),
|
||||||
|
new Countries(name: 'Dubai', code: '971'),
|
||||||
|
];
|
||||||
|
final double margin;
|
||||||
|
final double marginTop;
|
||||||
|
final double marginRight;
|
||||||
|
final double marginBottom;
|
||||||
|
final double marginLeft;
|
||||||
|
final TextEditingController controller;
|
||||||
|
final Function onNumberChange;
|
||||||
|
final Function onCountryChange;
|
||||||
|
MobileNo(
|
||||||
|
{this.disabled = false,
|
||||||
|
this.marginTop = 0,
|
||||||
|
this.marginRight = 0,
|
||||||
|
this.marginBottom = 0,
|
||||||
|
this.controller,
|
||||||
|
this.marginLeft = 0,
|
||||||
|
this.onNumberChange,
|
||||||
|
this.onCountryChange,
|
||||||
|
this.margin = 0});
|
||||||
|
|
||||||
|
@override
|
||||||
|
_MobileNo createState() => _MobileNo();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _MobileNo extends State<MobileNo> {
|
||||||
|
var _selectedType = '966';
|
||||||
|
String countryCode = '966';
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Visibility(
|
||||||
|
child: Column(children: <Widget>[
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: <Widget>[
|
||||||
|
Expanded(
|
||||||
|
// add Expanded to have your dropdown button fill remaining space
|
||||||
|
child: Padding(
|
||||||
|
padding: EdgeInsets.all(10),
|
||||||
|
child: DropdownButtonHideUnderline(
|
||||||
|
child: DropdownButton(
|
||||||
|
isExpanded: true,
|
||||||
|
value: _selectedType,
|
||||||
|
iconSize: 40,
|
||||||
|
elevation: 16,
|
||||||
|
onChanged: (value) => {
|
||||||
|
widget.onCountryChange(value),
|
||||||
|
setState(() {
|
||||||
|
countryCode = value;
|
||||||
|
_selectedType = value;
|
||||||
|
})
|
||||||
|
},
|
||||||
|
items: widget.countries
|
||||||
|
.map<DropdownMenuItem<String>>((Countries value) {
|
||||||
|
return DropdownMenuItem<String>(
|
||||||
|
value: value.code,
|
||||||
|
child: Text(value.name),
|
||||||
|
);
|
||||||
|
}).toList())))),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
padding: EdgeInsets.all(5),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
border: Border.all(color: Colors.grey),
|
||||||
|
borderRadius: BorderRadius.circular(10)),
|
||||||
|
child: Row(children: <Widget>[
|
||||||
|
Expanded(
|
||||||
|
flex: 1,
|
||||||
|
child: Icon(
|
||||||
|
Icons.phone,
|
||||||
|
color: Colors.red,
|
||||||
|
)),
|
||||||
|
Expanded(
|
||||||
|
flex: 1,
|
||||||
|
child: Text(
|
||||||
|
countryCode,
|
||||||
|
overflow: TextOverflow.clip,
|
||||||
|
)),
|
||||||
|
Expanded(
|
||||||
|
flex: 4,
|
||||||
|
child: Container(
|
||||||
|
margin: widget.margin != null
|
||||||
|
? EdgeInsets.all(widget.margin)
|
||||||
|
: EdgeInsets.only(
|
||||||
|
top: widget.marginTop,
|
||||||
|
right: widget.marginRight,
|
||||||
|
bottom: widget.marginBottom,
|
||||||
|
left: widget.marginLeft),
|
||||||
|
child: TextField(
|
||||||
|
controller: widget.controller,
|
||||||
|
keyboardType: TextInputType.phone,
|
||||||
|
// onChanged: (value) {
|
||||||
|
// widget.controller.text = countryCode;
|
||||||
|
// },
|
||||||
|
onChanged: (value) => widget.onNumberChange(value),
|
||||||
|
decoration: InputDecoration(
|
||||||
|
border: InputBorder.none, hintText: '5xxxxxxxx'),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
]),
|
||||||
|
)
|
||||||
|
]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Countries {
|
||||||
|
final String name;
|
||||||
|
final String code;
|
||||||
|
Countries({this.name, this.code});
|
||||||
|
}
|
||||||
@ -0,0 +1,74 @@
|
|||||||
|
import 'package:diplomaticquarterapp/config/size_config.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
// OWNER : Ibrahim albitar
|
||||||
|
// DATE : 12-04-2020
|
||||||
|
// DESCRIPTION : Customization for Texts in app
|
||||||
|
|
||||||
|
class AppText extends StatefulWidget {
|
||||||
|
final String data;
|
||||||
|
final Color color;
|
||||||
|
final FontWeight fontWeight;
|
||||||
|
final double fontSize;
|
||||||
|
final String fontFamily;
|
||||||
|
final double margin;
|
||||||
|
final double marginTop;
|
||||||
|
final double marginRight;
|
||||||
|
final double marginBottom;
|
||||||
|
final double marginLeft;
|
||||||
|
final bool visibility;
|
||||||
|
final TextAlign textAlign;
|
||||||
|
final Color backGroundcolor;
|
||||||
|
final bool underline;
|
||||||
|
AppText(this.data,
|
||||||
|
{this.color = Colors.black,
|
||||||
|
this.fontWeight = FontWeight.normal,
|
||||||
|
this.fontSize,
|
||||||
|
this.fontFamily = 'WorkSans',
|
||||||
|
this.margin,
|
||||||
|
this.marginTop = 0,
|
||||||
|
this.marginRight = 0,
|
||||||
|
this.marginBottom = 0,
|
||||||
|
this.marginLeft = 0,
|
||||||
|
this.visibility = true,
|
||||||
|
this.textAlign,
|
||||||
|
this.underline = false,
|
||||||
|
this.backGroundcolor = Colors.white});
|
||||||
|
|
||||||
|
@override
|
||||||
|
_AppTextState createState() => _AppTextState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _AppTextState extends State<AppText> {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Visibility(
|
||||||
|
visible: widget.visibility,
|
||||||
|
child: Container(
|
||||||
|
margin: widget.margin != null
|
||||||
|
? EdgeInsets.all(widget.margin)
|
||||||
|
: EdgeInsets.only(
|
||||||
|
top: widget.marginTop,
|
||||||
|
right: widget.marginRight,
|
||||||
|
bottom: widget.marginBottom,
|
||||||
|
left: widget.marginLeft),
|
||||||
|
child: Text(
|
||||||
|
widget.data,
|
||||||
|
textAlign: widget.textAlign,
|
||||||
|
overflow: TextOverflow.clip,
|
||||||
|
style: TextStyle(
|
||||||
|
color: widget.color,
|
||||||
|
fontWeight: widget.fontWeight,
|
||||||
|
fontSize: widget.fontSize ?? (SizeConfig.textMultiplier * 2),
|
||||||
|
fontFamily: widget.fontFamily,
|
||||||
|
decoration: widget.underline == true
|
||||||
|
? TextDecoration.underline
|
||||||
|
: TextDecoration.none
|
||||||
|
// backgroundColor:widget.backGroundcolor
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue