Files

61 lines
2.9 KiB
Dart

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<String> _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,
);
}
}