You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

618 lines
20 KiB

3 years ago
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';
3 years ago
import 'Pages/home.dart';
3 years ago
class MainScreens extends StatefulWidget {
final List<CameraDescription> connectedCameras;
const MainScreens({Key key, this.connectedCameras}) : super(key: key);
@override
_MainScreensState createState() => _MainScreensState();
}
class _MainScreensState extends State<MainScreens>
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<UserProvider>(context, listen: false)
.connectionToServer(context);
Provider.of<UserProvider>(context, listen: false).getCurrentUser();
Provider.of<UserProvider>(context, listen: false).getUserInformation();
Provider.of<DeviceProvider>(context, listen: false).checkBackgroundMode();
Provider.of<UserProvider>(context, listen: false).getMonthlyStatus();
Provider.of<UserProvider>(context, listen: false).loadFriends();
Provider.of<UserProvider>(context, listen: false).getCoupons();
Provider.of<UserProvider>(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<String, dynamic> user =
jsonDecode(prefs.getString("currentUser")) as Map<String, dynamic>;
TesoUser currentuser = TesoUser.fromJSON(user);
Map<String, dynamic> 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) {
3 years ago
_scanQRCode();
3 years ago
} 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<String, String> 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<dynamic> 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: <Widget>[
3 years ago
Home(),
3 years ago
Explore(
connectedCameras: widget.connectedCameras,
),
Notifications(),
Personnal(
showSettings: settingsDialog,
),
],
),
Align(
alignment: Alignment.bottomCenter,
child: Consumer<UserProvider>(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();
}),
),
],
),
),
3 years ago
floatingActionButton: buildFAB(context),
3 years ago
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<String, dynamic> _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<void> 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<String, dynamic> _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 {
3 years ago
if (message == null || message.notification == null) return;
3 years ago
final Map<String, dynamic> _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<String, dynamic> olduser =
jsonDecode(currentSaveUser) as Map<String, dynamic>;
TesoUser user = TesoUser.fromJSON(olduser);
user.gold =
(int.parse(user.gold) + int.parse(_data["reward"])).toString();
Provider.of<UserProvider>(context, listen: false).setUser(user);
});
}
}
Widget bottomOptions(context) {
3 years ago
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>[
BottomNavigationBarItem(
icon: Icon(
Icons.home,
size: SizeConfig.safeBlockHorizontal * 6.7,
),
label: "Home",
tooltip: ""),
BottomNavigationBarItem(
icon: Icon(
Icons.search,
size: SizeConfig.safeBlockHorizontal * 6.7,
3 years ago
),
3 years ago
label: ("Explore"),
3 years ago
),
3 years ago
// 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(
onPressed: () => print(""),
child: ImageIcon(
AssetImage("assets/images/rawLogo.png"),
size: SizeConfig.safeBlockHorizontal * 6.7,
3 years ago
),
),
);
}
}