This commit is contained in:
Artem Kokos
2026-04-14 00:02:02 +07:00
parent 1d31767ee0
commit 8198ea09ae
9 changed files with 403 additions and 4 deletions

View File

@@ -6,6 +6,8 @@ import 'package:geolocator/geolocator.dart';
import '../models/home_config.dart';
import '../services/api_client.dart';
import '../services/settings_service.dart';
import '../services/geofence_worker.dart';
import 'package:workmanager/workmanager.dart';
// ─── Сервисы ─────────────────────────────────────────────────
@@ -683,6 +685,37 @@ class AuthInfoNotifier extends Notifier<Map<String, dynamic>?> {
bool get isAdmin => state?['is_admin'] == true;
}
// ─── Геофенс: управление фоновым таском ─────────────────────
/// Синхронизировать состояние фонового таска с настройками домов.
/// Вызывать при старте приложения и при изменении настроек.
///
/// Если хотя бы один дом имеет geofenceReady -- регистрируем
/// периодический таск. Иначе -- отменяем.
Future<void> syncGeofenceTask(List<HomeConfig> homes) async {
final needGeofence = homes.any((h) => h.geofenceReady);
if (needGeofence) {
// Сбрасываем флаг "сработал" -- при открытии приложения
// считаем что пользователь снова дома (или осознанно включил)
await resetGeofenceFired();
await Workmanager().registerPeriodicTask(
geofenceTaskUniqueName,
geofenceTaskName,
frequency: const Duration(minutes: 15),
constraints: Constraints(
networkType: NetworkType.connected,
),
existingWorkPolicy: ExistingPeriodicWorkPolicy.replace,
backoffPolicy: BackoffPolicy.linear,
backoffPolicyDelay: const Duration(minutes: 1),
);
} else {
await Workmanager().cancelByUniqueName(geofenceTaskUniqueName);
}
}
// ─── Утилита: расчёт расстояния (Haversine) ──────────────────
double calculateDistanceKm(