import 'package:drift/drift.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../database/app_database.dart'; import 'database_provider.dart'; // ── All activities stream ───────────────────────────────────────────────────── final activitiesProvider = StreamProvider.autoDispose>((ref) { return ref.watch(activityDaoProvider).watchAllActivities(); }); // ── Activity frequency for charts ──────────────────────────────────────────── final activityFrequencyProvider = FutureProvider.autoDispose .family, ({DateTime start, DateTime end})>( (ref, range) => ref.watch(activityDaoProvider).getActivityFrequency(range.start, range.end), ); // ── Selected activities (used by log mood screen) ───────────────────────────── class SelectedActivities extends Notifier> { @override Set build() => {}; void toggle(int activityId) { if (state.contains(activityId)) { state = {...state}..remove(activityId); } else { state = {...state, activityId}; } } void clear() => state = {}; } final selectedActivitiesProvider = NotifierProvider.autoDispose>( SelectedActivities.new); // ── Activity notifier (create / delete custom activities) ───────────────────── class ActivityNotifier extends Notifier> { @override AsyncValue build() => const AsyncData(null); Future addActivity({ required String name, required int iconCodepoint, required String colourHex, }) async { state = const AsyncLoading(); final next = await AsyncValue.guard( () => ref.read(activityDaoProvider).insertActivity( ActivitiesCompanion.insert( name: name, iconCodepoint: iconCodepoint, colourHex: colourHex, isCustom: const Value(true), ), ), ); if (!ref.mounted) return; state = next; } Future deleteActivity(int id) async { state = const AsyncLoading(); final next = await AsyncValue.guard( () => ref.read(activityDaoProvider).deleteActivity(id), ); if (!ref.mounted) return; state = next; } } final activityNotifierProvider = NotifierProvider.autoDispose>( ActivityNotifier.new);