import 'package:flutter/foundation.dart'; import '../mixins/disposable_change_notifier_mixin.dart'; import '../services/storage_service.dart'; /// Provider for managing hidden library state across the app. /// This ensures that when a library is hidden/unhidden in one screen, /// all other screens are automatically updated. class HiddenLibrariesProvider extends ChangeNotifier with DisposableChangeNotifierMixin { late StorageService _storageService; Set _hiddenLibraryKeys = {}; bool _isInitialized = false; Future? _initFuture; HiddenLibrariesProvider() { // Start initialization eagerly to reduce race conditions _initFuture = _initialize(); } /// Ensures the provider is initialized. Call this before accessing hidden /// libraries in contexts where you need the actual persisted values. Future ensureInitialized() => _initFuture ?? _initialize(); /// Check if the provider has completed initialization bool get isInitialized => _isInitialized; /// Get an unmodifiable copy of hidden library keys Set get hiddenLibraryKeys => Set.unmodifiable(_hiddenLibraryKeys); /// Initialize the provider by loading hidden libraries from storage Future _initialize() async { if (_isInitialized) return; _storageService = await StorageService.getInstance(); _hiddenLibraryKeys = _storageService.getHiddenLibraries(); _isInitialized = true; safeNotifyListeners(); } /// Hide a library by its key /// Updates both in-memory state and persistent storage Future hideLibrary(String libraryKey) async { if (!_isInitialized) await _initialize(); if (!_hiddenLibraryKeys.contains(libraryKey)) { _hiddenLibraryKeys = Set.from(_hiddenLibraryKeys)..add(libraryKey); await _storageService.saveHiddenLibraries(_hiddenLibraryKeys); safeNotifyListeners(); } } /// Unhide a library by its key /// Updates both in-memory state and persistent storage Future unhideLibrary(String libraryKey) async { if (!_isInitialized) await _initialize(); if (_hiddenLibraryKeys.contains(libraryKey)) { _hiddenLibraryKeys = Set.from(_hiddenLibraryKeys)..remove(libraryKey); await _storageService.saveHiddenLibraries(_hiddenLibraryKeys); safeNotifyListeners(); } } /// Check if a specific library is hidden bool isLibraryHidden(String libraryKey) => _hiddenLibraryKeys.contains(libraryKey); /// Refresh hidden libraries from storage /// Useful if storage was modified outside the provider Future refresh() async { _hiddenLibraryKeys = _storageService.getHiddenLibraries(); safeNotifyListeners(); } }