From ae814bfb881aeed6c8b9c5a3e37081bf5c6412d9 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Wed, 11 Sep 2024 22:03:20 +0200 Subject: [PATCH] g1g1 banner --- HabitRPG/Generated/Storyboard Scenes.swift | 116 +++++++++--------- HabitRPG/Generated/Strings.swift | 6 +- .../Strings/Base.lproj/Mainstrings.strings | 1 + HabitRPG/UI/Purchases/G1G1Banner.swift | 34 +++++ HabitRPG/UI/Purchases/SubscriptionPage.swift | 10 +- Habitica.xcodeproj/project.pbxproj | 21 ++++ .../xcshareddata/swiftpm/Package.resolved | 12 +- 7 files changed, 134 insertions(+), 66 deletions(-) create mode 100644 HabitRPG/UI/Purchases/G1G1Banner.swift diff --git a/HabitRPG/Generated/Storyboard Scenes.swift b/HabitRPG/Generated/Storyboard Scenes.swift index 5476eed2a..bd7e32bf9 100644 --- a/HabitRPG/Generated/Storyboard Scenes.swift +++ b/HabitRPG/Generated/Storyboard Scenes.swift @@ -16,171 +16,171 @@ internal enum StoryboardScene { internal enum BuyModal: StoryboardType { internal static let storyboardName = "BuyModal" - internal static let initialScene = InitialSceneType(storyboard: BuyModal.self) + internal static let initialScene = InitialSceneType(storyboard: BuyModal.self) - internal static let hrpgBuyItemModalViewController = SceneType(storyboard: BuyModal.self, identifier: "HRPGBuyItemModalViewController") + internal static let hrpgBuyItemModalViewController = SceneType(storyboard: BuyModal.self, identifier: "HRPGBuyItemModalViewController") } internal enum Intro: StoryboardType { internal static let storyboardName = "Intro" - internal static let initialScene = InitialSceneType(storyboard: Intro.self) + internal static let initialScene = InitialSceneType(storyboard: Intro.self) - internal static let loginTableViewController = SceneType(storyboard: Intro.self, identifier: "LoginTableViewController") + internal static let loginTableViewController = SceneType(storyboard: Intro.self, identifier: "LoginTableViewController") } internal enum Main: StoryboardType { internal static let storyboardName = "Main" - internal static let aboutViewController = SceneType(storyboard: Main.self, identifier: "AboutViewController") + internal static let aboutViewController = SceneType(storyboard: Main.self, identifier: "AboutViewController") internal static let adventureGuideNavigationViewController = SceneType(storyboard: Main.self, identifier: "AdventureGuideNavigationViewController") - internal static let adventureGuideViewController = SceneType(storyboard: Main.self, identifier: "AdventureGuideViewController") + internal static let adventureGuideViewController = SceneType(storyboard: Main.self, identifier: "AdventureGuideViewController") - internal static let avatarOverviewViewController = SceneType(storyboard: Main.self, identifier: "AvatarOverviewViewController") + internal static let avatarOverviewViewController = SceneType(storyboard: Main.self, identifier: "AvatarOverviewViewController") - internal static let dailiesViewController = SceneType(storyboard: Main.self, identifier: "DailiesViewController") + internal static let dailiesViewController = SceneType(storyboard: Main.self, identifier: "DailiesViewController") - internal static let equipmentOverviewViewController = SceneType(storyboard: Main.self, identifier: "EquipmentOverviewViewController") + internal static let equipmentOverviewViewController = SceneType(storyboard: Main.self, identifier: "EquipmentOverviewViewController") - internal static let gemPurchaseViewController = SceneType(storyboard: Main.self, identifier: "GemPurchaseViewController") + internal static let gemPurchaseViewController = SceneType(storyboard: Main.self, identifier: "GemPurchaseViewController") - internal static let giftGemsNavController = SceneType(storyboard: Main.self, identifier: "GiftGemsNavController") + internal static let giftGemsNavController = SceneType(storyboard: Main.self, identifier: "GiftGemsNavController") - internal static let giftSubscriptionNavController = SceneType(storyboard: Main.self, identifier: "GiftSubscriptionNavController") + internal static let giftSubscriptionNavController = SceneType(storyboard: Main.self, identifier: "GiftSubscriptionNavController") - internal static let giftSubscriptionViewController = SceneType(storyboard: Main.self, identifier: "GiftSubscriptionViewController") + internal static let giftSubscriptionViewController = SceneType(storyboard: Main.self, identifier: "GiftSubscriptionViewController") - internal static let habitsViewController = SceneType(storyboard: Main.self, identifier: "HabitsViewController") + internal static let habitsViewController = SceneType(storyboard: Main.self, identifier: "HabitsViewController") internal static let itemNavigationController = SceneType(storyboard: Main.self, identifier: "ItemNavigationController") - internal static let itemsViewController = SceneType(storyboard: Main.self, identifier: "ItemsViewController") + internal static let itemsViewController = SceneType(storyboard: Main.self, identifier: "ItemsViewController") internal static let mainSplitViewController = SceneType(storyboard: Main.self, identifier: "MainSplitViewController") - internal static let mainTabBarController = SceneType(storyboard: Main.self, identifier: "MainTabBarController") + internal static let mainTabBarController = SceneType(storyboard: Main.self, identifier: "MainTabBarController") - internal static let mountDetailViewController = SceneType(storyboard: Main.self, identifier: "MountDetailViewController") + internal static let mountDetailViewController = SceneType(storyboard: Main.self, identifier: "MountDetailViewController") - internal static let mountsOverviewViewController = SceneType(storyboard: Main.self, identifier: "MountsOverviewViewController") + internal static let mountsOverviewViewController = SceneType(storyboard: Main.self, identifier: "MountsOverviewViewController") - internal static let newsViewController = SceneType(storyboard: Main.self, identifier: "NewsViewController") + internal static let newsViewController = SceneType(storyboard: Main.self, identifier: "NewsViewController") - internal static let notificationsNavigationController = SceneType(storyboard: Main.self, identifier: "NotificationsNavigationController") + internal static let notificationsNavigationController = SceneType(storyboard: Main.self, identifier: "NotificationsNavigationController") - internal static let petDetailViewController = SceneType(storyboard: Main.self, identifier: "PetDetailViewController") + internal static let petDetailViewController = SceneType(storyboard: Main.self, identifier: "PetDetailViewController") - internal static let petsOverviewViewController = SceneType(storyboard: Main.self, identifier: "PetsOverviewViewController") + internal static let petsOverviewViewController = SceneType(storyboard: Main.self, identifier: "PetsOverviewViewController") internal static let promoWebNavController = SceneType(storyboard: Main.self, identifier: "PromoWebNavController") - internal static let promoWebViewController = SceneType(storyboard: Main.self, identifier: "PromoWebViewController") + internal static let promoWebViewController = SceneType(storyboard: Main.self, identifier: "PromoWebViewController") internal static let promotionInfoNavController = SceneType(storyboard: Main.self, identifier: "PromotionInfoNavController") - internal static let promotionInfoViewController = SceneType(storyboard: Main.self, identifier: "PromotionInfoViewController") + internal static let promotionInfoViewController = SceneType(storyboard: Main.self, identifier: "PromotionInfoViewController") internal static let purchaseGemNavController = SceneType(storyboard: Main.self, identifier: "PurchaseGemNavController") - internal static let rewardsViewController = SceneType(storyboard: Main.self, identifier: "RewardsViewController") + internal static let rewardsViewController = SceneType(storyboard: Main.self, identifier: "RewardsViewController") internal static let spellUserNavigationController = SceneType(storyboard: Main.self, identifier: "SpellUserNavigationController") - internal static let stableViewController = SceneType(storyboard: Main.self, identifier: "StableViewController") + internal static let stableViewController = SceneType(storyboard: Main.self, identifier: "StableViewController") internal static let subscriptionNavController = SceneType(storyboard: Main.self, identifier: "SubscriptionNavController") internal static let taskBoardViewController = SceneType(storyboard: Main.self, identifier: "TaskBoardViewController") - internal static let todosViewController = SceneType(storyboard: Main.self, identifier: "TodosViewController") + internal static let todosViewController = SceneType(storyboard: Main.self, identifier: "TodosViewController") - internal static let avatarDetailViewController = SceneType(storyboard: Main.self, identifier: "avatarDetailViewController") + internal static let avatarDetailViewController = SceneType(storyboard: Main.self, identifier: "avatarDetailViewController") - internal static let oldAvatarDetailViewController = SceneType(storyboard: Main.self, identifier: "oldAvatarDetailViewController") + internal static let oldAvatarDetailViewController = SceneType(storyboard: Main.self, identifier: "oldAvatarDetailViewController") internal static let spellTaskNavigationController = SceneType(storyboard: Main.self, identifier: "spellTaskNavigationController") - internal static let tagNavigationController = SceneType(storyboard: Main.self, identifier: "tagNavigationController") + internal static let tagNavigationController = SceneType(storyboard: Main.self, identifier: "tagNavigationController") } internal enum Settings: StoryboardType { internal static let storyboardName = "Settings" - internal static let initialScene = InitialSceneType(storyboard: Settings.self) + internal static let initialScene = InitialSceneType(storyboard: Settings.self) internal static let classSelectionNavigationController = SceneType(storyboard: Settings.self, identifier: "ClassSelectionNavigationController") } internal enum Shop: StoryboardType { internal static let storyboardName = "Shop" - internal static let shopViewController = SceneType(storyboard: Shop.self, identifier: "ShopViewController") + internal static let shopViewController = SceneType(storyboard: Shop.self, identifier: "ShopViewController") } internal enum Social: StoryboardType { internal static let storyboardName = "Social" - internal static let challengeDetailViewController = SceneType(storyboard: Social.self, identifier: "ChallengeDetailViewController") + internal static let challengeDetailViewController = SceneType(storyboard: Social.self, identifier: "ChallengeDetailViewController") - internal static let challengeNavigationViewController = SceneType(storyboard: Social.self, identifier: "ChallengeNavigationViewController") + internal static let challengeNavigationViewController = SceneType(storyboard: Social.self, identifier: "ChallengeNavigationViewController") - internal static let challengeTableViewController = SceneType(storyboard: Social.self, identifier: "ChallengeTableViewController") + internal static let challengeTableViewController = SceneType(storyboard: Social.self, identifier: "ChallengeTableViewController") - internal static let groupChatViewController = SceneType(storyboard: Social.self, identifier: "GroupChatViewController") + internal static let groupChatViewController = SceneType(storyboard: Social.self, identifier: "GroupChatViewController") - internal static let groupTableViewController = SceneType(storyboard: Social.self, identifier: "GroupTableViewController") + internal static let groupTableViewController = SceneType(storyboard: Social.self, identifier: "GroupTableViewController") - internal static let guidelinesNavigationViewController = SceneType(storyboard: Social.self, identifier: "GuidelinesNavigationViewController") + internal static let guidelinesNavigationViewController = SceneType(storyboard: Social.self, identifier: "GuidelinesNavigationViewController") - internal static let guidelinesViewController = SceneType(storyboard: Social.self, identifier: "GuidelinesViewController") + internal static let guidelinesViewController = SceneType(storyboard: Social.self, identifier: "GuidelinesViewController") - internal static let guildsOverviewViewController = SceneType(storyboard: Social.self, identifier: "GuildsOverviewViewController") + internal static let guildsOverviewViewController = SceneType(storyboard: Social.self, identifier: "GuildsOverviewViewController") - internal static let inboxChatNavigationController = SceneType(storyboard: Social.self, identifier: "InboxChatNavigationController") + internal static let inboxChatNavigationController = SceneType(storyboard: Social.self, identifier: "InboxChatNavigationController") - internal static let inboxChatViewController = SceneType(storyboard: Social.self, identifier: "InboxChatViewController") + internal static let inboxChatViewController = SceneType(storyboard: Social.self, identifier: "InboxChatViewController") - internal static let inboxNavigationViewController = SceneType(storyboard: Social.self, identifier: "InboxNavigationViewController") + internal static let inboxNavigationViewController = SceneType(storyboard: Social.self, identifier: "InboxNavigationViewController") - internal static let inboxViewController = SceneType(storyboard: Social.self, identifier: "InboxViewController") + internal static let inboxViewController = SceneType(storyboard: Social.self, identifier: "InboxViewController") - internal static let partyNavigationViewController = SceneType(storyboard: Social.self, identifier: "PartyNavigationViewController") + internal static let partyNavigationViewController = SceneType(storyboard: Social.self, identifier: "PartyNavigationViewController") - internal static let partyViewController = SceneType(storyboard: Social.self, identifier: "PartyViewController") + internal static let partyViewController = SceneType(storyboard: Social.self, identifier: "PartyViewController") - internal static let questDetailViewController = SceneType(storyboard: Social.self, identifier: "QuestDetailViewController") + internal static let questDetailViewController = SceneType(storyboard: Social.self, identifier: "QuestDetailViewController") internal static let userProfileNavController = SceneType(storyboard: Social.self, identifier: "UserProfileNavController") - internal static let userProfileViewController = SceneType(storyboard: Social.self, identifier: "UserProfileViewController") + internal static let userProfileViewController = SceneType(storyboard: Social.self, identifier: "UserProfileViewController") } internal enum Support: StoryboardType { internal static let storyboardName = "Support" - internal static let initialScene = InitialSceneType(storyboard: Support.self) + internal static let initialScene = InitialSceneType(storyboard: Support.self) - internal static let faqDetailViewController = SceneType(storyboard: Support.self, identifier: "FAQDetailViewController") + internal static let faqDetailViewController = SceneType(storyboard: Support.self, identifier: "FAQDetailViewController") - internal static let faqViewController = SceneType(storyboard: Support.self, identifier: "FAQViewController") + internal static let faqViewController = SceneType(storyboard: Support.self, identifier: "FAQViewController") - internal static let mainSupportViewController = SceneType(storyboard: Support.self, identifier: "MainSupportViewController") + internal static let mainSupportViewController = SceneType(storyboard: Support.self, identifier: "MainSupportViewController") - internal static let reportBugViewController = SceneType(storyboard: Support.self, identifier: "ReportBugViewController") + internal static let reportBugViewController = SceneType(storyboard: Support.self, identifier: "ReportBugViewController") } internal enum Tasks: StoryboardType { internal static let storyboardName = "Tasks" internal static let taskDetailViewController = SceneType(storyboard: Tasks.self, identifier: "TaskDetailViewController") - internal static let taskFormViewController = SceneType(storyboard: Tasks.self, identifier: "TaskFormViewController") + internal static let taskFormViewController = SceneType(storyboard: Tasks.self, identifier: "TaskFormViewController") } internal enum User: StoryboardType { internal static let storyboardName = "User" - internal static let achievementsCollectionViewController = SceneType(storyboard: User.self, identifier: "AchievementsCollectionViewController") + internal static let achievementsCollectionViewController = SceneType(storyboard: User.self, identifier: "AchievementsCollectionViewController") - internal static let attributePointsViewController = SceneType(storyboard: User.self, identifier: "AttributePointsViewController") + internal static let attributePointsViewController = SceneType(storyboard: User.self, identifier: "AttributePointsViewController") - internal static let spellsViewController = SceneType(storyboard: User.self, identifier: "SpellsViewController") + internal static let spellsViewController = SceneType(storyboard: User.self, identifier: "SpellsViewController") - internal static let verifyUsernameModalViewController = SceneType(storyboard: User.self, identifier: "VerifyUsernameModalViewController") + internal static let verifyUsernameModalViewController = SceneType(storyboard: User.self, identifier: "VerifyUsernameModalViewController") } } // swiftlint:enable explicit_type_interface identifier_name line_length prefer_self_in_static_references diff --git a/HabitRPG/Generated/Strings.swift b/HabitRPG/Generated/Strings.swift index b48c848f7..6e6c96747 100644 --- a/HabitRPG/Generated/Strings.swift +++ b/HabitRPG/Generated/Strings.swift @@ -462,6 +462,10 @@ public enum L10n { public static var giftOneGetOne: String { return L10n.tr("Mainstrings", "gift_one_get_one") } /// Gift a subscription now and you’ll get the same sub for yourself free! public static var giftOneGetOneDescription: String { return L10n.tr("Mainstrings", "gift_one_get_one_description") } + /// Gift a sub and get a sub for free until %@ + public static func giftOneGetOneDescriptionDate(_ p1: String) -> String { + return L10n.tr("Mainstrings", "gift_one_get_one_description_date", p1) + } /// Gift One, Get One Event public static var giftOneGetOneEvent: String { return L10n.tr("Mainstrings", "gift_one_get_one_event") } /// Gift One, Get One @@ -1342,7 +1346,7 @@ public enum L10n { public static func xToY(_ p1: String, _ p2: String) -> String { return L10n.tr("Mainstrings", "x_to_y", p1, p2) } - /// %d/%d Gem Cap + /// %d / %d Gem Cap public static func xxGemCap(_ p1: Int, _ p2: Int) -> String { return L10n.tr("Mainstrings", "x_x_gem_cap", p1, p2) } diff --git a/HabitRPG/Strings/Base.lproj/Mainstrings.strings b/HabitRPG/Strings/Base.lproj/Mainstrings.strings index 6ee1a440f..b71c551bd 100644 --- a/HabitRPG/Strings/Base.lproj/Mainstrings.strings +++ b/HabitRPG/Strings/Base.lproj/Mainstrings.strings @@ -988,6 +988,7 @@ "gift_one_get_one_title" = "Gift One, Get One"; "gift_one_get_one_event" = "Gift One, Get One Event"; "gift_one_get_one_description" = "Gift a subscription now and you’ll get the same sub for yourself free!"; +"gift_one_get_one_description_date" = "Gift a sub and get a sub for free until %@"; "gems_support_developers" = "Purchasing Gems supports our small team and helps keep Habitica running"; "gem_benefits_title" = "Gems allow you to buy fun extras for your account, including:"; "unpin" = "Unpin"; diff --git a/HabitRPG/UI/Purchases/G1G1Banner.swift b/HabitRPG/UI/Purchases/G1G1Banner.swift new file mode 100644 index 000000000..8b968249f --- /dev/null +++ b/HabitRPG/UI/Purchases/G1G1Banner.swift @@ -0,0 +1,34 @@ +// +// G1G1Banner.swift +// Habitica +// +// Created by Phillip Thelen on 11.09.24. +// Copyright © 2024 HabitRPG Inc. All rights reserved. +// + +import Foundation +import SwiftUI + +struct G1G1Banner: View { + var endDate: Date + + private let formatter = DateFormatter() + + var body: some View { + HStack { + Image(Asset.promoGiftsLeft.name) + VStack { + Text(L10n.giftOneGetOneTitle) + .font(.system(size: 22, weight: .bold)) + Text(L10n.giftOneGetOneDescriptionDate(formatter.string(from: endDate))) + .font(.system(size: 16, weight: .semibold)) + .multilineTextAlignment(.center) + } + Image(Asset.promoGiftsRight.name) + }.background(LinearGradient(colors: [Color("#3BCAD7"), Color("#925CF3")], startPoint: .topLeading, endPoint: .bottomTrailing)) + } +} + +#Preview { + G1G1Banner(endDate: Date()) +} diff --git a/HabitRPG/UI/Purchases/SubscriptionPage.swift b/HabitRPG/UI/Purchases/SubscriptionPage.swift index 94d4399dd..3efca8fbd 100644 --- a/HabitRPG/UI/Purchases/SubscriptionPage.swift +++ b/HabitRPG/UI/Purchases/SubscriptionPage.swift @@ -82,6 +82,7 @@ class SubscriptionViewModel: BaseSubscriptionViewModel { let itunesSharedSecret = Secrets.itunesSharedSecret let userRepository = UserRepository() let inventoryRepository = InventoryRepository() + let configRepository = ConfigRepository.shared var onSubscriptionSuccessful: (() -> Void)? var onGiftButtonTapped: (() -> Void)? @@ -95,6 +96,8 @@ class SubscriptionViewModel: BaseSubscriptionViewModel { @Published var selectedSubscription: String = PurchaseHandler.subscriptionIdentifiers[0] @Published var availableSubscriptions = PurchaseHandler.subscriptionIdentifiers + @Published var activePromo: HabiticaPromotion? + init(presentationPoint: PresentationPoint?) { #if DEBUG appleValidator = AppleReceiptValidator(service: .production, sharedSecret: itunesSharedSecret) @@ -119,6 +122,8 @@ class SubscriptionViewModel: BaseSubscriptionViewModel { }).start()) retrieveProductList() + + activePromo = configRepository.activePromotion() } func retrieveProductList() { @@ -280,6 +285,9 @@ struct SubscriptionPage: View { var body: some View { LazyVStack(spacing: 0) { + if let endDate = viewModel.activePromo?.endDate, viewModel.activePromo?.identifier == "g1g1" { + G1G1Banner(endDate: endDate) + } if let point = viewModel.presentationPoint { Text(point.headerText) .multilineTextAlignment(.center) @@ -498,7 +506,7 @@ class SubscriptionModalViewController: HostingPanModal { class SubscriptionPageController: UIHostingController { let viewModel: SubscriptionViewModel let userRepository = UserRepository() - + init(presentationPoint: PresentationPoint?) { viewModel = SubscriptionViewModel(presentationPoint: presentationPoint) super.init(rootView: ScrollableSubscriptionPage(viewModel: viewModel)) diff --git a/Habitica.xcodeproj/project.pbxproj b/Habitica.xcodeproj/project.pbxproj index e25e9cbe7..49b7de6e1 100644 --- a/Habitica.xcodeproj/project.pbxproj +++ b/Habitica.xcodeproj/project.pbxproj @@ -239,6 +239,9 @@ 296CB4EE218C99FD0044A33E /* HabiticaButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 296CB4ED218C99FD0044A33E /* HabiticaButton.swift */; }; 296D6F1D20A0908B00D9CAB5 /* PartyQuestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 296D6F1C20A0908B00D9CAB5 /* PartyQuestView.swift */; }; 296E480821BE86F800D15E4A /* GiftSubscriptionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 296E480721BE86F800D15E4A /* GiftSubscriptionViewController.swift */; }; + 296E4F0D2C91A05A00D9CBDE /* G1G1Banner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 296E4F0C2C91A05A00D9CBDE /* G1G1Banner.swift */; }; + 296E4F0F2C91A6A800D9CBDE /* Habitica_Models.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 296E4F0E2C91A6A800D9CBDE /* Habitica_Models.framework */; }; + 296E4F102C91A6A800D9CBDE /* Habitica_Models.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 296E4F0E2C91A6A800D9CBDE /* Habitica_Models.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 296F51642358E5EF0019C872 /* SubscriptionPromoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 296F51632358E5EF0019C872 /* SubscriptionPromoView.swift */; }; 29701FE01F560D310097BBCC /* UIApplication-Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29701FDF1F560D310097BBCC /* UIApplication-Extensions.swift */; }; 29701FE21F5617900097BBCC /* ToastView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 29701FE11F5617900097BBCC /* ToastView.xib */; }; @@ -680,6 +683,17 @@ name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; + 296E4F112C91A6A800D9CBDE /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 296E4F102C91A6A800D9CBDE /* Habitica_Models.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; 7A84E1B0228928AD0081E96F /* Embed Foundation Extensions */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 12; @@ -907,6 +921,8 @@ 296D6F1C20A0908B00D9CAB5 /* PartyQuestView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartyQuestView.swift; sourceTree = ""; }; 296E0E6520F5078200A1E991 /* he */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = he; path = he.lproj/Mainstrings.strings; sourceTree = ""; }; 296E480721BE86F800D15E4A /* GiftSubscriptionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GiftSubscriptionViewController.swift; sourceTree = ""; }; + 296E4F0C2C91A05A00D9CBDE /* G1G1Banner.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = G1G1Banner.swift; sourceTree = ""; }; + 296E4F0E2C91A6A800D9CBDE /* Habitica_Models.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Habitica_Models.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 296F51632358E5EF0019C872 /* SubscriptionPromoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscriptionPromoView.swift; sourceTree = ""; }; 29701FDF1F560D310097BBCC /* UIApplication-Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIApplication-Extensions.swift"; sourceTree = ""; }; 29701FE11F5617900097BBCC /* ToastView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ToastView.xib; sourceTree = ""; }; @@ -1349,6 +1365,7 @@ 2994A8B128FE946A00CEDED7 /* Habitica_Database.framework in Frameworks */, 29252C382AF4FB330003692D /* Habitica_API_Client.framework in Frameworks */, 29BEE62F252CCFE100D456F8 /* SwiftUI.framework in Frameworks */, + 296E4F0F2C91A6A800D9CBDE /* Habitica_Models.framework in Frameworks */, 2938ED3E28B4EEB200E995A2 /* KeychainAccess in Frameworks */, 29BEE62D252CCFE100D456F8 /* WidgetKit.framework in Frameworks */, ); @@ -2343,6 +2360,7 @@ 2922EE832C80774400254106 /* SubscriptionOptionViewUI.swift */, 2922EE812C80772A00254106 /* SubscriptionBenefitView.swift */, 29EFE3A42C8B359A005B66C9 /* SubscriptionDetailViewUI.swift */, + 296E4F0C2C91A05A00D9CBDE /* G1G1Banner.swift */, ); path = Purchases; sourceTree = ""; @@ -2652,6 +2670,7 @@ D9EB4E8D18CB4A9400BB2094 /* Frameworks */ = { isa = PBXGroup; children = ( + 296E4F0E2C91A6A800D9CBDE /* Habitica_Models.framework */, 29252C372AF4FB330003692D /* Habitica_API_Client.framework */, 29995A6026CBCB0B0063D4C9 /* AdServices.framework */, 292DEE4D204DA1830086D5F7 /* Habitica_API_Client.framework */, @@ -2767,6 +2786,7 @@ 29BEE627252CCFE100D456F8 /* Sources */, 29BEE628252CCFE100D456F8 /* Frameworks */, 29BEE629252CCFE100D456F8 /* Resources */, + 296E4F112C91A6A800D9CBDE /* Embed Frameworks */, ); buildRules = ( ); @@ -3664,6 +3684,7 @@ 297D15FA20B803D30048101F /* UserProfileViewController.swift in Sources */, D9525F9B1E5F559600C529B8 /* ChallengeTableViewCell.swift in Sources */, D9A63A341E10328A0083ADC4 /* LoginTableViewController.swift in Sources */, + 296E4F0D2C91A05A00D9CBDE /* G1G1Banner.swift in Sources */, 299328AB24E5985B003BCE0C /* UIStackview-Extensions.swift in Sources */, D9BB455D1E71C8C70002AE2E /* CheckedTableViewcell.swift in Sources */, 292DEEA5204F6F6C0086D5F7 /* DailyTableViewDataSource.swift in Sources */, diff --git a/Habitica.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Habitica.xcworkspace/xcshareddata/swiftpm/Package.resolved index 301b262ab..b39a4c2db 100644 --- a/Habitica.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Habitica.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -69,8 +69,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/mattgallagher/CwlCatchException.git", "state" : { - "revision" : "3ef6999c73b6938cc0da422f2c912d0158abb0a0", - "version" : "2.2.0" + "revision" : "07b2ba21d361c223e25e3c1e924288742923f08c", + "version" : "2.2.1" } }, { @@ -78,8 +78,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/mattgallagher/CwlPreconditionTesting.git", "state" : { - "revision" : "2ef56b2caf25f55fa7eef8784c30d5a767550f54", - "version" : "2.2.1" + "revision" : "0139c665ebb45e6a9fbdb68aabfd7c39f3fe0071", + "version" : "2.2.2" } }, { @@ -294,8 +294,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-protobuf.git", "state" : { - "revision" : "564597ad2fe2513a94dd8f3ba27ea2ff4be3cb37", - "version" : "1.28.0" + "revision" : "edb6ed4919f7756157fe02f2552b7e3850a538e5", + "version" : "1.28.1" } }, {