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>? _partyRoomsFuture; List? _partyRooms; DateTime? _partyRoomsLoadedAt; void preloadInitialHomeRooms() { final token = AccountStorage().getToken(); if (AccountStorage().getCurrentUser() == null || token.isEmpty) { return; } unawaited( loadPartyRooms().catchError((error, stackTrace) { return []; }), ); } Future> loadPartyRooms({bool forceRefresh = false}) { if (!forceRefresh && _hasFreshPartyRoomCache) { return Future.value(List.from(_partyRooms!)); } if (!forceRefresh) { final pendingFuture = _partyRoomsFuture; if (pendingFuture != null) { return pendingFuture; } } final future = SCChatRoomRepository() .discovery(allRegion: true) .then((rooms) { _partyRooms = List.from(rooms); _partyRoomsLoadedAt = DateTime.now(); return List.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; } }