diff --git a/lib/helpers/account_credentials_helper.dart b/lib/helpers/account_credentials_helper.dart index 22b2523..e5bea76 100644 --- a/lib/helpers/account_credentials_helper.dart +++ b/lib/helpers/account_credentials_helper.dart @@ -10,10 +10,6 @@ import 'package:shared_preferences/shared_preferences.dart'; /// @author Pierre HUBERT class AccountCredentialsHelper { - /// Checkout whether current user is signed in or not - Future signedIn() async { - return await get() != null; - } /// Set new login tokens Future set(LoginTokens tokens) async { diff --git a/lib/helpers/account_helper.dart b/lib/helpers/account_helper.dart index 9dc561e..5fdcd70 100644 --- a/lib/helpers/account_helper.dart +++ b/lib/helpers/account_helper.dart @@ -3,6 +3,7 @@ import 'package:comunic/helpers/api_helper.dart'; import 'package:comunic/models/api_request.dart'; import 'package:comunic/models/authentication_details.dart'; import 'package:comunic/models/login_tokens.dart'; +import 'package:shared_preferences/shared_preferences.dart'; /// Account helper /// @@ -16,6 +17,23 @@ enum AuthResult { } class AccountHelper { + static const _USER_ID_PREFERENCE_NAME = "user_id"; + + // Current user ID + static int _currentUserID = -1; + + /// Checkout whether current user is signed in or not + /// + /// Warning : This method MUST BE CALLED AT LEAST ONCE AFTER APP START !!! + Future signedIn() async { + bool signedIn = await AccountCredentialsHelper().get() != null; + + // Load current user ID for later use + if (signedIn && _currentUserID == -1) await _loadCurrentUserID(); + + return signedIn; + } + /// Sign in user Future signIn(AuthenticationDetails auth) async { final request = APIRequest(uri: "account/login"); @@ -31,17 +49,53 @@ class AccountHelper { return AuthResult.TOO_MANY_ATTEMPTS; else if (response.code != 200) return AuthResult.NETWORK_ERROR; - //Save login tokens + // Save login tokens final tokensObj = response.getObject()["tokens"]; await AccountCredentialsHelper() .set(LoginTokens(tokensObj["token1"], tokensObj["token2"])); + // Get current user ID + final userID = await _downloadCurrentUserID(); + if (userID == null) { + await signOut(); // We can not stay signed in without current user ID + return AuthResult.NETWORK_ERROR; + } + + // Save current user ID + final preferences = await SharedPreferences.getInstance(); + await preferences.setInt(_USER_ID_PREFERENCE_NAME, userID); + _currentUserID = userID; + return AuthResult.SUCCESS; } /// Sign out user Future signOut() async { await AccountCredentialsHelper().set(null); + _currentUserID = 0; } + /// Get current user ID from the server + Future _downloadCurrentUserID() async { + final response = await APIRequest( + uri: "user/getCurrentUserID", + needLogin: true, + ).exec(); + + if (response.code != 200) return null; + + return response.getObject()["userID"]; + } + + /// Get the ID of the currently signed in user + Future _loadCurrentUserID() async { + final preferences = await SharedPreferences.getInstance(); + _currentUserID = preferences.getInt(_USER_ID_PREFERENCE_NAME); + } + + /// Get the ID of the currently signed in user + static int getCurrentUserID() { + if (_currentUserID == -1) throw "Current user ID has not been loaded yet!"; + return _currentUserID; + } } diff --git a/lib/main.dart b/lib/main.dart index ad8700f..a37e685 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,4 +1,4 @@ -import 'package:comunic/helpers/account_credentials_helper.dart'; +import 'package:comunic/helpers/account_helper.dart'; import 'package:comunic/models/config.dart'; import 'package:comunic/ui/routes/home_route.dart'; import 'package:comunic/ui/routes/login_route.dart'; @@ -45,7 +45,7 @@ class _ComunicApplicationHomeState extends State { void initState() { super.initState(); - AccountCredentialsHelper().signedIn().then((v) { + AccountHelper().signedIn().then((v) { setState(() { _signedIn = v; });