70 lines
1.7 KiB
Dart
70 lines
1.7 KiB
Dart
import 'package:connectivity_plus/connectivity_plus.dart';
|
|
import 'package:flutter/widgets.dart';
|
|
import 'package:http/http.dart' as http;
|
|
|
|
enum Status { network, maintenance, syncing }
|
|
|
|
class StatusProvider extends ChangeNotifier {
|
|
List<Status> _stack = [];
|
|
double _progress = 0.0;
|
|
|
|
StatusProvider() {
|
|
_handleNetworkChanges();
|
|
}
|
|
|
|
Status? getStatus() => _stack.length > 0 ? _stack[0] : null;
|
|
// Status progress from 0.0 to 1.0
|
|
double get progress => _progress;
|
|
|
|
void _handleNetworkChanges() {
|
|
Connectivity().onConnectivityChanged.listen((event) {
|
|
if (event == ConnectivityResult.none) {
|
|
if (!_stack.contains(Status.network)) {
|
|
_stack.insert(0, Status.network);
|
|
notifyListeners();
|
|
}
|
|
} else {
|
|
if (_stack.contains(Status.network)) {
|
|
_stack.remove(Status.network);
|
|
notifyListeners();
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
void triggerRequest(http.Response res) {
|
|
if (res.headers.containsKey("x-maintenance-mode") || res.statusCode == 503) {
|
|
if (!_stack.contains(Status.maintenance)) {
|
|
_stack.insert(0, Status.maintenance);
|
|
notifyListeners();
|
|
}
|
|
} else {
|
|
if (_stack.contains(Status.maintenance)) {
|
|
_stack.remove(Status.maintenance);
|
|
notifyListeners();
|
|
}
|
|
}
|
|
}
|
|
|
|
void triggerSync({required int current, required int max}) {
|
|
double prev = _progress;
|
|
|
|
if (!_stack.contains(Status.syncing)) {
|
|
_stack.add(Status.syncing);
|
|
notifyListeners();
|
|
}
|
|
|
|
if (max == 0) {
|
|
_progress = 0.0;
|
|
} else {
|
|
_progress = current / max;
|
|
}
|
|
|
|
if (_progress == 1.0) {
|
|
_stack.remove(Status.syncing);
|
|
_progress = 0.0;
|
|
notifyListeners();
|
|
} else if (progress != prev) notifyListeners();
|
|
}
|
|
}
|