Update: 2026-06-30 23:32:14
This commit is contained in:
93
siro_admin/lib/views/admin/marketing/heatmap_page.dart
Normal file
93
siro_admin/lib/views/admin/marketing/heatmap_page.dart
Normal file
@@ -0,0 +1,93 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_map/flutter_map.dart';
|
||||
import 'package:latlong2/latlong.dart';
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:siro_admin/constant/links.dart';
|
||||
|
||||
class HeatmapPage extends StatefulWidget {
|
||||
const HeatmapPage({super.key});
|
||||
|
||||
@override
|
||||
State<HeatmapPage> createState() => _HeatmapPageState();
|
||||
}
|
||||
|
||||
class _HeatmapPageState extends State<HeatmapPage> {
|
||||
List<CircleMarker> _markers = [];
|
||||
bool _isLoading = true;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_fetchHeatmapData();
|
||||
}
|
||||
|
||||
Future<void> _fetchHeatmapData() async {
|
||||
try {
|
||||
final response = await Dio().get('${AppLink.server}/Admin/geofence/get_heatmap.php?days=7');
|
||||
|
||||
if (response.statusCode == 200 && response.data['status'] == 'success') {
|
||||
final data = response.data['data'] as List;
|
||||
|
||||
setState(() {
|
||||
_markers = data.map((point) {
|
||||
final lat = double.tryParse(point['latitude'].toString()) ?? 0.0;
|
||||
final lng = double.tryParse(point['longitude'].toString()) ?? 0.0;
|
||||
final source = point['source'].toString();
|
||||
|
||||
// Color logic:
|
||||
// Geofence trigger = Green (High intent/Campaign)
|
||||
// App Usage = Blue (Normal usage)
|
||||
// Silent Push = Orange (Background wake)
|
||||
Color markerColor = Colors.blue.withOpacity(0.5);
|
||||
if (source == 'geofence') {
|
||||
markerColor = Colors.green.withOpacity(0.7);
|
||||
} else if (source == 'silent_push') {
|
||||
markerColor = Colors.orange.withOpacity(0.5);
|
||||
}
|
||||
|
||||
return CircleMarker(
|
||||
point: LatLng(lat, lng),
|
||||
color: markerColor,
|
||||
borderStrokeWidth: 0,
|
||||
useRadiusInMeter: true,
|
||||
radius: 150, // 150 meters radius for visualization
|
||||
);
|
||||
}).toList();
|
||||
_isLoading = false;
|
||||
});
|
||||
}
|
||||
} catch (e) {
|
||||
debugPrint("Error fetching heatmap: $e");
|
||||
setState(() {
|
||||
_isLoading = false;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: const Text('خريطة النشاط الحرارية (Heatmap)'),
|
||||
centerTitle: true,
|
||||
),
|
||||
body: _isLoading
|
||||
? const Center(child: CircularProgressIndicator())
|
||||
: FlutterMap(
|
||||
options: const MapOptions(
|
||||
initialCenter: LatLng(31.9522, 35.9334), // Default to Amman
|
||||
initialZoom: 12.0,
|
||||
),
|
||||
children: [
|
||||
TileLayer(
|
||||
urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png',
|
||||
userAgentPackageName: 'com.siro.admin',
|
||||
),
|
||||
CircleLayer(
|
||||
circles: _markers,
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user