mirror of
https://github.com/FoggedLens/deflock-app.git
synced 2026-02-12 16:52:51 +00:00
91 lines
2.8 KiB
Dart
91 lines
2.8 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'dart:async';
|
|
|
|
enum NetworkIssueType { osmTiles, overpassApi, both }
|
|
|
|
class NetworkStatus extends ChangeNotifier {
|
|
static final NetworkStatus instance = NetworkStatus._();
|
|
NetworkStatus._();
|
|
|
|
bool _osmTilesHaveIssues = false;
|
|
bool _overpassHasIssues = false;
|
|
Timer? _osmRecoveryTimer;
|
|
Timer? _overpassRecoveryTimer;
|
|
|
|
// Getters
|
|
bool get hasAnyIssues => _osmTilesHaveIssues || _overpassHasIssues;
|
|
bool get osmTilesHaveIssues => _osmTilesHaveIssues;
|
|
bool get overpassHasIssues => _overpassHasIssues;
|
|
|
|
NetworkIssueType? get currentIssueType {
|
|
if (_osmTilesHaveIssues && _overpassHasIssues) return NetworkIssueType.both;
|
|
if (_osmTilesHaveIssues) return NetworkIssueType.osmTiles;
|
|
if (_overpassHasIssues) return NetworkIssueType.overpassApi;
|
|
return null;
|
|
}
|
|
|
|
/// Report OSM tile server issues
|
|
void reportOsmTileIssue() {
|
|
if (!_osmTilesHaveIssues) {
|
|
_osmTilesHaveIssues = true;
|
|
notifyListeners();
|
|
debugPrint('[NetworkStatus] OSM tile server issues detected');
|
|
}
|
|
|
|
// Reset recovery timer - if we keep getting errors, keep showing indicator
|
|
_osmRecoveryTimer?.cancel();
|
|
_osmRecoveryTimer = Timer(const Duration(minutes: 2), () {
|
|
_osmTilesHaveIssues = false;
|
|
notifyListeners();
|
|
debugPrint('[NetworkStatus] OSM tile server issues cleared');
|
|
});
|
|
}
|
|
|
|
/// Report Overpass API issues
|
|
void reportOverpassIssue() {
|
|
if (!_overpassHasIssues) {
|
|
_overpassHasIssues = true;
|
|
notifyListeners();
|
|
debugPrint('[NetworkStatus] Overpass API issues detected');
|
|
}
|
|
|
|
// Reset recovery timer
|
|
_overpassRecoveryTimer?.cancel();
|
|
_overpassRecoveryTimer = Timer(const Duration(minutes: 2), () {
|
|
_overpassHasIssues = false;
|
|
notifyListeners();
|
|
debugPrint('[NetworkStatus] Overpass API issues cleared');
|
|
});
|
|
}
|
|
|
|
/// Report successful operations to potentially clear issues faster
|
|
void reportOsmTileSuccess() {
|
|
// Don't immediately clear on single success, but reduce recovery time
|
|
if (_osmTilesHaveIssues) {
|
|
_osmRecoveryTimer?.cancel();
|
|
_osmRecoveryTimer = Timer(const Duration(seconds: 30), () {
|
|
_osmTilesHaveIssues = false;
|
|
notifyListeners();
|
|
debugPrint('[NetworkStatus] OSM tile server issues cleared after success');
|
|
});
|
|
}
|
|
}
|
|
|
|
void reportOverpassSuccess() {
|
|
if (_overpassHasIssues) {
|
|
_overpassRecoveryTimer?.cancel();
|
|
_overpassRecoveryTimer = Timer(const Duration(seconds: 30), () {
|
|
_overpassHasIssues = false;
|
|
notifyListeners();
|
|
debugPrint('[NetworkStatus] Overpass API issues cleared after success');
|
|
});
|
|
}
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
_osmRecoveryTimer?.cancel();
|
|
_overpassRecoveryTimer?.cancel();
|
|
super.dispose();
|
|
}
|
|
} |