import 'dart:io'; import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart'; import 'package:diplomaticquarterapp/core/model/geofencing/requests/GeoZonesRequestModel.dart'; import 'package:diplomaticquarterapp/core/service/AuthenticatedUserObject.dart'; import 'package:diplomaticquarterapp/core/service/geofencing/GeofencingServices.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/models/Appointments/toDoCountProviderModel.dart'; import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; import 'package:diplomaticquarterapp/models/Authentication/select_device_imei_res.dart'; import 'package:diplomaticquarterapp/models/LiveCare/IncomingCallData.dart'; import 'package:diplomaticquarterapp/pages/BookAppointment/Search.dart'; import 'package:diplomaticquarterapp/pages/DrawerPages/family/my-family.dart'; import 'package:diplomaticquarterapp/pages/ToDoList/ToDo.dart'; import 'package:diplomaticquarterapp/pages/landing/home_page_2.dart'; import 'package:diplomaticquarterapp/pages/livecare/incoming_call.dart'; import 'package:diplomaticquarterapp/pages/medical/medical_profile_page_new.dart'; import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'; import 'package:diplomaticquarterapp/services/family_files/family_files_provider.dart' as family; import 'package:diplomaticquarterapp/services/robo_search/event_provider.dart'; import 'package:diplomaticquarterapp/theme/colors.dart'; import 'package:diplomaticquarterapp/uitl/LocalNotification.dart'; import 'package:diplomaticquarterapp/uitl/SignalRUtil.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/location_util.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/bottom_navigation/bottom_nav_bar.dart'; import 'package:diplomaticquarterapp/widgets/buttons/floatingActionButton.dart'; import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart'; import 'package:diplomaticquarterapp/widgets/drawer/app_drawer_widget.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/others/not_auh_page.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:provider/provider.dart'; import '../../locator.dart'; import '../../routes.dart'; class LandingPage extends StatefulWidget { static LandingPage shared; _LandingPageState state; LandingPage() { LandingPage.shared = this; } static bool isOpenCallPage = false; static IncomingCallData incomingCallData = new IncomingCallData(); @override _LandingPageState createState() => state = _LandingPageState(); switchToDoFromHMGServices() { state.changeCurrentTab(4); } } class _LandingPageState extends State with WidgetsBindingObserver { var authProvider = new AuthProvider(); int currentTab = 0; PageController pageController; ProjectViewModel projectViewModel; ToDoCountProviderModel model; var notificationCount = ''; var themeNotifier; DateTime currentBackPressTime; SignalRUtil signalRUtil; bool _showBottomNavigationBar = true; ///inject the user data AuthenticatedUserObject authenticatedUserObject = locator(); final FirebaseMessaging _firebaseMessaging = FirebaseMessaging(); final authService = new AuthProvider(); var event = RobotProvider(); var familyFileProvider = family.FamilyFilesProvider(); void _requestIOSPermissions() { flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation()?.requestPermissions( alert: true, badge: true, sound: true, ); } bool isPageNavigated = false; LocationUtils locationUtils; Future onWillPop() { DateTime now = DateTime.now(); if (currentBackPressTime == null || now.difference(currentBackPressTime) > Duration(seconds: 2)) { currentBackPressTime = now; AppToast.showToast(message: TranslationBase.of(context).pressAgain); return Future.value(false); } return Future.value(true); } changeCurrentTab(int tab) { if (!projectViewModel.isLogin) { if (tab == 3) { List imagesInfo = []; imagesInfo.add( ImagesInfo( imageEn: 'https://hmgwebservices.com/Images/MobileApp/images-info-home/family-file/en/0.png', imageAr: 'https://hmgwebservices.com/Images/MobileApp/images-info-home/family-file/ar/0.png'), ); imagesInfo.add( ImagesInfo( imageEn: 'https://hmgwebservices.com/Images/MobileApp/images-info-home/family-file/en/1.png', imageAr: 'https://hmgwebservices.com/Images/MobileApp/images-info-home/family-file/ar/1.png'), ); Navigator.push( context, MaterialPageRoute( builder: (cxt) => NotAutPage( title: TranslationBase.of(context).myFamilyFiles, description: TranslationBase.of(context).familyInfo, infoList: [], imagesInfo: imagesInfo, icon: "assets/images/new/bottom_nav/family_files.svg", ), ), ); return; } if (tab == 4) { List imagesInfo = []; imagesInfo.add( ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/images-info-home/todo/en/0.png', imageAr: 'https://hmgwebservices.com/Images/MobileApp/images-info-home/todo/ar/0.png')); Navigator.push( context, MaterialPageRoute( builder: (cxt) => NotAutPage( title: TranslationBase.of(context).todoList, description: TranslationBase.of(context).infoTodo, infoList: [], imagesInfo: imagesInfo, icon: "assets/images/new/bottom_nav/todo.svg", ), ), ); return; } } setState(() { if (tab == 5) { IS_VOICE_COMMAND_CLOSED = false; triggerRobot(); // pageController.jumpToPage(tab); } else { if (currentTab > 0 && tab == 2) pageController.jumpToPage(0); else if (tab != 0) { if (tab == 4 && projectViewModel.isLogin && model.count == 0) { AppToast.showErrorToast(message: TranslationBase.of(context).noBookedAppo); } else { pageController.jumpToPage(tab); } } else { pageController.jumpToPage(tab); } currentTab = tab; } }); } @override void didChangeAppLifecycleState(AppLifecycleState state) { super.didChangeAppLifecycleState(state); var route = ModalRoute.of(context); if (route != null) {} //setState(() { AppGlobal.context = context; if (state == AppLifecycleState.resumed) { if (LandingPage.isOpenCallPage) { if (!isPageNavigated) { isPageNavigated = true; Navigator.push(context, MaterialPageRoute(builder: (context) => IncomingCall(incomingCallData: LandingPage.incomingCallData))).then((value) { isPageNavigated = false; }); } } sharedPref.remove(APPOINTMENT_HISTORY_MEDICAL); } if (state == AppLifecycleState.paused) { isPageNavigated = false; } if (state == AppLifecycleState.inactive) { isPageNavigated = false; } //}); } @override void dispose() { WidgetsBinding.instance.removeObserver(this); super.dispose(); } @override void initState() { super.initState(); WidgetsBinding.instance.addObserver(this); AppGlobal.context = context; _requestIOSPermissions(); pageController = PageController(keepPage: true); _firebaseMessaging.setAutoInitEnabled(true); // signalRUtil = new SignalRUtil(hubName: "http://192.168.8.101:5001/chatHub", context: context); // signalRUtil = new SignalRUtil(hubName: "https://api.cssynapses.com/chatsocket", context: context); locationUtils = new LocationUtils(isShowConfirmDialog: false, context: context); WidgetsBinding.instance.addPostFrameCallback((_) { if (projectViewModel.isLogin && !projectViewModel.isLoginChild) { familyFileProvider.getSharedRecordByStatus(); } // signalRUtil.startSignalRConnection(); }); // HMG (Guest/Internet) Wifi Access [Zohaib Kambrani] //for now commented to reduce this call will enable it when needed // HMGNetworkConnectivity(context, () { // GifLoaderDialogUtils.showMyDialog(context); // PlatformBridge().connectHMGGuestWifi().then((value) => {GifLoaderDialogUtils.hideDialog(context)}); // }).checkAndConnectIfNoInternet(); if (Platform.isIOS) { _firebaseMessaging.requestNotificationPermissions(); } requestPermissions().then((results) { locationUtils.getCurrentLocation(); _firebaseMessaging.getToken().then((String token) { print("Firebase Token: " + token); sharedPref.setString(PUSH_TOKEN, token); if (token != null) { DEVICE_TOKEN = token; if (!projectViewModel.isLoginChild) { checkUserStatus(token); } // if (projectViewModel.isLogin) this.getNotificationCount(DEVICE_TOKEN); } }); if (results[Permission.location].isGranted) {} // if (results[Permission.storage].isGranted) ; // if (results[Permission.camera].isGranted) ; // if (results[Permission.photos].isGranted) ; // if (results[Permission.accessMediaLocation].isGranted) ; // if (results[Permission.calendar].isGranted) ; }); // }); // // //_firebase Background message handler _firebaseMessaging.configure( onMessage: (Map message) async { // showDialog("onMessage: $message"); print("onMessage: $message"); print(message); print(message['name']); print(message['appointmentdate']); if (Platform.isIOS) { if (message['is_call'] == "true") { var route = ModalRoute.of(context); if (route != null) { print(route.settings.name); } Map myMap = new Map.from(message); print(myMap); LandingPage.isOpenCallPage = true; LandingPage.incomingCallData = IncomingCallData.fromJson(myMap); if (!isPageNavigated) { isPageNavigated = true; Navigator.push( context, MaterialPageRoute( builder: (context) => IncomingCall( incomingCallData: LandingPage.incomingCallData))) .then((value) { isPageNavigated = false; }); } } else { print("Is Call Not Found iOS"); } } else { print("Is Call Not Found iOS"); } if (Platform.isAndroid) { if (message['data'].containsKey("is_call")) { var route = ModalRoute.of(context); if (route != null) { print(route.settings.name); } Map myMap = new Map.from(message['data']); print(myMap); LandingPage.isOpenCallPage = true; LandingPage.incomingCallData = IncomingCallData.fromJson(myMap); if (!isPageNavigated) { isPageNavigated = true; Navigator.push( context, MaterialPageRoute( builder: (context) => IncomingCall( incomingCallData: LandingPage.incomingCallData))) .then((value) { isPageNavigated = false; }); } } else { print("Is Call Not Found Android"); LocalNotification.getInstance().showNow(title: message['notification']['title'], subtitle: message['notification']['body']); } } else { print("Is Call Not Found Android"); } }, onBackgroundMessage: Platform.isIOS ? null : myBackgroundMessageHandler, onLaunch: (Map message) async { print("onLaunch: $message"); // showDialog("onLaunch: $message"); }, onResume: (Map message) async { print("onResume: $message"); print(message); print(message['name']); print(message['appointmentdate']); // showDialog("onResume: $message"); if (Platform.isIOS) { if (message['is_call'] == "true") { var route = ModalRoute.of(context); if (route != null) { print(route.settings.name); } Map myMap = new Map.from(message); print(myMap); LandingPage.isOpenCallPage = true; LandingPage.incomingCallData = IncomingCallData.fromJson(myMap); if (!isPageNavigated) { isPageNavigated = true; Navigator.push( context, MaterialPageRoute( builder: (context) => IncomingCall( incomingCallData: LandingPage.incomingCallData))) .then((value) { isPageNavigated = false; }); } } else { print("Is Call Not Found iOS"); } } else { print("Is Call Not Found iOS"); } }, ); } showDialogs(String message) { ConfirmDialog dialog = new ConfirmDialog( context: context, confirmMessage: message, okText: TranslationBase.of(context).confirm, cancelText: TranslationBase.of(context).cancel_nocaps, okFunction: () => {}, cancelFunction: () => {}); dialog.showAlertDialog(context); } Future> requestPermissions() async { var permissionResults = [ Permission.location, Permission.locationAlways, // Permission.storage, // Permission.camera, // Permission.photos, // Permission.notification, // Permission.accessMediaLocation, // Permission.calendar, Permission.activityRecognition ].request(); // var permissionsGranted = await deviceCalendarPlugin.hasPermissions(); // if (permissionsGranted.isSuccess && !permissionsGranted.data) { // permissionsGranted = await deviceCalendarPlugin.requestPermissions(); // if (!permissionsGranted.isSuccess || !permissionsGranted.data) {} // } return permissionResults; } static Future myBackgroundMessageHandler(Map message) async { Map myMap = new Map.from(message['data']); if (message.containsKey('data')) { LandingPage.incomingCallData = IncomingCallData.fromJson(myMap); LandingPage.isOpenCallPage = true; } if (message.containsKey('notification')) { final dynamic notification = message['notification']; } } void setUserValues(value) async { if (value != null) sharedPref.setObject(IMEI_USER_DATA, value); } Future getUserInformation() async { var userInfoJson = sharedPref.getObject(IMEI_USER_DATA); return userInfoJson; } checkValue(projectProvider) { if (projectProvider.searchValue != null) { changeCurrentTab(2); } } registerGeofences() async { await locator().getAllGeoZones(GeoZonesRequestModel()); void doIt() { getUserInformation().then((value) { if (value != null) projectViewModel.platformBridge().registerHmgGeofences(); }); } if (await Permission.location.isGranted) { doIt(); } else { [Permission.location].request().then((value) async { if (await Permission.location.isGranted) { doIt(); } }); } } login() async { var data = await sharedPref.getObject(IMEI_USER_DATA); sharedPref.remove(REGISTER_DATA_FOR_LOGIIN); if (data != null) { Navigator.of(context).pushNamed(CONFIRM_LOGIN); } else { GifLoaderDialogUtils.showMyDialog(context); authService.selectDeviceImei(DEVICE_TOKEN).then((SelectDeviceIMEIRES value) { GifLoaderDialogUtils.hideDialog(context); if (value != null) { setUserValues(value); Navigator.of(context).pushNamed(CONFIRM_LOGIN); } else { Navigator.of(context).pushNamed( WELCOME_LOGIN, ); } }).catchError((err) { GifLoaderDialogUtils.hideDialog(context); Navigator.of(context).pushNamed( WELCOME_LOGIN, ); }); } } getNotificationCount(token) async { if (await sharedPref.getObject(USER_PROFILE) != null) { var data = AuthenticatedUser.fromJson(await sharedPref.getObject(USER_PROFILE)); if (data != null) { authService.getDashboard().then((value) => { if (value != null) { setState(() { notificationCount = value['List_PatientDashboard'][0]['UnreadPatientNotificationCount'] > 99 ? '99+' : value['List_PatientDashboard'][0]['UnreadPatientNotificationCount'].toString(); sharedPref.setString(NOTIFICATION_COUNT, notificationCount); }) } }); } } } @override Widget build(BuildContext context) { projectViewModel = Provider.of(context); model = Provider.of(context); return Scaffold( appBar: PreferredSize( preferredSize: Size.fromHeight(currentTab == 0 ? 45 : 0.0), child: AppBar( elevation: 0, backgroundColor: CustomColors.backgroudGreyColor, textTheme: TextTheme( headline6: TextStyle(color: Theme.of(context).textTheme.headline1.color, fontWeight: FontWeight.bold), ), title: Text( getText(currentTab).toUpperCase(), style: TextStyle( fontWeight: FontWeight.bold, color: currentTab == 0 ? CustomColors.backgroudGreyColor : Theme.of(context).textTheme.headline1.color, fontFamily: projectViewModel.isArabic ? 'Cairo' : 'Poppins'), // bold: true, ), leading: Builder( builder: (BuildContext context) { return new Stack( children: [ currentTab == 0 ? IconButton( icon: SvgPicture.asset("assets/images/new/menu.svg"), color: Theme.of(context).textTheme.headline1.color, onPressed: () => Scaffold.of(context).openDrawer(), ) : IconButton( icon: Icon(Icons.arrow_back), onPressed: () { setState(() { currentTab = 0; }); pageController.jumpToPage(0); }, ), projectViewModel.isLogin && notificationCount != '' ? new Positioned( right: projectViewModel.isArabic ? 35 : 0, top: 5, child: new Container( padding: EdgeInsets.all(4), decoration: new BoxDecoration( color: Colors.red, borderRadius: BorderRadius.circular(20), ), constraints: BoxConstraints( minWidth: 20, minHeight: 20, ), child: new Text( notificationCount, style: new TextStyle( color: Colors.white, fontSize: projectViewModel.isArabic ? 8 : 9, ), textAlign: TextAlign.center, ), ), ) : SizedBox() ], ); }, ), actions: [ // IconButton( // //iconSize: 70, // icon: Icon( // projectViewModel.isLogin ? Icons.settings : Icons.login, // color: Theme.of(context).textTheme.headline1.color, // ), // onPressed: () { // if (projectViewModel.isLogin) // Navigator.of(context).pushNamed( // SETTINGS, // ); // else // login(); // }, //do something, // ) ], centerTitle: true, ), ), drawer: SafeArea(child: AppDrawer()), extendBody: false, body: WillPopScope( onWillPop: onWillPop, child: Stack(children: [ PageView( physics: NeverScrollableScrollPhysics(), controller: pageController, children: [ HomePage2( goToMyProfile: () { changeCurrentTab(1); }, onLoginClick: () { login(); }, onMedicalFileClick: () { changeCurrentTab(1); }, ), MedicalProfilePageNew(), Search(), MyFamily(isAppbarVisible: false), ToDo(isShowAppBar: false), ], // Please do not remove the BookingOptions from this array ), RobotIcon() ])), bottomNavigationBar: BottomNavBar( changeIndex: changeCurrentTab, index: currentTab, ), floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, floatingActionButton: (projectViewModel.havePrivilege(34) && currentTab == 0) ? FloatingButton( elevation: true, onTap: () { changeCurrentTab(2); }) : null); } triggerRobot() { event.setValue({"isRobotVisible": 'true'}); } getText(currentTab) { switch (currentTab) { case 0: return TranslationBase.of(context).home; case 1: return TranslationBase.of(context).medicalProfile; case 2: return TranslationBase.of(context).bookAppo; case 5: return TranslationBase.of(context).bookAppo; case 3: return TranslationBase.of(context).services; case 4: return TranslationBase.of(context).bookAppo; } } void checkUserStatus(token) async { authService.selectDeviceImei(token).then((SelectDeviceIMEIRES value) => setUserValues(value)); if (authenticatedUserObject.isLogin) { var data = AuthenticatedUser.fromJson(await sharedPref.getObject(USER_PROFILE)); if (data != null) { authService.registeredAuthenticatedUser(data, token, 0, 0).then((res) => {}); authService.getDashboard().then((value) => { setState(() { if (value != null) { notificationCount = value['List_PatientDashboard'][0]['UnreadPatientNotificationCount'] > 99 ? '99+' : value['List_PatientDashboard'][0]['UnreadPatientNotificationCount'].toString(); sharedPref.setString(NOTIFICATION_COUNT, notificationCount); } }), }); } } else {} } }