From 93b40471430488b5cce6cb667035749b52e78eca Mon Sep 17 00:00:00 2001 From: zarzet Date: Mon, 12 Jan 2026 01:56:16 +0700 Subject: [PATCH] fix: persist extension enabled state and clear search provider when disabled - Save enabled state to settings store when extension is enabled/disabled - Restore enabled state from settings store when extension is loaded - Clear searchProvider setting when the extension is disabled - Update search hint to check if extension is still enabled --- go_backend/extension_manager.go | 16 ++++++++++++++++ lib/providers/extension_provider.dart | 10 ++++++++++ lib/screens/home_tab.dart | 11 ++++++++--- 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/go_backend/extension_manager.go b/go_backend/extension_manager.go index ade22a35..2270b70e 100644 --- a/go_backend/extension_manager.go +++ b/go_backend/extension_manager.go @@ -369,6 +369,13 @@ func (m *ExtensionManager) SetExtensionEnabled(extensionID string, enabled bool) ext.Enabled = enabled GoLog("[Extension] %s %s\n", extensionID, map[bool]string{true: "enabled", false: "disabled"}[enabled]) + + // Persist enabled state to settings store + store := GetExtensionSettingsStore() + if err := store.Set(extensionID, "_enabled", enabled); err != nil { + GoLog("[Extension] Failed to persist enabled state for %s: %v\n", extensionID, err) + } + return nil } @@ -457,6 +464,15 @@ func (m *ExtensionManager) loadExtensionFromDirectory(dirPath string) (*LoadedEx SourceDir: dirPath, } + // Restore enabled state from settings store + store := GetExtensionSettingsStore() + if enabledVal, err := store.Get(manifest.Name, "_enabled"); err == nil { + if enabled, ok := enabledVal.(bool); ok { + ext.Enabled = enabled + GoLog("[Extension] Restored enabled state for %s: %v\n", manifest.Name, enabled) + } + } + // Initialize Goja VM if err := m.initializeVM(ext); err != nil { ext.Error = err.Error() diff --git a/lib/providers/extension_provider.dart b/lib/providers/extension_provider.dart index c3b150a4..b6aa8a70 100644 --- a/lib/providers/extension_provider.dart +++ b/lib/providers/extension_provider.dart @@ -1,6 +1,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:spotiflac_android/services/platform_bridge.dart'; import 'package:spotiflac_android/utils/logger.dart'; +import 'package:spotiflac_android/providers/settings_provider.dart'; final _log = AppLogger('ExtensionProvider'); @@ -528,6 +529,15 @@ class ExtensionNotifier extends Notifier { }).toList(); state = state.copyWith(extensions: extensions); + + // If disabling an extension that is the current search provider, clear it + if (!enabled) { + final settings = ref.read(settingsProvider); + if (settings.searchProvider == extensionId) { + ref.read(settingsProvider.notifier).setSearchProvider(null); + _log.d('Cleared search provider because extension $extensionId was disabled'); + } + } } catch (e) { _log.e('Failed to set extension enabled: $e'); state = state.copyWith(error: e.toString()); diff --git a/lib/screens/home_tab.dart b/lib/screens/home_tab.dart index 44b6457d..280457a9 100644 --- a/lib/screens/home_tab.dart +++ b/lib/screens/home_tab.dart @@ -779,10 +779,15 @@ class _HomeTabState extends ConsumerState with AutomaticKeepAliveClient if (searchProvider != null && searchProvider.isNotEmpty) { final extState = ref.read(extensionProvider); final ext = extState.extensions.where((e) => e.id == searchProvider).firstOrNull; - if (ext?.searchBehavior?.placeholder != null) { - return ext!.searchBehavior!.placeholder!; + // Only show extension placeholder if extension exists AND is enabled + if (ext != null && ext.enabled) { + if (ext.searchBehavior?.placeholder != null) { + return ext.searchBehavior!.placeholder!; + } + return 'Search with ${ext.displayName}...'; } - return 'Search with ${ext?.displayName ?? 'extension'}...'; + // Extension not found or disabled - clear the search provider setting + // and return default hint } return 'Paste Spotify URL or search...'; }