import 'dart:developer'; import 'package:easy_debounce/easy_debounce.dart'; import 'package:hydrated_bloc/hydrated_bloc.dart'; import '../../../../../storage/base/settings.dart'; import '../../../../../view/settings/defaultSettings.dart'; class SettingsCubit extends HydratedCubit { static const _debounceTag = 'settings_persist'; SettingsCubit() : super(DefaultSettings.get()); Settings val({bool write = false}) { if (write) { // Notify listeners immediately so the UI reflects the mutation right away; // debounce the actual persistence to disk to avoid hammering on rapid edits. _emitFreshInstance(); EasyDebounce.debounce(_debounceTag, const Duration(milliseconds: 500), _emitFreshInstance); } return state; } void _emitFreshInstance() { try { emit(Settings.fromJson(state.toJson())); } catch (e) { log('Failed to refresh settings state: $e'); } } Future reset() async { emit(DefaultSettings.get()); } @override Settings fromJson(Map json) { try { return Settings.fromJson(json); } catch (_) { try { return Settings.fromJson(_mergeSettings(json, DefaultSettings.get().toJson())); } catch (_) { return DefaultSettings.get(); } } } @override Map? toJson(Settings state) => state.toJson(); Map _mergeSettings(Map oldMap, Map newMap) { final merged = Map.from(newMap); oldMap.forEach((key, value) { if (merged.containsKey(key)) { if (value is Map && merged[key] is Map) { merged[key] = _mergeSettings(value, merged[key]); } else { merged[key] = value; } } }); return merged; } }