diff --git a/StikJIT/Utilities/FeatureFlags.swift b/StikJIT/Utilities/FeatureFlags.swift new file mode 100644 index 0000000..547b761 --- /dev/null +++ b/StikJIT/Utilities/FeatureFlags.swift @@ -0,0 +1,6 @@ +import Foundation + +enum FeatureFlags { + /// Global toggle for exposing location spoofing UI/logic. + static let isLocationSpoofingEnabled = false +} diff --git a/StikJIT/Utilities/TabConfiguration.swift b/StikJIT/Utilities/TabConfiguration.swift index 7465673..ca2449f 100644 --- a/StikJIT/Utilities/TabConfiguration.swift +++ b/StikJIT/Utilities/TabConfiguration.swift @@ -3,7 +3,14 @@ import Foundation enum TabConfiguration { static let storageKey = "enabledTabIdentifiers" static let maxSelectableTabs = 4 - static let allowedIDs: [String] = ["home", "console", "scripts", "profiles", "processes", "deviceinfo", "location"] + private static let baseAllowedIDs: [String] = ["home", "console", "scripts", "profiles", "processes", "deviceinfo"] + static var allowedIDs: [String] { + var ids = baseAllowedIDs + if FeatureFlags.isLocationSpoofingEnabled { + ids.append("location") + } + return ids + } static let defaultIDs: [String] = ["home", "console", "scripts", "profiles"] static let defaultRawValue = serialize(defaultIDs) diff --git a/StikJIT/Views/MainTabView.swift b/StikJIT/Views/MainTabView.swift index d1e73f8..0951a0b 100644 --- a/StikJIT/Views/MainTabView.swift +++ b/StikJIT/Views/MainTabView.swift @@ -61,7 +61,7 @@ struct MainTabView: View { private var availableTabs: [TabDescriptor] { configurableTabs.filter { descriptor in - descriptor.id != "location" || !isAppStoreBuild + descriptor.id != "location" || (FeatureFlags.isLocationSpoofingEnabled && !isAppStoreBuild) } } diff --git a/StikJIT/Views/ProfileView.swift b/StikJIT/Views/ProfileView.swift index 0c77cb0..16a287b 100644 --- a/StikJIT/Views/ProfileView.swift +++ b/StikJIT/Views/ProfileView.swift @@ -359,17 +359,25 @@ struct ProfileView: View { } func loadProfiles() async { - working = true + await MainActor.run { working = true } do { - let profileDatas = try JITEnableContext.shared.fetchAllProfiles() - self.profiles = profileDatas.map { Profile(data: $0) } + let profileDatas = try await Task.detached(priority: .userInitiated) { + try JITEnableContext.shared.fetchAllProfiles() + }.value + let parsedProfiles = profileDatas.map { Profile(data: $0) } + await MainActor.run { + self.profiles = parsedProfiles + self.working = false + } } catch { - alertMsg = error.localizedDescription - alertTitle = "Failed to Fetch Profiles" - alertSuccess = false - alert = true + await MainActor.run { + alertMsg = error.localizedDescription + alertTitle = "Failed to Fetch Profiles" + alertSuccess = false + alert = true + working = false + } } - working = false } func saveProfile(profile: Profile) { diff --git a/StikJIT/Views/SettingsView.swift b/StikJIT/Views/SettingsView.swift index d25bdd1..41686f6 100644 --- a/StikJIT/Views/SettingsView.swift +++ b/StikJIT/Views/SettingsView.swift @@ -94,7 +94,7 @@ struct SettingsView: View { TabOption(id: "processes", title: "Processes", detail: "Inspect running apps", icon: "rectangle.stack.person.crop", isBeta: true), TabOption(id: "deviceinfo", title: "Device Info", detail: "View detailed device metadata", icon: "iphone.and.arrow.forward", isBeta: false) ] - if !isAppStoreBuild { + if FeatureFlags.isLocationSpoofingEnabled && !isAppStoreBuild { options.append(TabOption(id: "location", title: "Location Sim", detail: "Sideload only", icon: "location", isBeta: true)) } return options