From b9bfef44460aafba6820a5303e49b70fdd1c459d Mon Sep 17 00:00:00 2001 From: Carlos Date: Thu, 1 Jan 2026 10:11:16 +0100 Subject: [PATCH] fix: Use proper app support directory for config storage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move config.json from Documents folder to the proper application support directory (AppData\Roaming on Windows, ~/.local/share on Linux, ~/Library/Application Support on macOS). This fixes the app hanging on startup on Windows 11 25H2 when the Documents folder is inaccessible (OneDrive sync issues, permissions, network redirects, etc.). Changes: - Use getApplicationSupportDirectory() instead of getApplicationDocumentsDirectory() - Add 10-second timeout on directory resolution - Ensure directory exists before writing config - Add try-catch in SettingsBloc to emit error state instead of hanging Fixes: CCExtractor/ccextractor#1936 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- lib/bloc/settings_bloc/settings_bloc.dart | 15 ++++++++++----- lib/repositories/settings_repository.dart | 14 +++++++++++++- 2 files changed, 23 insertions(+), 6 deletions(-) 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'); }