1.0.5: Eating out slots, rule violations panel, Crashlytics, search bar fix

- Eating out: tap any empty slot → "Mark as eating out"; shows teal indicator,
  skipped by auto-assign, counts as complete, tap again to unmark
- Rule violations panel: access via wand long-press context menu when conflicts exist;
  shows all isRuleOverridden slots with Fix (clear) or Ignore (acknowledge) actions
- Firebase Crashlytics integrated: CrashlyticsService + dSYM upload build phase,
  isPremium property tracked per session
- PremiumSyncService: extracted premium state machine, StoreKit Transaction.updates
  listener, isPremium no longer synced via iCloud to avoid stale state
- StoreManager: analytics on purchase/restore, bundle ID fallback for product ID lookup
- Search bar contrast bug fixed: TextField now has explicit foreground color for dark mode
- WelcomeStepView: redesigned onboarding welcome screen with week preview
- Version bump: 1.0.5 build 22

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
alexandrev-tibco
2026-04-27 09:48:20 +02:00
parent 6c7e12b41f
commit 110807d239
111 changed files with 3116 additions and 154 deletions
+13 -2
View File
@@ -218,7 +218,8 @@ struct WeekCalendarView: View {
dayOfWeek: day,
mealType: mealType.rawValue,
dishId: preferred.dishId,
isRuleOverridden: preferred.isRuleOverridden
isRuleOverridden: preferred.isRuleOverridden,
isEatingOut: preferred.isEatingOut
)
}
@@ -279,6 +280,14 @@ struct WeekCalendarView: View {
} : nil
)
.draggable("slot:\(slot.slotId.uuidString)")
} else if let slot = slot, slot.isEatingOut {
EatingOutSlotView(mealType: mealType)
.contentShape(Rectangle())
.onTapGesture {
guard viewModel.canEditCurrentWeek else { return }
guard let live = liveSlot(for: slot) else { return }
viewModel.unmarkEatingOut(slot: live, plan: plan, settings: settings)
}
} else if let slot = slot {
EmptySlotView(mealType: mealType)
.contentShape(Rectangle())
@@ -309,6 +318,7 @@ struct WeekCalendarView: View {
let mealType: String
let dishId: UUID?
let isRuleOverridden: Bool
let isEatingOut: Bool
}
private var dishesSnapshotKey: String {
@@ -354,7 +364,8 @@ struct WeekCalendarView: View {
dayOfWeek: preferred.dayOfWeek,
mealType: preferred.mealType,
dishId: preferred.dishId,
isRuleOverridden: preferred.isRuleOverridden
isRuleOverridden: preferred.isRuleOverridden,
isEatingOut: preferred.isEatingOut
)
}