127 lines
3.9 KiB
Dart
127 lines
3.9 KiB
Dart
import 'dart:io';
|
|
import 'package:flutter/foundation.dart' show kIsWeb;
|
|
import 'package:get/get.dart';
|
|
import 'package:file_picker/file_picker.dart';
|
|
import 'package:path_provider/path_provider.dart';
|
|
import 'package:share_plus/share_plus.dart';
|
|
import 'dart:convert';
|
|
import '../helpers/filament_repository.dart';
|
|
import '../pages/list_view.dart';
|
|
import '../helpers/web_download_helper_stub.dart'
|
|
if (dart.library.html) '../helpers/web_download_helper.dart';
|
|
|
|
class HomeController extends GetxController {
|
|
void loadFilaments() {
|
|
// Navigiere zur Listenseite
|
|
Get.toNamed(ListPage.namedRoute);
|
|
}
|
|
|
|
Future<void> downloadFilaments() async {
|
|
try {
|
|
// JSON-Daten vom Repository holen
|
|
final jsonData = FilamentRepository.to.exportToJson();
|
|
|
|
if (kIsWeb) {
|
|
// Web: Download direkt im Browser
|
|
final fileName =
|
|
'filament_backup_${DateTime.now().millisecondsSinceEpoch}.json';
|
|
downloadJsonFileWeb(jsonData, fileName);
|
|
} else {
|
|
// Mobile/Desktop: Datei speichern und teilen
|
|
await _downloadForMobile(jsonData);
|
|
}
|
|
|
|
Get.snackbar(
|
|
'Erfolg',
|
|
'Backup wurde erstellt',
|
|
snackPosition: SnackPosition.BOTTOM,
|
|
backgroundColor: Get.theme.colorScheme.primary.withAlpha(26),
|
|
colorText: Get.theme.colorScheme.primary,
|
|
duration: Duration(seconds: 3),
|
|
);
|
|
} catch (e) {
|
|
Get.snackbar(
|
|
'Fehler',
|
|
'Backup konnte nicht erstellt werden: $e',
|
|
snackPosition: SnackPosition.BOTTOM,
|
|
backgroundColor: Get.theme.colorScheme.error.withAlpha(26),
|
|
colorText: Get.theme.colorScheme.error,
|
|
);
|
|
}
|
|
}
|
|
|
|
Future<void> _downloadForMobile(String jsonData) async {
|
|
// Temporäre Datei erstellen
|
|
final directory = await getTemporaryDirectory();
|
|
final fileName =
|
|
'filament_backup_${DateTime.now().millisecondsSinceEpoch}.json';
|
|
final file = File('${directory.path}/$fileName');
|
|
|
|
await file.writeAsString(jsonData);
|
|
|
|
// Datei über Share-Dialog teilen
|
|
await Share.shareXFiles([XFile(file.path)], text: 'Filament Backup');
|
|
}
|
|
|
|
Future<void> restoreFilaments() async {
|
|
try {
|
|
// Datei auswählen
|
|
FilePickerResult? result = await FilePicker.platform.pickFiles(
|
|
type: FileType.custom,
|
|
allowedExtensions: ['json'],
|
|
);
|
|
|
|
if (result != null) {
|
|
String? jsonData;
|
|
|
|
if (kIsWeb) {
|
|
// Web: Bytes direkt lesen
|
|
final bytes = result.files.first.bytes;
|
|
if (bytes != null) {
|
|
jsonData = utf8.decode(bytes);
|
|
}
|
|
} else {
|
|
// Mobile/Desktop: Datei von Pfad lesen
|
|
final path = result.files.first.path;
|
|
if (path != null) {
|
|
final file = File(path);
|
|
jsonData = await file.readAsString();
|
|
}
|
|
}
|
|
|
|
if (jsonData != null) {
|
|
// Daten importieren
|
|
final success = await FilamentRepository.to.importFromJson(jsonData);
|
|
|
|
if (success) {
|
|
Get.snackbar(
|
|
'Erfolg',
|
|
'Backup wurde erfolgreich wiederhergestellt',
|
|
snackPosition: SnackPosition.BOTTOM,
|
|
backgroundColor: Get.theme.colorScheme.primary.withAlpha(26),
|
|
colorText: Get.theme.colorScheme.primary,
|
|
duration: Duration(seconds: 3),
|
|
);
|
|
} else {
|
|
Get.snackbar(
|
|
'Fehler',
|
|
'Ungültige Backup-Datei',
|
|
snackPosition: SnackPosition.BOTTOM,
|
|
backgroundColor: Get.theme.colorScheme.error.withAlpha(26),
|
|
colorText: Get.theme.colorScheme.error,
|
|
);
|
|
}
|
|
}
|
|
}
|
|
} catch (e) {
|
|
Get.snackbar(
|
|
'Fehler',
|
|
'Wiederherstellung fehlgeschlagen: $e',
|
|
snackPosition: SnackPosition.BOTTOM,
|
|
backgroundColor: Get.theme.colorScheme.error.withAlpha(26),
|
|
colorText: Get.theme.colorScheme.error,
|
|
);
|
|
}
|
|
}
|
|
}
|