Add guided reflection flow with mood-adaptive CBT/ACT questions

Walks users through 3-4 guided questions based on mood category:
positive (great/good) gets gratitude-oriented questions, neutral
(average) gets exploratory questions, and negative (bad/horrible)
gets empathetic questions. Stored as JSON in MoodEntryModel,
integrated into PDF reports, AI summaries, and CSV export.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Trey t
2026-03-11 10:51:36 -05:00
parent 19b4c8b05b
commit 5bd8f8076a
13 changed files with 15340 additions and 13617 deletions

View File

@@ -54,7 +54,7 @@ class ExportService {
// MARK: - CSV Export
func generateCSV(entries: [MoodEntryModel]) -> String {
var csv = "Date,Mood,Mood Value,Notes,Weekday,Entry Type,Timestamp\n"
var csv = "Date,Mood,Mood Value,Notes,Reflection,Weekday,Entry Type,Timestamp\n"
let sortedEntries = entries.sorted { $0.forDate > $1.forDate }
@@ -63,11 +63,14 @@ class ExportService {
let mood = entry.mood.widgetDisplayName
let moodValue = entry.moodValue + 1 // 1-5 scale
let notes = escapeCSV(entry.notes ?? "")
let reflectionText = entry.reflectionJSON
.flatMap { GuidedReflection.decode(from: $0) }
.map { $0.responses.filter { !$0.answer.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty }.map { "Q: \($0.question) A: \($0.answer)" }.joined(separator: " | ") } ?? ""
let weekday = weekdayName(from: entry.weekDay)
let entryType = EntryType(rawValue: entry.entryType)?.description ?? "Unknown"
let timestamp = isoFormatter.string(from: entry.timestamp)
csv += "\(date),\(mood),\(moodValue),\(notes),\(weekday),\(entryType),\(timestamp)\n"
csv += "\(date),\(mood),\(moodValue),\(notes),\(escapeCSV(reflectionText)),\(weekday),\(entryType),\(timestamp)\n"
}
return csv