Files
front-hokm/lib/core/network/connectivity_service.dart
T

66 lines
2.0 KiB
Dart

import 'dart:async';
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart';
import '../config.dart';
/// وضعیتِ اینترنت را نگه می‌دارد: هم قطعِ رابطِ شبکه (وای‌فای/دیتا) و هم دسترسیِ
/// واقعی به سرور (با پینگِ سبکِ /health). [online] برای نمایشِ اوورلیِ «اتصال نیست».
class ConnectivityService {
ConnectivityService._();
static final ConnectivityService I = ConnectivityService._();
final ValueNotifier<bool> online = ValueNotifier<bool>(true);
final Connectivity _conn = Connectivity();
final Dio _dio = Dio(BaseOptions(
connectTimeout: const Duration(seconds: 4),
receiveTimeout: const Duration(seconds: 4),
));
StreamSubscription? _sub;
bool _checking = false;
Future<void> init() async {
_sub = _conn.onConnectivityChanged.listen(_onChange);
await recheck();
}
void _onChange(List<ConnectivityResult> results) {
final hasInterface =
results.any((r) => r != ConnectivityResult.none);
if (!hasInterface) {
online.value = false; // بی‌درنگ: رابطِ شبکه قطع است
} else {
_verify(); // رابط هست؛ دسترسیِ واقعی را بررسی کن
}
}
/// بررسیِ دستیِ اتصال (دکمه‌ی «تلاش مجدد»).
Future<void> recheck() async {
final results = await _conn.checkConnectivity();
final hasInterface = results.any((r) => r != ConnectivityResult.none);
if (!hasInterface) {
online.value = false;
return;
}
await _verify();
}
Future<void> _verify() async {
if (_checking) return;
_checking = true;
try {
final res = await _dio.get('${AppConfig.baseUrl}/health');
online.value = res.statusCode == 200;
} catch (_) {
online.value = false;
} finally {
_checking = false;
}
}
void dispose() => _sub?.cancel();
}