import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter_cache_manager/flutter_cache_manager.dart'; import 'package:teso/Classes/API%20Clasess/CouponDetails.dart'; import 'package:teso/Classes/API%20Clasess/Product.dart'; import 'package:teso/Classes/API%20Clasess/TesoBusinessDetail.dart'; import 'package:camera/camera.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; import 'package:page_transition/page_transition.dart' as Transition; import 'package:shared_preferences/shared_preferences.dart'; import 'package:teso/Pages/Personnal.dart'; import 'package:teso/Pages/Sub_Pages/Notifications/ChatScreen.dart'; import 'package:teso/Pages/Sub_Pages/PersonalSub/Settings.dart'; import 'package:teso/Pages/Sub_Pages/PopUp/Personalized.dart'; import 'package:teso/Pages/codeQR.dart'; import 'package:teso/Pages/notifications.dart'; import 'package:teso/providers/pageAnimations.dart'; import 'package:teso/util/SizeConfig.dart'; import 'package:teso/util/consts.dart'; import 'Classes/API Clasess/CouponHead.dart'; import 'Pages/Sub_Pages/Coupons/ProximityCoupons.dart'; import 'Pages/explore.dart'; import 'package:teso/Pages/LandingPage.dart'; import 'package:http/http.dart' as http; import 'package:firebase_auth/firebase_auth.dart'; import 'package:teso/Pages/scannerqr.dart'; import 'package:provider/provider.dart'; import 'package:teso/providers/user_provider.dart'; import 'package:teso/providers/device_provider.dart'; import 'package:teso/Notifications/NotificationPlugin.dart'; import 'package:teso/Classes/Payload.dart'; import 'dart:convert'; import 'package:teso/Pages/Sub_Pages/Coupons/ProximityCoupons.dart'; import 'package:teso/Pages/DesireComeTrue.dart'; import 'package:teso/Pages/Sub_Pages/PersonalSub/CompleteProfile.dart'; import 'package:teso/Classes/TesoUser.dart'; import 'package:teso/Pages/Sub_Pages/CoinPurchase.dart'; import 'package:teso/Classes/NotificationSpliter.dart'; import 'Pages/home.dart'; class MainScreens extends StatefulWidget { final List connectedCameras; const MainScreens({Key key, this.connectedCameras}) : super(key: key); @override _MainScreensState createState() => _MainScreensState(); } class _MainScreensState extends State with TickerProviderStateMixin { final FirebaseMessaging _firebaseMessaging = FirebaseMessaging.instance; int _page = 0; PageController _pageController; String result = ""; ScrollController _scrollBottomBarController = new ScrollController(); bool isScrollingDown = false; double bottomBarHeight = 75; final picker = ImagePicker(); FirebaseAuth _auth; String dd; bool _initialized = false; bool navVisible = true; Future _scanQRCode() async { result = ""; result = await Navigator.push( context, PageTransition( type: PageTransitionType.downToUp, child: QRCodeScanner(), ), ); try { if (result.isNotEmpty) { Navigator.push( context, PageTransition( type: PageTransitionType.downToUp, child: ScanQR( shopID: result, ), ), ); } } catch (ex) { setState(() { result = "Unknown Error $ex"; }); } } @override void dispose() { super.dispose(); _pageController.dispose(); _scrollBottomBarController.removeListener(() {}); DefaultCacheManager().emptyCache(); } void clear() async { await DefaultCacheManager().emptyCache(); } @override void initState() { notificationPlugin .setListenerForLowerVersions(onNotificationInLowerVersions); notificationPlugin.setOnNotificationClick(onNotificationClick); Provider.of(context, listen: false) .connectionToServer(context); Provider.of(context, listen: false).getCurrentUser(); Provider.of(context, listen: false).getUserInformation(); Provider.of(context, listen: false).checkBackgroundMode(); Provider.of(context, listen: false).getMonthlyStatus(); Provider.of(context, listen: false).loadFriends(); Provider.of(context, listen: false).getCoupons(); Provider.of(context, listen: false).checkBlockedUsers(); super.initState(); _pageController = PageController(initialPage: 0, keepPage: false); SharedPreferences.getInstance().then((prefs) async { String deviceToken; await _firebaseMessaging.getToken().then((token) { deviceToken = token; }); Map user = jsonDecode(prefs.getString("currentUser")) as Map; TesoUser currentuser = TesoUser.fromJSON(user); Map updates = { 'chattingWith': "", 'typing': false, "username": currentuser.username, "deviceToken": deviceToken }; FirebaseFirestore.instance .collection('users') .doc(currentuser.userGUID) .update(updates); init(context); if (currentuser.dateOfBirth == null || currentuser.gender == null) { Navigator.push( context, PageTransition( type: PageTransitionType.leftToRight, child: CompleteProfile(), )); } }); } void navigationTapped(int page) { if (page == 0) { _pageController.jumpToPage(0); } else if (page == 1) { _pageController.jumpToPage(1); } else if (page == 2) { _scanQRCode(); } else if (page == 3) { _pageController.jumpToPage(2); } else { _pageController.jumpToPage(3); } } void onPageChanged(int page) { setState(() { if (page < 2) { this._page = page; } else { this._page = page + 1; } }); } void settingsDialog(context) { showModalBottomSheet( context: context, isScrollControlled: true, enableDrag: true, shape: RoundedRectangleBorder( borderRadius: BorderRadius.vertical(top: Radius.circular(30.0)), ), builder: (BuildContext bc) { return Setting( logOut: logOut, connectedCameras: widget.connectedCameras, ); }); } void logOut() async { try { SharedPreferences.getInstance().then((prefs) async { String token = prefs.getString('tokensTeso'); String id = prefs.getString('id'); Map requestHeaders = { 'Content-type': 'application/json', 'Accept': 'application/json', 'Authorization': token }; var register = Uri.parse(serverLocation + 'api/logout'); var client = await http.get(register, headers: requestHeaders); if (client.statusCode == 200) { clear(); FirebaseFirestore.instance .collection('users') .doc(id) .update({'deviceToken': ""}); _auth = FirebaseAuth.instance; await _auth.signOut(); await prefs.clear(); await prefs.setBool("launched", true); // print(r.toString()); Navigator.of(context).pushAndRemoveUntil( MaterialPageRoute(builder: (context) => LandingPage()), (Route route) => false); } else {} }); } catch (e) { print(e); } } bool onWillPop() { _pageController.previousPage( duration: Duration(milliseconds: 200), curve: Curves.linear, ); return false; } Widget build(BuildContext context) { return Scaffold( extendBody: true, body: WillPopScope( onWillPop: () => Future.sync(onWillPop), child: Stack( children: [ PageView( physics: NeverScrollableScrollPhysics(), controller: _pageController, onPageChanged: onPageChanged, children: [ Home(), Explore( connectedCameras: widget.connectedCameras, ), Notifications(), Personnal( showSettings: settingsDialog, ), ], ), Align( alignment: Alignment.bottomCenter, child: Consumer(builder: (BuildContext context, UserProvider user, Widget child) { if (user.saving) return Container( width: double.infinity, height: 30, alignment: Alignment.center, padding: EdgeInsets.all( SizeConfig.safeBlockVertical * 1.3, ), margin: EdgeInsets.only( // left: MediaQuery.of(context).size.width * 0.119, // right: MediaQuery.of(context).size.width * 0.119, bottom: SizeConfig.safeBlockVertical * 15, ), color: Color.fromRGBO(0, 0, 0, 0.2), child: Text("Saving...", style: TextStyle( color: Colors.white, )), ); else return Container(); }), ), ], ), ), floatingActionButton: buildFAB(context), bottomNavigationBar: bottomOptions(context), ); } onNotificationInLowerVersions(ReceivedNotification receivedNotification) {} onNotificationClick(String payload) async { Payload load = Payload.fromJSON(json.decode(payload.toString())); switch (load.loadID) { case "TESN001": await Navigator.of(context).push( Transition.PageTransition( type: Transition.PageTransitionType.bottomToTop, child: ProximityCoupons(), ), ); break; case "TESN002": await Navigator.push( context, Transition.PageTransition( child: DesireComeTrue(), type: Transition.PageTransitionType.fade, ), ); break; case "TESN000": navigationTapped(3); break; case "TESN0R0": navigationTapped(3); break; case "TESN003": await Navigator.push( context, Transition.PageTransition( child: Coins(initalPage: 0), type: Transition.PageTransitionType.fade, ), ); break; case "TESN004": TesoUser user = new TesoUser(); user.firstname = load.load2; user.userGUID = load.load1; user.lastname = load.load3; await Navigator.push( context, Transition.PageTransition( child: ChatScreen( user: user, ), type: Transition.PageTransitionType.fade, ), ); break; } } void _fetchMessage(RemoteMessage message, BuildContext context) async { if (message == null || message.notification == null) return; final Map _data = message.data; final RemoteNotification notification = message.notification; Payload payload = await NotificationSplitter.getPayload(_data, context); await notificationPlugin.showNotification( notification.title, notification.body, payload.toString(), ); if (payload.load2 != null && payload.load2 == "personalized") { try { var coup = jsonDecode(payload.load1); Product product = new Product(); product.productName = payload.load7; product.unitPrice = double.parse(payload.load6); TesoBusinessDetail business = new TesoBusinessDetail(); business.businessName = payload.load5; CouponsHead head = new CouponsHead(); head.businessId = coup["BusinessId"]; head.couponId = payload.load3; head.expiration = DateTime.parse(coup["Expiration"].toString()); head.lower = coup["LowerLimit"]; head.quantity = 1; head.state = payload.load4; head.targetProduct = coup["TargetProduct"]; head.type = coup["Type"]; head.upper = coup["UpperLimit"]; head.generated = DateTime.parse(coup["Generated"].toString()); CouponDetails details = new CouponDetails(); details.businessId = head.businessId; details.condition = payload.load4; details.targetProduct = product; details.issuer = business; details.lowerLimit = head.lower; details.upperLimit = head.upper; await Navigator.push( context, PageTransition( type: PageTransitionType.fade, child: PersonalCoupon( details: details, head: head, ), ), ); } catch (e) { print(e); } } } Future init(BuildContext context) async { if (!_initialized) { await _firebaseMessaging.requestPermission(); _firebaseMessaging .getInitialMessage() .then((message) => _fetchMessage(message, context)); FirebaseMessaging.onMessage .listen((message) => _fetchForegroundMessage(message, context)); FirebaseMessaging.onMessageOpenedApp .listen((message) => _fromBackground(message, context)); _firebaseMessaging.getToken().then((token) { // print('token: $token'); }); _initialized = true; } } void _fromBackground(RemoteMessage message, BuildContext context) async { if (message == null || message.notification == null) return; final Map _data = message.data; Payload payload = await NotificationSplitter.getPayload(_data, context); if (payload.load2 != null && payload.load2 == "personalized") { try { var coup = jsonDecode(payload.load1); Product product = new Product(); product.productName = payload.load7; product.unitPrice = double.parse(payload.load6); TesoBusinessDetail business = new TesoBusinessDetail(); business.businessName = payload.load5; CouponsHead head = new CouponsHead(); head.businessId = coup["BusinessId"]; head.couponId = payload.load3; head.expiration = DateTime.parse(coup["Expiration"].toString()); head.lower = coup["LowerLimit"]; head.quantity = 1; head.state = payload.load4; head.targetProduct = coup["TargetProduct"]; head.type = coup["Type"]; head.upper = coup["UpperLimit"]; head.generated = DateTime.parse(coup["Generated"].toString()); CouponDetails details = new CouponDetails(); details.businessId = head.businessId; details.condition = payload.load4; details.targetProduct = product; details.issuer = business; details.lowerLimit = head.lower; details.upperLimit = head.upper; await Navigator.push( context, PageTransition( type: PageTransitionType.fade, child: PersonalCoupon( details: details, head: head, ), ), ); } catch (e) { print(e); } } else { switch (_data["notificationType"]) { case "chats": TesoUser user = new TesoUser(); user.firstname = payload.load2; user.userGUID = payload.load1; user.lastname = payload.load3; await Navigator.push( context, Transition.PageTransition( child: ChatScreen( user: user, ), type: Transition.PageTransitionType.fade, ), ); break; default: navigationTapped(3); break; } } } void _fetchForegroundMessage( RemoteMessage message, BuildContext context) async { if (message == null || message.notification == null) return; final Map _data = message.data; final RemoteNotification notification = message.notification; Payload payload = await NotificationSplitter.getPayload(_data, context); await notificationPlugin.showNotification( notification.title, notification.body, payload.toString(), ); if (payload.load2 != null && payload.load2 == "personalized") { try { var coup = jsonDecode(payload.load1); Product product = new Product(); product.productName = payload.load7; product.unitPrice = double.parse(payload.load6); TesoBusinessDetail business = new TesoBusinessDetail(); business.businessName = payload.load5; CouponsHead head = new CouponsHead(); head.businessId = coup["BusinessId"]; head.couponId = payload.load3; head.expiration = DateTime.parse(coup["Expiration"].toString()); head.lower = coup["LowerLimit"]; head.quantity = 1; head.state = payload.load4; head.targetProduct = coup["TargetProduct"]; head.type = coup["Type"]; head.upper = coup["UpperLimit"]; head.generated = DateTime.parse(coup["Generated"].toString()); CouponDetails details = new CouponDetails(); details.businessId = head.businessId; details.condition = payload.load4; details.targetProduct = product; details.issuer = business; details.lowerLimit = head.lower; details.upperLimit = head.upper; await Navigator.push( context, PageTransition( type: PageTransitionType.fade, child: PersonalCoupon( details: details, head: head, ), ), ); } catch (e) { print(e); } } else if (payload.loadID == "TESN0R0") { SharedPreferences.getInstance().then((prefs) async { String currentSaveUser = prefs.getString("currentUser"); Map olduser = jsonDecode(currentSaveUser) as Map; TesoUser user = TesoUser.fromJSON(olduser); user.gold = (int.parse(user.gold) + int.parse(_data["reward"])).toString(); Provider.of(context, listen: false).setUser(user); }); } } Widget bottomOptions(context) { return BottomNavigationBar( //iconSize: 19.5, showSelectedLabels: false, showUnselectedLabels: false, backgroundColor: Theme.of(context).primaryColor, selectedItemColor: Theme.of(context).colorScheme.secondary, unselectedItemColor: Colors.grey[500], elevation: 150, type: BottomNavigationBarType.fixed, items: [ BottomNavigationBarItem( icon: Icon( Icons.home, size: SizeConfig.safeBlockHorizontal * 6.7, ), label: "Home", tooltip: ""), BottomNavigationBarItem( icon: Icon( Icons.search, size: SizeConfig.safeBlockHorizontal * 6.7, ), label: ("Explore"), ), // BottomNavigationBarItem( // icon: GestureDetector( // onLongPress: () => {_scanQRCode()}, // child: ImageIcon( // AssetImage("assets/images/rawLogo.png"), // size: SizeConfig.safeBlockHorizontal * 6.7, // ), // ), // label: ("TESO"), // ), // BottomNavigationBarItem( // icon: Icon( // Icons.notifications, // size: SizeConfig.safeBlockHorizontal * 6.7, // ), // label: ("Alerts"), // ), // BottomNavigationBarItem( // icon: Icon( // Icons.person, // size: SizeConfig.safeBlockHorizontal * 6.7, // ), // label: ("Personal"), // ), ], onTap: navigationTapped, currentIndex: _page, ); } Widget buildFAB(BuildContext context) { return GestureDetector( onLongPress: () => {_scanQRCode()}, child: FloatingActionButton( backgroundColor: tesoGold, onPressed: () => print(""), child: ImageIcon( AssetImage("assets/images/rawLogo.png"), size: SizeConfig.safeBlockHorizontal * 6.7, ), ), ); } }