64 lines
1.9 KiB
Dart
64 lines
1.9 KiB
Dart
import 'dart:async';
|
|
|
|
import 'package:yumi/shared/business_logic/models/res/room_res.dart';
|
|
import 'package:yumi/shared/data_sources/sources/local/user_manager.dart';
|
|
import 'package:yumi/shared/data_sources/sources/repositories/sc_room_repository_imp.dart';
|
|
|
|
class SCHomeRoomPreloadManager {
|
|
SCHomeRoomPreloadManager._();
|
|
|
|
static final SCHomeRoomPreloadManager instance = SCHomeRoomPreloadManager._();
|
|
|
|
static const Duration _partyRoomCacheTtl = Duration(seconds: 30);
|
|
|
|
Future<List<SocialChatRoomRes>>? _partyRoomsFuture;
|
|
List<SocialChatRoomRes>? _partyRooms;
|
|
DateTime? _partyRoomsLoadedAt;
|
|
|
|
void preloadInitialHomeRooms() {
|
|
final token = AccountStorage().getToken();
|
|
if (AccountStorage().getCurrentUser() == null || token.isEmpty) {
|
|
return;
|
|
}
|
|
unawaited(
|
|
loadPartyRooms().catchError((error, stackTrace) {
|
|
return <SocialChatRoomRes>[];
|
|
}),
|
|
);
|
|
}
|
|
|
|
Future<List<SocialChatRoomRes>> loadPartyRooms({bool forceRefresh = false}) {
|
|
if (!forceRefresh && _hasFreshPartyRoomCache) {
|
|
return Future.value(List<SocialChatRoomRes>.from(_partyRooms!));
|
|
}
|
|
if (!forceRefresh) {
|
|
final pendingFuture = _partyRoomsFuture;
|
|
if (pendingFuture != null) {
|
|
return pendingFuture;
|
|
}
|
|
}
|
|
|
|
final future = SCChatRoomRepository()
|
|
.discovery(allRegion: true)
|
|
.then((rooms) {
|
|
_partyRooms = List<SocialChatRoomRes>.from(rooms);
|
|
_partyRoomsLoadedAt = DateTime.now();
|
|
return List<SocialChatRoomRes>.from(rooms);
|
|
})
|
|
.whenComplete(() {
|
|
_partyRoomsFuture = null;
|
|
});
|
|
_partyRoomsFuture = future;
|
|
return future;
|
|
}
|
|
|
|
bool get _hasFreshPartyRoomCache {
|
|
final rooms = _partyRooms;
|
|
final loadedAt = _partyRoomsLoadedAt;
|
|
if (rooms == null || loadedAt == null) {
|
|
return false;
|
|
}
|
|
return DateTime.now().difference(loadedAt) < _partyRoomCacheTtl;
|
|
}
|
|
}
|