Merge branch 'sultan_merge' into 'master'

Sultan merge

See merge request Cloud_Solution/diplomatic-quarter!5
merge-requests/6/merge
Mohammad Aljammal 4 years ago
commit bbb6dcd913

@ -23,6 +23,7 @@ if (flutterVersionName == null) {
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'com.google.gms.google-services'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
android {
@ -60,4 +61,5 @@ flutter {
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation "com.google.firebase:firebase-messaging:20.1.0"
}

@ -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"
}

@ -33,15 +33,22 @@
android:name="io.flutter.embedding.android.SplashScreenDrawable"
android:resource="@drawable/launch_background"
/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<intent-filter>
<action android:name="FLUTTER_NOTIFICATION_CLICK" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data
android:name="flutterEmbedding"
android:value="2" />
</application>
<uses-permission android:name="android.permission.INTERNET" />
</manifest>

@ -8,6 +8,7 @@ buildscript {
dependencies {
classpath 'com.android.tools.build:gradle:3.5.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'com.google.gms:google-services:4.3.2'
}
}

@ -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,11 +1,12 @@
import 'dart:io';
import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
import 'package:diplomaticquarterapp/models/Request.dart';
import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
import 'dart:io';
const MAX_SMALL_SCREEN = 660;
const BASE_URL = 'https://uat.hmgwebservices.com/Services';
const BASE_URL = 'https://hmgwebservices.com/Services';
const GET_PROJECT = '/Lists.svc/REST/GetProject';
//const BASE_URL = 'https://hmgwebservices.com/'; // Production Environment
@ -18,7 +19,6 @@ const GET_CLINICS_LIST_URL = "Services/lists.svc/REST/GetClinicCentralized";
//URL to get doctors list
const GET_DOCTORS_LIST_URL = "Services/Doctors.svc/REST/SearchDoctorsByTime";
class AppGlobal {
static var context;
AppSharedPreferences sharedPref = AppSharedPreferences();
@ -39,3 +39,8 @@ class AppGlobal {
}
}
const CHANNEL = 3;
const GENERAL_ID = 'Cs2020@2016\$2958';
const IP_ADDRESS = '10.20.10.20';
const VERSION_ID = 5.5;

@ -42,4 +42,41 @@ const Map<String, Map<String, String>> localizedValues = {
'appoActions': {'en': 'Appointment Actions', 'ar': 'إجراءات الموعد'},
'login': {'en': 'Login', 'ar': 'تسجيل الدخول'},
'loginregister': {'en': 'Login / Register', 'ar': 'دخولتسجيل'},
'welcome': {'en': 'Welcome', 'ar': 'أهلا بك'},
'welcome_text': {
'en': 'Dr. Sulaiman Al Habib Mobile Application ',
'ar': 'الدكتور سليمان الحبيب لتطبيقات الهاتف المتحرك'
},
'welcome_text2': {
'en': 'Have you visited AlHabib Medical Group before? ',
'ar': 'الدكتور سليمان الحبيب لتطبيقات الهاتف المتحرك'
},
'yes': {'en': 'Yes', 'ar': 'نعم'},
'no': {'en': 'No', 'ar': 'لا'},
"logintyperadio": {
"en": "Choose from below options to login to your medical file.",
"ar": "اختر من الخيارات أدناه لتسجيل الدخول إلى ملفك الطبي."
},
"registernow": {"en": "Register Now", "ar": "تسجيل الان"},
"nationalID": {"en": "National ID", "ar": "رقم الهوية"},
"fileNo": {"en": "File Number", "ar": "رقم الملف"},
"forgotFileNo": {"en": "Forgot file Number?", "ar": "نسيت رقم الملف الطبي؟"},
"enter-national-id": {
"en": "Please enter mobile number and national ID / Iqama",
"ar": "الرجاء إدخال رقم الجوال والهوية الوطنية / الاقامة"
},
"profile-info": {
"en": "Please enter profile information",
"ar": "الرجاء إدخال معلومات الملف الشخصي"
},
"submit": {"en": "Submit", "ar": "ارسال"},
"forgot-desc": {
"en": "Enter the mobile number to receive the Medical file Number via SMS",
"ar": "أدخل رقم الجوال المسجل لاستلام رقم الملف عن طريق الرسائل النصية"
},
"dob": {"en": "Birth Date:", "ar": "تاريخ الميلاد"},
"hijri-date": {"en": "Hijri Date", "ar": "التاريخ الهجري"},
"gregorian-date": {"en": "Gregorian Date", "ar": "التاريخ الميلادي"},
};

@ -1,3 +1,7 @@
const TOKEN = 'token';
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;
}
}

@ -14,7 +14,7 @@ AppSharedPreferences sharedPref = new AppSharedPreferences();
/// body: null);
class BaseAppClient {
post(
post(
String endPoint, {
Map<String, dynamic> body,
Function(dynamic response, int statusCode) onSuccess,
@ -22,7 +22,6 @@ class BaseAppClient {
}) async {
String url = BASE_URL + endPoint;
try {
//Map profile = await sharedPref.getObj(DOCTOR_PROFILE);
// String token = await sharedPref.getString(TOKEN);

@ -1,3 +1,4 @@
import 'package:diplomaticquarterapp/routes.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
@ -71,8 +72,8 @@ class MyApp extends StatelessWidget {
),
),
),
initialRoute: '/',
routes: {'/': (context) => LandingPage()},
initialRoute: HOME,
routes: routes,
debugShowCheckedModeBanner: false,
),
),

@ -1,12 +1,14 @@
import 'package:diplomaticquarterapp/pages/BookAppointment/BookingOptions.dart';
import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
import 'package:diplomaticquarterapp/core/model/auth/select_device_imei_res.dart';
import 'package:diplomaticquarterapp/pages/ToDoList/ToDo.dart';
import 'package:diplomaticquarterapp/pages/landing/replay_page.dart';
import 'package:diplomaticquarterapp/providers/auth_provider.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/widgets/bottom_navigation/bottom_nav_bar.dart';
import 'package:diplomaticquarterapp/widgets/drawer/app_drawer_widget.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'home_page.dart';
class LandingPage extends StatefulWidget {
@ -17,7 +19,8 @@ class LandingPage extends StatefulWidget {
class _LandingPageState extends State<LandingPage> {
int currentTab = 0;
PageController pageController;
final FirebaseMessaging _firebaseMessaging = FirebaseMessaging();
final authService = new AuthProvider();
_changeCurrentTab(int tab) {
setState(() {
currentTab = tab;
@ -29,6 +32,14 @@ class _LandingPageState extends State<LandingPage> {
void initState() {
super.initState();
pageController = PageController(keepPage: true);
_firebaseMessaging.getToken().then((String token) {
sharedPref.setString(PUSH_TOKEN, token);
if (token != null) {
checkUserStatus(token);
}
//assert(token != null);
});
}
@override
@ -36,6 +47,7 @@ class _LandingPageState extends State<LandingPage> {
return Scaffold(
appBar: AppBar(
elevation: 0,
backgroundColor: Colors.grey,
textTheme: TextTheme(
headline6:
TextStyle(color: Colors.white, fontWeight: FontWeight.bold),
@ -77,4 +89,10 @@ class _LandingPageState extends State<LandingPage> {
return TranslationBase.of(context).bookAppo;
}
}
void checkUserStatus(token) {
authService
.selectDeviceImei(token)
.then((SelectDeviceIMEIRES value) => print(value));
}
}

@ -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()
};

@ -95,6 +95,33 @@ class TranslationBase {
String get appoActions => localizedValues['appoActions'][locale.languageCode];
String get appointment => localizedValues['appointment'][locale.languageCode];
String get login => localizedValues['login'][locale.languageCode];
String get loginregister =>
localizedValues['loginregister'][locale.languageCode];
String get welcome => localizedValues['welcome'][locale.languageCode];
String get welcomeText =>
localizedValues['welcome_text'][locale.languageCode];
String get welcomeText2 =>
localizedValues['welcome_text2'][locale.languageCode];
String get yes => localizedValues['yes'][locale.languageCode];
String get no => localizedValues['no'][locale.languageCode];
String get logintypeRadio =>
localizedValues['logintyperadio'][locale.languageCode];
String get registerNow => localizedValues['registernow'][locale.languageCode];
String get nationalID => localizedValues['nationalID'][locale.languageCode];
String get fileNo => localizedValues['fileNo'][locale.languageCode];
String get forgotPassword =>
localizedValues['forgotFileNo'][locale.languageCode];
String get enterNationalId =>
localizedValues['enter-national-id'][locale.languageCode];
String get profileInfo =>
localizedValues['profile-info'][locale.languageCode];
String get submit => localizedValues['submit'][locale.languageCode];
String get forgotDesc => localizedValues['forgot-desc'][locale.languageCode];
String get dob => localizedValues['dob'][locale.languageCode];
String get hijriDate => localizedValues['hijri-date'][locale.languageCode];
String get gregorianDate =>
localizedValues['gregorian-date'][locale.languageCode];
}
class TranslationBaseDelegate extends LocalizationsDelegate<TranslationBase> {

@ -42,4 +42,42 @@ class Utils {
static hideKeyboard(BuildContext context) {
FocusScope.of(context).unfocus();
}
bool isSAUDIIDValid(String id) {
if (id == null) {
return false;
}
try {
id = id.toString();
id = id.trim();
var returnValue = int.parse(id);
var sum = 0;
if (returnValue > 0) {
var type = int.parse(id[0]);
if (id.length != 10) {
return false;
}
if (type != 2 && type != 1) {
return false;
}
for (var i = 0; i < 10; i++) {
if (i % 2 == 0) {
var a = id[i];
var x = int.parse(a) * 2;
var b = x.toString();
if (b.length == 1) {
b = "0" + b;
}
sum += int.parse(b[0]) + int.parse(b[1]);
} else {
sum += int.parse(id[i]);
}
}
return sum % 10 == 0;
}
} catch (err) {}
return false;
}
}

@ -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,
));
}
}

@ -1,3 +1,4 @@
import 'package:diplomaticquarterapp/routes.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/widgets/data_display/list/flexible_container.dart';
import 'package:diplomaticquarterapp/widgets/data_display/text.dart';
@ -6,8 +7,6 @@ import 'package:flutter/material.dart';
import '../../config/size_config.dart';
import 'drawer_item_widget.dart';
class AppDrawer extends StatefulWidget {
@override
_AppDrawerState createState() => _AppDrawerState();
@ -32,11 +31,11 @@ class _AppDrawerState extends State<AppDrawer> {
child: InkWell(
child: DrawerHeader(
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Container(
child: Image.asset('assets/images/logo.png'),
margin: EdgeInsets.only(top: 10, bottom: 15),
margin: EdgeInsets.all(20),
),
SizedBox(
height: 1,
@ -45,36 +44,18 @@ class _AppDrawerState extends State<AppDrawer> {
),
),
SizedBox(height: 15),
CircleAvatar(
radius: SizeConfig.imageSizeMultiplier * 12,
backgroundColor: Colors.white,
//TODO add backgroundImage: NetworkImage(''),
),
Padding(
padding: EdgeInsets.only(top: 10),
child: Texts(
'Patient',
color: Colors.black,
fontSize: SizeConfig.textMultiplier * 2,
)),
Texts("Director of medical records",
//TODO: Make The Dr Title Dynamic and check overflow issue.
color: Colors.black87),
RaisedButton(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(18.0),
side: BorderSide(color: Colors.red),
),
child: Texts(
TranslationBase.of(context).logout,
color: Colors.white,
),
onPressed: () async {
Navigator.pop(context);
//TODO add await helpers.logout();
},
),
// CircleAvatar(
// radius: SizeConfig.imageSizeMultiplier * 12,
// backgroundColor: Colors.white,
// //TODO add backgroundImage: NetworkImage(''),
// ),
// Padding(
// padding: EdgeInsets.only(top: 10),
// child: Texts(
// 'Patient',
// color: Colors.black,
// fontSize: SizeConfig.textMultiplier * 2,
// )),
],
),
),
@ -85,10 +66,12 @@ class _AppDrawerState extends State<AppDrawer> {
),
InkWell(
child: DrawerItem(
TranslationBase.of(context).settings, Icons.settings),
TranslationBase.of(context).loginregister,
Icons.lock),
onTap: () {
Navigator.pop(context);
//TODO add fun
Navigator.of(context).pushNamed(
WELCOME_LOGIN,
);
},
),
],

@ -25,7 +25,7 @@ class _DrawerItemState extends State<DrawerItem> {
@override
Widget build(BuildContext context) {
return Container(
margin: EdgeInsets.only(top: 5, bottom: 5, left: 10, right: 10),
margin: EdgeInsets.only(top: 5, bottom: 15, left: 10, right: 10),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
@ -34,21 +34,26 @@ class _DrawerItemState extends State<DrawerItem> {
color: widget.iconColor,
size: SizeConfig.imageSizeMultiplier * 5,
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Texts(
widget.title,
color: widget.textColor,
fontSize: SizeConfig.textMultiplier * 2.3,
),
Texts(
widget.subTitle,
color: widget.textColor,
fontSize: SizeConfig.textMultiplier * 2.5,
),
],
),
Padding(
padding: widget.subTitle == ''
? EdgeInsets.only(top: 20)
: EdgeInsets.only(top: 0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Texts(
widget.title,
color: widget.textColor,
fontSize: SizeConfig.textMultiplier * 2.3,
),
Texts(
widget.subTitle,
color: widget.textColor,
fontSize: SizeConfig.textMultiplier * 2.5,
),
],
),
)
],
),
);

@ -46,7 +46,7 @@ class TextFields extends StatefulWidget {
this.suffixIcon,
this.autoFocus,
this.onChanged,
this.initialValue,
// this.initialValue,
this.minLines,
this.maxLines,
this.inputFormatters,
@ -68,18 +68,20 @@ class TextFields extends StatefulWidget {
this.maxLength,
this.prefixIcon,
this.bare = false,
this.onTap,
this.fontSize = 16.0,
this.fontWeight = FontWeight.w700,
this.autoValidate = false})
: super(key: key);
final String hintText;
final String initialValue;
// final String initialValue;
final String type;
final bool autoFocus;
final IconData suffixIcon;
final Color suffixIconColor;
final IconData prefixIcon;
final Icon prefixIcon;
final VoidCallback onTap;
final TextEditingController controller;
final TextInputType keyboardType;
final FormFieldValidator validator;
@ -196,6 +198,10 @@ class _TextFieldsState extends State<TextFields> {
decoration: widget.bare
? null
: BoxDecoration(boxShadow: [
// BoxShadow(
// color: Color.fromRGBO(70, 68, 167, focus ? 0.20 : 0),
// offset: Offset(0.0, 13.0),
// blurRadius: focus ? 34.0 : 12.0)
BoxShadow(
color: Color.fromRGBO(110, 68, 80, focus ? 0.20 : 0),
offset: Offset(0.0, 13.0),
@ -217,7 +223,7 @@ class _TextFieldsState extends State<TextFields> {
minLines: widget.minLines ?? 1,
maxLines: widget.maxLines ?? 1,
maxLengthEnforced: widget.maxLengthEnforced,
initialValue: widget.initialValue,
// initialValue: widget.initialValue,
onChanged: widget.onChanged,
focusNode: _focusNode,
maxLength: widget.maxLength ?? null,
@ -255,19 +261,7 @@ class _TextFieldsState extends State<TextFields> {
? Colors.transparent
: Theme.of(context).backgroundColor,
suffixIcon: _buildSuffixIcon(),
prefixIcon: widget.type != "search"
? widget.prefixIcon != null
? Padding(
padding: EdgeInsets.only(
left: 28.0, top: 14.0, bottom: 14.0, right: 0),
child: Text(
"\$",
style: TextStyle(
fontSize: 14, fontWeight: FontWeight.w800),
),
)
: null
: Icon(EvaIcons.search, size: 20.0, color: Colors.grey[500]),
prefixIcon: widget.prefixIcon,
errorStyle: TextStyle(
fontSize: 14.0,
fontWeight: widget.fontWeight,
@ -277,35 +271,23 @@ class _TextFieldsState extends State<TextFields> {
color: Theme.of(context)
.errorColor
.withOpacity(widget.bare ? 0.0 : 0.5),
width: 2.0),
width: 1.0),
borderRadius: BorderRadius.circular(widget.bare ? 0.0 : 8.0)),
focusedErrorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: Theme.of(context)
.errorColor
.withOpacity(widget.bare ? 0.0 : 0.5),
width: 2.0),
width: 1.0),
borderRadius: BorderRadius.circular(widget.bare ? 0.0 : 8.0)),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
color: Theme.of(context)
.dividerColor
.withOpacity(widget.bare ? 0.0 : 1.0),
width: 2.0),
borderSide: BorderSide(color: Colors.grey, width: 1.0),
borderRadius: BorderRadius.circular(widget.bare ? 0.0 : 8.0)),
disabledBorder: OutlineInputBorder(
borderSide: BorderSide(
color: Theme.of(context)
.dividerColor
.withOpacity(widget.bare ? 0.0 : 1.0),
width: 2.0),
borderSide: BorderSide(color: Colors.grey, width: 1.0),
borderRadius: BorderRadius.circular(widget.bare ? 0.0 : 8.0)),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(
color: Theme.of(context)
.dividerColor
.withOpacity(widget.bare ? 0.0 : 1.0),
width: 2.0),
borderSide: BorderSide(color: Colors.grey, width: 1.0),
borderRadius: BorderRadius.circular(widget.bare ? 0.0 : 8.0),
),
),

@ -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});
}

@ -1,4 +1,7 @@
import 'package:diplomaticquarterapp/config/config.dart';
import 'package:diplomaticquarterapp/widgets/data_display/text.dart';
import '../progress_indicator/app_loader_widget.dart';
import 'arrow_back.dart';
import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart';
import 'package:diplomaticquarterapp/widgets/progress_indicator/app_loader_widget.dart';
import 'package:flutter/material.dart';

@ -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
),
),
),
);
}
}

@ -38,7 +38,8 @@ dependencies:
url_launcher: ^5.5.0
shared_preferences: ^0.5.8
flutter_flexible_toast: ^0.1.4
firebase_messaging: ^6.0.16
# Progress bar
progress_hud_v2: ^2.0.0
percent_indicator: ^2.1.5

Loading…
Cancel
Save