yumi-flutter/lib/services/home/home_room_preload_manager.dart
2026-05-09 18:31:48 +08:00

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;
}
}