import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; /// مصدر بلاطات الخرائط الموحّد لكل شاشات اللوحة. /// /// لماذا هذا الملف موجود: /// كانت خمس شاشات تكتب `urlTemplate` بنفسها، وأربع منها تشير مباشرة إلى /// `https://tile.openstreetmap.org/...`. سياسة استخدام بلاطات OpenStreetMap /// تمنع صراحةً هذا الاستعمال لتطبيق إنتاجي، والخوادم التطوّعية تحجب المخالفين — /// وهو سبب رسالة "Access Blocked: App is not following the Tile Usage Policy" /// واختفاء الخريطة في شاشة المراقب. /// /// التوحيد هنا يجعل تبديل المزوّد تعديل سطر واحد بدل خمسة. /// /// الافتراضي الحالي هو خرائط CARTO الأساسية (مجانية للاستعمال المعتدل ولا /// تحجب كخوادم OSM التطوّعية)، مع نسختين فاتحة وداكنة تتبعان ثيم اللوحة. /// للإنتاج بحِمل كبير: سجّل في MapTiler أو Stadia واضبط [tileUrlOverride] /// و[attributionOverride] بمفتاحك. class MapTiles { MapTiles._(); /// اضبطه لتجاوز المزوّد الافتراضي (مثلاً رابط MapTiler مع مفتاحك). /// اتركه فارغاً لاستخدام CARTO. static const String tileUrlOverride = ''; static const String attributionOverride = ''; static const String _cartoLight = 'https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png'; static const String _cartoDark = 'https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png'; static const List _subdomains = ['a', 'b', 'c', 'd']; /// عرّف عن التطبيق بوضوح — شرط في سياسة كل المزوّدين، وغيابه سبب شائع للحجب. static const String userAgent = 'com.siromove.admin'; static String urlFor(BuildContext context) { if (tileUrlOverride.isNotEmpty) return tileUrlOverride; return Theme.of(context).brightness == Brightness.dark ? _cartoDark : _cartoLight; } static String attributionFor(BuildContext context) { if (attributionOverride.isNotEmpty) return attributionOverride; return '© OpenStreetMap contributors © CARTO'; } /// طبقة البلاطات الجاهزة — استعملها بدل بناء [TileLayer] يدوياً. static TileLayer layer(BuildContext context) { return TileLayer( urlTemplate: urlFor(context), subdomains: tileUrlOverride.isEmpty ? _subdomains : const [], userAgentPackageName: userAgent, // الحد الأقصى الذي تخدمه معظم المزوّدات المجانية؛ تجاوزه يُرجع 404 // فتظهر الخريطة رمادية عند التقريب الشديد. maxNativeZoom: 19, ); } }