From abdda2be145306def1cba3facfe05fe2a8f8173a Mon Sep 17 00:00:00 2001 From: Jganenokk Date: Sat, 13 Jun 2026 23:06:54 +0700 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=BD=D0=B5=D0=B1=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D1=88=D0=B8=D0=B5=20=D1=84=D0=B8=D0=BA=D1=81=D1=8B=20=D0=BE?= =?UTF-8?q?=D1=82=20=D0=BB=D0=B8=D0=BD=D1=83=D1=81=D0=B0=20=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B2=D0=B0=D0=BB=D1=8C=D0=B4=D1=81=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/backend/modules/self_check.dart | 2 ++ lib/core/cache/self_presence.dart | 4 ++++ lib/frontend/screens/calls/calls_tab.dart | 25 +++++++++++++++++++++-- lib/main.dart | 3 ++- 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/lib/backend/modules/self_check.dart b/lib/backend/modules/self_check.dart index 610c8e9..96cb050 100644 --- a/lib/backend/modules/self_check.dart +++ b/lib/backend/modules/self_check.dart @@ -24,6 +24,8 @@ class SelfCheckService { _timer = Timer.periodic(interval, (_) => unawaited(_check())); } + void checkNow() => unawaited(_check()); + Future _check() async { final api = _api; if (api == null || api.state != SessionState.online) return; diff --git a/lib/core/cache/self_presence.dart b/lib/core/cache/self_presence.dart index 4f59d65..bef144c 100644 --- a/lib/core/cache/self_presence.dart +++ b/lib/core/cache/self_presence.dart @@ -11,6 +11,10 @@ class SelfPresence { isOnline.value = true; } + static void markOffline() { + isOnline.value = false; + } + static void markOfflineFromPing() { if (isOnline.value || lastSeenSeconds.value == null) { lastSeenSeconds.value = _nowSeconds; diff --git a/lib/frontend/screens/calls/calls_tab.dart b/lib/frontend/screens/calls/calls_tab.dart index d278eb9..8a9edd2 100644 --- a/lib/frontend/screens/calls/calls_tab.dart +++ b/lib/frontend/screens/calls/calls_tab.dart @@ -1,6 +1,10 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:material_symbols_icons/symbols.dart'; -import '../../../main.dart' show api; +import '../../../main.dart' show api, accountModule; +import '../../../backend/api.dart'; +import '../../../backend/modules/account.dart'; import '../../../core/storage/app_database.dart'; import '../../../core/utils/format.dart'; import '../../../backend/modules/calls.dart'; @@ -17,11 +21,28 @@ class _CallsTabState extends State { List _calls = []; bool _isLoading = true; int _selectedTabIndex = 0; // 0 for 'Все', 1 for 'Пропущенные' + StreamSubscription? _loginSub; @override void initState() { super.initState(); - _loadHistory(); + if (api.state == SessionState.online) { + _loadHistory(); + } else { + _loginSub = accountModule.loginStatusStream.listen((status) { + if (status == LoginStatus.success) { + _loginSub?.cancel(); + _loginSub = null; + _loadHistory(); + } + }); + } + } + + @override + void dispose() { + _loginSub?.cancel(); + super.dispose(); } Future _loadHistory() async { diff --git a/lib/main.dart b/lib/main.dart index fe5d080..a0f20df 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -127,7 +127,7 @@ void main() async { await FileHistoryCache.load(prefs); await DraftStore.instance.load(); await KometSettings.load(); - if (KometSettings.ghostMode.value) SelfPresence.markOfflineFromPing(); + if (KometSettings.ghostMode.value) SelfPresence.markOffline(); await ContactCache.load(); final initialFpsOverlay = prefs.getBool('dev_fps_overlay') ?? false; final initialVpnBypass = prefs.getBool(VpnBypassService.prefKey) ?? false; @@ -262,6 +262,7 @@ class KometAppState extends State CallController.instance.init(api); OutboxService.instance.init(api, messagesModule); SelfCheckService.instance.init(api); + SelfCheckService.instance.checkNow(); if (isOnemeFlavor) { await PushService.instance.init(api: api, account: accountModule); await PushService.instance.onLoginSuccess();