refactor: merge profile cache into unified cache repository
This commit is contained in:
@@ -1,49 +1,30 @@
|
||||
import 'dart:async';
|
||||
|
||||
import '../../../users/data/models/user_response.dart';
|
||||
import 'user_profile_cache_repository.dart';
|
||||
|
||||
class SettingsUserCache {
|
||||
final UserProfileCacheRepository _repository;
|
||||
|
||||
SettingsUserCache(this._repository);
|
||||
|
||||
UserResponse? _cachedUser;
|
||||
Future<UserResponse>? _inflight;
|
||||
int _generation = 0;
|
||||
|
||||
UserResponse? get cachedUser => _cachedUser;
|
||||
|
||||
Future<UserResponse> getOrLoad(Future<UserResponse> Function() loader) {
|
||||
final cached = _cachedUser;
|
||||
if (cached != null) {
|
||||
return Future<UserResponse>.value(cached);
|
||||
}
|
||||
|
||||
final inflight = _inflight;
|
||||
if (inflight != null) {
|
||||
return inflight;
|
||||
}
|
||||
|
||||
final generation = _generation;
|
||||
late final Future<UserResponse> request;
|
||||
request = loader()
|
||||
.then((user) {
|
||||
if (generation == _generation) {
|
||||
_cachedUser = user;
|
||||
}
|
||||
return user;
|
||||
})
|
||||
.whenComplete(() {
|
||||
if (identical(_inflight, request)) {
|
||||
_inflight = null;
|
||||
}
|
||||
});
|
||||
|
||||
_inflight = request;
|
||||
return request;
|
||||
Future<UserResponse> getProfile({bool forceRefresh = false}) async {
|
||||
final user = await _repository.getProfile(forceRefresh: forceRefresh);
|
||||
_cachedUser = user;
|
||||
return user;
|
||||
}
|
||||
|
||||
void set(UserResponse user) {
|
||||
_cachedUser = user;
|
||||
unawaited(_repository.setCached(user));
|
||||
}
|
||||
|
||||
void invalidate() {
|
||||
_generation += 1;
|
||||
_cachedUser = null;
|
||||
_inflight = null;
|
||||
unawaited(_repository.invalidate());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user