Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
2862b45
feat: firebase initialization
benedictusyoga Nov 26, 2025
9dfd460
Merge remote-tracking branch 'refs/remotes/origin/feat/firebase-imple…
benedictusyoga Nov 26, 2025
1003cfd
feat: firebase initialization
benedictusyoga Nov 26, 2025
ed56072
Merge remote-tracking branch 'refs/remotes/origin/feat/firebase-imple…
benedictusyoga Nov 26, 2025
c96f620
feat: sign in with apple init
benedictusyoga Nov 26, 2025
65737d7
Merge remote-tracking branch 'refs/remotes/origin/feat/firebase-imple…
benedictusyoga Nov 26, 2025
92636cf
feat: room and mom init success
benedictusyoga Nov 26, 2025
3a8586e
Merge remote-tracking branch 'refs/remotes/origin/feat/firebase-imple…
benedictusyoga Nov 26, 2025
ecf9ded
feat: heartbeat sync init
benedictusyoga Nov 26, 2025
06152cf
Merge remote-tracking branch 'refs/remotes/origin/feat/firebase-imple…
benedictusyoga Nov 27, 2025
248a8b5
feat: mom/dad sync works!
benedictusyoga Nov 27, 2025
c4bc9a1
Merge remote-tracking branch 'refs/remotes/origin/feat/firebase-imple…
benedictusyoga Nov 27, 2025
ef43603
feat: updated provisioning profile
benedictusyoga Nov 27, 2025
0be004d
Merge remote-tracking branch 'refs/remotes/origin/feat/firebase-imple…
benedictusyoga Nov 28, 2025
701b034
fix: listening mode top text
destucr Nov 27, 2025
8e97557
feat: add profile screen
destucr Nov 26, 2025
fe4b29c
feat: add profile navigation in PregnancyTimelineView
destucr Nov 26, 2025
d2f8d9e
fix: profile in pregnancy timeline view
destucr Nov 27, 2025
a379a91
fix: swiftlint violation
destucr Nov 27, 2025
de7a696
fix: profile name input
destucr Nov 28, 2025
2675fd5
Merge branch 'development' into fix/profile-auth
destucr Nov 28, 2025
5760534
fix: swiftlint
destucr Nov 28, 2025
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
65 changes: 55 additions & 10 deletions Tiny.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@

/* Begin PBXBuildFile section */
430725D62EC5C791006234D7 /* Orb in Frameworks */ = {isa = PBXBuildFile; productRef = 430725D52EC5C791006234D7 /* Orb */; };
DE00E4A12ED5AFA0005EC8F5 /* FirebaseAnalytics in Frameworks */ = {isa = PBXBuildFile; productRef = DE00E4A02ED5AFA0005EC8F5 /* FirebaseAnalytics */; };
DE00E6792ED6D630005EC8F5 /* FirebaseAuth in Frameworks */ = {isa = PBXBuildFile; productRef = DE00E6782ED6D630005EC8F5 /* FirebaseAuth */; };
DE00E67B2ED6D630005EC8F5 /* FirebaseFirestore in Frameworks */ = {isa = PBXBuildFile; productRef = DE00E67A2ED6D630005EC8F5 /* FirebaseFirestore */; };
DE00E67D2ED6D630005EC8F5 /* FirebaseStorage in Frameworks */ = {isa = PBXBuildFile; productRef = DE00E67C2ED6D630005EC8F5 /* FirebaseStorage */; };
DE5E9C862EB354B200485B15 /* AudioKit in Frameworks */ = {isa = PBXBuildFile; productRef = DE5E9C852EB354B200485B15 /* AudioKit */; };
DE5E9C882EB354B700485B15 /* AudioKitEX in Frameworks */ = {isa = PBXBuildFile; productRef = DE5E9C872EB354B700485B15 /* AudioKitEX */; };
/* End PBXBuildFile section */
Expand All @@ -33,9 +37,6 @@
433435C42EACD4E4004C6B8C /* Tiny.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Tiny.app; sourceTree = BUILT_PRODUCTS_DIR; };
433435D12EACD4E5004C6B8C /* TinyTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TinyTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
433435DB2EACD4E5004C6B8C /* TinyUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TinyUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
DEFE64C82ECB6123004B115A /* AudioKit */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = AudioKit; path = "/Users/benedictusyoga/Library/Developer/Xcode/DerivedData/Tiny-avirkidcxafmvjhegizwaahcarxv/SourcePackages/checkouts/AudioKit"; sourceTree = "<absolute>"; };
DEFE64C92ECB6126004B115A /* AudioKitEX */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = AudioKitEX; path = "/Users/benedictusyoga/Library/Developer/Xcode/DerivedData/Tiny-avirkidcxafmvjhegizwaahcarxv/SourcePackages/checkouts/AudioKitEX"; sourceTree = "<absolute>"; };
DEFE64CA2ECB6128004B115A /* Orb */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = Orb; path = "/Users/benedictusyoga/Library/Developer/Xcode/DerivedData/Tiny-avirkidcxafmvjhegizwaahcarxv/SourcePackages/checkouts/Orb"; sourceTree = "<absolute>"; };
/* End PBXFileReference section */

/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
Expand Down Expand Up @@ -75,8 +76,12 @@
buildActionMask = 2147483647;
files = (
430725D62EC5C791006234D7 /* Orb in Frameworks */,
DE00E6792ED6D630005EC8F5 /* FirebaseAuth in Frameworks */,
DE5E9C862EB354B200485B15 /* AudioKit in Frameworks */,
DE00E4A12ED5AFA0005EC8F5 /* FirebaseAnalytics in Frameworks */,
DE00E67D2ED6D630005EC8F5 /* FirebaseStorage in Frameworks */,
DE5E9C882EB354B700485B15 /* AudioKitEX in Frameworks */,
DE00E67B2ED6D630005EC8F5 /* FirebaseFirestore in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down Expand Up @@ -121,9 +126,6 @@
DE5E9C842EB354B200485B15 /* Frameworks */ = {
isa = PBXGroup;
children = (
DEFE64C82ECB6123004B115A /* AudioKit */,
DEFE64C92ECB6126004B115A /* AudioKitEX */,
DEFE64CA2ECB6128004B115A /* Orb */,
);
name = Frameworks;
sourceTree = "<group>";
Expand Down Expand Up @@ -152,6 +154,10 @@
DE5E9C852EB354B200485B15 /* AudioKit */,
DE5E9C872EB354B700485B15 /* AudioKitEX */,
430725D52EC5C791006234D7 /* Orb */,
DE00E4A02ED5AFA0005EC8F5 /* FirebaseAnalytics */,
DE00E6782ED6D630005EC8F5 /* FirebaseAuth */,
DE00E67A2ED6D630005EC8F5 /* FirebaseFirestore */,
DE00E67C2ED6D630005EC8F5 /* FirebaseStorage */,
);
productName = tiny;
productReference = 433435C42EACD4E4004C6B8C /* Tiny.app */;
Expand Down Expand Up @@ -240,6 +246,7 @@
DEF686412EB33FA9004CC0C3 /* XCRemoteSwiftPackageReference "AudioKit" */,
DEF686422EB33FB2004CC0C3 /* XCRemoteSwiftPackageReference "AudioKitEX" */,
430725D42EC5C69D006234D7 /* XCRemoteSwiftPackageReference "Orb" */,
DE00E49F2ED5AFA0005EC8F5 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */,
);
preferredProjectObjectVersion = 77;
productRefGroup = 433435C52EACD4E4004C6B8C /* Products */;
Expand Down Expand Up @@ -465,9 +472,12 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_STYLE = Automatic;
CODE_SIGN_ENTITLEMENTS = Tiny/Tiny.entitlements;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 6PN64DQKLX;
DEVELOPMENT_TEAM = "";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = YPC2WUCUT5;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = Tiny/Info.plist;
Expand All @@ -490,6 +500,8 @@
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.miracle.tiny;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = TinyProvisionProfile;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
Expand All @@ -509,9 +521,12 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_STYLE = Automatic;
CODE_SIGN_ENTITLEMENTS = Tiny/Tiny.entitlements;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 6PN64DQKLX;
DEVELOPMENT_TEAM = "";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = YPC2WUCUT5;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = Tiny/Info.plist;
Expand All @@ -534,6 +549,8 @@
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.miracle.tiny;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = TinyProvisionProfile;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
Expand Down Expand Up @@ -682,6 +699,14 @@
minimumVersion = 0.2.0;
};
};
DE00E49F2ED5AFA0005EC8F5 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/firebase/firebase-ios-sdk";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 12.6.0;
};
};
DEF686412EB33FA9004CC0C3 /* XCRemoteSwiftPackageReference "AudioKit" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/AudioKit/AudioKit.git";
Expand All @@ -706,6 +731,26 @@
package = 430725D42EC5C69D006234D7 /* XCRemoteSwiftPackageReference "Orb" */;
productName = Orb;
};
DE00E4A02ED5AFA0005EC8F5 /* FirebaseAnalytics */ = {
isa = XCSwiftPackageProductDependency;
package = DE00E49F2ED5AFA0005EC8F5 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */;
productName = FirebaseAnalytics;
};
DE00E6782ED6D630005EC8F5 /* FirebaseAuth */ = {
isa = XCSwiftPackageProductDependency;
package = DE00E49F2ED5AFA0005EC8F5 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */;
productName = FirebaseAuth;
};
DE00E67A2ED6D630005EC8F5 /* FirebaseFirestore */ = {
isa = XCSwiftPackageProductDependency;
package = DE00E49F2ED5AFA0005EC8F5 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */;
productName = FirebaseFirestore;
};
DE00E67C2ED6D630005EC8F5 /* FirebaseStorage */ = {
isa = XCSwiftPackageProductDependency;
package = DE00E49F2ED5AFA0005EC8F5 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */;
productName = FirebaseStorage;
};
DE5E9C852EB354B200485B15 /* AudioKit */ = {
isa = XCSwiftPackageProductDependency;
package = DEF686412EB33FA9004CC0C3 /* XCRemoteSwiftPackageReference "AudioKit" */;
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

31 changes: 28 additions & 3 deletions Tiny/App/ContentView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,21 @@ import SwiftData
struct ContentView: View {
@AppStorage("hasShownOnboarding") var hasShownOnboarding: Bool = false
@StateObject private var heartbeatSoundManager = HeartbeatSoundManager()
@State private var showTimeline = false


@Environment(\.modelContext) private var modelContext
@EnvironmentObject var authService: AuthenticationService
@EnvironmentObject var syncManager: HeartbeatSyncManager

var body: some View {
Group {
if hasShownOnboarding {
HeartbeatMainView()
// After onboarding → always go to RootView (SignIn → Onboarding → Main)
RootView()
.environmentObject(heartbeatSoundManager)
.environmentObject(authService)
.environmentObject(syncManager)
} else {
// Onboarding only
OnBoardingView(hasShownOnboarding: $hasShownOnboarding)
}
}
Expand All @@ -31,6 +37,25 @@ struct ContentView: View {
}
}

struct RootView: View {
@EnvironmentObject var authService: AuthenticationService

var body: some View {
Group {
if !authService.isAuthenticated {
// Step 1: Landing screen with Sign in with Apple
SignInView()
} else if authService.currentUser?.role == nil {
// Step 2-4: Onboarding flow (role selection, name input, room code)
OnboardingCoordinator()
} else {
// Step 5: Main app - go to HeartbeatMainView
HeartbeatMainView()
}
}
}
}

#Preview {
ContentView()
.modelContainer(for: SavedHeartbeat.self, inMemory: true)
Expand Down
11 changes: 11 additions & 0 deletions Tiny/App/tinyApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,20 @@

import SwiftUI
import SwiftData
import FirebaseCore

@main
struct TinyApp: App {
@StateObject var heartbeatSoundManager = HeartbeatSoundManager()
@StateObject var authService = AuthenticationService()
@StateObject var syncManager = HeartbeatSyncManager()

@State private var isShowingSplashScreen: Bool = true // Add state to control splash screen

init() {
FirebaseApp.configure()
}

// Define the container configuration
var sharedModelContainer: ModelContainer = {
let schema = Schema([
Expand All @@ -35,6 +43,9 @@ struct TinyApp: App {
} else {
ContentView()
.environmentObject(heartbeatSoundManager)
.environmentObject(authService)
.environmentObject(syncManager)
.preferredColorScheme(.dark)
}
}
.modelContainer(sharedModelContainer)
Expand Down
Loading