import 'dart:async'; import 'dart:io'; import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:internet_connection_checker/internet_connection_checker.dart'; class NetGuard { static final NetGuard _i = NetGuard._(); NetGuard._(); factory NetGuard() => _i; bool _notified = false; /// فحص: (أ) فيه شبكة؟ (ب) فيه انترنت؟ (ج) السيرفر نفسه reachable؟ Future hasInternet({Uri? mustReach}) async { final connectivity = await Connectivity().checkConnectivity(); if (connectivity == ConnectivityResult.none) return false; final hasNet = await InternetConnectionChecker.createInstance().hasConnection; if (!hasNet) return false; if (mustReach != null) { try { final host = mustReach.host; final result = await InternetAddress.lookup(host); if (result.isEmpty || result.first.rawAddress.isEmpty) return false; // اختباري خفيف عبر TCP (80/443) — 400ms timeout final port = mustReach.scheme == 'http' ? 80 : 443; final socket = await Socket.connect(host, port, timeout: const Duration(milliseconds: 400)); socket.destroy(); } catch (_) { return false; } } return true; } /// إظهار إشعار مرة واحدة ثم إسكات التكرارات void notifyOnce(void Function(String title, String msg) show) { if (_notified) return; _notified = true; show('لا يوجد اتصال بالإنترنت', 'تحقق من الشبكة ثم حاول مجددًا.'); // إعادة السماح بعد 15 ثانية Future.delayed(const Duration(seconds: 15), () => _notified = false); } }