Update signing configuration to use 88oakapps.feels identifiers

- Update App Group IDs from group.com.tt.feels to group.com.88oakapps.feels
- Update iCloud container IDs from iCloud.com.tt.feels to iCloud.com.88oakapps.feels
- Sync code constants with entitlements across all targets (iOS, Watch, Widget)
- Update documentation in CLAUDE.md and PROJECT_OVERVIEW.md

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Trey t
2026-01-29 10:01:49 -06:00
parent b6290403b0
commit 810ac2d649
28 changed files with 12289 additions and 13332 deletions

View File

@@ -241,29 +241,40 @@ struct FeelsTipModifier: ViewModifier {
let tip: any FeelsTip
let gradientColors: [Color]
@ObservedObject private var tipsManager = FeelsTipsManager.shared
// Use local state for sheet to avoid interference from other manager state changes
@State private var showSheet = false
@State private var hasCheckedEligibility = false
func body(content: Content) -> some View {
content
.onAppear {
tipsManager.showTipIfEligible(tip)
}
.sheet(isPresented: $tipsManager.showTipModal) {
if let currentTip = tipsManager.currentTip {
TipModalView(
icon: currentTip.icon,
title: currentTip.title,
message: currentTip.message,
gradientColors: gradientColors,
onDismiss: {
tipsManager.markTipAsShown(currentTip)
}
)
.presentationDetents([.height(340)])
.presentationDragIndicator(.visible)
.presentationCornerRadius(28)
// Only check eligibility once per view lifetime
guard !hasCheckedEligibility else { return }
hasCheckedEligibility = true
// Delay tip presentation to ensure view hierarchy is fully established
// This prevents "presenting from detached view controller" errors
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
if FeelsTipsManager.shared.shouldShowTip(tip) {
showSheet = true
}
}
}
.sheet(isPresented: $showSheet) {
TipModalView(
icon: tip.icon,
title: tip.title,
message: tip.message,
gradientColors: gradientColors,
onDismiss: {
showSheet = false
FeelsTipsManager.shared.markTipAsShown(tip)
}
)
.presentationDetents([.height(340)])
.presentationDragIndicator(.visible)
.presentationCornerRadius(28)
}
}
}