From 26d84041c707bedb57e4da865640c639652e9ef8 Mon Sep 17 00:00:00 2001 From: zarzet Date: Mon, 12 Jan 2026 01:58:44 +0700 Subject: [PATCH] fix: initialize extension system at app start for proper search hint - Move extension system initialization to main.dart _EagerInitialization - Show default search hint until extension system is initialized - Watch extension state changes to update search hint dynamically --- lib/main.dart | 37 ++++++++++++++++++++++++++++++++++--- lib/screens/home_tab.dart | 11 ++++++++++- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index dbdb3dfd..e0ec75e4 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,7 +1,10 @@ +import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:path_provider/path_provider.dart'; import 'package:spotiflac_android/app.dart'; import 'package:spotiflac_android/providers/download_queue_provider.dart'; +import 'package:spotiflac_android/providers/extension_provider.dart'; import 'package:spotiflac_android/services/notification_service.dart'; import 'package:spotiflac_android/services/share_intent_service.dart'; @@ -24,14 +27,42 @@ void main() async { } /// Widget to eagerly initialize providers that need to load data on startup -class _EagerInitialization extends ConsumerWidget { +class _EagerInitialization extends ConsumerStatefulWidget { const _EagerInitialization({required this.child}); final Widget child; @override - Widget build(BuildContext context, WidgetRef ref) { + ConsumerState<_EagerInitialization> createState() => _EagerInitializationState(); +} + +class _EagerInitializationState extends ConsumerState<_EagerInitialization> { + @override + void initState() { + super.initState(); + _initializeExtensions(); + } + + Future _initializeExtensions() async { + try { + final appDir = await getApplicationDocumentsDirectory(); + final extensionsDir = '${appDir.path}/extensions'; + final dataDir = '${appDir.path}/extension_data'; + + // Create directories if needed + await Directory(extensionsDir).create(recursive: true); + await Directory(dataDir).create(recursive: true); + + // Initialize extension system + await ref.read(extensionProvider.notifier).initialize(extensionsDir, dataDir); + } catch (e) { + debugPrint('Failed to initialize extensions: $e'); + } + } + + @override + Widget build(BuildContext context) { // Eagerly initialize download history provider to load from storage ref.watch(downloadHistoryProvider); - return child; + return widget.child; } } diff --git a/lib/screens/home_tab.dart b/lib/screens/home_tab.dart index 280457a9..81adbf54 100644 --- a/lib/screens/home_tab.dart +++ b/lib/screens/home_tab.dart @@ -320,6 +320,10 @@ class _HomeTabState extends ConsumerState with AutomaticKeepAliveClient final error = ref.watch(trackProvider.select((s) => s.error)); final hasSearchedBefore = ref.watch(settingsProvider.select((s) => s.hasSearchedBefore)); + // Watch extension state to update search hint when extensions load/change + ref.watch(extensionProvider.select((s) => s.isInitialized)); + ref.watch(extensionProvider.select((s) => s.extensions)); + final colorScheme = Theme.of(context).colorScheme; final hasResults = _isTyping || tracks.isNotEmpty || (searchArtists != null && searchArtists.isNotEmpty) || isLoading; final screenHeight = MediaQuery.of(context).size.height; @@ -775,9 +779,14 @@ class _HomeTabState extends ConsumerState with AutomaticKeepAliveClient String _getSearchHint() { final settings = ref.read(settingsProvider); final searchProvider = settings.searchProvider; + final extState = ref.read(extensionProvider); + + // If extension system not initialized yet, show default hint + if (!extState.isInitialized) { + return 'Paste Spotify URL or search...'; + } if (searchProvider != null && searchProvider.isNotEmpty) { - final extState = ref.read(extensionProvider); final ext = extState.extensions.where((e) => e.id == searchProvider).firstOrNull; // Only show extension placeholder if extension exists AND is enabled if (ext != null && ext.enabled) {