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
@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>API_KEY</key>
<string>AIzaSyBkDgBKsgudAAwsWErzLviIWm3dir4bHCc</string>
<key>GCM_SENDER_ID</key>
<string>442954975324</string>
<key>PLIST_VERSION</key>
<string>1</string>
<key>BUNDLE_ID</key>
<string>com.alexandrevazquez.mealmood</string>
<key>PROJECT_ID</key>
<string>mealmood</string>
<key>STORAGE_BUCKET</key>
<string>mealmood.firebasestorage.app</string>
<key>IS_ADS_ENABLED</key>
<true></true>
<key>IS_ANALYTICS_ENABLED</key>
<true></true>
<key>IS_APPINVITE_ENABLED</key>
<true></true>
<key>IS_GCM_ENABLED</key>
<true></true>
<key>IS_SIGNIN_ENABLED</key>
<true></true>
<key>GOOGLE_APP_ID</key>
<string>1:442954975324:ios:f6fd3a3bf28b6f3d59be99</string>
</dict>
</plist>
+2 -2
View File
@@ -15,9 +15,9 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0.4</string>
<string>1.0.5</string>
<key>CFBundleVersion</key>
<string>21</string>
<string>22</string>
<key>GADApplicationIdentifier</key>
<string>ca-app-pub-1549720748100858~9985112590</string>
<key>LSRequiresIPhoneOS</key>
+4
View File
@@ -8,5 +8,9 @@
</array>
<key>com.apple.developer.ubiquity-kvstore-identifier</key>
<string>$(TeamIdentifierPrefix)$(CFBundleIdentifier)</string>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.alexandrevazquez.mealmood</string>
</array>
</dict>
</plist>
@@ -298,3 +298,15 @@
// Onboarding preview
"onboarding_welcome_preview_label" = "So könnte deine Woche aussehen ✨";
// Auswärts essen
"slot_eating_out" = "Auswärts";
"home_mark_eating_out" = "Auswärts essen";
"toast_eating_out_marked" = "Als auswärts markiert";
// Regelkonflikte
"violations_panel_title" = "Regelkonflikte";
"violations_panel_empty" = "Keine Konflikte diese Woche";
"violations_fix" = "Slot leeren";
"violations_ignore" = "Ignorieren";
"violations_badge" = "%d Konflikt(e)";
@@ -298,3 +298,15 @@
// Onboarding preview
"onboarding_welcome_preview_label" = "Your week could look like this ✨";
// Eating out
"slot_eating_out" = "Eating out";
"home_mark_eating_out" = "Mark as eating out";
"toast_eating_out_marked" = "Marked as eating out";
// Rule violations panel
"violations_panel_title" = "Rule conflicts";
"violations_panel_empty" = "No rule conflicts this week";
"violations_fix" = "Clear slot";
"violations_ignore" = "Ignore";
"violations_badge" = "%d conflict(s)";
@@ -298,3 +298,15 @@
// Onboarding preview
"onboarding_welcome_preview_label" = "Tu semana puede quedar así ✨";
// Comer fuera
"slot_eating_out" = "Comiendo fuera";
"home_mark_eating_out" = "Marcar como comida fuera";
"toast_eating_out_marked" = "Marcado como comida fuera";
// Panel de conflictos
"violations_panel_title" = "Conflictos de reglas";
"violations_panel_empty" = "Sin conflictos esta semana";
"violations_fix" = "Vaciar hueco";
"violations_ignore" = "Ignorar";
"violations_badge" = "%d conflicto(s)";
@@ -298,3 +298,15 @@
// Onboarding preview
"onboarding_welcome_preview_label" = "Votre semaine pourrait ressembler à ça ✨";
// Repas à l'extérieur
"slot_eating_out" = "Repas dehors";
"home_mark_eating_out" = "Manger à l'extérieur";
"toast_eating_out_marked" = "Repas marqué à l'extérieur";
// Panneau de conflits
"violations_panel_title" = "Conflits de règles";
"violations_panel_empty" = "Aucun conflit cette semaine";
"violations_fix" = "Vider le créneau";
"violations_ignore" = "Ignorer";
"violations_badge" = "%d conflit(s)";
@@ -298,3 +298,15 @@
// Onboarding preview
"onboarding_welcome_preview_label" = "La tua settimana potrebbe essere così ✨";
// Mangiare fuori
"slot_eating_out" = "Fuori casa";
"home_mark_eating_out" = "Mangiare fuori";
"toast_eating_out_marked" = "Segnato come fuori casa";
// Pannello conflitti
"violations_panel_title" = "Conflitti di regole";
"violations_panel_empty" = "Nessun conflitto questa settimana";
"violations_fix" = "Svuota slot";
"violations_ignore" = "Ignora";
"violations_badge" = "%d conflitto/i";
@@ -298,3 +298,15 @@
// Onboarding preview
"onboarding_welcome_preview_label" = "Sua semana pode ficar assim ✨";
// Comer fora
"slot_eating_out" = "Comendo fora";
"home_mark_eating_out" = "Comer fora";
"toast_eating_out_marked" = "Marcado como comer fora";
// Painel de conflitos
"violations_panel_title" = "Conflitos de regras";
"violations_panel_empty" = "Sem conflitos esta semana";
"violations_fix" = "Limpar slot";
"violations_ignore" = "Ignorar";
"violations_badge" = "%d conflito(s)";