CarbPresetIntentRequest.swift 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import CoreData
  2. import Foundation
  3. final class CarbPresetIntentRequest: BaseIntentsRequest {
  4. func addCarbs(
  5. _ quantityCarbs: Int,
  6. _ quantityFat: Int,
  7. _ quantityProtein: Int,
  8. _ dateAdded: Date,
  9. _ note: String?,
  10. _ dateDefinedByUser: Bool
  11. ) async throws -> String {
  12. guard quantityCarbs >= 0 || quantityFat >= 0 || quantityProtein >= 0 else {
  13. return "Amount must be positive."
  14. }
  15. try await carbsStorage.storeCarbs(
  16. [CarbsEntry(
  17. id: UUID().uuidString,
  18. createdAt: dateAdded,
  19. actualDate: dateAdded,
  20. carbs: Decimal(quantityCarbs),
  21. fat: Decimal(quantityFat),
  22. protein: Decimal(quantityProtein),
  23. note: (note?.isEmpty ?? true) ? "Via Shortcut" : note!,
  24. enteredBy: CarbsEntry.local,
  25. isFPU: false, fpuID: nil
  26. )],
  27. areFetchedFromRemote: false
  28. )
  29. var resultDisplay: String
  30. resultDisplay = String(localized: "Added \(quantityCarbs) g carbs")
  31. if quantityFat > 0 {
  32. resultDisplay = String(localized: "\(resultDisplay) and \(quantityFat) g fat")
  33. }
  34. if quantityProtein > 0 {
  35. resultDisplay = String(localized: "\(resultDisplay) and \(quantityProtein) g protein")
  36. }
  37. if dateDefinedByUser {
  38. let dateFormatter = DateFormatter()
  39. dateFormatter.dateStyle = .none
  40. dateFormatter.timeStyle = .short
  41. let hourName = dateFormatter.string(from: dateAdded)
  42. resultDisplay = String(localized: "\(resultDisplay) at \(hourName)")
  43. let dayStatus = determineDateStatus(dateAdded)
  44. if let dayStatus = dayStatus {
  45. resultDisplay = String(localized: "\(resultDisplay) \(dayStatus)")
  46. }
  47. }
  48. return resultDisplay
  49. }
  50. func determineDateStatus(_ date: Date) -> LocalizedStringResource? {
  51. let calendar = Calendar.current
  52. let now = Date()
  53. let dateStartOfDay = calendar.startOfDay(for: date)
  54. let nowStartOfDay = calendar.startOfDay(for: now)
  55. let components = calendar.dateComponents([.day], from: nowStartOfDay, to: dateStartOfDay)
  56. if let dayDifference = components.day {
  57. switch dayDifference {
  58. case -1:
  59. return LocalizedStringResource(stringLiteral: "Yesterday")
  60. case 0:
  61. return nil
  62. case 1:
  63. return LocalizedStringResource(stringLiteral: "Tomorrow")
  64. default:
  65. return nil
  66. }
  67. }
  68. return nil
  69. }
  70. }