feat: rebuild iOS app from API audit + new podcast/media service
iOS App (complete rebuild): - Audited all fitness API endpoints against live responses - Models match exact API field names (snapshot_ prefixes, UUID strings) - FoodEntry uses computed properties (foodName, calories, etc.) wrapping snapshot fields - Flexible Int/Double decoding for all numeric fields - AI assistant with raw JSON state management (JSONSerialization, not Codable) - Home dashboard with custom background, frosted glass calorie widget - Fitness: Today/Templates/Goals/Foods tabs - Food search with recent + all sections - Meal sections with colored accent bars, swipe to delete - 120fps ProMotion, iOS 17+ @Observable Podcast/Media Service: - FastAPI backend for podcast RSS + local audiobook folders - Shows, episodes, playback progress, queue management - RSS feed fetching with feedparser + ETag support - Local folder scanning with mutagen for audio metadata - HTTP Range streaming for local audio files - Playback events logging (play/pause/seek/complete) - Reuses brain's PostgreSQL + Redis - media_ prefixed tables Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -7,42 +7,41 @@
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
A10001 /* PlatformApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10001 /* PlatformApp.swift */; };
|
||||
A10002 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10002 /* ContentView.swift */; };
|
||||
A10003 /* Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10003 /* Config.swift */; };
|
||||
A10004 /* APIClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10004 /* APIClient.swift */; };
|
||||
A10005 /* AuthManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10005 /* AuthManager.swift */; };
|
||||
A10006 /* LoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10006 /* LoginView.swift */; };
|
||||
A10007 /* HomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10007 /* HomeView.swift */; };
|
||||
A10008 /* HomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10008 /* HomeViewModel.swift */; };
|
||||
A10009 /* FitnessModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10009 /* FitnessModels.swift */; };
|
||||
A10010 /* FitnessAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10010 /* FitnessAPI.swift */; };
|
||||
A10011 /* FitnessRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10011 /* FitnessRepository.swift */; };
|
||||
A10012 /* FitnessTabView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10012 /* FitnessTabView.swift */; };
|
||||
A10013 /* TodayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10013 /* TodayView.swift */; };
|
||||
A10014 /* MealSectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10014 /* MealSectionView.swift */; };
|
||||
A10015 /* FoodSearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10015 /* FoodSearchView.swift */; };
|
||||
A10016 /* AddFoodSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10016 /* AddFoodSheet.swift */; };
|
||||
A10018 /* TemplatesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10018 /* TemplatesView.swift */; };
|
||||
A10019 /* GoalsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10019 /* GoalsView.swift */; };
|
||||
A10020 /* EntryDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10020 /* EntryDetailView.swift */; };
|
||||
A10021 /* TodayViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10021 /* TodayViewModel.swift */; };
|
||||
A10022 /* FoodSearchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10022 /* FoodSearchViewModel.swift */; };
|
||||
A10024 /* TemplatesViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10024 /* TemplatesViewModel.swift */; };
|
||||
A10025 /* GoalsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10025 /* GoalsViewModel.swift */; };
|
||||
A10026 /* MacroRing.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10026 /* MacroRing.swift */; };
|
||||
A10027 /* MacroBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10027 /* MacroBar.swift */; };
|
||||
A10028 /* LoadingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10028 /* LoadingView.swift */; };
|
||||
A10029 /* Date+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10029 /* Date+Extensions.swift */; };
|
||||
A10030 /* Color+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10030 /* Color+Extensions.swift */; };
|
||||
A10031 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B10031 /* Assets.xcassets */; };
|
||||
A10032 /* FoodLibraryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10032 /* FoodLibraryView.swift */; };
|
||||
A10033 /* AssistantChatView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10033 /* AssistantChatView.swift */; };
|
||||
A10034 /* AssistantViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10034 /* AssistantViewModel.swift */; };
|
||||
A10001 /* PlatformApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10001; };
|
||||
A10002 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10002; };
|
||||
A10003 /* Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10003; };
|
||||
A10004 /* APIClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10004; };
|
||||
A10005 /* AuthManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10005; };
|
||||
A10006 /* LoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10006; };
|
||||
A10007 /* HomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10007; };
|
||||
A10008 /* HomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10008; };
|
||||
A10009 /* FitnessModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10009; };
|
||||
A10010 /* FitnessAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10010; };
|
||||
A10011 /* FitnessRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10011; };
|
||||
A10012 /* TodayViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10012; };
|
||||
A10013 /* FoodSearchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10013; };
|
||||
A10014 /* TemplatesViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10014; };
|
||||
A10015 /* GoalsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10015; };
|
||||
A10016 /* FitnessTabView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10016; };
|
||||
A10017 /* TodayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10017; };
|
||||
A10018 /* MealSectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10018; };
|
||||
A10019 /* FoodSearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10019; };
|
||||
A10020 /* AddFoodSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10020; };
|
||||
A10021 /* FoodLibraryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10021; };
|
||||
A10022 /* TemplatesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10022; };
|
||||
A10023 /* GoalsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10023; };
|
||||
A10024 /* EntryDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10024; };
|
||||
A10025 /* AssistantChatView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10025; };
|
||||
A10026 /* AssistantViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10026; };
|
||||
A10027 /* MacroRing.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10027; };
|
||||
A10028 /* MacroBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10028; };
|
||||
A10029 /* LoadingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10029; };
|
||||
A10030 /* Color+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10030; };
|
||||
A10031 /* Date+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10031; };
|
||||
A10032 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C10001; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
B10000 /* Platform.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Platform.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
B10001 /* PlatformApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlatformApp.swift; sourceTree = "<group>"; };
|
||||
B10002 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
|
||||
B10003 /* Config.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Config.swift; sourceTree = "<group>"; };
|
||||
@@ -54,31 +53,33 @@
|
||||
B10009 /* FitnessModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FitnessModels.swift; sourceTree = "<group>"; };
|
||||
B10010 /* FitnessAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FitnessAPI.swift; sourceTree = "<group>"; };
|
||||
B10011 /* FitnessRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FitnessRepository.swift; sourceTree = "<group>"; };
|
||||
B10012 /* FitnessTabView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FitnessTabView.swift; sourceTree = "<group>"; };
|
||||
B10013 /* TodayView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TodayView.swift; sourceTree = "<group>"; };
|
||||
B10014 /* MealSectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MealSectionView.swift; sourceTree = "<group>"; };
|
||||
B10015 /* FoodSearchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FoodSearchView.swift; sourceTree = "<group>"; };
|
||||
B10016 /* AddFoodSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddFoodSheet.swift; sourceTree = "<group>"; };
|
||||
B10018 /* TemplatesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TemplatesView.swift; sourceTree = "<group>"; };
|
||||
B10019 /* GoalsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GoalsView.swift; sourceTree = "<group>"; };
|
||||
B10020 /* EntryDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntryDetailView.swift; sourceTree = "<group>"; };
|
||||
B10021 /* TodayViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TodayViewModel.swift; sourceTree = "<group>"; };
|
||||
B10022 /* FoodSearchViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FoodSearchViewModel.swift; sourceTree = "<group>"; };
|
||||
B10024 /* TemplatesViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TemplatesViewModel.swift; sourceTree = "<group>"; };
|
||||
B10025 /* GoalsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GoalsViewModel.swift; sourceTree = "<group>"; };
|
||||
B10026 /* MacroRing.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MacroRing.swift; sourceTree = "<group>"; };
|
||||
B10027 /* MacroBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MacroBar.swift; sourceTree = "<group>"; };
|
||||
B10028 /* LoadingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadingView.swift; sourceTree = "<group>"; };
|
||||
B10029 /* Date+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+Extensions.swift"; sourceTree = "<group>"; };
|
||||
B10012 /* TodayViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TodayViewModel.swift; sourceTree = "<group>"; };
|
||||
B10013 /* FoodSearchViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FoodSearchViewModel.swift; sourceTree = "<group>"; };
|
||||
B10014 /* TemplatesViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TemplatesViewModel.swift; sourceTree = "<group>"; };
|
||||
B10015 /* GoalsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GoalsViewModel.swift; sourceTree = "<group>"; };
|
||||
B10016 /* FitnessTabView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FitnessTabView.swift; sourceTree = "<group>"; };
|
||||
B10017 /* TodayView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TodayView.swift; sourceTree = "<group>"; };
|
||||
B10018 /* MealSectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MealSectionView.swift; sourceTree = "<group>"; };
|
||||
B10019 /* FoodSearchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FoodSearchView.swift; sourceTree = "<group>"; };
|
||||
B10020 /* AddFoodSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddFoodSheet.swift; sourceTree = "<group>"; };
|
||||
B10021 /* FoodLibraryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FoodLibraryView.swift; sourceTree = "<group>"; };
|
||||
B10022 /* TemplatesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TemplatesView.swift; sourceTree = "<group>"; };
|
||||
B10023 /* GoalsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GoalsView.swift; sourceTree = "<group>"; };
|
||||
B10024 /* EntryDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntryDetailView.swift; sourceTree = "<group>"; };
|
||||
B10025 /* AssistantChatView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AssistantChatView.swift; sourceTree = "<group>"; };
|
||||
B10026 /* AssistantViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AssistantViewModel.swift; sourceTree = "<group>"; };
|
||||
B10027 /* MacroRing.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MacroRing.swift; sourceTree = "<group>"; };
|
||||
B10028 /* MacroBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MacroBar.swift; sourceTree = "<group>"; };
|
||||
B10029 /* LoadingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadingView.swift; sourceTree = "<group>"; };
|
||||
B10030 /* Color+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Color+Extensions.swift"; sourceTree = "<group>"; };
|
||||
B10031 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||
B10032 /* FoodLibraryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FoodLibraryView.swift; sourceTree = "<group>"; };
|
||||
B10033 /* AssistantChatView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AssistantChatView.swift; sourceTree = "<group>"; };
|
||||
B10034 /* AssistantViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AssistantViewModel.swift; sourceTree = "<group>"; };
|
||||
B10031 /* Date+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+Extensions.swift"; sourceTree = "<group>"; };
|
||||
B10033 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
C10001 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||
D10001 /* Platform.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Platform.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
C10001 /* Frameworks */ = {
|
||||
E10001 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
@@ -88,29 +89,30 @@
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
G10000 = {
|
||||
F10001 = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
G10001 /* Platform */,
|
||||
G10099 /* Products */,
|
||||
F10002 /* Platform */,
|
||||
F10020 /* Products */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
G10001 /* Platform */ = {
|
||||
F10002 /* Platform */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
B10001 /* PlatformApp.swift */,
|
||||
B10002 /* ContentView.swift */,
|
||||
B10003 /* Config.swift */,
|
||||
B10031 /* Assets.xcassets */,
|
||||
G10002 /* Core */,
|
||||
G10003 /* Features */,
|
||||
G10004 /* Shared */,
|
||||
B10033 /* Info.plist */,
|
||||
C10001 /* Assets.xcassets */,
|
||||
F10003 /* Core */,
|
||||
F10004 /* Features */,
|
||||
F10015 /* Shared */,
|
||||
);
|
||||
path = Platform;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
G10002 /* Core */ = {
|
||||
F10003 /* Core */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
B10004 /* APIClient.swift */,
|
||||
@@ -119,46 +121,18 @@
|
||||
path = Core;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
G10003 /* Features */ = {
|
||||
F10004 /* Features */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
G10010 /* Auth */,
|
||||
G10011 /* Home */,
|
||||
G10012 /* Fitness */,
|
||||
G10018 /* Assistant */,
|
||||
F10005 /* Auth */,
|
||||
F10006 /* Home */,
|
||||
F10007 /* Fitness */,
|
||||
F10014 /* Assistant */,
|
||||
);
|
||||
path = Features;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
G10004 /* Shared */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
G10005 /* Components */,
|
||||
G10006 /* Extensions */,
|
||||
);
|
||||
path = Shared;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
G10005 /* Components */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
B10026 /* MacroRing.swift */,
|
||||
B10027 /* MacroBar.swift */,
|
||||
B10028 /* LoadingView.swift */,
|
||||
);
|
||||
path = Components;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
G10006 /* Extensions */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
B10029 /* Date+Extensions.swift */,
|
||||
B10030 /* Color+Extensions.swift */,
|
||||
);
|
||||
path = Extensions;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
G10010 /* Auth */ = {
|
||||
F10005 /* Auth */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
B10006 /* LoginView.swift */,
|
||||
@@ -166,7 +140,7 @@
|
||||
path = Auth;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
G10011 /* Home */ = {
|
||||
F10006 /* Home */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
B10007 /* HomeView.swift */,
|
||||
@@ -175,19 +149,19 @@
|
||||
path = Home;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
G10012 /* Fitness */ = {
|
||||
F10007 /* Fitness */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
G10013 /* Models */,
|
||||
G10014 /* API */,
|
||||
G10015 /* Repository */,
|
||||
G10016 /* Views */,
|
||||
G10017 /* ViewModels */,
|
||||
F10008 /* Models */,
|
||||
F10009 /* API */,
|
||||
F10010 /* Repository */,
|
||||
F10011 /* ViewModels */,
|
||||
F10012 /* Views */,
|
||||
);
|
||||
path = Fitness;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
G10013 /* Models */ = {
|
||||
F10008 /* Models */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
B10009 /* FitnessModels.swift */,
|
||||
@@ -195,7 +169,7 @@
|
||||
path = Models;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
G10014 /* API */ = {
|
||||
F10009 /* API */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
B10010 /* FitnessAPI.swift */,
|
||||
@@ -203,7 +177,7 @@
|
||||
path = API;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
G10015 /* Repository */ = {
|
||||
F10010 /* Repository */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
B10011 /* FitnessRepository.swift */,
|
||||
@@ -211,46 +185,74 @@
|
||||
path = Repository;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
G10016 /* Views */ = {
|
||||
F10011 /* ViewModels */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
B10012 /* FitnessTabView.swift */,
|
||||
B10013 /* TodayView.swift */,
|
||||
B10014 /* MealSectionView.swift */,
|
||||
B10015 /* FoodSearchView.swift */,
|
||||
B10016 /* AddFoodSheet.swift */,
|
||||
B10018 /* TemplatesView.swift */,
|
||||
B10019 /* GoalsView.swift */,
|
||||
B10020 /* EntryDetailView.swift */,
|
||||
B10032 /* FoodLibraryView.swift */,
|
||||
);
|
||||
path = Views;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
G10017 /* ViewModels */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
B10021 /* TodayViewModel.swift */,
|
||||
B10022 /* FoodSearchViewModel.swift */,
|
||||
B10024 /* TemplatesViewModel.swift */,
|
||||
B10025 /* GoalsViewModel.swift */,
|
||||
B10012 /* TodayViewModel.swift */,
|
||||
B10013 /* FoodSearchViewModel.swift */,
|
||||
B10014 /* TemplatesViewModel.swift */,
|
||||
B10015 /* GoalsViewModel.swift */,
|
||||
);
|
||||
path = ViewModels;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
G10018 /* Assistant */ = {
|
||||
F10012 /* Views */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
B10033 /* AssistantChatView.swift */,
|
||||
B10034 /* AssistantViewModel.swift */,
|
||||
B10016 /* FitnessTabView.swift */,
|
||||
B10017 /* TodayView.swift */,
|
||||
B10018 /* MealSectionView.swift */,
|
||||
B10019 /* FoodSearchView.swift */,
|
||||
B10020 /* AddFoodSheet.swift */,
|
||||
B10021 /* FoodLibraryView.swift */,
|
||||
B10022 /* TemplatesView.swift */,
|
||||
B10023 /* GoalsView.swift */,
|
||||
B10024 /* EntryDetailView.swift */,
|
||||
);
|
||||
path = Views;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
F10014 /* Assistant */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
B10025 /* AssistantChatView.swift */,
|
||||
B10026 /* AssistantViewModel.swift */,
|
||||
);
|
||||
path = Assistant;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
G10099 /* Products */ = {
|
||||
F10015 /* Shared */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
B10000 /* Platform.app */,
|
||||
F10016 /* Components */,
|
||||
F10017 /* Extensions */,
|
||||
);
|
||||
path = Shared;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
F10016 /* Components */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
B10027 /* MacroRing.swift */,
|
||||
B10028 /* MacroBar.swift */,
|
||||
B10029 /* LoadingView.swift */,
|
||||
);
|
||||
path = Components;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
F10017 /* Extensions */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
B10030 /* Color+Extensions.swift */,
|
||||
B10031 /* Date+Extensions.swift */,
|
||||
);
|
||||
path = Extensions;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
F10020 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D10001 /* Platform.app */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
@@ -258,13 +260,13 @@
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
T10001 /* Platform */ = {
|
||||
G10001 /* Platform */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = CL10002 /* Build configuration list for PBXNativeTarget "Platform" */;
|
||||
buildConfigurationList = H10003 /* Build configuration list for PBXNativeTarget "Platform" */;
|
||||
buildPhases = (
|
||||
S10001 /* Sources */,
|
||||
C10001 /* Frameworks */,
|
||||
R10001 /* Resources */,
|
||||
G10002 /* Sources */,
|
||||
E10001 /* Frameworks */,
|
||||
G10003 /* Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
@@ -272,25 +274,25 @@
|
||||
);
|
||||
name = Platform;
|
||||
productName = Platform;
|
||||
productReference = B10000 /* Platform.app */;
|
||||
productReference = D10001 /* Platform.app */;
|
||||
productType = "com.apple.product-type.application";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
|
||||
/* Begin PBXProject section */
|
||||
P10001 /* Project object */ = {
|
||||
G10010 /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
BuildIndependentTargetsInParallel = 1;
|
||||
LastSwiftUpdateCheck = 1540;
|
||||
LastUpgradeCheck = 1540;
|
||||
TargetAttributes = {
|
||||
T10001 = {
|
||||
G10001 = {
|
||||
CreatedOnToolsVersion = 15.4;
|
||||
};
|
||||
};
|
||||
};
|
||||
buildConfigurationList = CL10001 /* Build configuration list for PBXProject "Platform" */;
|
||||
buildConfigurationList = H10001 /* Build configuration list for PBXProject "Platform" */;
|
||||
compatibilityVersion = "Xcode 14.0";
|
||||
developmentRegion = en;
|
||||
hasScannedForEncodings = 0;
|
||||
@@ -298,29 +300,29 @@
|
||||
en,
|
||||
Base,
|
||||
);
|
||||
mainGroup = G10000;
|
||||
productRefGroup = G10099 /* Products */;
|
||||
mainGroup = F10001;
|
||||
productRefGroup = F10020 /* Products */;
|
||||
projectDirPath = "";
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
T10001 /* Platform */,
|
||||
G10001 /* Platform */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXResourcesBuildPhase section */
|
||||
R10001 /* Resources */ = {
|
||||
G10003 /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
A10031 /* Assets.xcassets in Resources */,
|
||||
A10032 /* Assets.xcassets in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
S10001 /* Sources */ = {
|
||||
G10002 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
@@ -335,33 +337,33 @@
|
||||
A10009 /* FitnessModels.swift in Sources */,
|
||||
A10010 /* FitnessAPI.swift in Sources */,
|
||||
A10011 /* FitnessRepository.swift in Sources */,
|
||||
A10012 /* FitnessTabView.swift in Sources */,
|
||||
A10013 /* TodayView.swift in Sources */,
|
||||
A10014 /* MealSectionView.swift in Sources */,
|
||||
A10015 /* FoodSearchView.swift in Sources */,
|
||||
A10016 /* AddFoodSheet.swift in Sources */,
|
||||
A10018 /* TemplatesView.swift in Sources */,
|
||||
A10019 /* GoalsView.swift in Sources */,
|
||||
A10020 /* EntryDetailView.swift in Sources */,
|
||||
A10021 /* TodayViewModel.swift in Sources */,
|
||||
A10022 /* FoodSearchViewModel.swift in Sources */,
|
||||
A10024 /* TemplatesViewModel.swift in Sources */,
|
||||
A10025 /* GoalsViewModel.swift in Sources */,
|
||||
A10026 /* MacroRing.swift in Sources */,
|
||||
A10027 /* MacroBar.swift in Sources */,
|
||||
A10028 /* LoadingView.swift in Sources */,
|
||||
A10029 /* Date+Extensions.swift in Sources */,
|
||||
A10012 /* TodayViewModel.swift in Sources */,
|
||||
A10013 /* FoodSearchViewModel.swift in Sources */,
|
||||
A10014 /* TemplatesViewModel.swift in Sources */,
|
||||
A10015 /* GoalsViewModel.swift in Sources */,
|
||||
A10016 /* FitnessTabView.swift in Sources */,
|
||||
A10017 /* TodayView.swift in Sources */,
|
||||
A10018 /* MealSectionView.swift in Sources */,
|
||||
A10019 /* FoodSearchView.swift in Sources */,
|
||||
A10020 /* AddFoodSheet.swift in Sources */,
|
||||
A10021 /* FoodLibraryView.swift in Sources */,
|
||||
A10022 /* TemplatesView.swift in Sources */,
|
||||
A10023 /* GoalsView.swift in Sources */,
|
||||
A10024 /* EntryDetailView.swift in Sources */,
|
||||
A10025 /* AssistantChatView.swift in Sources */,
|
||||
A10026 /* AssistantViewModel.swift in Sources */,
|
||||
A10027 /* MacroRing.swift in Sources */,
|
||||
A10028 /* MacroBar.swift in Sources */,
|
||||
A10029 /* LoadingView.swift in Sources */,
|
||||
A10030 /* Color+Extensions.swift in Sources */,
|
||||
A10032 /* FoodLibraryView.swift in Sources */,
|
||||
A10033 /* AssistantChatView.swift in Sources */,
|
||||
A10034 /* AssistantViewModel.swift in Sources */,
|
||||
A10031 /* Date+Extensions.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
BC10001 /* Debug */ = {
|
||||
H10010 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
@@ -414,6 +416,7 @@
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
|
||||
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
@@ -423,7 +426,7 @@
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
BC10002 /* Release */ = {
|
||||
H10011 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
@@ -470,6 +473,7 @@
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
|
||||
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
MTL_FAST_MATH = YES;
|
||||
SDKROOT = iphoneos;
|
||||
@@ -478,17 +482,17 @@
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
BC10003 /* Debug */ = {
|
||||
H10012 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEVELOPMENT_TEAM = CRN5A2VZ79;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
ENABLE_PREVIEWS = YES;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_FILE = Platform/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = Platform;
|
||||
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
|
||||
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
|
||||
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
|
||||
@@ -501,25 +505,23 @@
|
||||
MARKETING_VERSION = 1.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.quadjourney.Platform;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
|
||||
SUPPORTS_MACCATALYST = NO;
|
||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
BC10004 /* Release */ = {
|
||||
H10013 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEVELOPMENT_TEAM = CRN5A2VZ79;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
ENABLE_PREVIEWS = YES;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_FILE = Platform/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = Platform;
|
||||
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
|
||||
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
|
||||
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
|
||||
@@ -532,8 +534,6 @@
|
||||
MARKETING_VERSION = 1.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.quadjourney.Platform;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
|
||||
SUPPORTS_MACCATALYST = NO;
|
||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
@@ -543,25 +543,26 @@
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
CL10001 /* Build configuration list for PBXProject "Platform" */ = {
|
||||
H10001 /* Build configuration list for PBXProject "Platform" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
BC10001 /* Debug */,
|
||||
BC10002 /* Release */,
|
||||
H10010 /* Debug */,
|
||||
H10011 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
CL10002 /* Build configuration list for PBXNativeTarget "Platform" */ = {
|
||||
H10003 /* Build configuration list for PBXNativeTarget "Platform" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
BC10003 /* Debug */,
|
||||
BC10004 /* Release */,
|
||||
H10012 /* Debug */,
|
||||
H10013 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
|
||||
};
|
||||
rootObject = P10001 /* Project object */;
|
||||
rootObject = G10010 /* Project object */;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user