feat: set up Flutter project with drift database, Riverpod providers, and LLM service layer
- Configure dependencies: drift 2.32.x, flutter_riverpod 3.3.1, fl_chart 1.2.x, flutter_local_notifications 21.x, local_auth 3.x, and supporting packages - Drop riverpod_generator (incompatible analyzer version with drift_dev 2.32.x); convert all providers to manual Riverpod 3.x API using Notifier<T> and typed families - Define drift schema: MoodEntries, Activities, EntryActivities, Tags, EntryTags, LlmInsights, UserSettings with four DAOs (mood, activity, insight, settings) - Add LLM service abstraction (LlmService) and MediaPipe implementation - Fix SettingsDao.delete → deleteByKey to avoid shadowing drift's inherited delete method
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
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<List<Activity>>((ref) {
|
||||
return ref.watch(activityDaoProvider).watchAllActivities();
|
||||
});
|
||||
|
||||
// ── Activity frequency for charts ────────────────────────────────────────────
|
||||
|
||||
final activityFrequencyProvider = FutureProvider.autoDispose
|
||||
.family<Map<int, int>, ({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<Set<int>> {
|
||||
@override
|
||||
Set<int> build() => {};
|
||||
|
||||
void toggle(int activityId) {
|
||||
if (state.contains(activityId)) {
|
||||
state = <int>{...state}..remove(activityId);
|
||||
} else {
|
||||
state = {...state, activityId};
|
||||
}
|
||||
}
|
||||
|
||||
void clear() => state = {};
|
||||
}
|
||||
|
||||
final selectedActivitiesProvider =
|
||||
NotifierProvider.autoDispose<SelectedActivities, Set<int>>(
|
||||
SelectedActivities.new);
|
||||
|
||||
// ── Activity notifier (create / delete custom activities) ─────────────────────
|
||||
|
||||
class ActivityNotifier extends Notifier<AsyncValue<void>> {
|
||||
@override
|
||||
AsyncValue<void> build() => const AsyncData(null);
|
||||
|
||||
Future<void> addActivity({
|
||||
required String name,
|
||||
required int iconCodepoint,
|
||||
required String colourHex,
|
||||
}) async {
|
||||
state = const AsyncLoading();
|
||||
state = await AsyncValue.guard(
|
||||
() => ref.read(activityDaoProvider).insertActivity(
|
||||
ActivitiesCompanion.insert(
|
||||
name: name,
|
||||
iconCodepoint: iconCodepoint,
|
||||
colourHex: colourHex,
|
||||
isCustom: const Value(true),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> deleteActivity(int id) async {
|
||||
state = const AsyncLoading();
|
||||
state = await AsyncValue.guard(
|
||||
() => ref.read(activityDaoProvider).deleteActivity(id),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
final activityNotifierProvider =
|
||||
NotifierProvider.autoDispose<ActivityNotifier, AsyncValue<void>>(
|
||||
ActivityNotifier.new);
|
||||
Reference in New Issue
Block a user