public async Task <string> SignInWithTokenAsync(User storedUser, bool fireEvents = true) { try { LoggerService.Instance.Log("Account.SignInWithTokenAsync..."); IsLoading = true; UserInfo = null; if (storedUser == null) { LoggerService.Instance.Log("ERROR: Account.SignInWithTokenAsync: cannot get stored account"); var error = "There was an error logging in"; if (fireEvents) { await Fire_OnSignInComplete(SignedIn, error, false, SignInAErrorType.LoginError); } return(error); } if (!storedUser.IsTokenExpired()) { LoggerService.Instance.Log("Account.SignInWithTokenAsync: account token NOT expired. reusing it"); UserInfo = storedUser; await FetchUserCreditsAsync(); if (fireEvents) { await Fire_OnSignInComplete(SignedIn, null, false, SignInAErrorType.LoginError); } return(null); } var errorMessage = string.Empty; var response = await LoginClient.LoginWithToken(storedUser.AuthToken); if (response != null) { if (response.Success) { var newUser = response.Data.ToObject <User>(); newUser.Name = newUser.FirstName + "" + userInfo.LastName; if (!string.IsNullOrEmpty(newUser.Token)) { newUser.AuthToken = storedUser.AuthToken; UserInfo = newUser; await FetchUserCreditsAsync(); UserStoreService.Instance.SaveUserCredentials(newUser); } else { LoggerService.Instance.Log("ERROR: Account.SignInWithTokenAsync: token is null"); errorMessage = "There was an error logging in"; } } else if (response.ErrorCode == ErrorCodes.AUTH_TOKEN_LOGIN) { //The auth token must be invalid - reset user info and request input storedUser.Token = null; storedUser.AuthToken = null; UserInfo = null; UserStoreService.Instance.SaveUserCredentials(storedUser); errorMessage = response.ErrorMessageClean; } else { errorMessage = response.ErrorMessageClean; } } else { errorMessage = "There was an error logging in"; } if (!string.IsNullOrEmpty(errorMessage)) { LoggerService.Instance.Log("ERROR: Account.SignInWithTokenAsync: " + errorMessage); } else { LoggerService.Instance.Log("Account.SignInWithTokenAsync: success"); } OnPropertyChanged("SignedIn"); if (fireEvents) { await Fire_OnSignInComplete(SignedIn, errorMessage, false, SignInAErrorType.LoginError); } return(errorMessage); } catch (ThrottleException ex) { return(ex.Message); } finally { IsLoading = false; } }