Phase 3.1 WS2: FCM fallback Flutter + CC, unread badges, dynamic ping
- Control center: add mitra ping config UI (require ping toggle + interval)
- Mitra app StatusNotifier: honor require_ping and ping_interval_seconds
from API; skip heartbeat when ping not required
- Both apps: update notification services for FCM deep-linking
- mitra_app: handle chat_request (open_accept), session_closing
- client_app: handle session_closing, paired
- Unread badge providers:
- mitra_app: UnreadSessions provider (polls active-with-unread, badge
on active sessions button)
- client_app: UnreadCount provider (polls active-with-unread, badge
on _ActiveSessionCard)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -30,6 +30,8 @@ class StatusErrorData extends OnlineStatusData {
|
||||
@Riverpod(keepAlive: true)
|
||||
class OnlineStatus extends _$OnlineStatus {
|
||||
Timer? _heartbeatTimer;
|
||||
bool _requirePing = true;
|
||||
int _pingIntervalSeconds = 15;
|
||||
|
||||
@override
|
||||
OnlineStatusData build() => const StatusInitialData();
|
||||
@@ -38,6 +40,8 @@ class OnlineStatus extends _$OnlineStatus {
|
||||
try {
|
||||
final response = await ref.read(apiClientProvider).get('/api/mitra/status');
|
||||
final data = response['data'] as Map<String, dynamic>;
|
||||
_requirePing = data['require_ping'] as bool? ?? true;
|
||||
_pingIntervalSeconds = data['ping_interval_seconds'] as int? ?? 15;
|
||||
state = StatusLoadedData(isOnline: data['is_online'] as bool);
|
||||
} catch (e) {
|
||||
state = const StatusLoadedData(isOnline: false);
|
||||
@@ -48,7 +52,7 @@ class OnlineStatus extends _$OnlineStatus {
|
||||
state = const StatusLoadingData();
|
||||
try {
|
||||
await ref.read(apiClientProvider).post('/api/mitra/status/online');
|
||||
_startHeartbeat();
|
||||
if (_requirePing) _startHeartbeat();
|
||||
state = const StatusLoadedData(isOnline: true);
|
||||
} catch (e) {
|
||||
state = const StatusErrorData('Gagal mengubah status. Coba lagi.');
|
||||
@@ -67,11 +71,11 @@ class OnlineStatus extends _$OnlineStatus {
|
||||
}
|
||||
|
||||
void onAppPaused() {
|
||||
_stopHeartbeat();
|
||||
if (_requirePing) _stopHeartbeat();
|
||||
}
|
||||
|
||||
void onAppResumed() {
|
||||
if (state is StatusLoadedData && (state as StatusLoadedData).isOnline) {
|
||||
if (_requirePing && state is StatusLoadedData && (state as StatusLoadedData).isOnline) {
|
||||
_startHeartbeat();
|
||||
}
|
||||
load();
|
||||
@@ -79,7 +83,7 @@ class OnlineStatus extends _$OnlineStatus {
|
||||
|
||||
void _startHeartbeat() {
|
||||
_stopHeartbeat();
|
||||
_heartbeatTimer = Timer.periodic(const Duration(seconds: 15), (_) {
|
||||
_heartbeatTimer = Timer.periodic(Duration(seconds: _pingIntervalSeconds), (_) {
|
||||
_heartbeatTick();
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user