diff --git a/android/app/build.gradle b/android/app/build.gradle index 54ea9373..06128dc0 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -7,9 +7,9 @@ if (localPropertiesFile.exists()) { } def flutterRoot = localProperties.getProperty('flutter.sdk') -if (flutterRoot == null) { - throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") -} +//if (flutterRoot == null) { +// throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") +//} def flutterVersionCode = localProperties.getProperty('flutter.versionCode') if (flutterVersionCode == null) { @@ -74,7 +74,7 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation "com.google.firebase:firebase-messaging:20.3.0" implementation 'pub.devrel:easypermissions:0.4.0' - implementation 'com.google.firebase:firebase-inappmessaging-display:17.2.0' +// implementation 'com.google.firebase:firebase-inappmessaging-display:17.2.0' implementation 'com.google.guava:guava:27.0.1-android' // Dependency on local binaries implementation fileTree(dir: 'libs', include: ['*.jar']) diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 41d9d64a..af1bd592 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1170,5 +1170,10 @@ const Map localizedValues = { "ar": "هذه الخدمة تم تصميمها لتتمكن من ربط الملفات الطبية للعائلة بملفك الطبي حتى تتمكن من إدارة سجلاتهم عن طريق تسجيل الدخول إلى ملفك الطبي." }, - "help": {"en": "Help", "ar": "مساعدة"} + "help": {"en": "Help", "ar": "مساعدة"}, + + "habibRobotText":{ + "en":"Hi, This is HABIB, your personal assistant. I'm here to assist you by voice commands. How can I help?", + "ar":"مرحباً ، معك حبيب مساعدك الشخصي. أنا هنا لمساعدتك بالأوامر الصوتية." + } }; diff --git a/lib/pages/landing/home_page.dart b/lib/pages/landing/home_page.dart index b8cf64bb..20e678b7 100644 --- a/lib/pages/landing/home_page.dart +++ b/lib/pages/landing/home_page.dart @@ -63,6 +63,7 @@ class _HomePageState extends State { onModelReady: (model) => model.getPatientRadOrders(), builder: (_, model, wi) => AppScaffold( isShowDecPage: false, + isHelp:true, body: Container( width: double.infinity, child: SingleChildScrollView( diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 1cc06c7b..22ad9459 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -1127,6 +1127,9 @@ class TranslationBase { String get infoTodo => localizedValues['info-todo'][locale.languageCode]; String get familyInfo => localizedValues['family-info'][locale.languageCode]; String get help => localizedValues['help'][locale.languageCode]; + String get habibRobotText => localizedValues['habibRobotText'][locale.languageCode]; + + } class TranslationBaseDelegate extends LocalizationsDelegate { diff --git a/lib/widgets/bottom_navigation/bottom_nav_bar.dart b/lib/widgets/bottom_navigation/bottom_nav_bar.dart index 89d892f7..9d65d4b0 100644 --- a/lib/widgets/bottom_navigation/bottom_nav_bar.dart +++ b/lib/widgets/bottom_navigation/bottom_nav_bar.dart @@ -35,7 +35,8 @@ class _BottomNavBarState extends State { color: Colors.white, child: Padding( padding: EdgeInsets.symmetric(horizontal: 18), - child: Row( + child: Directionality( + textDirection:TextDirection.ltr, child:Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ @@ -97,7 +98,7 @@ class _BottomNavBarState extends State { name: TranslationBase.of(context).help, ) ], - ), + )), ), ); } diff --git a/lib/widgets/drawer/app_drawer_widget.dart b/lib/widgets/drawer/app_drawer_widget.dart index a45cba96..47e8b892 100644 --- a/lib/widgets/drawer/app_drawer_widget.dart +++ b/lib/widgets/drawer/app_drawer_widget.dart @@ -41,19 +41,15 @@ class _AppDrawerState extends State { var familyFileProvider = FamilyFilesProvider(); AuthenticatedUser user; AuthenticatedUser mainUser; - AuthenticatedUserObject authenticatedUserObject = locator< - AuthenticatedUserObject>(); + AuthenticatedUserObject authenticatedUserObject = + locator(); VitalSignService _vitalSignService = locator(); - @override Widget build(BuildContext context) { projectProvider = Provider.of(context); return SizedBox( - width: MediaQuery - .of(context) - .size - .width * 0.75, + width: MediaQuery.of(context).size.width * 0.75, child: Container( color: Colors.white, child: Drawer( @@ -72,67 +68,66 @@ class _AppDrawerState extends State { children: [ Container( child: - Image.asset('assets/images/DQ/DQ_logo.png'), + Image.asset('assets/images/DQ/DQ_logo.png'), margin: EdgeInsets.all( SizeConfig.imageSizeMultiplier * 4), ), (user != null && projectProvider.isLogin) ? Padding( - padding: EdgeInsets.all(15), - child: Column( - mainAxisAlignment: - MainAxisAlignment.start, - children: [ - Row( + padding: EdgeInsets.all(15), + child: Column( + mainAxisAlignment: + MainAxisAlignment.start, children: [ - Padding( - padding: EdgeInsets.only( - right: 5), - child: Icon( - Icons.account_circle, + Row( + children: [ + Padding( + padding: EdgeInsets.only( + right: 5), + child: Icon( + Icons.account_circle, + color: Color(0xFF40ACC9), + )), + AppText( + user.firstName + + ' ' + + user.lastName, color: Color(0xFF40ACC9), - )), - AppText( - user.firstName + - ' ' + - user.lastName, - color: Color(0xFF40ACC9), - ) - ], - ), - Row(children: [ - Padding( - padding: EdgeInsets.only( - left: 30, top: 5), - child: Column( - children: [ - AppText( - TranslationBase - .of( - context) - .fileno + - ": " + - user.patientID - .toString(), - color: - Color(0xFF40ACC9), - fontSize: SizeConfig - .textMultiplier * - 1.5, - ), - AppText( - user.bloodGroup != null - ? 'Blood Group: ' + - user.bloodGroup - : '', - fontSize: SizeConfig - .textMultiplier * - 1.5, - ), - ], - )) - ]) - ])) + ) + ], + ), + Row(children: [ + Padding( + padding: EdgeInsets.only( + left: 30, top: 5), + child: Column( + children: [ + AppText( + TranslationBase.of( + context) + .fileno + + ": " + + user.patientID + .toString(), + color: + Color(0xFF40ACC9), + fontSize: SizeConfig + .textMultiplier * + 1.5, + ), + AppText( + user.bloodGroup != null + ? 'Blood Group: ' + + user.bloodGroup + : '', + fontSize: SizeConfig + .textMultiplier * + 1.5, + ), + ], + )) + ]) + ])) : SizedBox(), ], ), @@ -144,9 +139,7 @@ class _AppDrawerState extends State { children: [ InkWell( child: DrawerItem( - TranslationBase - .of(context) - .arabicChange, + TranslationBase.of(context).arabicChange, Icons.translate), onTap: () { // Navigator.of(context).pushNamed( @@ -161,263 +154,195 @@ class _AppDrawerState extends State { ), (user != null && projectProvider.isLogin) ? Column( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - user.isFamily == null || user.isFamily == false - ? InkWell( - child: DrawerItem( - TranslationBase - .of(context) - .family, - Icons.group, - textColor: Color(0xFF40ACC9), - iconColor: Color(0xFF40ACC9), - bottomLine: false, - sideArrow: true, - ), - onTap: () { - Navigator.of(context).pushNamed( - MY_FAMILIY, - ); - }, - ) - : SizedBox(), - FutureBuilder( - future: getFamilyFiles(), // async work - builder: (BuildContext context, - AsyncSnapshot< - GetAllSharedRecordsByStatusResponse> - snapshot) { - switch (snapshot.connectionState) { - case ConnectionState.waiting: - return Padding( - padding: EdgeInsets.all(10), - child: Text('Loading....')); - default: - if (snapshot.hasError) - return Padding( - padding: EdgeInsets.all(10), - child: Text(snapshot.error)); - else - return Container( - decoration: BoxDecoration( - border: Border( - bottom: BorderSide( - // <--- left side - color: Colors.grey[200], - width: 1.0, - ), - )), - child: Column( - children: [ - user.isFamily == true - ? Container( - padding: - EdgeInsets.only( - bottom: 5), - child: InkWell( - onTap: () { - switchUser( - mainUser, - context); - }, - child: Row( - crossAxisAlignment: - CrossAxisAlignment - .start, - children: < - Widget>[ - Expanded( - child: Icon( - Icons - .person), - ), - Expanded( - flex: 7, - child: Column( - crossAxisAlignment: - CrossAxisAlignment - .start, - children: < - Widget>[ - AppText( - mainUser - .firstName + - ' ' + - mainUser - .lastName), - AppText( - TranslationBase - .of( - context) - .fileno + - ": " + - mainUser - .patientID - .toString()), - ])), - ], - ))) - : SizedBox(), - Column( - mainAxisAlignment: - MainAxisAlignment - .start, - mainAxisSize: - MainAxisSize.min, - children: snapshot.data - .getAllSharedRecordsByStatusList - .map( - (result) { - return result - .status == - 3 - ? Container( - padding: EdgeInsets - .only( - bottom: - 5), + mainAxisAlignment: MainAxisAlignment.start, + children: [ + user.isFamily == null || + user.isFamily == false + ? InkWell( + child: DrawerItem( + TranslationBase.of(context).family, + Icons.group, + textColor: Color(0xFF40ACC9), + iconColor: Color(0xFF40ACC9), + bottomLine: false, + sideArrow: true, + ), + onTap: () { + Navigator.of(context).pushNamed( + MY_FAMILIY, + ); + }, + ) + : SizedBox(), + FutureBuilder( + future: getFamilyFiles(), // async work + builder: (BuildContext context, + AsyncSnapshot< + GetAllSharedRecordsByStatusResponse> + snapshot) { + switch (snapshot.connectionState) { + case ConnectionState.waiting: + return Padding( + padding: EdgeInsets.all(10), + child: Text('Loading....')); + default: + if (snapshot.hasError) + return Padding( + padding: EdgeInsets.all(10), + child: Text(snapshot.error)); + else + return Container( + decoration: BoxDecoration( + border: Border( + bottom: BorderSide( + // <--- left side + color: Colors.grey[200], + width: 1.0, + ), + )), + child: Column( + children: [ + user.isFamily == true + ? Container( + padding: + EdgeInsets.only( + bottom: 5), child: InkWell( onTap: () { switchUser( - result, + mainUser, context); }, child: Row( crossAxisAlignment: - CrossAxisAlignment - .start, + CrossAxisAlignment + .start, children: < Widget>[ Expanded( - child: - Icon(Icons - .person, - color: result - .responseID == - user - .patientID - ? Color( - 0xFF40ACC9) - : Colors - .black), + child: Icon( + Icons + .person), ), Expanded( flex: 7, - child: Padding( - padding: EdgeInsets - .only( - left: 5, - right: 5), - child: Column( - crossAxisAlignment: CrossAxisAlignment - .start, - children: < - Widget>[ - AppText( - result - .patientName, - color: result - .responseID == - user - .patientID - ? Color( - 0xFF40ACC9) - : Colors - .black), - AppText( - TranslationBase - .of( - context) - .fileno + - ": " + - result - .iD - .toString(), - color: result - .responseID == - user - .patientID - ? Color( - 0xFF40ACC9) - : Colors - .black), - ]))), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + AppText(mainUser.firstName + ' ' + mainUser.lastName), + AppText(TranslationBase.of(context).fileno + ": " + mainUser.patientID.toString()), + ])), ], ))) - : SizedBox(); - }).toList()) - ], - )); - } - }, - ), - InkWell( - child: DrawerItem( - TranslationBase - .of(context) - .notification, - Icons.notifications), - onTap: () { - //NotificationsPage - Navigator.of(context).pop(); - Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) => - NotificationsPage())); - }, - ), - InkWell( - child: DrawerItem( - TranslationBase - .of(context) - .appsetting, - Icons.settings_input_composite), - onTap: () { - Navigator.of(context).pushNamed( - SETTINGS, - ); - }, - ), - InkWell( - child: DrawerItem( - TranslationBase - .of(context) - .rateApp, - Icons.star), - onTap: () { - if (Platform.isIOS) { - launch( - "https://apps.apple.com/sa/app/dr-suliaman-alhabib/id733503978"); - } else { - launch( - "https://play.google.com/store/apps/details?id=com.ejada.hmg&hl=en"); - } - }, - ), - InkWell( - child: DrawerItem( - TranslationBase - .of(context) - .logout, - Icons.lock_open), - onTap: () { - logout(); - }, - ) - ], - ) + : SizedBox(), + Column( + mainAxisAlignment: + MainAxisAlignment + .start, + mainAxisSize: + MainAxisSize.min, + children: snapshot.data + .getAllSharedRecordsByStatusList + .map( + (result) { + return result + .status == + 3 + ? Container( + padding: EdgeInsets + .only( + bottom: + 5), + child: InkWell( + onTap: () { + switchUser( + result, + context); + }, + child: Row( + crossAxisAlignment: + CrossAxisAlignment.start, + children: < + Widget>[ + Expanded( + child: + Icon(Icons.person, color: result.responseID == user.patientID ? Color(0xFF40ACC9) : Colors.black), + ), + Expanded( + flex: 7, + child: Padding( + padding: EdgeInsets.only(left: 5, right: 5), + child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + AppText(result.patientName, color: result.responseID == user.patientID ? Color(0xFF40ACC9) : Colors.black), + AppText(TranslationBase.of(context).fileno + ": " + result.iD.toString(), color: result.responseID == user.patientID ? Color(0xFF40ACC9) : Colors.black), + ]))), + ], + ))) + : SizedBox(); + }).toList()) + ], + )); + } + }, + ), + InkWell( + child: DrawerItem( + TranslationBase.of(context) + .notification, + Icons.notifications), + onTap: () { + //NotificationsPage + Navigator.of(context).pop(); + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => + NotificationsPage())); + }, + ), + InkWell( + child: DrawerItem( + TranslationBase.of(context).appsetting, + Icons.settings_input_composite), + onTap: () { + Navigator.of(context).pushNamed( + SETTINGS, + ); + }, + ), + InkWell( + child: DrawerItem( + TranslationBase.of(context).rateApp, + Icons.star), + onTap: () { + if (Platform.isIOS) { + launch( + "https://apps.apple.com/sa/app/dr-suliaman-alhabib/id733503978"); + } else { + launch( + "https://play.google.com/store/apps/details?id=com.ejada.hmg&hl=en"); + } + }, + ), + InkWell( + child: DrawerItem( + TranslationBase.of(context).logout, + Icons.lock_open), + onTap: () { + logout(); + }, + ) + ], + ) : InkWell( - child: DrawerItem( - TranslationBase - .of(context) - .loginregister, - Icons.lock_open), - onTap: () { - login(); - }, - ), + child: DrawerItem( + TranslationBase.of(context).loginregister, + Icons.lock_open), + onTap: () { + login(); + }, + ), ], ) ], @@ -436,9 +361,7 @@ class _AppDrawerState extends State { children: [ Column( children: [ - Text(TranslationBase - .of(context) - .poweredBy), + Text(TranslationBase.of(context).poweredBy), Image.asset( 'assets/images/cs_logo_container.png', width: SizeConfig.imageSizeMultiplier * 30, @@ -527,12 +450,11 @@ class _AppDrawerState extends State { this .familyFileProvider .silentLoggin(user is AuthenticatedUser ? null : user, - mainUser: user is AuthenticatedUser) + mainUser: user is AuthenticatedUser) .then((value) { GifLoaderDialogUtils.hideDialog(context); loginAfter(value, context); - }) - .catchError((err) { + }).catchError((err) { GifLoaderDialogUtils.hideDialog(context); print(err); AppToast.showErrorToast(message: err); diff --git a/lib/widgets/others/app_scaffold_pharmacy_widget.dart b/lib/widgets/others/app_scaffold_pharmacy_widget.dart index 764089e9..3121dca3 100644 --- a/lib/widgets/others/app_scaffold_pharmacy_widget.dart +++ b/lib/widgets/others/app_scaffold_pharmacy_widget.dart @@ -8,8 +8,6 @@ import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/others/bottom_bar.dart'; import 'package:diplomaticquarterapp/widgets/progress_indicator/app_loader_widget.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; -import 'package:diplomaticquarterapp/widgets/robo-search/robosearch.dart'; -import 'package:diplomaticquarterapp/widgets/robo-search/search.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; diff --git a/lib/widgets/others/app_scaffold_widget.dart b/lib/widgets/others/app_scaffold_widget.dart index 23c5cae1..e0e89b45 100644 --- a/lib/widgets/others/app_scaffold_widget.dart +++ b/lib/widgets/others/app_scaffold_widget.dart @@ -12,18 +12,20 @@ import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/bottom_bar.dart'; import 'package:diplomaticquarterapp/widgets/progress_indicator/app_loader_widget.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; +import 'package:diplomaticquarterapp/widgets/weather_slider/weather_slider.dart'; +import 'package:diplomaticquarterapp/widgets/typewriter/typewiter.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:provider/provider.dart'; -import 'package:animated_text_kit/animated_text_kit.dart'; +import 'package:diplomaticquarterapp/services/robo_search/event_provider.dart'; import '../../locator.dart'; import 'floating_button_search.dart'; import '../progress_indicator/app_loader_widget.dart'; import 'arrow_back.dart'; import 'network_base_view.dart'; import 'not_auh_page.dart'; -import 'package:diplomaticquarterapp/widgets/weather_slider/weather_slider.dart'; + class AppScaffold extends StatelessWidget { final String appBarTitle; @@ -47,9 +49,12 @@ class AppScaffold extends StatelessWidget { final List appBarIcons; final PreferredSizeWidget appBarWidget; + + ProjectViewModel projectProvider; AuthenticatedUserObject authenticatedUserObject = locator(); + AppScaffold( {@required this.body, this.appBarTitle = '', @@ -70,13 +75,14 @@ class AppScaffold extends StatelessWidget { this.appBarWidget, this.image, this.infoList, - this.isHelp}); + this.isHelp =false}); @override Widget build(BuildContext context) { AppGlobal.context = context; PreferredSizeWidget appBar; + projectProvider = Provider.of(context); if (this.appBarWidget == null) { PreferredSizeWidget appBarWidget = AppBarWidget( appBarTitle, @@ -108,10 +114,10 @@ class AppScaffold extends StatelessWidget { ) : baseViewModel != null ? NetworkBaseView( - child: buildBodyWidget(), + child: buildBodyWidget(context), baseViewModel: baseViewModel, ) - : buildBodyWidget(), + : buildBodyWidget(context), bottomSheet: bottomSheet, // floatingActionButton: floatingActionButton ?? floatingActionButton, // bottomNavigationBar: @@ -124,61 +130,12 @@ class AppScaffold extends StatelessWidget { return isLoading ? AppLoaderWidget() : Container(); } - buildBodyWidget() { + buildBodyWidget(context) { // return body; //Stack(children: [body, buildAppLoaderWidget(isLoading)]); return Stack(children: [ body, - isHelp ?? - Positioned( - child: Column( - children: [ - Container( - height: 100, - width: 150, - padding: EdgeInsets.all(5), - margin: EdgeInsets.only(right: 10.0, bottom: 0), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10), - color: Colors.white, - boxShadow: [ - BoxShadow(color: Colors.grey, spreadRadius: 3), - ], - ), - child: TyperAnimatedTextKit( - onTap: () {}, - text: [ - "Discipline is the best tool", - "Design first, then code", - "Do not patch bugs out, rewrite them", - "Do not test bugs out, design them out", - ], - textStyle: - TextStyle(fontSize: 14.0, color: Colors.black54), - speed: Duration(milliseconds: 100), - textAlign: TextAlign.start, - alignment: AlignmentDirectional - .topStart // or Alignment.topLeft - )), - Positioned( - child: Stack( - children: [ - Positioned( - top: 0, - right: 50, - child: Container( - height: 0, - width: 0, - decoration: ShapeDecoration( - color: Colors.grey, - shape: MessageBorder(reverse: true), - ))), - FloatingSearchButton() - ], - )) - ], - ), - left: SizeConfig.screenWidth - 160, - bottom: 50) + isHelp ? RobotIcon() : Container() + /*FloatingSearchButton()*/ ]); @@ -278,3 +235,81 @@ class AppBarWidget extends StatelessWidget with PreferredSizeWidget { @override Size get preferredSize => Size(double.maxFinite, 60); } +class RobotIcon extends StatefulWidget { + + @override + _RobotIcon createState() => _RobotIcon(); +} + +class _RobotIcon extends State { + var event = RobotProvider(); + bool isAnimation =true; + + @override + void initState() { + event.controller.stream.listen((p) { + if (p['animationEnable'] == 'false') { + setState(() { + if (this.mounted) { + this.isAnimation = false; + } + }); + + } + }); + super.initState(); + } + @override + Widget build(BuildContext context) { + return Positioned( + child : + Column( + children: [ + + isAnimation ? Container(height:150,width:200,padding:EdgeInsets.all(5),margin:EdgeInsets.only(right:35.0,bottom:0 + ),decoration :BoxDecoration( + borderRadius:BorderRadius.circular(10), + color:Colors.white, + boxShadow: + [BoxShadow( + color: Colors.black, + spreadRadius: + 1 + ), + ], + ), + child:TyperAnimatedTextKit(text:Provider.of(context,listen:false).isArabic == true ? + "هذه الخدمة تم تصميمها لتتمكن من ربط الملفات الطبية للعائلة بملفك الطبي حتى تتمكن من إدارة سجلاتهم عن طريق تسجيل الدخول إلى ملفك الطبي." + : "Through this service, you will be able to link your family medical files to your medical file so that you can manage their records by login to your medical file.", + textLength: Provider.of(context,listen:false).isArabic== true ? "هذه الخدمة تم تصميمها لتتمكن من ربط الملفات الطبية للعائلة بملفك الطبي حتى تتمكن من إدارة سجلاتهم عن طريق تسجيل الدخول إلى ملفك الطبي.".length: "Through this service, you will be able to link your family medical files to your medical file so that you can manage their records by login to your medical file.".length + ) + + ) : Container(), + Stack( + children: + [ isAnimation ? Positioned(top:0,right:40,child: + Container(height:0,width:0, + decoration: + ShapeDecoration( + color: + Colors.grey, + shape: + MessageBorder( + reverse + : + true + ), + ) + ) + ) :Container(), + FloatingSearchButton() + ], + ) + + ], + ), + right: -30,bottom:50 + + ); + } +} \ No newline at end of file diff --git a/lib/widgets/others/floating_button_search.dart b/lib/widgets/others/floating_button_search.dart index 3c432de3..e235f28b 100644 --- a/lib/widgets/others/floating_button_search.dart +++ b/lib/widgets/others/floating_button_search.dart @@ -2,9 +2,13 @@ import 'dart:collection'; import 'dart:io'; import 'dart:math'; +import 'package:cached_network_image/cached_network_image.dart'; import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/core/service/AuthenticatedUserObject.dart'; +import 'package:diplomaticquarterapp/core/service/medical/vital_sign_service.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/locator.dart'; import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart'; import 'package:diplomaticquarterapp/models/Appointments/DoctorProfile.dart'; import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; @@ -13,6 +17,7 @@ import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/parking_page.da import 'package:diplomaticquarterapp/pages/Blood/blood_donation.dart'; import 'package:diplomaticquarterapp/pages/Blood/my_balance_page.dart'; import 'package:diplomaticquarterapp/pages/BookAppointment/widgets/BranchView.dart'; +import 'package:diplomaticquarterapp/pages/ContactUs/LiveChat/livechat_page.dart'; import 'package:diplomaticquarterapp/pages/ContactUs/findus/findus_page.dart'; import 'package:diplomaticquarterapp/pages/DrawerPages/family/my-family.dart'; import 'package:diplomaticquarterapp/pages/ErService/AmbulanceReq.dart'; @@ -55,9 +60,10 @@ import 'package:speech_to_text/speech_to_text.dart'; import 'package:diplomaticquarterapp/pages/BookAppointment/DoctorProfile.dart'; import 'package:diplomaticquarterapp/pages/BookAppointment/Search.dart'; import 'package:flutter/cupertino.dart'; - +import 'package:diplomaticquarterapp/pages/pharmacies/screens/pharmacy_module_page.dart'; import 'package:smart_progress_bar/smart_progress_bar.dart'; import 'package:url_launcher/url_launcher.dart'; +import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/%E2%80%8B%20health_calculators.dart'; class FloatingSearchButton extends StatefulWidget { @override @@ -93,10 +99,10 @@ class _FloatingSearchButton extends State var sharedPref = new AppSharedPreferences(); bool _hasSpeech = false; ProjectViewModel projectProvider; - + bool isAnimationEnable = true; AnimationController controller; Animation offset; - + String networkImage; @override void initState() { controller = @@ -104,6 +110,7 @@ class _FloatingSearchButton extends State offset = Tween(begin: Offset.zero, end: Offset(0.0, 1.0)) .animate(controller); controller.reverse(); + initialSpeak(); Future.delayed(const Duration(seconds: 2), () { requestPermissions(); getUserData(); @@ -122,14 +129,23 @@ class _FloatingSearchButton extends State super.initState(); } + @override + void didUpdateWidget(FloatingSearchButton oldWidget) { + super.didUpdateWidget(oldWidget); + // event.controller.stream.listen((p) { + // if (p['animationEnable'] != 'false') { + // initialSpeak(); + // } + // }); + } + AuthenticatedUserObject authenticatedUserObject = + locator(); + VitalSignService _vitalSignService = locator(); @override Widget build(BuildContext context) { projectProvider = Provider.of(context); return Container( - child: - SlideTransition( - position: offset, - child: getStack())); + child: SlideTransition(position: offset, child: getStack())); } Widget getStack() { @@ -138,10 +154,15 @@ class _FloatingSearchButton extends State width: 150, margin: EdgeInsets.only(left: 20.0), child: Stack(children: [ - GestureDetector( child: Container( - child: Image.asset('assets/images/gif/robot-idle.gif'), + child:networkImage !=null ? CachedNetworkImage( + imageUrl: networkImage, + placeholder: (context, url) =>Image.asset('assets/images/gif/robot-idle.gif'), + errorWidget: (context, url, error) => Icon(Icons.error), + ) : Image.asset(isAnimationEnable == true + ? 'assets/images/gif/robot-speaking.gif' + : 'assets/images/gif/robot-idle.gif'), ), onTap: () { initSpeechState().then((value) => {startVoiceSearch()}); @@ -244,7 +265,6 @@ class _FloatingSearchButton extends State } void errorListener(SpeechRecognitionError error) { - print(error); event.setValue({"searchText": 'null'}); //setState(() { // reconizedWord = "${error.errorMsg} - ${error.permanent}"; @@ -283,64 +303,6 @@ class _FloatingSearchButton extends State doctorId: result['DoctorId'], doctorName: null, ); - - // List clnicID = unique(result['ClinicId']); - // if (result['ProjectId'] != 0 && - // clnicID.length > 0 && - // result['DoctorId'].length > 0) { - // if (clnicID.length == 1) { - // getDoctorsList( - // result['ProjectId'], - // clnicID[0], - // context, - // doctorId: result['DoctorId'], - // doctorName: null, - // ); - // } else { - // goToClinic(clnicID); - // } - // } else if (result['ProjectId'] != 0 && - // clnicID.length > 0 && - // result['DoctorId'].length == 0) { - // if (clnicID.length == 1) { - // getDoctorsList( - // result['ProjectId'], - // clnicID[0], - // context, - // ); - // } else { - // goToClinic(clnicID); - // } - // } else if (result['ProjectId'] == 0 && - // clnicID.length > 0 && - // result['DoctorId'].length == 0) { - // if (clnicID.length == 1) { - // getDoctorsList( - // result['ProjectId'], - // clnicID[0], - // context, - // ); - // } else { - // goToClinic(clnicID); - // } - // } else if (result['ProjectId'] == 0 && - // clnicID.length > 0 && - // result['DoctorId'].length > 0) { - // if (clnicID.length == 1) { - // getDoctorsList( - // result['ProjectId'], - // clnicID[0], - // context, - // doctorId: result['DoctorId'], - // doctorName: null, - // ); - // } else { - // goToClinic(clnicID); - // } - // } else { - // goToClinic(clnicID); - // } - // speak(); } break; case '102': @@ -639,6 +601,7 @@ class _FloatingSearchButton extends State case '44': { //chat need be implmented here. + Navigator.push(context, FadePage(page: LiveChatPage())); } break; case '45': @@ -656,14 +619,54 @@ class _FloatingSearchButton extends State Navigator.push(context, FadePage(page: FeedbackHomePage())); } break; + case '45': + { + launch('https://hmg.com/ir/ar/Pages/ShareInformation/home.aspx'); + break; + } + case '46': + { + launch('https://hmg.com/ir/ar/pages/home.aspx'); + break; + } + case '47': + { + //this.cs.sharedService.setSharedData(true, "isComingFromVoiceCommand"); + //this.cs.openFeedback(); + Navigator.push(context, FadePage(page: FeedbackHomePage())); + break; + } + case '48': + { + Navigator.push(context, FadePage(page: PharmacyPage())); + break; + } + case '50': + { + this.signOut(); + break; + } + case '51': + { + // Women health calculator + //this.cs.sharedService.setSharedData(true, "isOpenWomenHealthCalculator"); + //this.cs.navigateForward('/calculators/calculator'); + Navigator.push(context, FadePage(page: HealthCalculators())); + break; + } + case '52': + { + //this.bridge.openMyInvoices(); + break; + } + case '53': + { + launch("tel://920066666"); + break; + } default: { - // Navigator.pushAndRemoveUntil( - // context, - // MaterialPageRoute( - // builder: (context) => LandingPage()), - // (Route r) => false); speak(); } break; @@ -783,17 +786,22 @@ class _FloatingSearchButton extends State } speak() async { - // var voice = await flutterTts.getVoices; + setState(() { + this.networkImage = results['AnimationURL']; + this.isAnimationEnable = true; + }); + if (_currentLocaleId == 'en' && results['ReturnMessage'] != null) { - await flutterTts.setVoice({"name":"en-au-x-aub-network", "locale":"en-AU"}); + await flutterTts + .setVoice({"name": "en-au-x-aub-network", "locale": "en-AU"}); await flutterTts.speak(results['ReturnMessage']); } else if (results['ReturnMessage_Ar'] != null) { - await flutterTts.setVoice({"name":"ar-xa-x-ard-network", "locale":"ar"}); + await flutterTts + .setVoice({"name": "ar-xa-x-ard-network", "locale": "ar"}); await flutterTts.speak(results['ReturnMessage_Ar']); } - // Future.delayed(const Duration(seconds: 10), () { - // initSpeechState().then((value) => startVoiceSearch()); - // }); + + stopAnimation(); } goToClinic(List ids) { @@ -816,6 +824,50 @@ class _FloatingSearchButton extends State user = AuthenticatedUser.fromJson( await this.sharedPref.getObject(USER_PROFILE)); } - //await flutterTts.setVoice("en-us-x-sfg#male_1-local"); + } + + initialSpeak() async { + results = { + 'ReturnMessage_Ar': + "هذه الخدمة تم تصميمها لتتمكن من ربط الملفات الطبية للعائلة بملفك الطبي حتى تتمكن من إدارة سجلاتهم عن طريق تسجيل الدخول إلى ملفك الطبي.", + 'ReturnMessage': + "Through this service, you will be able to link your family medical files to your medical file so that you can manage their records by login to your medical file." + }; + this.speak(); + + if (Provider.of(context, listen: false).isArabic == + false && + results['ReturnMessage'] != null) { + await flutterTts + .setVoice({"name": "en-au-x-aub-network", "locale": "en-AU"}); + await flutterTts.speak(results['ReturnMessage']); + } else if (results['ReturnMessage_Ar'] != null) { + await flutterTts + .setVoice({"name": "ar-xa-x-ard-network", "locale": "ar"}); + await flutterTts.speak(results['ReturnMessage_Ar']); + + } + + this.isAnimationEnable = true; + stopAnimation(); + } + stopAnimation(){ + flutterTts.setCompletionHandler(() => { + event.setValue({"animationEnable": 'false'}), + setState(() { + this.networkImage = null; + this.isAnimationEnable = false; + }) + }); + } + signOut() async{ + authenticatedUserObject.logout(); + projectProvider.isLogin = false; + await authenticatedUserObject.getUser(); + _vitalSignService.heightCm = ""; + _vitalSignService.weightKg = ""; + await sharedPref.clear(); + this.user = null; + Navigator.of(context).pushNamed(HOME); } } diff --git a/lib/widgets/typewriter/typewiter.dart b/lib/widgets/typewriter/typewiter.dart index e69de29b..97a54150 100644 --- a/lib/widgets/typewriter/typewiter.dart +++ b/lib/widgets/typewriter/typewiter.dart @@ -0,0 +1,72 @@ +import 'package:flutter/material.dart'; + +class TyperAnimatedTextKit extends StatefulWidget { + final String text; + final int textLength; + TyperAnimatedTextKit({this.text, this.textLength}); + @override + _TyperState createState() => _TyperState(); +} + +class _TyperState extends State + with TickerProviderStateMixin { + Animation _characterCount; + AnimationController _controller; + int _stringIndex; + @override + void initState() { + _controller = new AnimationController( + duration: const Duration(seconds: 7), + vsync: this, + ); + + Future.delayed(const Duration(milliseconds: 500), () { + setState(() { + _stringIndex = _stringIndex == null ? 0 : _stringIndex + 1; + _characterCount = new StepTween(begin: 0, end: widget.textLength) + .animate(new CurvedAnimation(parent: _controller, curve: Curves.easeIn)); + + }); + _controller.forward(); + }); + + super.initState(); + } + + @override + void didUpdateWidget(TyperAnimatedTextKit oldWidget) { + super.didUpdateWidget(oldWidget); + _controller = new AnimationController( + duration: const Duration(seconds: 7), + vsync: this, + ); + + setState(() { + _stringIndex = _stringIndex == null ? 0 : _stringIndex + 1; + _characterCount = new StepTween(begin: 0, end: widget.textLength) + .animate(new CurvedAnimation(parent: _controller, curve: Curves.easeIn)); + + }); + _controller.forward(); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + @override + Widget build(BuildContext context) { + + return Container( + child: _characterCount == null ? null : new AnimatedBuilder( + animation: _characterCount, + builder: (BuildContext context, Widget child) { + String text = widget.text.substring(0, _characterCount.value); + return Text(text, style: TextStyle(color:Colors.black, fontSize: 12), textAlign: TextAlign.start, + + ); + }, + )); + } +} \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index e3e8bb06..51ccbe8f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -83,7 +83,7 @@ dependencies: google_maps_flutter: ^1.0.3 # Qr code Scanner TODO fix it - barcode_scanner: ^1.0.1 +# barcode_scanner: ^1.0.1 barcode_scan: any # Qr code Scanner barcode_scan_fix: ^1.0.2 @@ -146,7 +146,7 @@ dependencies: screen: ^0.0.5 #google maps places google_maps_place_picker: ^1.0.0 - animated_text_kit: ^2.5.4 + typewriter: ^0.0.3 #Dependencies for video call implementation native_device_orientation: ^0.3.0 enum_to_string: ^1.0.9 @@ -154,6 +154,7 @@ dependencies: wakelock: ^0.1.4 after_layout: ^1.0.7 twilio_programmable_video: ^0.5.0+3 + cached_network_image: ^2.4.1 flutter_tts: path: flutter_tts-voice_enhancement vibration: ^1.7.2