diff --git a/lib/bloc/settings_bloc/settings_bloc.dart b/lib/bloc/settings_bloc/settings_bloc.dart index 61284a8..66a2936 100644 --- a/lib/bloc/settings_bloc/settings_bloc.dart +++ b/lib/bloc/settings_bloc/settings_bloc.dart @@ -19,11 +19,16 @@ class SettingsBloc extends Bloc { Future _onCheckSettings( CheckSettingsEvent event, Emitter emit) async { - bool settingsStatus = await _settingsRepository.checkValidJSON(); - if (settingsStatus) { - add(GetSettingsEvent()); - } else { - emit(SettingsErrorState("Couldn't parse json file")); + try { + bool settingsStatus = await _settingsRepository.checkValidJSON(); + if (settingsStatus) { + add(GetSettingsEvent()); + } else { + // Config was invalid but has been rewritten with defaults, load it + add(GetSettingsEvent()); + } + } catch (e) { + emit(SettingsErrorState('Failed to initialize settings: $e')); } } diff --git a/lib/repositories/settings_repository.dart b/lib/repositories/settings_repository.dart index 7ecad00..9cb2b2a 100644 --- a/lib/repositories/settings_repository.dart +++ b/lib/repositories/settings_repository.dart @@ -9,12 +9,24 @@ import 'package:ccxgui/utils/logger.dart'; class SettingsRepository { Future get _localPath async { - final directory = await getApplicationDocumentsDirectory(); + // Use application support directory instead of documents directory. + // On Windows this is AppData\Roaming, on macOS ~/Library/Application Support, + // on Linux ~/.local/share. This is the proper location for app config files + // and avoids issues with OneDrive sync, permissions, etc. + final directory = await getApplicationSupportDirectory() + .timeout(const Duration(seconds: 10), onTimeout: () { + throw Exception('Timeout getting application support directory'); + }); return directory.path; } Future get _localFile async { final path = await _localPath; + // Ensure directory exists before returning file reference + final dir = Directory(path); + if (!await dir.exists()) { + await dir.create(recursive: true); + } return File('$path/config.json'); }