Signed-off-by: Matt Bruce <mbrucedogs@gmail.com>

This commit is contained in:
Matt Bruce 2026-02-03 08:21:26 -06:00
parent c081d3c86a
commit e0d7fa750f
9 changed files with 51 additions and 38 deletions

View File

@ -449,7 +449,7 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO; COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf; DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = 6R7KLBPBLZ; DEVELOPMENT_TEAM = "$(DEVELOPMENT_TEAM)";
ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES; ENABLE_TESTABILITY = YES;
ENABLE_USER_SCRIPT_SANDBOXING = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES;
@ -561,8 +561,8 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.1; MARKETING_VERSION = 1.1;
PRODUCT_BUNDLE_IDENTIFIER = com.mbrucedogs.Andromida; PRODUCT_BUNDLE_IDENTIFIER = "$(APP_BUNDLE_IDENTIFIER)";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(PRODUCT_NAME)";
STRING_CATALOG_GENERATE_SYMBOLS = YES; STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_APPROACHABLE_CONCURRENCY = YES; SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor;
@ -597,8 +597,8 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.1; MARKETING_VERSION = 1.1;
PRODUCT_BUNDLE_IDENTIFIER = com.mbrucedogs.Andromida; PRODUCT_BUNDLE_IDENTIFIER = "$(APP_BUNDLE_IDENTIFIER)";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(PRODUCT_NAME)";
STRING_CATALOG_GENERATE_SYMBOLS = YES; STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_APPROACHABLE_CONCURRENCY = YES; SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor;
@ -621,7 +621,7 @@
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 26.2; IPHONEOS_DEPLOYMENT_TARGET = 26.2;
MARKETING_VERSION = 1.1; MARKETING_VERSION = 1.1;
PRODUCT_BUNDLE_IDENTIFIER = com.mbrucedogs.AndromidaTests; PRODUCT_BUNDLE_IDENTIFIER = "$(TESTS_BUNDLE_IDENTIFIER)";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
STRING_CATALOG_GENERATE_SYMBOLS = NO; STRING_CATALOG_GENERATE_SYMBOLS = NO;
SWIFT_APPROACHABLE_CONCURRENCY = YES; SWIFT_APPROACHABLE_CONCURRENCY = YES;
@ -645,7 +645,7 @@
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 26.2; IPHONEOS_DEPLOYMENT_TARGET = 26.2;
MARKETING_VERSION = 1.1; MARKETING_VERSION = 1.1;
PRODUCT_BUNDLE_IDENTIFIER = com.mbrucedogs.AndromidaTests; PRODUCT_BUNDLE_IDENTIFIER = "$(TESTS_BUNDLE_IDENTIFIER)";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
STRING_CATALOG_GENERATE_SYMBOLS = NO; STRING_CATALOG_GENERATE_SYMBOLS = NO;
SWIFT_APPROACHABLE_CONCURRENCY = YES; SWIFT_APPROACHABLE_CONCURRENCY = YES;
@ -667,7 +667,7 @@
DEVELOPMENT_TEAM = 6R7KLBPBLZ; DEVELOPMENT_TEAM = 6R7KLBPBLZ;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.1; MARKETING_VERSION = 1.1;
PRODUCT_BUNDLE_IDENTIFIER = com.mbrucedogs.AndromidaUITests; PRODUCT_BUNDLE_IDENTIFIER = "$(UITESTS_BUNDLE_IDENTIFIER)";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
STRING_CATALOG_GENERATE_SYMBOLS = NO; STRING_CATALOG_GENERATE_SYMBOLS = NO;
SWIFT_APPROACHABLE_CONCURRENCY = YES; SWIFT_APPROACHABLE_CONCURRENCY = YES;
@ -689,7 +689,7 @@
DEVELOPMENT_TEAM = 6R7KLBPBLZ; DEVELOPMENT_TEAM = 6R7KLBPBLZ;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.1; MARKETING_VERSION = 1.1;
PRODUCT_BUNDLE_IDENTIFIER = com.mbrucedogs.AndromidaUITests; PRODUCT_BUNDLE_IDENTIFIER = "$(UITESTS_BUNDLE_IDENTIFIER)";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
STRING_CATALOG_GENERATE_SYMBOLS = NO; STRING_CATALOG_GENERATE_SYMBOLS = NO;
SWIFT_APPROACHABLE_CONCURRENCY = YES; SWIFT_APPROACHABLE_CONCURRENCY = YES;
@ -722,7 +722,7 @@
"@executable_path/../../Frameworks", "@executable_path/../../Frameworks",
); );
MARKETING_VERSION = 1.1; MARKETING_VERSION = 1.1;
PRODUCT_BUNDLE_IDENTIFIER = com.mbrucedogs.Andromida.AndromidaWidget; PRODUCT_BUNDLE_IDENTIFIER = "$(WIDGET_BUNDLE_IDENTIFIER)";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES; SKIP_INSTALL = YES;
STRING_CATALOG_GENERATE_SYMBOLS = YES; STRING_CATALOG_GENERATE_SYMBOLS = YES;
@ -755,7 +755,7 @@
"@executable_path/../../Frameworks", "@executable_path/../../Frameworks",
); );
MARKETING_VERSION = 1.1; MARKETING_VERSION = 1.1;
PRODUCT_BUNDLE_IDENTIFIER = com.mbrucedogs.Andromida.AndromidaWidget; PRODUCT_BUNDLE_IDENTIFIER = "$(WIDGET_BUNDLE_IDENTIFIER)";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES; SKIP_INSTALL = YES;
STRING_CATALOG_GENERATE_SYMBOLS = YES; STRING_CATALOG_GENERATE_SYMBOLS = YES;

View File

@ -16,7 +16,7 @@
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "EAC04A972F26BAE8007F87EA" BlueprintIdentifier = "EAC04A972F26BAE8007F87EA"
BuildableName = "Andromida.app" BuildableName = "Rituals.app"
BlueprintName = "Andromida" BlueprintName = "Andromida"
ReferencedContainer = "container:Andromida.xcodeproj"> ReferencedContainer = "container:Andromida.xcodeproj">
</BuildableReference> </BuildableReference>
@ -45,7 +45,7 @@
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "EAC04A972F26BAE8007F87EA" BlueprintIdentifier = "EAC04A972F26BAE8007F87EA"
BuildableName = "Andromida.app" BuildableName = "Rituals.app"
BlueprintName = "Andromida" BlueprintName = "Andromida"
ReferencedContainer = "container:Andromida.xcodeproj"> ReferencedContainer = "container:Andromida.xcodeproj">
</BuildableReference> </BuildableReference>
@ -62,7 +62,7 @@
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "EAC04A972F26BAE8007F87EA" BlueprintIdentifier = "EAC04A972F26BAE8007F87EA"
BuildableName = "Andromida.app" BuildableName = "Rituals.app"
BlueprintName = "Andromida" BlueprintName = "Andromida"
ReferencedContainer = "container:Andromida.xcodeproj"> ReferencedContainer = "container:Andromida.xcodeproj">
</BuildableReference> </BuildableReference>

View File

@ -31,7 +31,7 @@
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "EAC04A972F26BAE8007F87EA" BlueprintIdentifier = "EAC04A972F26BAE8007F87EA"
BuildableName = "Andromida.app" BuildableName = "Rituals.app"
BlueprintName = "Andromida" BlueprintName = "Andromida"
ReferencedContainer = "container:Andromida.xcodeproj"> ReferencedContainer = "container:Andromida.xcodeproj">
</BuildableReference> </BuildableReference>
@ -72,7 +72,7 @@
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "EAC04A972F26BAE8007F87EA" BlueprintIdentifier = "EAC04A972F26BAE8007F87EA"
BuildableName = "Andromida.app" BuildableName = "Rituals.app"
BlueprintName = "Andromida" BlueprintName = "Andromida"
ReferencedContainer = "container:Andromida.xcodeproj"> ReferencedContainer = "container:Andromida.xcodeproj">
</BuildableReference> </BuildableReference>
@ -108,7 +108,7 @@
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "EAC04A972F26BAE8007F87EA" BlueprintIdentifier = "EAC04A972F26BAE8007F87EA"
BuildableName = "Andromida.app" BuildableName = "Rituals.app"
BlueprintName = "Andromida" BlueprintName = "Andromida"
ReferencedContainer = "container:Andromida.xcodeproj"> ReferencedContainer = "container:Andromida.xcodeproj">
</BuildableReference> </BuildableReference>

View File

@ -9,6 +9,11 @@
<key>orderHint</key> <key>orderHint</key>
<integer>1</integer> <integer>1</integer>
</dict> </dict>
<key>AndromidaTests.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>3</integer>
</dict>
<key>AndromidaWidgetExtension.xcscheme_^#shared#^_</key> <key>AndromidaWidgetExtension.xcscheme_^#shared#^_</key>
<dict> <dict>
<key>orderHint</key> <key>orderHint</key>

View File

@ -12,6 +12,7 @@ struct AndromidaApp: App {
/// Track if user just completed the wizard (to start on Rituals tab) /// Track if user just completed the wizard (to start on Rituals tab)
@State private var justCompletedWizard = false @State private var justCompletedWizard = false
@State private var isTransitioningToRoot = false
init() { init() {
// Register app's color theme for Bedrock components // Register app's color theme for Bedrock components
@ -55,14 +56,13 @@ struct AndromidaApp: App {
if hasCompletedSetupWizard { if hasCompletedSetupWizard {
// Main app - start on Rituals tab if just completed wizard // Main app - start on Rituals tab if just completed wizard
AppLaunchView(config: .rituals) { RootView(
RootView( store: store,
store: store, settingsStore: settingsStore,
settingsStore: settingsStore, categoryStore: categoryStore,
categoryStore: categoryStore, initialTab: justCompletedWizard ? .rituals : .today
initialTab: justCompletedWizard ? .rituals : .today )
) .transition(.opacity)
}
} else { } else {
// First-run setup wizard // First-run setup wizard
AppLaunchView(config: .rituals) { AppLaunchView(config: .rituals) {
@ -72,7 +72,7 @@ struct AndromidaApp: App {
reminderScheduler: store.reminderScheduler, reminderScheduler: store.reminderScheduler,
onComplete: { onComplete: {
justCompletedWizard = true justCompletedWizard = true
withAnimation { withAnimation(.easeInOut(duration: 0.5)) {
hasCompletedSetupWizard = true hasCompletedSetupWizard = true
} }
} }

View File

@ -9,7 +9,7 @@ struct RootView: View {
@State private var selectedTab: RootTab @State private var selectedTab: RootTab
@State private var analyticsPrewarmTask: Task<Void, Never>? @State private var analyticsPrewarmTask: Task<Void, Never>?
@State private var isForegroundRefreshing = false @State private var isForegroundRefreshing = false
@State private var isResumingFromBackground = true @State private var isResumingFromBackground = false
private let foregroundRefreshMinimumSeconds: TimeInterval = 0.15 private let foregroundRefreshMinimumSeconds: TimeInterval = 0.15
private let debugForegroundRefreshMinimumSeconds: TimeInterval = 0.8 private let debugForegroundRefreshMinimumSeconds: TimeInterval = 0.8
private let debugForegroundRefreshKey = "debugForegroundRefreshNextForeground" private let debugForegroundRefreshKey = "debugForegroundRefreshNextForeground"

View File

@ -17,7 +17,14 @@ enum AppIdentifiers {
Bundle.main.bundleIdentifier ?? "com.mbrucedogs.Andromida" Bundle.main.bundleIdentifier ?? "com.mbrucedogs.Andromida"
} }
// User-facing app name
static let appName: String = {
Bundle.main.object(forInfoDictionaryKey: "CFBundleDisplayName") as? String
?? Bundle.main.object(forInfoDictionaryKey: "CFBundleName") as? String
?? "Rituals"
}()
static var widgetBundleIdentifier: String { static var widgetBundleIdentifier: String {
"\(bundleIdentifier).Widget" "\(bundleIdentifier).AndromidaWidget"
} }
} }

View File

@ -6,20 +6,21 @@
// ============================================================================= // =============================================================================
COMPANY_IDENTIFIER = com.mbrucedogs COMPANY_IDENTIFIER = com.mbrucedogs
APP_NAME = Andromida BUNDLE_ID_NAME = Andromida
DEVELOPMENT_TEAM = // Add your Team ID here if needed PRODUCT_NAME = Rituals
DEVELOPMENT_TEAM = 6R7KLBPBLZ
// ============================================================================= // =============================================================================
// DERIVED IDENTIFIERS - DO NOT EDIT // DERIVED IDENTIFIERS - DO NOT EDIT
// ============================================================================= // =============================================================================
APP_BUNDLE_IDENTIFIER = $(COMPANY_IDENTIFIER).$(APP_NAME) APP_BUNDLE_IDENTIFIER = $(COMPANY_IDENTIFIER).$(BUNDLE_ID_NAME)
WATCH_BUNDLE_IDENTIFIER = $(APP_BUNDLE_IDENTIFIER).watchkitapp WATCH_BUNDLE_IDENTIFIER = $(APP_BUNDLE_IDENTIFIER).watchkitapp
APPCLIP_BUNDLE_IDENTIFIER = $(APP_BUNDLE_IDENTIFIER).Clip APPCLIP_BUNDLE_IDENTIFIER = $(APP_BUNDLE_IDENTIFIER).Clip
WIDGET_BUNDLE_IDENTIFIER = $(APP_BUNDLE_IDENTIFIER).Widget WIDGET_BUNDLE_IDENTIFIER = $(APP_BUNDLE_IDENTIFIER).AndromidaWidget
INTENT_BUNDLE_IDENTIFIER = $(APP_BUNDLE_IDENTIFIER).Intent INTENT_BUNDLE_IDENTIFIER = $(APP_BUNDLE_IDENTIFIER).Intent
TESTS_BUNDLE_IDENTIFIER = $(COMPANY_IDENTIFIER).$(APP_NAME)Tests TESTS_BUNDLE_IDENTIFIER = $(COMPANY_IDENTIFIER).$(BUNDLE_ID_NAME)Tests
UITESTS_BUNDLE_IDENTIFIER = $(COMPANY_IDENTIFIER).$(APP_NAME)UITests UITESTS_BUNDLE_IDENTIFIER = $(COMPANY_IDENTIFIER).$(BUNDLE_ID_NAME)UITests
APP_GROUP_IDENTIFIER = group.$(COMPANY_IDENTIFIER).$(APP_NAME) APP_GROUP_IDENTIFIER = group.$(COMPANY_IDENTIFIER).$(BUNDLE_ID_NAME)
CLOUDKIT_CONTAINER_IDENTIFIER = iCloud.$(COMPANY_IDENTIFIER).$(APP_NAME) CLOUDKIT_CONTAINER_IDENTIFIER = iCloud.$(COMPANY_IDENTIFIER).$(BUNDLE_ID_NAME)

View File

@ -7,9 +7,9 @@
<key>NSExtensionPointIdentifier</key> <key>NSExtensionPointIdentifier</key>
<string>com.apple.widgetkit-extension</string> <string>com.apple.widgetkit-extension</string>
</dict> </dict>
<key>AppGroupIdentifier</key>
<string>$(APP_GROUP_IDENTIFIER)</string>
<key>CloudKitContainerIdentifier</key> <key>CloudKitContainerIdentifier</key>
<string>$(CLOUDKIT_CONTAINER_IDENTIFIER)</string> <string>$(CLOUDKIT_CONTAINER_IDENTIFIER)</string>
<key>AppGroupIdentifier</key>
<string>$(APP_GROUP_IDENTIFIER)</string>
</dict> </dict>
</plist> </plist>