Files
flux/lib/core/utils/version_check_service.dart

95 lines
2.9 KiB
Dart
Raw Permalink Normal View History

2026-06-04 15:21:11 +02:00
import 'dart:io';
2026-05-19 18:53:24 +02:00
import 'package:flutter/foundation.dart';
import 'package:package_info_plus/package_info_plus.dart';
import 'package:supabase_flutter/supabase_flutter.dart';
class VersionCheckService {
Future<String?> checkForceUpdate() async {
try {
2026-06-04 15:21:11 +02:00
// 1. Capiamo su che piattaforma sta girando l'app in questo istante
String currentPlatform = _getCurrentPlatform();
2026-05-19 18:53:24 +02:00
2026-06-04 15:21:11 +02:00
// 2. Recuperiamo SOLO la riga corrispondente alla nostra piattaforma
final dbResponse = await Supabase.instance.client
2026-05-19 18:53:24 +02:00
.from('app_config')
2026-06-04 15:21:11 +02:00
.select('min_version, download_url')
.eq('platform', currentPlatform)
.maybeSingle(); // Usiamo maybeSingle così se non c'è la riga non crasha
if (dbResponse == null) {
return null; // Nessuna regola per questa piattaforma
}
2026-05-19 18:53:24 +02:00
2026-06-04 15:21:11 +02:00
String minVersionFromDb = dbResponse['min_version'] as String;
String downloadUrl = dbResponse['download_url'] as String;
2026-05-19 18:53:24 +02:00
2026-06-04 15:21:11 +02:00
// 3. Recuperiamo la versione locale di Flutter
PackageInfo packageInfo = await PackageInfo.fromPlatform();
String localVersionRaw = packageInfo.version;
2026-05-19 18:53:24 +02:00
2026-06-04 15:21:11 +02:00
// 🥷 TRUCCO 1: Pulizia totale dai build number (+37) o tag "v"
String cleanLocal = localVersionRaw
.split('+')
.first
.replaceAll('v', '')
.trim();
String cleanDb = minVersionFromDb
.split('+')
.first
.replaceAll('v', '')
.trim();
2026-05-19 18:53:24 +02:00
2026-06-04 15:21:11 +02:00
// 🥷 TRUCCO 2: Confronto Semantico Reale
if (_isVersionLower(current: cleanLocal, minimum: cleanDb)) {
// Ritorna il link VERO per questa specifica piattaforma preso dal CSV!
return downloadUrl;
2026-05-19 18:53:24 +02:00
}
return null;
} catch (e) {
2026-06-04 15:21:11 +02:00
debugPrint("Errore durante il check versione: $e");
return null;
2026-05-19 18:53:24 +02:00
}
}
2026-06-04 15:21:11 +02:00
// Helper ninja per mappare le piattaforme in base alle stringhe del tuo DB
String _getCurrentPlatform() {
if (kIsWeb) return 'web';
if (Platform.isAndroid) return 'android';
if (Platform.isIOS) return 'ios';
if (Platform.isWindows) return 'windows';
if (Platform.isMacOS) return 'macos';
if (Platform.isLinux) return 'linux';
return 'unknown';
}
// Il motore matematico (resta invariato)
bool _isVersionLower({required String current, required String minimum}) {
if (current == minimum) return false;
2026-05-19 18:53:24 +02:00
List<int> currentParts = current
.split('.')
.map((e) => int.tryParse(e) ?? 0)
.toList();
2026-06-04 15:21:11 +02:00
List<int> minParts = minimum
2026-05-19 18:53:24 +02:00
.split('.')
.map((e) => int.tryParse(e) ?? 0)
.toList();
2026-06-04 15:21:11 +02:00
while (currentParts.length < 3) {
currentParts.add(0);
}
while (minParts.length < 3) {
minParts.add(0);
}
2026-05-19 18:53:24 +02:00
2026-06-04 15:21:11 +02:00
if (currentParts[0] != minParts[0]) {
return currentParts[0] < minParts[0];
}
if (currentParts[1] != minParts[1]) {
return currentParts[1] < minParts[1];
2026-05-19 18:53:24 +02:00
}
2026-06-04 15:21:11 +02:00
return currentParts[2] < minParts[2];
2026-05-19 18:53:24 +02:00
}
}