Files

54 lines
1.8 KiB
Dart
Raw Permalink Normal View History

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<bool>((ref) {
return ModelDownloadService().isModelPresent();
});
// ── Has the user chosen to skip the model requirement? ───────────────────────
class _SkipNotifier extends Notifier<bool> {
@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<AsyncValue<bool>> {
@override
AsyncValue<bool> build() => const AsyncData(false);
Future<void> 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, AsyncValue<bool>>(
ModelScanNotifier.new);