import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../llm/model_download_service.dart'; import 'settings_provider.dart'; // ── Is the model file present on disk? ─────────────────────────────────────── final modelPresentProvider = FutureProvider((ref) { return ModelDownloadService().isModelPresent(); }); // ── Has the user chosen to skip the model requirement? ─────────────────────── class _SkipNotifier extends Notifier { @override bool build() => false; void skip() => state = true; } final modelSkippedProvider = NotifierProvider<_SkipNotifier, bool>(_SkipNotifier.new); // ── Scan notifier — checks for the model on demand ────────────────��────────── class ModelScanNotifier extends Notifier> { @override AsyncValue build() => const AsyncData(false); Future scan() async { state = const AsyncLoading(); final next = await AsyncValue.guard( () => ModelDownloadService().isModelPresent(), ); if (!ref.mounted) return; next.whenData((present) async { if (present) { await ref.read(settingsNotifierProvider.notifier).markModelDownloaded(); ref.invalidate(modelPresentProvider); } else { state = AsyncError( Exception('Model file not found at expected path'), StackTrace.current, ); } }); if (next is AsyncError) state = next; } void skipToApp() => ref.read(modelSkippedProvider.notifier).skip(); } final modelScanProvider = NotifierProvider.autoDispose>( ModelScanNotifier.new);