Files
Reflect/Shared/MoodEntryFunctions.swift
Trey t 0442eab1f8 Rebrand entire project from Feels to Reflect
Complete rename across all bundle IDs, App Groups, CloudKit containers,
StoreKit product IDs, data store filenames, URL schemes, logger subsystems,
Swift identifiers, user-facing strings (7 languages), file names, directory
names, Xcode project, schemes, assets, and documentation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 11:47:16 -06:00

68 lines
2.7 KiB
Swift

//
// MoodEntryFunctions.swift
// Reflect (iOS)
//
// Created by Trey Tartt on 2/19/22.
//
import Foundation
@MainActor
class MoodEntryFunctions {
static func padMoodEntriesForCalendar(entries grouped: [Int: [Int: [MoodEntryModel]]]) -> [Int: [Int: [MoodEntryModel]]] {
var newGrouped = [Int: [Int: [MoodEntryModel]]]()
let allYears = grouped.keys.sorted(by: > )
for year in allYears {
var newMonth = [Int: [MoodEntryModel]]()
let oldMonths = grouped[year]!
let monthKeys = oldMonths.keys.sorted(by: > )
for key in monthKeys {
if let entries = oldMonths[key] {
newMonth[key] = MoodEntryFunctions.padMoodEntriesMonth(monthEntries: entries)
}
newGrouped[year] = newMonth
}
}
return newGrouped
}
static func padMoodEntriesMonth(monthEntries entries: [MoodEntryModel]) -> [MoodEntryModel] {
let sortedEntries = entries.sorted(by: { $0.forDate < $1.forDate })
var mutableEntries = sortedEntries
if let firstDate = sortedEntries.first {
let date = firstDate.forDate
// if the first entry for a month is in the middle of the month we
// need to add in the missing entries, as placeholders, to the beignning to get
// the entries on the right day. think user downloads in the middle of the month
// and entry is on the 13th ... this needs to show on the 13th entry spot
var startOfMonth = date.startOfMonth
startOfMonth = Calendar.current.date(byAdding: .hour, value: 9, to: startOfMonth)!
let lastMissingDate = mutableEntries.first?.forDate ?? date.endOfMonth
var missingDates = Date.dates(from: startOfMonth, toDate: lastMissingDate, includingToDate: true)
missingDates = missingDates.dropLast()
for date in missingDates {
mutableEntries.insert(DataController.shared.generateObjectNotInArray(forDate: date, withMood: .placeholder), at: 0)
}
mutableEntries = mutableEntries.sorted(by: {
$0.forDate < $1.forDate
})
// fill in calendar day offset .. if month starts on wed we need to
// pad the beginning sun, mon, tues
if let firstDate = mutableEntries.first?.forDate {
let weekday = Int16(Calendar.current.component(.weekday, from: firstDate))
for _ in 1..<weekday {
mutableEntries.insert(DataController.shared.generateObjectNotInArray(withMood: .placeholder), at: 0)
}
}
}
return mutableEntries
}
}