Эх сурвалжийг харах

feat: store user data on log in

Léo Salé 3 жил өмнө
parent
commit
a242d97d01

+ 20 - 9
app/lib/Services/AuthService.dart

@@ -1,12 +1,14 @@
 import 'package:cloud_firestore/cloud_firestore.dart';
 import 'package:firebase_auth/firebase_auth.dart';
 import 'package:physigo/Services/DatabaseManager.dart';
+import 'package:physigo/Services/logged_in_user.dart';
 
 class AuthenticationServices {
-  final FirebaseAuth _auth = FirebaseAuth.instance;
+  static final FirebaseAuth _auth = FirebaseAuth.instance;
+  static LoggedInUser? user;
 
   //Register a user
-  Future createNewUser(String address, bool anonymous, String birth, String name, String email, String password,
+  static Future createNewUser(String address, bool anonymous, String birth, String name, String email, String password,
       String phone, String sharedID, String surname) async {
     try {
       UserCredential result = await _auth.createUserWithEmailAndPassword(email: email, password: password);
@@ -21,23 +23,32 @@ class AuthenticationServices {
   }
 
   //LogIn with user
-  Future loginUser(String email, String password) async {
+  static Future loginUser(String email, String password) async {
     try {
       UserCredential result = await _auth.signInWithEmailAndPassword(email: email, password: password);
+      await getCurrentUser();
       return result.user;
     } catch (e) {
       print(e.toString());
     }
   }
 
-  Future<dynamic> getCurrentUser() async {
-    User? user = _auth.currentUser;
-    var querySnapshot =
-        await FirebaseFirestore.instance.collection('profileInfo').where('mail', isEqualTo: user?.email).get();
-    return querySnapshot;
+  static Future<LoggedInUser?> getCurrentUser() async {
+    if (user != null) {
+      return user;
+    }
+    if (_auth.currentUser == null) {
+      return null;
+    }
+    var querySnapshot = await FirebaseFirestore.instance
+        .collection('profileInfo')
+        .where('mail', isEqualTo: _auth.currentUser?.email)
+        .get();
+    user = LoggedInUser.fromMap(querySnapshot.docs.first.data());
+    return user;
   }
 
-  Stream<int> getPlace(dynamic user) async* {
+  static Stream<int> getPlace(dynamic user) async* {
     var users = await FirebaseFirestore.instance
         .collection('Users')
         .where("total_points", isGreaterThan: user["total_points"])

+ 22 - 0
app/lib/Services/logged_in_user.dart

@@ -0,0 +1,22 @@
+class LoggedInUser {
+  final String name;
+  final num totalPoints;
+  final dynamic weeklyPlace;
+  final String sharedId;
+
+  const LoggedInUser({
+    required this.name,
+    required this.totalPoints,
+    required this.weeklyPlace,
+    required this.sharedId,
+  });
+
+  factory LoggedInUser.fromMap(Map<String, dynamic> map) {
+    return LoggedInUser(
+      name: map["name"],
+      totalPoints: map["total_points"],
+      weeklyPlace: map["weekly_place"],
+      sharedId: map["shared_id"]
+    );
+  }
+}

+ 1 - 2
app/lib/SignupPage.dart

@@ -15,7 +15,6 @@ TextEditingController _passwd2 = TextEditingController();
 bool anonymous = false;
 String? _dateString;
 
-final AuthenticationServices _auth = AuthenticationServices();
 
 
 class SignupPage extends StatefulWidget {
@@ -305,7 +304,7 @@ class _SignupForm3 extends State<SignupForm3> {
 
   void createUser() async {
     dynamic result =
-        await _auth.createNewUser(_address.text, anonymous, _dateString.toString(), _name.text, _mail.text, _passwd.text,
+        await AuthenticationServices.createNewUser(_address.text, anonymous, _dateString.toString(), _name.text, _mail.text, _passwd.text,
             _phoneNumber.text, _username.text, _surname.text);
     if (result == null) {
       print('mail not valid');

+ 21 - 23
app/lib/currentUser.dart

@@ -1,11 +1,11 @@
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/widgets.dart';
+import 'package:physigo/Services/logged_in_user.dart';
 import 'Services/AuthService.dart';
 
 class CurrentUser extends StatefulWidget {
-  const CurrentUser( {
-    required this.name, Key? key}):super(key: key);
+  const CurrentUser({required this.name, Key? key}) : super(key: key);
   final String name;
   @override
   State<CurrentUser> createState() => _CurrentUserState();
@@ -13,20 +13,19 @@ class CurrentUser extends StatefulWidget {
 
 class _CurrentUserState extends State<CurrentUser> {
   final AuthenticationServices _auth = AuthenticationServices();
-  late dynamic user = _auth.getCurrentUser();
+  late Future<LoggedInUser?> user = AuthenticationServices.getCurrentUser();
 
   @override
   Widget build(BuildContext context) {
-    return FutureBuilder<dynamic>(
+    return FutureBuilder<LoggedInUser?>(
       future: user,
       builder: (context, snapshot) {
-        if(snapshot.connectionState == ConnectionState.waiting){
+        if (snapshot.connectionState == ConnectionState.waiting) {
           return const Text('Wait a moment');
-        }
-        else if(snapshot.connectionState == ConnectionState.done) {
-          dynamic user2 = snapshot.data.docs[0];
+        } else if (snapshot.connectionState == ConnectionState.done) {
+          LoggedInUser user2 = snapshot.data!;
           // DatabaseManager manager = DatabaseManager(widget.name);
-           Stream<int> place = _auth.getPlace(user2);
+          Stream<int> place = AuthenticationServices.getPlace(user2);
           return Row(
             children: [
               SizedBox(
@@ -36,29 +35,28 @@ class _CurrentUserState extends State<CurrentUser> {
               SizedBox(
                 height: 100,
                 width: 50,
-              child: StreamBuilder(
-                stream: place,
-                builder: (context, snapshot){
-                  return Text(
-                      "${snapshot.data}");
-                },
-              ),
+                child: StreamBuilder(
+                  stream: place,
+                  builder: (context, snapshot) {
+                    return Text("${snapshot.data}");
+                  },
+                ),
               ),
               SizedBox(
                 height: 100,
                 width: 135,
-                child: Text(user2["shared_id"]),
+                child: Text(user2.sharedId),
               ),
               SizedBox(
                 height: 100,
                 width: 60,
-                child: Text(user2["name"]),
-              ),
-              SizedBox(
-                height: 100,
-                width: 50,
-                child: Text("${user2[widget.name]}"),
+                child: Text(user2.name),
               ),
+              // SizedBox(
+              //   height: 100,
+              //   width: 50,
+              //   child: Text("${user2[widget.name]}"),
+              // ),
             ],
           );
         }

+ 1 - 1
app/lib/logIn.dart

@@ -65,7 +65,7 @@ class _LogIn extends State<LogIn> {
   }
 
   void signInUser() async {
-    dynamic authResult = await _auth.loginUser(_email.text, _passwd.text);
+    dynamic authResult = await AuthenticationServices.loginUser(_email.text, _passwd.text);
     if (authResult == null) {
       print("log in error");
     } else {

+ 26 - 17
app/lib/main.dart

@@ -1,5 +1,7 @@
 import 'package:firebase_core/firebase_core.dart';
 import 'package:flutter/material.dart';
+import 'package:physigo/Services/AuthService.dart';
+import 'package:physigo/Services/logged_in_user.dart';
 
 import 'firebase_options.dart';
 import 'push_notifications_initializer.dart';
@@ -24,22 +26,29 @@ class PhysiGo extends StatelessWidget {
   const PhysiGo({Key? key}) : super(key: key);
   @override
   Widget build(BuildContext context) {
-    return MaterialApp(
-      title: 'PhisyGo',
-      theme: ThemeData(
-        primarySwatch: Colors.blueGrey,
-      ),
-      initialRoute: '/mainPage',
-      routes: {
-        '/': (context) => MyHomePage(title: ''),
-        '/register': (context) => SignupPage(),
-        //'/register2': (context) => RegisterScreen2(title: ''),
-        //'/register3': (context) => RegisterScreen3(title: ''),
-        '/login': (context) => LogIn(title: ''),
-        '/profilePage': (context) => ProfilePage(title: ''),
-        '/mainPage': (context) => MainPage()
-      },
-      //home: const MyHomePage(title: 'Flutter Demo Home Page'),
-    );
+    return FutureBuilder<LoggedInUser?>(
+        future: AuthenticationServices.getCurrentUser(),
+        builder: (context, snapshot) {
+          if (snapshot.connectionState == ConnectionState.waiting) {
+            return const Center(child: CircularProgressIndicator());
+          }
+          return MaterialApp(
+            title: 'PhysiGo',
+            theme: ThemeData(
+              primarySwatch: Colors.blueGrey,
+            ),
+            initialRoute: snapshot.hasData ? '/mainPage' : "/",
+            routes: {
+              '/': (context) => MyHomePage(title: ''),
+              '/register': (context) => SignupPage(),
+              //'/register2': (context) => RegisterScreen2(title: ''),
+              //'/register3': (context) => RegisterScreen3(title: ''),
+              '/login': (context) => LogIn(title: ''),
+              '/profilePage': (context) => ProfilePage(title: ''),
+              '/mainPage': (context) => MainPage()
+            },
+            //home: const MyHomePage(title: 'Flutter Demo Home Page'),
+          );
+        });
   }
 }