Initial FeelAloud project
This commit is contained in:
92
Moment/AppIntent.swift
Normal file
92
Moment/AppIntent.swift
Normal file
@@ -0,0 +1,92 @@
|
||||
import AppIntents
|
||||
import Foundation
|
||||
import WidgetKit
|
||||
|
||||
enum MomentRatingValue: String, AppEnum {
|
||||
case veryGood = "Sehr gut"
|
||||
case good = "Gut"
|
||||
case middle = "Mittel"
|
||||
case bad = "Schlecht"
|
||||
case veryBad = "Sehr schlecht"
|
||||
|
||||
static var typeDisplayRepresentation = TypeDisplayRepresentation(name: "Stimmung")
|
||||
|
||||
static var caseDisplayRepresentations: [MomentRatingValue: DisplayRepresentation] = [
|
||||
.veryGood: "Sehr gut",
|
||||
.good: "Gut",
|
||||
.middle: "Mittel",
|
||||
.bad: "Schlecht",
|
||||
.veryBad: "Sehr schlecht"
|
||||
]
|
||||
|
||||
var emoji: String {
|
||||
switch self {
|
||||
case .veryGood: "😄"
|
||||
case .good: "🙂"
|
||||
case .middle: "😐"
|
||||
case .bad: "🙁"
|
||||
case .veryBad: "😞"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct TrackMomentIntent: AppIntent {
|
||||
static var title: LocalizedStringResource = "Momentaufnahme speichern"
|
||||
static var description = IntentDescription("Speichert eine schnelle Stimmungsabfrage aus dem Homescreen-Widget.")
|
||||
static var openAppWhenRun = true
|
||||
|
||||
@Parameter(title: "Stimmung")
|
||||
var rating: MomentRatingValue
|
||||
|
||||
init() {
|
||||
rating = .middle
|
||||
}
|
||||
|
||||
init(rating: MomentRatingValue) {
|
||||
self.rating = rating
|
||||
}
|
||||
|
||||
func perform() async throws -> some IntentResult {
|
||||
MomentWidgetStorage.enqueue(ratingRawValue: rating.rawValue)
|
||||
WidgetCenter.shared.reloadTimelines(ofKind: Moment.kind)
|
||||
return .result()
|
||||
}
|
||||
}
|
||||
|
||||
enum MomentWidgetStorage {
|
||||
static let appGroupIdentifier = "group.de.feelaloud"
|
||||
static let pendingSnapshotsKey = "pendingWidgetSnapshots"
|
||||
static let lastRatingKey = "lastWidgetSnapshotRating"
|
||||
static let lastRecordedAtKey = "lastWidgetSnapshotDate"
|
||||
|
||||
static var defaults: UserDefaults {
|
||||
UserDefaults(suiteName: appGroupIdentifier) ?? .standard
|
||||
}
|
||||
|
||||
static func enqueue(ratingRawValue: String) {
|
||||
let defaults = defaults
|
||||
var snapshots = pendingSnapshots(from: defaults)
|
||||
snapshots.append(PendingWidgetSnapshot(ratingRawValue: ratingRawValue, createdAt: .now))
|
||||
|
||||
if let data = try? JSONEncoder().encode(snapshots) {
|
||||
defaults.set(data, forKey: pendingSnapshotsKey)
|
||||
}
|
||||
|
||||
defaults.set(ratingRawValue, forKey: lastRatingKey)
|
||||
defaults.set(Date.now, forKey: lastRecordedAtKey)
|
||||
}
|
||||
|
||||
private static func pendingSnapshots(from defaults: UserDefaults) -> [PendingWidgetSnapshot] {
|
||||
guard let data = defaults.data(forKey: pendingSnapshotsKey),
|
||||
let snapshots = try? JSONDecoder().decode([PendingWidgetSnapshot].self, from: data) else {
|
||||
return []
|
||||
}
|
||||
|
||||
return snapshots
|
||||
}
|
||||
}
|
||||
|
||||
struct PendingWidgetSnapshot: Codable {
|
||||
var ratingRawValue: String
|
||||
var createdAt: Date
|
||||
}
|
||||
Reference in New Issue
Block a user