Files
numstation-flutter/lib/auth/custom_auth/custom_auth_manager.dart

136 lines
3.7 KiB
Dart
Raw Normal View History

2023-12-27 16:10:09 +08:00
import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'custom_auth_user_provider.dart';
export 'custom_auth_manager.dart';
const _kAuthTokenKey = '_auth_authentication_token_';
const _kRefreshTokenKey = '_auth_refresh_token_';
const _kTokenExpirationKey = '_auth_token_expiration_';
const _kUidKey = '_auth_uid_';
const _kUserDataKey = '_auth_user_data_';
class CustomAuthManager {
// Auth session attributes
String? authenticationToken;
String? refreshToken;
DateTime? tokenExpiration;
// User attributes
String? uid;
Future signOut() async {
authenticationToken = null;
refreshToken = null;
tokenExpiration = null;
uid = null;
// Update the current user.
numstationAuthUserSubject.add(
NumstationAuthUser(loggedIn: false),
);
persistAuthData();
}
Future<NumstationAuthUser?> signIn({
String? authenticationToken,
String? refreshToken,
DateTime? tokenExpiration,
String? authUid,
}) async =>
_updateCurrentUser(
authenticationToken: authenticationToken,
refreshToken: refreshToken,
tokenExpiration: tokenExpiration,
authUid: authUid,
);
void updateAuthUserData({
String? authenticationToken,
String? refreshToken,
DateTime? tokenExpiration,
String? authUid,
}) {
assert(
currentUser?.loggedIn ?? false,
'User must be logged in to update auth user data.',
);
_updateCurrentUser(
authenticationToken: authenticationToken,
refreshToken: refreshToken,
tokenExpiration: tokenExpiration,
authUid: authUid,
);
}
NumstationAuthUser? _updateCurrentUser({
String? authenticationToken,
String? refreshToken,
DateTime? tokenExpiration,
String? authUid,
}) {
this.authenticationToken = authenticationToken;
this.refreshToken = refreshToken;
this.tokenExpiration = tokenExpiration;
this.uid = authUid;
// Update the current user stream.
final updatedUser = NumstationAuthUser(
loggedIn: true,
uid: authUid,
);
numstationAuthUserSubject.add(updatedUser);
persistAuthData();
return updatedUser;
}
late SharedPreferences _prefs;
Future initialize() async {
_prefs = await SharedPreferences.getInstance();
try {
authenticationToken = _prefs.getString(_kAuthTokenKey);
refreshToken = _prefs.getString(_kRefreshTokenKey);
tokenExpiration = _prefs.getInt(_kTokenExpirationKey) != null
? DateTime.fromMillisecondsSinceEpoch(
_prefs.getInt(_kTokenExpirationKey)!)
: null;
uid = _prefs.getString(_kUidKey);
} catch (e) {
if (kDebugMode) {
print('Error initializing auth: $e');
}
return;
}
final authTokenExists = authenticationToken != null;
final tokenExpired =
tokenExpiration != null && tokenExpiration!.isBefore(DateTime.now());
final updatedUser = NumstationAuthUser(
loggedIn: authTokenExists && !tokenExpired,
uid: uid,
);
numstationAuthUserSubject.add(updatedUser);
}
void persistAuthData() {
authenticationToken != null
? _prefs.setString(_kAuthTokenKey, authenticationToken!)
: _prefs.remove(_kAuthTokenKey);
refreshToken != null
? _prefs.setString(_kRefreshTokenKey, refreshToken!)
: _prefs.remove(_kRefreshTokenKey);
tokenExpiration != null
? _prefs.setInt(
_kTokenExpirationKey, tokenExpiration!.millisecondsSinceEpoch)
: _prefs.remove(_kTokenExpirationKey);
uid != null ? _prefs.setString(_kUidKey, uid!) : _prefs.remove(_kUidKey);
}
}
NumstationAuthUser? currentUser;
bool get loggedIn => currentUser?.loggedIn ?? false;