2023-12-21 09:14:40 +00:00
|
|
|
/// Created by Haoyi on 2021/7/26
|
|
|
|
|
|
|
|
|
|
part of "account_manager.dart";
|
|
|
|
|
|
|
|
|
|
extension AccountAuthExtension on AccountManager {
|
2024-03-07 03:46:50 +00:00
|
|
|
Future<FirebaseAccountAuth> _loginFirebase(GuruUser guruUser,
|
2023-12-21 09:14:40 +00:00
|
|
|
{bool canRefreshFirebaseToken = true}) async {
|
|
|
|
|
User? firebaseUser;
|
2024-03-07 03:46:50 +00:00
|
|
|
GuruUser newGuruUser = guruUser;
|
|
|
|
|
firebaseUser = await _authenticateFirebase(guruUser).catchError((error) {
|
2023-12-21 09:14:40 +00:00
|
|
|
Log.e("_authenticateFirebase error! $error", tag: "Account");
|
|
|
|
|
return null;
|
|
|
|
|
});
|
|
|
|
|
if (firebaseUser == null && canRefreshFirebaseToken) {
|
|
|
|
|
try {
|
2024-03-07 03:46:50 +00:00
|
|
|
newGuruUser = await _refreshFirebaseToken(guruUser);
|
|
|
|
|
return _loginFirebase(newGuruUser, canRefreshFirebaseToken: false);
|
2023-12-21 09:14:40 +00:00
|
|
|
} catch (error, stacktrace) {
|
2024-03-07 03:46:50 +00:00
|
|
|
return FirebaseAccountAuth(guruUser, firebaseUser: null);
|
2023-12-21 09:14:40 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-03-07 03:46:50 +00:00
|
|
|
return FirebaseAccountAuth(newGuruUser, firebaseUser: firebaseUser);
|
2023-12-21 09:14:40 +00:00
|
|
|
}
|
|
|
|
|
|
2024-03-07 03:46:50 +00:00
|
|
|
Future<GuruUser> _refreshFirebaseToken(GuruUser oldSaasUser) async {
|
2023-12-21 09:14:40 +00:00
|
|
|
return await GuruApi.instance
|
|
|
|
|
.renewFirebaseToken()
|
|
|
|
|
.then((tokenData) => oldSaasUser.copyWith(firebaseToken: tokenData.firebaseToken));
|
|
|
|
|
}
|
|
|
|
|
|
2024-03-07 03:46:50 +00:00
|
|
|
Future<User?> _authenticateFirebase(GuruUser guruUser) async {
|
2023-12-21 09:14:40 +00:00
|
|
|
int retry = 0;
|
|
|
|
|
dynamic lastError;
|
|
|
|
|
while (retry < 1) {
|
|
|
|
|
try {
|
2024-03-07 03:46:50 +00:00
|
|
|
Log.i("[$retry] _authenticateFirebase:${guruUser.firebaseToken}", tag: "Account");
|
2023-12-21 09:14:40 +00:00
|
|
|
|
|
|
|
|
return await FirebaseAuth.instance
|
2024-03-07 03:46:50 +00:00
|
|
|
.signInWithCustomToken(guruUser.firebaseToken)
|
2023-12-21 09:14:40 +00:00
|
|
|
.then((result) => result.user);
|
|
|
|
|
} catch (error, stacktrace) {
|
|
|
|
|
await Future.delayed(const Duration(milliseconds: 600));
|
|
|
|
|
retry++;
|
|
|
|
|
Log.i("[$retry] _authenticateFirebase error :$error, $stacktrace", tag: "Account");
|
|
|
|
|
lastError = error;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
throw lastError ?? ("_authenticateFirebase error!");
|
|
|
|
|
}
|
2024-03-07 03:46:50 +00:00
|
|
|
|
|
|
|
|
Future<bool> authenticateFirebase() async {
|
|
|
|
|
final guruUser = accountDataStore.user;
|
|
|
|
|
if (guruUser == null) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
try {
|
|
|
|
|
final auth = await _loginFirebase(guruUser);
|
|
|
|
|
final newGuruUser = auth.user;
|
|
|
|
|
if (!guruUser.isSame(newGuruUser)) {
|
|
|
|
|
_updateGuruUser(newGuruUser);
|
|
|
|
|
}
|
|
|
|
|
if (auth.firebaseUser != null) {
|
|
|
|
|
_updateFirebaseUser(auth.firebaseUser!);
|
|
|
|
|
Log.i("_updateFirebaseUser success!", tag: "Account");
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
} catch (error, stacktrace) {
|
|
|
|
|
GuruAnalytics.instance.logException(error, stacktrace: stacktrace);
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2023-12-21 09:14:40 +00:00
|
|
|
}
|