Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bet Tracker View #14

Merged
merged 15 commits into from
Mar 24, 2025
Merged
Changes from 14 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
*.DS_Store
.build/
xcuserdata/
**/xcuserdata/
xcshareddata/swiftpm/
96 changes: 66 additions & 30 deletions All In.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
@@ -7,8 +7,16 @@
objects = {

/* Begin PBXBuildFile section */
2951F2692D8CCD7C0056F078 /* DailyGainLoss.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2951F2682D8CCD760056F078 /* DailyGainLoss.swift */; };
2973B0652D875F13003C9CF5 /* FrequentAskedQuestion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2973B0642D875F06003C9CF5 /* FrequentAskedQuestion.swift */; };
29AB851E2D8E10550052E0A6 /* FAQ.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29AB851D2D8E10530052E0A6 /* FAQ.swift */; };
29C66D082D8CDC4F00166BD7 /* LexendDeca-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 29C66D052D8CDC4F00166BD7 /* LexendDeca-Medium.ttf */; };
29C66D092D8CDC4F00166BD7 /* LexendDeca-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 29C66D042D8CDC4F00166BD7 /* LexendDeca-Light.ttf */; };
29C66D0A2D8CDC4F00166BD7 /* LexendDeca-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 29C66D062D8CDC4F00166BD7 /* LexendDeca-Regular.ttf */; };
29C66D0B2D8CDC4F00166BD7 /* LexendDeca-SemiBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 29C66D072D8CDC4F00166BD7 /* LexendDeca-SemiBold.ttf */; };
29C8A00D2D8F8E8000F9B3F5 /* Pill.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C8A00B2D8F8E8000F9B3F5 /* Pill.swift */; };
29C8A00E2D8F8E8000F9B3F5 /* BetTrackerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C8A00A2D8F8E8000F9B3F5 /* BetTrackerView.swift */; };
29C8A00F2D8F8E8000F9B3F5 /* ProfileViewViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C8A0082D8F8E8000F9B3F5 /* ProfileViewViewModel.swift */; };
29C8A0112D8F8E9D00F9B3F5 /* FAQ.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C8A0102D8F8E9B00F9B3F5 /* FAQ.swift */; };
897DFBDE2CCED80600246B0D /* PlayerChestViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 897DFBB62CCED80600246B0D /* PlayerChestViewModel.swift */; };
897DFBDF2CCED80600246B0D /* RarityChestSheetViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 897DFBB72CCED80600246B0D /* RarityChestSheetViewModel.swift */; };
897DFBE02CCED80600246B0D /* SheetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 897DFBB92CCED80600246B0D /* SheetView.swift */; };
@@ -22,7 +30,6 @@
897DFBE82CCED80600246B0D /* HomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 897DFBC32CCED80600246B0D /* HomeView.swift */; };
897DFBE92CCED80600246B0D /* MarketplaceViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 897DFBC52CCED80600246B0D /* MarketplaceViewModel.swift */; };
897DFBEA2CCED80600246B0D /* MarketplaceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 897DFBC72CCED80600246B0D /* MarketplaceView.swift */; };
897DFBEB2CCED80600246B0D /* ProfileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 897DFBCA2CCED80600246B0D /* ProfileView.swift */; };
897DFBEC2CCED80600246B0D /* PlayerAveragesModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 897DFBCC2CCED80600246B0D /* PlayerAveragesModel.swift */; };
897DFBED2CCED80600246B0D /* PlayerDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 897DFBCD2CCED80600246B0D /* PlayerDataModel.swift */; };
897DFBEE2CCED80600246B0D /* PlayerModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 897DFBCE2CCED80600246B0D /* PlayerModel.swift */; };
@@ -46,7 +53,6 @@
D0155A832B950FF6003FE6BC /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0155A822B950FF6003FE6BC /* ContentView.swift */; };
D0155A852B950FF7003FE6BC /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D0155A842B950FF7003FE6BC /* Assets.xcassets */; };
D0155A882B950FF7003FE6BC /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D0155A872B950FF7003FE6BC /* Preview Assets.xcassets */; };
D01FBED92D74F76D00D365EF /* ProfileViewViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01FBED82D74F76D00D365EF /* ProfileViewViewModel.swift */; };
D047C6312BD6E9DA007F6103 /* AlamofireImage in Frameworks */ = {isa = PBXBuildFile; productRef = D047C6302BD6E9DA007F6103 /* AlamofireImage */; };
D057FD852BA76F8600EF552D /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = D057FD842BA76F8600EF552D /* Constants.swift */; };
D0CD31822BD5A2F500E7136C /* NetworkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0CD31812BD5A2F500E7136C /* NetworkManager.swift */; };
@@ -72,8 +78,17 @@
/* End PBXContainerItemProxy section */

/* Begin PBXFileReference section */
2951F2682D8CCD760056F078 /* DailyGainLoss.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailyGainLoss.swift; sourceTree = "<group>"; };
2973B0642D875F06003C9CF5 /* FrequentAskedQuestion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FrequentAskedQuestion.swift; sourceTree = "<group>"; };
29AB851D2D8E10530052E0A6 /* FAQ.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FAQ.swift; sourceTree = "<group>"; };
29C66D042D8CDC4F00166BD7 /* LexendDeca-Light.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "LexendDeca-Light.ttf"; sourceTree = "<group>"; };
29C66D052D8CDC4F00166BD7 /* LexendDeca-Medium.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "LexendDeca-Medium.ttf"; sourceTree = "<group>"; };
29C66D062D8CDC4F00166BD7 /* LexendDeca-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "LexendDeca-Regular.ttf"; sourceTree = "<group>"; };
29C66D072D8CDC4F00166BD7 /* LexendDeca-SemiBold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "LexendDeca-SemiBold.ttf"; sourceTree = "<group>"; };
29C8A0082D8F8E8000F9B3F5 /* ProfileViewViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileViewViewModel.swift; sourceTree = "<group>"; };
29C8A00A2D8F8E8000F9B3F5 /* BetTrackerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BetTrackerView.swift; sourceTree = "<group>"; };
29C8A00B2D8F8E8000F9B3F5 /* Pill.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Pill.swift; sourceTree = "<group>"; };
29C8A0102D8F8E9B00F9B3F5 /* FAQ.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FAQ.swift; sourceTree = "<group>"; };
29DB4FC32D8CDEAC00E489DB /* All-In-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "All-In-Info.plist"; sourceTree = SOURCE_ROOT; };
897DFBB62CCED80600246B0D /* PlayerChestViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlayerChestViewModel.swift; sourceTree = "<group>"; };
897DFBB72CCED80600246B0D /* RarityChestSheetViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RarityChestSheetViewModel.swift; sourceTree = "<group>"; };
897DFBB92CCED80600246B0D /* SheetView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SheetView.swift; sourceTree = "<group>"; };
@@ -87,7 +102,6 @@
897DFBC32CCED80600246B0D /* HomeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeView.swift; sourceTree = "<group>"; };
897DFBC52CCED80600246B0D /* MarketplaceViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarketplaceViewModel.swift; sourceTree = "<group>"; };
897DFBC72CCED80600246B0D /* MarketplaceView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarketplaceView.swift; sourceTree = "<group>"; };
897DFBCA2CCED80600246B0D /* ProfileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileView.swift; sourceTree = "<group>"; };
897DFBCC2CCED80600246B0D /* PlayerAveragesModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlayerAveragesModel.swift; sourceTree = "<group>"; };
897DFBCD2CCED80600246B0D /* PlayerDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlayerDataModel.swift; sourceTree = "<group>"; };
897DFBCE2CCED80600246B0D /* PlayerModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlayerModel.swift; sourceTree = "<group>"; };
@@ -114,7 +128,6 @@
D0155A872B950FF7003FE6BC /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = "<group>"; };
D0155A8D2B950FF7003FE6BC /* All InTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "All InTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
D0155A972B950FF7003FE6BC /* All InUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "All InUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
D01FBED82D74F76D00D365EF /* ProfileViewViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileViewViewModel.swift; sourceTree = "<group>"; };
D057FD842BA76F8600EF552D /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = "<group>"; };
D0CD31812BD5A2F500E7136C /* NetworkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkManager.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
@@ -147,14 +160,44 @@
/* End PBXFrameworksBuildPhase section */

/* Begin PBXGroup section */
29AB851C2D8E10490052E0A6 /* Models */ = {
29C66D032D8CDC4400166BD7 /* Fonts */ = {
isa = PBXGroup;
children = (
29AB851D2D8E10530052E0A6 /* FAQ.swift */,
29C66D042D8CDC4F00166BD7 /* LexendDeca-Light.ttf */,
29C66D052D8CDC4F00166BD7 /* LexendDeca-Medium.ttf */,
29C66D062D8CDC4F00166BD7 /* LexendDeca-Regular.ttf */,
29C66D072D8CDC4F00166BD7 /* LexendDeca-SemiBold.ttf */,
);
path = Fonts;
sourceTree = "<group>";
};
29C8A0072D8F8E8000F9B3F5 /* Models */ = {
isa = PBXGroup;
children = (
29C8A0102D8F8E9B00F9B3F5 /* FAQ.swift */,
);
path = Models;
sourceTree = "<group>";
};
29C8A0092D8F8E8000F9B3F5 /* ViewModels */ = {
isa = PBXGroup;
children = (
29C8A0082D8F8E8000F9B3F5 /* ProfileViewViewModel.swift */,
);
path = ViewModels;
sourceTree = "<group>";
};
29C8A00C2D8F8E8000F9B3F5 /* Profile */ = {
isa = PBXGroup;
children = (
29C8A0072D8F8E8000F9B3F5 /* Models */,
29C8A0092D8F8E8000F9B3F5 /* ViewModels */,
29C8A00A2D8F8E8000F9B3F5 /* BetTrackerView.swift */,
29C8A00B2D8F8E8000F9B3F5 /* Pill.swift */,
);
path = Profile;
sourceTree = "<group>";
};
897DFBB82CCED80600246B0D /* ViewModels */ = {
isa = PBXGroup;
children = (
@@ -215,16 +258,6 @@
path = Marketplace;
sourceTree = "<group>";
};
897DFBCB2CCED80600246B0D /* Profile */ = {
isa = PBXGroup;
children = (
29AB851C2D8E10490052E0A6 /* Models */,
D01FBEDA2D74F77C00D365EF /* ViewModels */,
897DFBCA2CCED80600246B0D /* ProfileView.swift */,
);
path = Profile;
sourceTree = "<group>";
};
897DFBCF2CCED80600246B0D /* Player */ = {
isa = PBXGroup;
children = (
@@ -238,6 +271,7 @@
897DFBD42CCED80600246B0D /* Models */ = {
isa = PBXGroup;
children = (
2951F2682D8CCD760056F078 /* DailyGainLoss.swift */,
897DFBCF2CCED80600246B0D /* Player */,
897DFBD02CCED80600246B0D /* ChestModel.swift */,
897DFBD12CCED80600246B0D /* ContractModel.swift */,
@@ -279,9 +313,9 @@
897DFBDD2CCED80600246B0D /* Features */ = {
isa = PBXGroup;
children = (
29C8A00C2D8F8E8000F9B3F5 /* Profile */,
897DFBC42CCED80600246B0D /* Home */,
897DFBC82CCED80600246B0D /* Marketplace */,
897DFBCB2CCED80600246B0D /* Profile */,
897DFBDC2CCED80600246B0D /* Shared */,
);
path = Features;
@@ -300,6 +334,7 @@
CE101CDC2BA776ED00218E40 /* Resources */ = {
isa = PBXGroup;
children = (
29C66D032D8CDC4400166BD7 /* Fonts */,
D0155A842B950FF7003FE6BC /* Assets.xcassets */,
D0155A862B950FF7003FE6BC /* Preview Content */,
);
@@ -329,6 +364,7 @@
D0155A7F2B950FF6003FE6BC /* All In */ = {
isa = PBXGroup;
children = (
29DB4FC32D8CDEAC00E489DB /* All-In-Info.plist */,
9928219F2BC0931200B592F7 /* AllInApp.swift */,
D0155A822B950FF6003FE6BC /* ContentView.swift */,
CE101CDC2BA776ED00218E40 /* Resources */,
@@ -364,14 +400,6 @@
path = "All InUITests";
sourceTree = "<group>";
};
D01FBEDA2D74F77C00D365EF /* ViewModels */ = {
isa = PBXGroup;
children = (
D01FBED82D74F76D00D365EF /* ProfileViewViewModel.swift */,
);
path = ViewModels;
sourceTree = "<group>";
};
D057FD832BA76F7B00EF552D /* Utils */ = {
isa = PBXGroup;
children = (
@@ -508,6 +536,10 @@
buildActionMask = 2147483647;
files = (
D0155A882B950FF7003FE6BC /* Preview Assets.xcassets in Resources */,
29C66D082D8CDC4F00166BD7 /* LexendDeca-Medium.ttf in Resources */,
29C66D092D8CDC4F00166BD7 /* LexendDeca-Light.ttf in Resources */,
29C66D0A2D8CDC4F00166BD7 /* LexendDeca-Regular.ttf in Resources */,
29C66D0B2D8CDC4F00166BD7 /* LexendDeca-SemiBold.ttf in Resources */,
D0155A852B950FF7003FE6BC /* Assets.xcassets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -575,21 +607,23 @@
897DFBE82CCED80600246B0D /* HomeView.swift in Sources */,
897DFBE92CCED80600246B0D /* MarketplaceViewModel.swift in Sources */,
897DFBEA2CCED80600246B0D /* MarketplaceView.swift in Sources */,
897DFBEB2CCED80600246B0D /* ProfileView.swift in Sources */,
897DFBEC2CCED80600246B0D /* PlayerAveragesModel.swift in Sources */,
897DFBED2CCED80600246B0D /* PlayerDataModel.swift in Sources */,
897DFBEE2CCED80600246B0D /* PlayerModel.swift in Sources */,
897DFBEF2CCED80600246B0D /* ChestModel.swift in Sources */,
897DFBF02CCED80600246B0D /* ContractModel.swift in Sources */,
89E4FAA82CEA8F9600A952B1 /* Logger.swift in Sources */,
897DFBF12CCED80600246B0D /* TransactionModel.swift in Sources */,
29AB851E2D8E10550052E0A6 /* FAQ.swift in Sources */,
897DFBF22CCED80600246B0D /* UserModel.swift in Sources */,
897DFBF32CCED80600246B0D /* PillSelectView.swift in Sources */,
897DFBF42CCED80600246B0D /* ViewController.swift in Sources */,
D01FBED92D74F76D00D365EF /* ProfileViewViewModel.swift in Sources */,
897DFBF52CCED80600246B0D /* ContractCard.swift in Sources */,
897DFBF62CCED80600246B0D /* PlayerContractSheetView.swift in Sources */,
29C8A00D2D8F8E8000F9B3F5 /* Pill.swift in Sources */,
29C8A00E2D8F8E8000F9B3F5 /* BetTrackerView.swift in Sources */,
29C8A00F2D8F8E8000F9B3F5 /* ProfileViewViewModel.swift in Sources */,
29C8A0112D8F8E9D00F9B3F5 /* FAQ.swift in Sources */,
2951F2692D8CCD7C0056F078 /* DailyGainLoss.swift in Sources */,
897DFBF72CCED80600246B0D /* TabBar.swift in Sources */,
D057FD852BA76F8600EF552D /* Constants.swift in Sources */,
);
@@ -762,6 +796,7 @@
ENABLE_PREVIEWS = YES;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "All-In-Info.plist";
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
@@ -792,6 +827,7 @@
ENABLE_PREVIEWS = YES;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "All-In-Info.plist";
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -7,7 +7,7 @@
<key>All In.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>0</integer>
<integer>3</integer>
</dict>
<key>SnapKitPlayground (Playground) 1.xcscheme</key>
<dict>
2 changes: 2 additions & 0 deletions All In/AllInApp.swift
Original file line number Diff line number Diff line change
@@ -9,10 +9,12 @@ import SwiftUI

@main
struct AllInApp: App {

var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(ProfileViewViewModel())
.environmentObject(TabNavigationManager())
}
}
}
42 changes: 19 additions & 23 deletions All In/ContentView.swift
Original file line number Diff line number Diff line change
@@ -9,34 +9,30 @@ import SwiftUI

struct ContentView: View {

@State var tabSelection = 0
@EnvironmentObject var tabNavigationManager: TabNavigationManager

private let transitionModifier = AnyTransition.opacity.animation(.easeInOut(duration: 0.15))

var body: some View {
ZStack {
TabView(selection: $tabSelection) {
HomeView(tabSelection: $tabSelection)
.tag(0)
.tabItem {
EmptyView()
}

MarketplaceView(tabSelection: $tabSelection)
.tag(1)
.tabItem {
EmptyView()
}

ProfileView(tabSelection: $tabSelection, user: User.dummyData[0])
.tag(2)
.tabItem {
EmptyView()
}
VStack {
Group {
if tabNavigationManager.selectedTab == .home {
HomeView()
.transition(transitionModifier)
} else if tabNavigationManager.selectedTab == .market {
MarketplaceView()
.transition(transitionModifier)
} else if tabNavigationManager.selectedTab == .betTracker {
BetTrackerView(user: User.dummyData[0])
.transition(transitionModifier)
}
}
.onAppear {
UITabBar.appearance().unselectedItemTintColor = .white

}
TabBar(selectedPage: $tabNavigationManager.selectedTab)
.frame(height: 96)
}
.ignoresSafeArea()
.background(Constants.Colors.background)
}

}
61 changes: 31 additions & 30 deletions All In/Features/Home/HomeView.swift
Original file line number Diff line number Diff line change
@@ -9,7 +9,6 @@ import SwiftUI

struct HomeView: View {

@Binding var tabSelection: Int
@EnvironmentObject var viewModel: ProfileViewViewModel

var body: some View {
@@ -71,6 +70,7 @@ struct HomeView: View {
ContractCard(contract: contract)
.cornerRadius(16)
}

moreMarketplaceContracts
}
.padding(EdgeInsets(top: 0, leading: 16, bottom: 0, trailing: 16))
@@ -79,44 +79,45 @@ struct HomeView: View {
Spacer()
}
}
TabBar(page: "home")
.frame(height: 108)
}
.ignoresSafeArea(edges: .all)
.ignoresSafeArea(edges: .top)

}

private var moreMarketplaceContracts: some View {
Button {
tabSelection = 1
} label: {
ZStack {
RoundedRectangle(cornerRadius: 16)
.inset(by: 0.5)
.stroke(Constants.Colors.grey02, lineWidth: 1)
.frame(width: 181, height: 222)
.background(.white)
.cornerRadius(16)
.shadow(color: Constants.Colors.grey00, radius: 5, x: 0, y: 4)
VStack {
Text("View More")
.foregroundStyle(Constants.Colors.grey03)
Image(systemName: "arrowshape.forward.circle.fill")
.resizable()
.foregroundStyle(Constants.Colors.grey03)
.frame(width: 42, height: 42)
(
Button {

} label: {
ZStack {
RoundedRectangle(cornerRadius: 16)
.inset(by: 0.5)
.stroke(Constants.Colors.grey02, lineWidth: 1)
.frame(width: 181, height: 222)
.background(.white)
.cornerRadius(16)
.shadow(color: Constants.Colors.grey00, radius: 5, x: 0, y: 4)
VStack {
Text("View More")
.foregroundStyle(Constants.Colors.grey03)
Image(systemName: "arrowshape.forward.circle.fill")
.resizable()
.foregroundStyle(Constants.Colors.grey03)
.frame(width: 42, height: 42)
}
}
.font(Constants.Fonts.subheader)
.frame(width: 181, height: 222)
.background {
RoundedRectangle(cornerRadius: 16)
.foregroundStyle(Constants.Colors.white)
}
}
.font(Constants.Fonts.subheader)
.frame(width: 181, height: 222)
.background {
RoundedRectangle(cornerRadius: 16)
.foregroundStyle(Constants.Colors.white)
}
}
)
}
}

#Preview {
HomeView(tabSelection: .constant(0))
HomeView()
.environmentObject(ProfileViewViewModel())
}
24 changes: 19 additions & 5 deletions All In/Features/Home/Views/FrequentAskedQuestion.swift
Original file line number Diff line number Diff line change
@@ -9,6 +9,7 @@ import SwiftUI

struct FrequentAskedQuestion: View {
@State private var expandedQuestionIds = Set<UUID>()
@Environment(\.dismiss) private var dismiss

var myGradient = Gradient(
colors: [
@@ -23,18 +24,29 @@ struct FrequentAskedQuestion: View {
NavigationStack {
ScrollView {
VStack(alignment: .leading, spacing: 20) {
// Custom back button
Button(action: {
dismiss()
}) {
Image(systemName: "arrow.left")
.font(.system(size: 24))
.foregroundStyle(Constants.Colors.white)
.padding(.top, 20)
}

header

questionsList

Spacer(minLength: 20)
}
.padding(.horizontal)
.padding(.top, 40)
.frame(maxWidth: .infinity)
}
.background(Constants.Colors.background)
.scrollIndicators(.hidden)
.navigationBarBackButtonHidden(true)
.navigationBarHidden(true)
}
}
}
@@ -44,11 +56,11 @@ extension FrequentAskedQuestion {
private var header: some View {
VStack(alignment: .leading, spacing: 8) {
Text("How can we help?")
.font(Constants.Fonts.faq)
.font(Constants.Fonts.headerProfile)
.foregroundStyle(Constants.Colors.white)

Text("Frequently Asked Questions")
.font(Constants.Fonts.faq2)
.font(Constants.Fonts.subFAQ)
.foregroundStyle(Constants.Colors.white)
.padding(.bottom, 24)
}
@@ -85,8 +97,10 @@ extension FrequentAskedQuestion {
.frame(width: 24, height: 24)

Text(faq.question)
.font(Constants.Fonts.body)
.font(Constants.Fonts.faqDetail)
.foregroundStyle(Constants.Colors.white)
.frame(maxWidth: .infinity, alignment: .leading)
.multilineTextAlignment(.leading)

Spacer()
}
@@ -97,7 +111,7 @@ extension FrequentAskedQuestion {
// Answer section (only visible when expanded)
if isExpanded {
Text(faq.answer)
.font(Constants.Fonts.body)
.font(Constants.Fonts.faqDetail2)
.foregroundStyle(Constants.Colors.white.opacity(0.8))
.padding([.horizontal, .bottom])
.padding(.top, 4)
11 changes: 3 additions & 8 deletions All In/Features/Marketplace/MarketplaceView.swift
Original file line number Diff line number Diff line change
@@ -11,8 +11,6 @@ struct MarketplaceView: View {

@StateObject var viewModel = ViewModel()
@EnvironmentObject var profileViewModel: ProfileViewViewModel

@Binding var tabSelection: Int
@State var selectedStat: Stat = .points

let columns = [GridItem(.flexible()), GridItem(.flexible())]
@@ -25,12 +23,9 @@ struct MarketplaceView: View {
Divider()

content

TabBar(page: "market")
.frame(height: 108)
}
.ignoresSafeArea(edges: .all)
.background(Constants.Colors.grey00)
.ignoresSafeArea(edges: .top)
.background(Constants.Colors.background)
}

private var header: some View {
@@ -107,6 +102,6 @@ struct MarketplaceView: View {
}

#Preview {
MarketplaceView(tabSelection: .constant(0))
MarketplaceView()
.environmentObject(ProfileViewViewModel())
}
339 changes: 339 additions & 0 deletions All In/Features/Profile/BetTrackerView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,339 @@
//
// BetTrackerView.swift
// All In
//
// Created by jiwon jeong on 3/20/25.
//

import SwiftUI
import Charts

struct BetTrackerView: View {

// MARK: - Properties

@State private var timeFilter: TimeFilter = .weekly
@State private var showingFAQ = false

let user: User

var myGradient = Gradient(
colors: [
Constants.Colors.gradientBlue,
Constants.Colors.gradientLightBlue,
Constants.Colors.gradientPurple,
Constants.Colors.gradientLavender
]
)

enum TimeFilter {
case weekly
case monthly
}

/// Calculates the Total Gain/Losses for the Selected User
private func calculateTotalGainLoss() -> Int {
let data = timeFilter == .weekly ? user.weeklyGainLoss : user.monthlyGainLoss
return data.reduce(0) { $0 + $1.value }
}

/// Calculates the user's current week gain/Loss
private func calculateCurrentWeekGainLoss() -> String {
let currentWeekTotal = user.weeklyGainLoss.reduce(0) { $0 + $1.value }
return String(format: "%.2f", Double(currentWeekTotal) / 100.0)
}

/// Calculates the user's last week gain/loss
private func calculateLastWeekGainLoss() -> Int {
// TODO: need to make network requests for this
400
}

/// Calculates the day's since user's account creation
private func daysSinceAccountCreation() -> Int {
let calendar = Calendar.current
let components = calendar.dateComponents([.day], from: user.createdAt, to: Date())
return components.day ?? 0
}

/// Calculating the scaling so that it is easily viewable
private func calculateMaxScaleValue() -> Int {
let data = timeFilter == .weekly ? user.weeklyGainLoss : user.monthlyGainLoss
let maxAbsValue = data.map { abs($0.value) }.max() ?? 5000

// Round up to nearest 1000 for cleaner scale intervals
let roundedUp = Int(ceil(Double(maxAbsValue) / 1000.0) * 1000)
return max(1000, roundedUp)
}

// MARK: - UI

var body: some View {
NavigationStack {
ScrollView {
VStack(spacing: 16) {
trackerCard

HStack(spacing: 17) {
totalProfitCard

rankingCard
}

HStack(spacing: 17) {
contractsSoldCard

accountAgeCard
}
}
.padding(24)
}
.ignoresSafeArea(edges: .bottom)
.background(Constants.Colors.background)
.navigationDestination(isPresented: $showingFAQ) {
FrequentAskedQuestion()
}
}
}

private var trackerCard: some View {
VStack(alignment: .leading, spacing: 24) {
HStack {
Text("Your Bet Tracker")
.font(Constants.Fonts.header)
.foregroundStyle(Constants.Colors.white)

Spacer()

Button(action: {
showingFAQ = true
}) {
Image(systemName: "questionmark.circle")
.foregroundStyle(Constants.Colors.white)
.font(.system(size: 24))
}
}

HStack {
timeFilterPills

Spacer()

HStack(spacing: 7) {
Image(systemName: "dollarsign.circle")
.foregroundStyle(Constants.Colors.white)
.font(.system(size: 24))

Text("\(user.balance)")
.font(Constants.Fonts.subheaderProfile)
.foregroundStyle(Constants.Colors.white)
}
}

gainLossChart
}
.cornerRadius(16)
}

private var timeFilterPills: some View {
HStack(spacing: 0) {
Pill(title: "Weekly", isSelected: timeFilter == .weekly) {
timeFilter = .weekly
}

Pill(title: "Monthly", isSelected: timeFilter == .monthly) {
timeFilter = .monthly
}
}
.padding(4)
.background(Constants.Colors.blackBlue)
.cornerRadius(28)
}

private var gainLossChart: some View {
VStack(alignment: .leading, spacing: 8) {
HStack {
Text("Gains/Losses")
.font(Constants.Fonts.profileCard)
.foregroundStyle(Constants.Colors.white)

Spacer()

Text("+$\(calculateTotalGainLoss())")
.font(Constants.Fonts.subheaderProfile)
.foregroundStyle(Constants.Colors.white)
}

HStack {
Spacer()

VStack(alignment: .trailing, spacing: 2) {
HStack(spacing: 0) {
Text("+\(calculateCurrentWeekGainLoss())")
.font(Constants.Fonts.cardHeader)
.foregroundStyle(Constants.Colors.moneyGreen)

Text(" This week")
.font(Constants.Fonts.cardHeader)
.foregroundStyle(Constants.Colors.white)
}

HStack(spacing: 0) {
Text("+$\(calculateLastWeekGainLoss())")
.font(Constants.Fonts.cardHeader)
.foregroundStyle(Constants.Colors.moneyGreen)

Text(" Last week")
.font(Constants.Fonts.cardHeader)
.foregroundStyle(Constants.Colors.white)
}
}
}

Chart {
ForEach(timeFilter == .weekly ? user.weeklyGainLoss : user.monthlyGainLoss, id: \.day) { item in
BarMark(
x: .value("Day", item.day),
y: .value("Value", item.value)
)
.foregroundStyle(item.value >= 0 ? Constants.Colors.greenChart : Constants.Colors.redChart)
.cornerRadius(0)
}

RuleMark(y: .value("Zero", 0))
.lineStyle(StrokeStyle(lineWidth: 1, dash: [2, 2]))
.foregroundStyle(Constants.Colors.white)

RuleMark(y: .value("Upper Line", -calculateMaxScaleValue()))
.lineStyle(StrokeStyle(lineWidth: 1))
.foregroundStyle(Constants.Colors.white)

}
.chartYScale(domain: -calculateMaxScaleValue()...calculateMaxScaleValue())
.chartYAxis {
let maxValue = calculateMaxScaleValue()

AxisMarks(position: .leading, values: [-maxValue, -maxValue/2, 0, maxValue/2, maxValue]) { value in
AxisGridLine()
AxisTick()
AxisValueLabel {
if let intValue = value.as(Int.self) {
Text("\(intValue)")
.font(Constants.Fonts.caption)
.foregroundStyle(Constants.Colors.white)
}
}
}
}
.chartXAxis {
AxisMarks(values: timeFilter == .weekly ? ["M", "T", "W", "TH", "F", "S", "SU"] : Array(1...12).map { "\($0)" }) { value in
AxisValueLabel {
if let day = value.as(String.self) {
Text(day)
.font(Constants.Fonts.caption)
.foregroundStyle(Constants.Colors.white)
}
}
}
}
.frame(height: 165)
.padding(.top, 8)
}
.padding(16)
.background(Constants.Colors.blackBlue)
.cornerRadius(16)
.overlay(
RoundedRectangle(cornerRadius: 16)
.stroke(LinearGradient(gradient: myGradient, startPoint: .topLeading, endPoint: .bottomTrailing), lineWidth: 1)
)
}

private var totalProfitCard: some View {
VStack(alignment: .leading, spacing: 8) {
Text("Total Profit")
.font(Constants.Fonts.cardHeader)
.foregroundStyle(Constants.Colors.white)

Text("$\(user.totalProfit)")
.font(Constants.Fonts.cardContent)
.foregroundStyle(Constants.Colors.white)
.padding(.top, 8)
}
.frame(maxWidth: .infinity, alignment: .leading)
.padding(16)
.background(Constants.Colors.blackBlue)
.cornerRadius(16)
.overlay(
RoundedRectangle(cornerRadius: 16)
.stroke(LinearGradient(gradient: myGradient, startPoint: .topLeading, endPoint: .bottomTrailing), lineWidth: 1)
)
}

private var rankingCard: some View {
VStack(alignment: .leading, spacing: 8) {
Text("Ranking No.")
.font(Constants.Fonts.cardHeader)
.foregroundStyle(Constants.Colors.white)

Text("\(user.ranking)")
.font(Constants.Fonts.cardContent)
.foregroundStyle(Constants.Colors.white)
.padding(.top, 8)
}
.frame(maxWidth: .infinity, alignment: .leading)
.padding(16)
.background(Constants.Colors.blackBlue)
.cornerRadius(16)
.overlay(
RoundedRectangle(cornerRadius: 16)
.stroke(LinearGradient(gradient: myGradient, startPoint: .topLeading, endPoint: .bottomTrailing), lineWidth: 1)
)
}

private var contractsSoldCard: some View {
VStack(alignment: .leading, spacing: 8) {
Text("No. of Contracts Sold")
.font(Constants.Fonts.cardHeader)
.foregroundStyle(Constants.Colors.white)

Text("\(user.sellerTransactions.count)")
.font(Constants.Fonts.cardContent)
.foregroundStyle(Constants.Colors.white)
.padding(.top, 8)
}
.frame(maxWidth: .infinity, alignment: .leading)
.padding(16)
.background(Constants.Colors.blackBlue)
.cornerRadius(16)
.overlay(
RoundedRectangle(cornerRadius: 16)
.stroke(LinearGradient(gradient: myGradient, startPoint: .topLeading, endPoint: .bottomTrailing), lineWidth: 1)
)
}

private var accountAgeCard: some View {
VStack(alignment: .leading, spacing: 8) {
Text("Age of Account")
.font(Constants.Fonts.cardHeader)
.foregroundStyle(Constants.Colors.white)

Text("\(daysSinceAccountCreation()) days")
.font(Constants.Fonts.cardContent)
.foregroundStyle(Constants.Colors.white)
.padding(.top, 8)
}
.frame(maxWidth: .infinity, alignment: .leading)
.padding(16)
.background(Constants.Colors.blackBlue)
.cornerRadius(16)
.overlay(
RoundedRectangle(cornerRadius: 16)
.stroke(LinearGradient(gradient: myGradient, startPoint: .topLeading, endPoint: .bottomTrailing), lineWidth: 1)
)
}

}

#Preview {
BetTrackerView(user: User.dummyData[0])
}
27 changes: 27 additions & 0 deletions All In/Features/Profile/Pill.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
//
// Pill.swift
// All In
//
// Created by jiwon jeong on 3/20/25.
//

import SwiftUI

struct Pill: View {
let title: String
let isSelected: Bool
let action: () -> Void

var body: some View {
Button(action: action) {
Text(title)
.font(Constants.Fonts.pillButton)
.foregroundStyle(Constants.Colors.white)
.padding(.horizontal, 16)
.padding(.vertical, 8)
.frame(height: 39)
.background(isSelected ? Constants.Colors.background : Color.clear)
.cornerRadius(20)
}
}
}
173 changes: 0 additions & 173 deletions All In/Features/Profile/ProfileView.swift

This file was deleted.

22 changes: 22 additions & 0 deletions All In/Features/Shared/Models/DailyGainLoss.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
//
// DailyGainLoss.swift
// All In
//
// Created by jiwon jeong on 3/20/25.
//

import Foundation

struct DailyGainLoss: Codable, Identifiable {
let id: UUID
let day: String
let value: Int
let date: Date

init(id: UUID = UUID(), day: String, value: Int, date: Date) {
self.id = id
self.day = day
self.value = value
self.date = date
}
}
67 changes: 55 additions & 12 deletions All In/Features/Shared/Models/UserModel.swift
Original file line number Diff line number Diff line change
@@ -5,41 +5,84 @@
// Created by Peter Bidoshi on 4/22/24.
//

struct User: Codable {
import Foundation

// Helper function to generate monthly gain loss data
private func generateMonthlyGainLoss() -> [DailyGainLoss] {
var result: [DailyGainLoss] = []

for i in 1...12 {
let date = Calendar.current.date(byAdding: .day, value: -(12-i), to: Date())!
let value = Int.random(in: -800...1200)
result.append(DailyGainLoss(day: "\(i)", value: value, date: date))
}

return result
}

struct User: Codable, Identifiable {
let id: Int
let username: String
let email: String
let balance: Int
let contracts: [Contract]
let sellerTransations: [Transaction]
let sellerTransactions: [Transaction]
let buyerTransactions: [Transaction]

let createdAt: Date
let totalProfit: Int
let ranking: Int
let weeklyGainLoss: [DailyGainLoss]
let monthlyGainLoss: [DailyGainLoss]
}

extension User {

static let dummyData: [User] = [
User(
id: 0,
username: "antoinztte",
email: "act238@cornell.edu",
balance: 1500,
balance: 1000,
contracts: [
Contract.dummyData[0],
Contract.dummyData[1]
],
sellerTransations: [],
buyerTransactions: []
sellerTransactions: [],
buyerTransactions: [],
createdAt: Calendar.current.date(byAdding: .day, value: -17, to: Date())!,
totalProfit: 64,
ranking: 52,
weeklyGainLoss: [
DailyGainLoss(day: "M", value: 1000, date: Calendar.current.date(byAdding: .day, value: -6, to: Date())!),
DailyGainLoss(day: "T", value: -2000, date: Calendar.current.date(byAdding: .day, value: -5, to: Date())!),
DailyGainLoss(day: "W", value: 3000, date: Calendar.current.date(byAdding: .day, value: -4, to: Date())!),
DailyGainLoss(day: "TH", value: -1500, date: Calendar.current.date(byAdding: .day, value: -3, to: Date())!),
DailyGainLoss(day: "F", value: 2500, date: Calendar.current.date(byAdding: .day, value: -2, to: Date())!),
DailyGainLoss(day: "S", value: 1200, date: Calendar.current.date(byAdding: .day, value: -1, to: Date())!),
DailyGainLoss(day: "SU", value: -800, date: Date())
],
monthlyGainLoss: generateMonthlyGainLoss()
),
User(
id: 1,
username: "antoinztte",
email: "act238@cornell.edu",
balance: 1000,
username: "peterbidoshi",
email: "pb384@cornell.edu",
balance: 1500,
contracts: [],
sellerTransations: [],
buyerTransactions: []
sellerTransactions: [],
buyerTransactions: [],
createdAt: Calendar.current.date(byAdding: .day, value: -30, to: Date())!,
totalProfit: 25,
ranking: 87,
weeklyGainLoss: [
DailyGainLoss(day: "M", value: 500, date: Calendar.current.date(byAdding: .day, value: -6, to: Date())!),
DailyGainLoss(day: "T", value: 4000, date: Calendar.current.date(byAdding: .day, value: -5, to: Date())!),
DailyGainLoss(day: "W", value: -2500, date: Calendar.current.date(byAdding: .day, value: -4, to: Date())!),
DailyGainLoss(day: "TH", value: 200, date: Calendar.current.date(byAdding: .day, value: -3, to: Date())!),
DailyGainLoss(day: "F", value: -1200, date: Calendar.current.date(byAdding: .day, value: -2, to: Date())!),
DailyGainLoss(day: "S", value: 600, date: Calendar.current.date(byAdding: .day, value: -1, to: Date())!),
DailyGainLoss(day: "SU", value: 2000, date: Date())
],
monthlyGainLoss: generateMonthlyGainLoss()
)
]
}
94 changes: 55 additions & 39 deletions All In/Features/Shared/Views/TabBar.swift
Original file line number Diff line number Diff line change
@@ -5,56 +5,72 @@
// Created by Peter Bidoshi on 3/17/24.
//

import Foundation
import SwiftUI

struct TabBar: View {
let page: String
let tabItemSize: CGFloat = 24

@Binding var selectedPage: TabBarPage

private let pages: [TabBarPage] = [.home, .market, .betTracker]
private let tabItemSize: CGFloat = 24
private let unselectedColor = Constants.Colors.white
private let selectedColor = Constants.Colors.gradientLightBlue

var body: some View {
ZStack {
Constants.Colors.background
.ignoresSafeArea(edges: .bottom)
VStack {
HStack {
VStack {
Image("home")
.renderingMode(.template)
.resizable()
.frame(width: tabItemSize, height: tabItemSize)
.foregroundStyle(page == "home" ? Constants.Colors.red : Constants.Colors.white)
Text("Home")
.font(.system(size: 12, weight: .regular))
.foregroundStyle(page == "home" ? Constants.Colors.red : Constants.Colors.white)
}
Spacer()
VStack {
Image("marketplace")
.renderingMode(.template)
.resizable()
.frame(width: tabItemSize, height: tabItemSize)
.foregroundStyle(page == "market" ? Constants.Colors.red : Constants.Colors.white)
Text("Marketplace")
.font(.system(size: 12, weight: .regular))
.foregroundStyle(page == "market" ? Constants.Colors.red : Constants.Colors.white)
}
Spacer()
VStack {
Image("bet-tracker")
.renderingMode(.template)
.resizable()
.frame(width: tabItemSize, height: tabItemSize)
.foregroundStyle(page == "profile" ? Constants.Colors.red : Constants.Colors.white)
Text("Bet Tracker")
.font(.system(size: 12, weight: .regular))
.foregroundStyle(page == "profile" ? Constants.Colors.red : Constants.Colors.white)
ForEach(pages, id: \.id) { page in
tabButton(page: page) {
VStack {
Image(page.image)
.renderingMode(.template)
.resizable()
.frame(width: tabItemSize, height: tabItemSize)
.foregroundStyle(selectedPage == page ? selectedColor: unselectedColor)

Text(page.name)
.font(.system(size: 12, weight: .regular))
.foregroundStyle(selectedPage == page ? selectedColor: unselectedColor)
}
}

if page.id != pages.last?.id {
Spacer()
}
}
}
.padding(EdgeInsets(top: 0, leading: 32, bottom: 24, trailing: 32))

Spacer()
}.padding()
}

func tabButton(page: TabBarPage, content: () -> some View) -> some View {
Button {
selectedPage = page
} label: {
content()
}
.toolbarBackground(Constants.Colors.background, for: .tabBar)
.frame(width: 96, height: 48)
}
}

class TabNavigationManager: ObservableObject {
@Published var selectedTab: TabBarPage = .home
}

struct TabBarPage: Equatable {

let id: Int
let name: String
let image: String

static let home = TabBarPage(id: 0, name: "Home", image: "home")
static let market = TabBarPage(id: 1, name: "Marketplace", image: "marketplace")
static let betTracker = TabBarPage(id: 2, name: "Bet Tracker", image: "bet-tracker")

}

#Preview {
TabBar(page: "market")
TabBar(selectedPage: .constant(.home))
}

This file was deleted.

Binary file not shown.
Binary file not shown.
Binary file not shown.
24 changes: 0 additions & 24 deletions All In/Resources/Assets.xcassets/Profile.imageset/Contents.json

This file was deleted.

6 changes: 0 additions & 6 deletions All In/Resources/Assets.xcassets/Profile.imageset/Person.svg

This file was deleted.

Binary file added All In/Resources/Fonts/LexendDeca-Light.ttf
Binary file not shown.
Binary file added All In/Resources/Fonts/LexendDeca-Medium.ttf
Binary file not shown.
Binary file added All In/Resources/Fonts/LexendDeca-Regular.ttf
Binary file not shown.
Binary file added All In/Resources/Fonts/LexendDeca-SemiBold.ttf
Binary file not shown.
18 changes: 17 additions & 1 deletion All In/Utils/Constants.swift
Original file line number Diff line number Diff line change
@@ -33,6 +33,11 @@ struct Constants {
static let gradientLavender = Color(hex: 0x7D97FE)
static let blackBlue = Color(hex: 0x201E2D)

// Charts
static let greenChart = Color(hex: 0x47CD89)
static let redChart = Color(hex: 0xF97066)
static let moneyGreen = Color(hex: 0x47CD89)

// System
static let background = Color(hex: 0x15141B)
}
@@ -45,7 +50,18 @@ struct Constants {
static let subheader = Font.system(size: 18, weight: .bold, design: .default)
static let bodyBold = Font.system(size: 16, weight: .semibold, design: .default)
static let body = Font.system(size: 16, weight: .regular, design: .default)
static let caption = Font.system(size: 12, weight: .regular, design: .default)
static let pillButton = Font.system(size: 12, weight: .semibold, design: .default)

// Profile
static let headerProfile = Font.custom("LexendDeca-SemiBold", size: 24)
static let subheaderProfile = Font.custom("LexendDeca-SemiBold", size: 18)
static let cardHeader = Font.custom("LexendDeca-SemiBold", size: 12)
static let cardContent = Font.custom("LexendDeca-Medium", size: 22)
static let profileCard = Font.custom("LexendDeca-SemiBold", size: 20)
static let caption = Font.custom("LexendDeca-Medium", size: 12)
static let subFAQ = Font.custom("LexendDeca-Light", size: 15)
static let faqDetail = Font.custom("LexendDeca-Medium", size: 16)
static let faqDetail2 = Font.custom("LexendDeca-Light", size: 14)
}

struct UserDefaultKeys {
13 changes: 13 additions & 0 deletions All-In-Info.plist
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?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>UIAppFonts</key>
<array>
<string>LexendDeca-Light.ttf</string>
<string>LexendDeca-Medium.ttf</string>
<string>LexendDeca-SemiBold.ttf</string>
<string>LexendDeca-Bold.ttf</string>
</array>
</dict>
</plist>