implemented chat long-polling and optimistic updates, centralized notification management, optimized avatar caching
This commit is contained in:
+18
-9
@@ -36,7 +36,6 @@ class App extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _AppState extends State<App> with WidgetsBindingObserver {
|
||||
late Timer _refetchChats;
|
||||
late Timer _updateTimings;
|
||||
StreamSubscription<dynamic>? _timetableWidgetSync;
|
||||
// Tracked via the bottom-nav controller's listener so it always reflects the
|
||||
@@ -45,8 +44,25 @@ class _AppState extends State<App> with WidgetsBindingObserver {
|
||||
int _knownTotalTabs = 1;
|
||||
bool _userOnLastTab = false;
|
||||
|
||||
static const Duration _chatListActiveInterval = Duration(seconds: 15);
|
||||
static const Duration _chatListIdleInterval = Duration(seconds: 60);
|
||||
|
||||
void _onTabControllerChanged() {
|
||||
_userOnLastTab = Main.bottomNavigator.index == _knownTotalTabs - 1;
|
||||
_syncChatListPolling();
|
||||
}
|
||||
|
||||
void _syncChatListPolling() {
|
||||
if (!mounted) return;
|
||||
final modules = AppModule.getBottomBarModules(context);
|
||||
final talkSlot = modules.indexWhere((m) => m.module == Modules.talk);
|
||||
final talkIsActive =
|
||||
talkSlot >= 0 && Main.bottomNavigator.index == talkSlot;
|
||||
final bloc = context.read<ChatListBloc>();
|
||||
bloc.setAutoRefreshInterval(
|
||||
talkIsActive ? _chatListActiveInterval : _chatListIdleInterval,
|
||||
);
|
||||
if (talkIsActive) bloc.refresh();
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -138,19 +154,13 @@ class _AppState extends State<App> with WidgetsBindingObserver {
|
||||
ShareIntentListener.instance.attach();
|
||||
ShareIntentListener.pending.addListener(_handlePendingShare);
|
||||
_handlePendingShare();
|
||||
_syncChatListPolling();
|
||||
});
|
||||
|
||||
_updateTimings = Timer.periodic(const Duration(seconds: 30), (_) {
|
||||
if (mounted) setState(() {});
|
||||
});
|
||||
|
||||
_refetchChats = Timer.periodic(const Duration(seconds: 60), (_) {
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
if (!mounted) return;
|
||||
context.read<ChatListBloc>().refresh();
|
||||
});
|
||||
});
|
||||
|
||||
UpdateUserIndex.index();
|
||||
|
||||
if (context.read<SettingsCubit>().val().notificationSettings.enabled) {
|
||||
@@ -181,7 +191,6 @@ class _AppState extends State<App> with WidgetsBindingObserver {
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_refetchChats.cancel();
|
||||
_updateTimings.cancel();
|
||||
_timetableWidgetSync?.cancel();
|
||||
ShareIntentListener.pending.removeListener(_handlePendingShare);
|
||||
|
||||
Reference in New Issue
Block a user