1.1.0: Smarter autocomplete + Statistics view

- AutocompleteEngine: MRV heuristic picks the most-constrained slot first
  at each step; historical scoring deprioritises dishes used in recent
  weeks (decay: 0.20 last week → 0.90 four+ weeks ago)
- HomeViewModel: passes last 4 weeks as recentPlans to autocomplete
- StatsView (Premium): streak, weeks planned, completion rate, top 8
  dishes with bar charts, top 6 tags with colour bars — 6 languages
- StoreManager: update product ID to approved bundle-ID convention
- Version bump to 1.1.3 / build 48

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
alexandrev-tibco
2026-05-27 15:05:39 +02:00
parent 0103ee98c6
commit 330f21a019
13 changed files with 433 additions and 59 deletions
+12
View File
@@ -85,6 +85,7 @@
FB0011111111111111111106 /* AnalyticsService.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB0011111111111111111107 /* AnalyticsService.swift */; };
FB0011111111111111111108 /* FirebaseCrashlytics in Frameworks */ = {isa = PBXBuildFile; productRef = FB001111111111111111110B /* FirebaseCrashlytics */; };
FB0011111111111111111109 /* CrashlyticsService.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB001111111111111111110A /* CrashlyticsService.swift */; };
443CC3997A9A4818B51066FB /* StatsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E8AD94FC874467D863D464C /* StatsView.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -198,6 +199,7 @@
FD621CE9B44512AE8894D92E /* OnboardingViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingViewModel.swift; sourceTree = "<group>"; };
FE73D5B7AF8B5E2D63105977 /* Font+MealMood.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Font+MealMood.swift"; sourceTree = "<group>"; };
FF2DE77AD57DB6DAB188CD9E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
1E8AD94FC874467D863D464C /* StatsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatsView.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -357,10 +359,19 @@
35F15C6817E504B1114420CD /* Premium */,
4B80B7CABE3B737897455A26 /* Settings */,
CE41931687CCC60F76A2B6D9 /* Tags */,
0D63499EC79D43728D1CA8C7 /* Stats */,
);
path = Views;
sourceTree = "<group>";
};
0D63499EC79D43728D1CA8C7 /* Stats */ = {
isa = PBXGroup;
children = (
1E8AD94FC874467D863D464C /* StatsView.swift */,
);
path = Stats;
sourceTree = "<group>";
};
8BE925662F55707DF083677A /* Dishes */ = {
isa = PBXGroup;
children = (
@@ -685,6 +696,7 @@
233B9C1A5CA7E938318491C0 /* SocialShareSheet.swift in Sources */,
25B3C328E088A403CABAF20A /* PremiumSyncService.swift in Sources */,
FB0011111111111111111109 /* CrashlyticsService.swift in Sources */,
443CC3997A9A4818B51066FB /* StatsView.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};