Files
dailyou/lib/core/database/app_database.dart
T
stefwill 6f3fb74e7e feat: implement multi-step mood logging wizard
Adds sleep/energy/positivity/self-worth tracking columns to the database
(schema v2 migration), a new 5-option StepScale widget, per-answer chips
at the top of the screen, a 2×2 activity grid chip, and a full step-by-step
wizard flow: mood → sleep (first entry today only) → energy → positivity →
self-worth → activities → review+save.
2026-04-26 12:14:45 +10:00

113 lines
3.0 KiB
Dart

import 'package:flutter/foundation.dart';
import 'package:drift/drift.dart';
import 'package:drift_flutter/drift_flutter.dart';
import 'package:path_provider/path_provider.dart';
import 'tables.dart';
import 'daos/mood_dao.dart';
import 'daos/activity_dao.dart';
import 'daos/insight_dao.dart';
import 'daos/settings_dao.dart';
part 'app_database.g.dart';
@DriftDatabase(
tables: [
MoodEntries,
Activities,
EntryActivities,
Tags,
EntryTags,
LlmInsights,
UserSettings,
],
daos: [
MoodDao,
ActivityDao,
InsightDao,
SettingsDao,
],
)
class AppDatabase extends _$AppDatabase {
AppDatabase() : super(_openConnection());
@override
int get schemaVersion => 2;
@override
MigrationStrategy get migration => MigrationStrategy(
onCreate: (m) async {
await m.createAll();
await _seedDefaultActivities();
},
onUpgrade: (m, from, to) async {
if (from < 2) {
await m.addColumn(moodEntries,
moodEntries.sleepMinutes as GeneratedColumn<Object>);
await m.addColumn(moodEntries,
moodEntries.energyLevel as GeneratedColumn<Object>);
await m.addColumn(moodEntries,
moodEntries.positivityLevel as GeneratedColumn<Object>);
await m.addColumn(moodEntries,
moodEntries.selfWorthLevel as GeneratedColumn<Object>);
}
},
);
Future<void> _seedDefaultActivities() async {
final defaults = [
(
name: 'Exercise',
icon: 0xe567,
colour: '#FF6B6B'
), // Icons.fitness_center
(name: 'Good sleep', icon: 0xe7f5, colour: '#7B68EE'), // Icons.bedtime
(name: 'Social', icon: 0xe7ef, colour: '#FFB347'), // Icons.people
(name: 'Work', icon: 0xe8b6, colour: '#4FC3F7'), // Icons.work
(name: 'Food', icon: 0xe56c, colour: '#81C784'), // Icons.restaurant
(name: 'Reading', icon: 0xe865, colour: '#F06292'), // Icons.menu_book
(name: 'Outdoors', icon: 0xe1a1, colour: '#AED581'), // Icons.park
(
name: 'Family',
icon: 0xe8a1,
colour: '#FFD54F'
), // Icons.family_restroom
(
name: 'Meditation',
icon: 0xe7fb,
colour: '#80CBC4'
), // Icons.self_improvement
(name: 'Travel', icon: 0xe8b5, colour: '#FF8A65'), // Icons.flight
];
for (final (index, a) in defaults.indexed) {
await into(activities).insert(
ActivitiesCompanion.insert(
name: a.name,
iconCodepoint: a.icon,
colourHex: a.colour,
sortOrder: Value(index),
),
);
}
}
}
QueryExecutor _openConnection() {
if (kIsWeb) {
return driftDatabase(
name: 'lumina_db',
web: DriftWebOptions(
sqlite3Wasm: Uri.parse('sqlite3.wasm'),
driftWorker: Uri.parse('drift_worker.dart.js'),
),
);
}
return driftDatabase(
name: 'lumina_db',
native: DriftNativeOptions(
databaseDirectory: getApplicationSupportDirectory,
),
);
}