mirror of
https://github.com/FoggedLens/deflock-app.git
synced 2026-02-12 16:52:51 +00:00
117 lines
3.3 KiB
Dart
117 lines
3.3 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'dart:async';
|
|
|
|
/// Simple enum-based network status for surveillance data requests.
|
|
/// Only tracks the latest user-initiated request - background requests are ignored.
|
|
enum NetworkRequestStatus {
|
|
idle, // No active requests
|
|
loading, // Request in progress
|
|
splitting, // Request being split due to limits/timeouts
|
|
success, // Data loaded successfully
|
|
timeout, // Request timed out
|
|
rateLimited, // API rate limited
|
|
noData, // No offline data available
|
|
error, // Other network errors
|
|
}
|
|
|
|
class NetworkStatus extends ChangeNotifier {
|
|
static final NetworkStatus instance = NetworkStatus._();
|
|
NetworkStatus._();
|
|
|
|
NetworkRequestStatus _status = NetworkRequestStatus.idle;
|
|
Timer? _autoResetTimer;
|
|
|
|
/// Current network status
|
|
NetworkRequestStatus get status => _status;
|
|
|
|
/// Set status and handle auto-reset timers
|
|
void _setStatus(NetworkRequestStatus newStatus) {
|
|
if (_status == newStatus) return;
|
|
|
|
_status = newStatus;
|
|
_autoResetTimer?.cancel();
|
|
|
|
// Auto-reset certain statuses after a delay
|
|
switch (newStatus) {
|
|
case NetworkRequestStatus.success:
|
|
_autoResetTimer = Timer(const Duration(seconds: 2), () {
|
|
_setStatus(NetworkRequestStatus.idle);
|
|
});
|
|
break;
|
|
case NetworkRequestStatus.timeout:
|
|
case NetworkRequestStatus.error:
|
|
_autoResetTimer = Timer(const Duration(seconds: 5), () {
|
|
_setStatus(NetworkRequestStatus.idle);
|
|
});
|
|
break;
|
|
case NetworkRequestStatus.noData:
|
|
_autoResetTimer = Timer(const Duration(seconds: 3), () {
|
|
_setStatus(NetworkRequestStatus.idle);
|
|
});
|
|
break;
|
|
case NetworkRequestStatus.rateLimited:
|
|
_autoResetTimer = Timer(const Duration(minutes: 2), () {
|
|
_setStatus(NetworkRequestStatus.idle);
|
|
});
|
|
break;
|
|
default:
|
|
// No auto-reset for idle, loading, splitting
|
|
break;
|
|
}
|
|
|
|
notifyListeners();
|
|
}
|
|
|
|
/// Start loading surveillance data
|
|
void setLoading() {
|
|
debugPrint('[NetworkStatus] Loading surveillance data');
|
|
_setStatus(NetworkRequestStatus.loading);
|
|
}
|
|
|
|
/// Request is being split due to complexity/limits
|
|
void setSplitting() {
|
|
debugPrint('[NetworkStatus] Splitting request due to complexity');
|
|
_setStatus(NetworkRequestStatus.splitting);
|
|
}
|
|
|
|
/// Data loaded successfully
|
|
void setSuccess() {
|
|
debugPrint('[NetworkStatus] Surveillance data loaded successfully');
|
|
_setStatus(NetworkRequestStatus.success);
|
|
}
|
|
|
|
/// Request timed out
|
|
void setTimeout() {
|
|
debugPrint('[NetworkStatus] Request timed out');
|
|
_setStatus(NetworkRequestStatus.timeout);
|
|
}
|
|
|
|
/// Rate limited by API
|
|
void setRateLimited() {
|
|
debugPrint('[NetworkStatus] Rate limited by API');
|
|
_setStatus(NetworkRequestStatus.rateLimited);
|
|
}
|
|
|
|
/// No offline data available
|
|
void setNoData() {
|
|
debugPrint('[NetworkStatus] No offline data available');
|
|
_setStatus(NetworkRequestStatus.noData);
|
|
}
|
|
|
|
/// Network or other error
|
|
void setError() {
|
|
debugPrint('[NetworkStatus] Network error occurred');
|
|
_setStatus(NetworkRequestStatus.error);
|
|
}
|
|
|
|
/// Clear status (force to idle)
|
|
void clear() {
|
|
_setStatus(NetworkRequestStatus.idle);
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
_autoResetTimer?.cancel();
|
|
super.dispose();
|
|
}
|
|
} |