custom_auth_manager.dart 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. import 'dart:async';
  2. import 'dart:convert';
  3. import 'package:flutter/foundation.dart';
  4. import 'package:shared_preferences/shared_preferences.dart';
  5. import '/backend/schema/structs/index.dart';
  6. import 'custom_auth_user_provider.dart';
  7. export 'custom_auth_manager.dart';
  8. const _kAuthTokenKey = '_auth_authentication_token_';
  9. const _kRefreshTokenKey = '_auth_refresh_token_';
  10. const _kTokenExpirationKey = '_auth_token_expiration_';
  11. const _kUidKey = '_auth_uid_';
  12. const _kUserDataKey = '_auth_user_data_';
  13. class CustomAuthManager {
  14. // Auth session attributes
  15. String? authenticationToken;
  16. String? refreshToken;
  17. DateTime? tokenExpiration;
  18. // User attributes
  19. String? uid;
  20. UserStruct? userData;
  21. Future signOut() async {
  22. authenticationToken = null;
  23. refreshToken = null;
  24. tokenExpiration = null;
  25. uid = null;
  26. userData = null;
  27. // Update the current user.
  28. uitgaanskrantAuthUserSubject.add(
  29. UitgaanskrantAuthUser(loggedIn: false),
  30. );
  31. persistAuthData();
  32. }
  33. Future<UitgaanskrantAuthUser?> signIn({
  34. String? authenticationToken,
  35. String? refreshToken,
  36. DateTime? tokenExpiration,
  37. String? authUid,
  38. UserStruct? userData,
  39. }) async =>
  40. _updateCurrentUser(
  41. authenticationToken: authenticationToken,
  42. refreshToken: refreshToken,
  43. tokenExpiration: tokenExpiration,
  44. authUid: authUid,
  45. userData: userData,
  46. );
  47. void updateAuthUserData({
  48. String? authenticationToken,
  49. String? refreshToken,
  50. DateTime? tokenExpiration,
  51. String? authUid,
  52. UserStruct? userData,
  53. }) {
  54. assert(
  55. currentUser?.loggedIn ?? false,
  56. 'User must be logged in to update auth user data.',
  57. );
  58. _updateCurrentUser(
  59. authenticationToken: authenticationToken,
  60. refreshToken: refreshToken,
  61. tokenExpiration: tokenExpiration,
  62. authUid: authUid,
  63. userData: userData,
  64. );
  65. }
  66. UitgaanskrantAuthUser? _updateCurrentUser({
  67. String? authenticationToken,
  68. String? refreshToken,
  69. DateTime? tokenExpiration,
  70. String? authUid,
  71. UserStruct? userData,
  72. }) {
  73. this.authenticationToken = authenticationToken;
  74. this.refreshToken = refreshToken;
  75. this.tokenExpiration = tokenExpiration;
  76. this.uid = authUid;
  77. this.userData = userData;
  78. // Update the current user stream.
  79. final updatedUser = UitgaanskrantAuthUser(
  80. loggedIn: true,
  81. uid: authUid,
  82. userData: userData,
  83. );
  84. uitgaanskrantAuthUserSubject.add(updatedUser);
  85. persistAuthData();
  86. return updatedUser;
  87. }
  88. late SharedPreferences _prefs;
  89. Future initialize() async {
  90. _prefs = await SharedPreferences.getInstance();
  91. try {
  92. authenticationToken = _prefs.getString(_kAuthTokenKey);
  93. refreshToken = _prefs.getString(_kRefreshTokenKey);
  94. tokenExpiration = _prefs.getInt(_kTokenExpirationKey) != null
  95. ? DateTime.fromMillisecondsSinceEpoch(
  96. _prefs.getInt(_kTokenExpirationKey)!)
  97. : null;
  98. uid = _prefs.getString(_kUidKey);
  99. userData = _prefs.getString(_kUserDataKey) != null
  100. ? UserStruct.fromSerializableMap(
  101. (jsonDecode(_prefs.getString(_kUserDataKey)!) as Map)
  102. .cast<String, dynamic>(),
  103. )
  104. : null;
  105. } catch (e) {
  106. if (kDebugMode) {
  107. print('Error initializing auth: $e');
  108. }
  109. return;
  110. }
  111. final authTokenExists = authenticationToken != null;
  112. final tokenExpired =
  113. tokenExpiration != null && tokenExpiration!.isBefore(DateTime.now());
  114. final updatedUser = UitgaanskrantAuthUser(
  115. loggedIn: authTokenExists && !tokenExpired,
  116. uid: uid,
  117. userData: userData,
  118. );
  119. uitgaanskrantAuthUserSubject.add(updatedUser);
  120. }
  121. void persistAuthData() {
  122. authenticationToken != null
  123. ? _prefs.setString(_kAuthTokenKey, authenticationToken!)
  124. : _prefs.remove(_kAuthTokenKey);
  125. refreshToken != null
  126. ? _prefs.setString(_kRefreshTokenKey, refreshToken!)
  127. : _prefs.remove(_kRefreshTokenKey);
  128. tokenExpiration != null
  129. ? _prefs.setInt(
  130. _kTokenExpirationKey, tokenExpiration!.millisecondsSinceEpoch)
  131. : _prefs.remove(_kTokenExpirationKey);
  132. uid != null ? _prefs.setString(_kUidKey, uid!) : _prefs.remove(_kUidKey);
  133. userData != null
  134. ? _prefs.setString(
  135. _kUserDataKey, jsonEncode(userData!.toSerializableMap()))
  136. : _prefs.remove(_kUserDataKey);
  137. }
  138. }
  139. UitgaanskrantAuthUser? currentUser;
  140. bool get loggedIn => currentUser?.loggedIn ?? false;