diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 3cb8c5e..51147d0 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -81,7 +81,16 @@ "import_data": "Daten importieren", "export_data": "Daten exportieren", "error": "Fehler", - "error_import": "Datei konnte nicht importiert werden", + + "import_success_title": "Import erfolgreich", + "import_success_message":"Die Spieldaten wurden erfolgreich importiert.", + "import_validation_error_title": "Validierung fehlgeschlagen", + "import_validation_error_message": "Es wurden keine Cabo-Counter Spieldaten gefunden. Bitte stellen Sie sicher, dass es sich um eine gültige Cabo-Counter Exportdatei handelt.", + "import_format_error_title": "Falsches Format", + "import_format_error_message": "Die Datei ist kein gültiges JSON-Format oder enthält ungültige Daten.", + "import_generic_error_title": "Import fehlgeschlagen", + "import_generic_error_message": "Der Import ist fehlgeschlagen.", + "error_export": "Datei konnte nicht exportiert werden", "error_found": "Fehler gefunden?", "create_issue": "Issue erstellen", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index f76e04a..a6b1a8f 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -81,7 +81,16 @@ "import_data": "Import Data", "export_data": "Export Data", "error": "Error", - "error_import": "Could not import file", + + "import_success_title": "Import successful", + "import_success_message":"The game data has been successfully imported.", + "import_validation_error_title": "Validation failed", + "import_validation_error_message": "No Cabo-Counter game data was found. Please make sure that this is a valid Cabo-Counter export file.", + "import_format_error_title": "Wrong format", + "import_format_error_message": "The file is not a valid JSON format or contains invalid data.", + "import_generic_error_title": "Import failed", + "import_generic_error_message": "The import has failed.", + "error_export": "Could not export file", "error_found": "Found a bug?", "create_issue": "Create Issue", diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index 1751ab7..a4e1edb 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -452,11 +452,53 @@ abstract class AppLocalizations { /// **'Fehler'** String get error; - /// No description provided for @error_import. + /// No description provided for @import_success_title. /// /// In de, this message translates to: - /// **'Datei konnte nicht importiert werden'** - String get error_import; + /// **'Import erfolgreich'** + String get import_success_title; + + /// No description provided for @import_success_message. + /// + /// In de, this message translates to: + /// **'Die Spieldaten wurden erfolgreich importiert.'** + String get import_success_message; + + /// No description provided for @import_validation_error_title. + /// + /// In de, this message translates to: + /// **'Validierung fehlgeschlagen'** + String get import_validation_error_title; + + /// No description provided for @import_validation_error_message. + /// + /// In de, this message translates to: + /// **'Es wurden keine Cabo-Counter Spieldaten gefunden. Bitte stellen Sie sicher, dass es sich um eine gültige Cabo-Counter Exportdatei handelt.'** + String get import_validation_error_message; + + /// No description provided for @import_format_error_title. + /// + /// In de, this message translates to: + /// **'Falsches Format'** + String get import_format_error_title; + + /// No description provided for @import_format_error_message. + /// + /// In de, this message translates to: + /// **'Die Datei ist kein gültiges JSON-Format oder enthält ungültige Daten.'** + String get import_format_error_message; + + /// No description provided for @import_generic_error_title. + /// + /// In de, this message translates to: + /// **'Import fehlgeschlagen'** + String get import_generic_error_title; + + /// No description provided for @import_generic_error_message. + /// + /// In de, this message translates to: + /// **'Der Import ist fehlgeschlagen.'** + String get import_generic_error_message; /// No description provided for @error_export. /// diff --git a/lib/l10n/app_localizations_de.dart b/lib/l10n/app_localizations_de.dart index 434b5f1..b06d454 100644 --- a/lib/l10n/app_localizations_de.dart +++ b/lib/l10n/app_localizations_de.dart @@ -195,7 +195,31 @@ class AppLocalizationsDe extends AppLocalizations { String get error => 'Fehler'; @override - String get error_import => 'Datei konnte nicht importiert werden'; + String get import_success_title => 'Import erfolgreich'; + + @override + String get import_success_message => + 'Die Spieldaten wurden erfolgreich importiert.'; + + @override + String get import_validation_error_title => 'Validierung fehlgeschlagen'; + + @override + String get import_validation_error_message => + 'Es wurden keine Cabo-Counter Spieldaten gefunden. Bitte stellen Sie sicher, dass es sich um eine gültige Cabo-Counter Exportdatei handelt.'; + + @override + String get import_format_error_title => 'Falsches Format'; + + @override + String get import_format_error_message => + 'Die Datei ist kein gültiges JSON-Format oder enthält ungültige Daten.'; + + @override + String get import_generic_error_title => 'Import fehlgeschlagen'; + + @override + String get import_generic_error_message => 'Der Import ist fehlgeschlagen.'; @override String get error_export => 'Datei konnte nicht exportiert werden'; diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index 64cdb77..2dfc72d 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -192,7 +192,31 @@ class AppLocalizationsEn extends AppLocalizations { String get error => 'Error'; @override - String get error_import => 'Could not import file'; + String get import_success_title => 'Import successful'; + + @override + String get import_success_message => + 'The game data has been successfully imported.'; + + @override + String get import_validation_error_title => 'Validation failed'; + + @override + String get import_validation_error_message => + 'No Cabo-Counter game data was found. Please make sure that this is a valid Cabo-Counter export file.'; + + @override + String get import_format_error_title => 'Wrong format'; + + @override + String get import_format_error_message => + 'The file is not a valid JSON format or contains invalid data.'; + + @override + String get import_generic_error_title => 'Import failed'; + + @override + String get import_generic_error_message => 'The import has failed.'; @override String get error_export => 'Could not export file'; diff --git a/lib/services/local_storage_service.dart b/lib/services/local_storage_service.dart index e3fddcc..6039a7b 100644 --- a/lib/services/local_storage_service.dart +++ b/lib/services/local_storage_service.dart @@ -9,6 +9,14 @@ import 'package:flutter/services.dart'; import 'package:json_schema/json_schema.dart'; import 'package:path_provider/path_provider.dart'; +enum ImportStatus { + success, + canceled, + validationError, + formatError, + genericError +} + class LocalStorageService { static const String _fileName = 'game_data.json'; @@ -111,7 +119,7 @@ class LocalStorageService { } /// Opens the file picker to import a JSON file and loads the game data from it. - static Future importJsonFile() async { + static Future importJsonFile() async { final result = await FilePicker.platform.pickFiles( dialogTitle: 'Wähle eine Datei mit Spieldaten aus', type: FileType.custom, @@ -121,14 +129,14 @@ class LocalStorageService { if (result == null) { print( '[local_storage_service.dart] Der Filepicker-Dialog wurde abgebrochen'); - return false; + return ImportStatus.canceled; } try { final jsonString = await _readFileContent(result.files.single); if (!await validateJsonSchema(jsonString)) { - return false; + return ImportStatus.validationError; } final jsonData = json.decode(jsonString) as List; gameManager.gameList = jsonData @@ -137,15 +145,16 @@ class LocalStorageService { .toList(); print( '[local_storage_service.dart] Die Datei wurde erfolgreich Importiertn'); - return true; + await saveGameSessions(); + return ImportStatus.success; } on FormatException catch (e) { print( '[local_storage_service.dart] Ungültiges JSON-Format. Exception: $e'); - return false; + return ImportStatus.formatError; } on Exception catch (e) { print( '[local_storage_service.dart] Fehler beim Dateizugriff. Exception: $e'); - return false; + return ImportStatus.genericError; } } diff --git a/lib/views/settings_view.dart b/lib/views/settings_view.dart index 53eb92d..b36347d 100644 --- a/lib/views/settings_view.dart +++ b/lib/views/settings_view.dart @@ -125,27 +125,7 @@ class _SettingsViewState extends State { onPressed: () async { final success = await LocalStorageService.importJsonFile(); - if (!success && context.mounted) { - showCupertinoDialog( - context: context, - builder: (context) => CupertinoAlertDialog( - title: Text( - AppLocalizations.of(context) - .error), - content: Text( - AppLocalizations.of(context) - .error_import), - actions: [ - CupertinoDialogAction( - child: Text( - AppLocalizations.of(context) - .ok), - onPressed: () => - Navigator.pop(context), - ), - ], - )); - } + showFeedbackDialog(success); }), const SizedBox( width: 20, @@ -236,4 +216,52 @@ class _SettingsViewState extends State { Future _getPackageInfo() async { return await PackageInfo.fromPlatform(); } + + void showFeedbackDialog(ImportStatus status) { + if (status == ImportStatus.canceled) return; + final (title, message) = _getDialogContent(status); + + showCupertinoDialog( + context: context, + builder: (context) { + return CupertinoAlertDialog( + title: Text(title), + content: Text(message), + actions: [ + CupertinoDialogAction( + child: Text(AppLocalizations.of(context).ok), + onPressed: () => Navigator.pop(context), + ), + ], + ); + }); + } + + (String, String) _getDialogContent(ImportStatus status) { + switch (status) { + case ImportStatus.success: + return ( + AppLocalizations.of(context).import_success_title, + AppLocalizations.of(context).import_success_message + ); + case ImportStatus.validationError: + return ( + AppLocalizations.of(context).import_validation_error_title, + AppLocalizations.of(context).import_validation_error_message + ); + + case ImportStatus.formatError: + return ( + AppLocalizations.of(context).import_format_error_title, + AppLocalizations.of(context).import_format_error_message + ); + case ImportStatus.genericError: + return ( + AppLocalizations.of(context).import_generic_error_title, + AppLocalizations.of(context).import_generic_error_message + ); + case ImportStatus.canceled: + return ('', ''); + } + } } diff --git a/pubspec.yaml b/pubspec.yaml index 7dc76bd..39afb1b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,7 +2,7 @@ name: cabo_counter description: "Mobile app for the card game Cabo" publish_to: 'none' -version: 0.3.3+256 +version: 0.3.3+265 environment: sdk: ^3.5.4