diff --git a/HabitRPG/Generated/Assets-Images.swift b/HabitRPG/Generated/Assets-Images.swift index c742ef361..569ceec52 100644 --- a/HabitRPG/Generated/Assets-Images.swift +++ b/HabitRPG/Generated/Assets-Images.swift @@ -207,6 +207,8 @@ internal enum Asset { internal static let gemPurchaseFooterSparkles = ImageAsset(name: "gem_purchase_footer_sparkles") internal static let gemPurchaseHeader = ImageAsset(name: "gem_purchase_header") internal static let gemPurchaseHeaderDark = ImageAsset(name: "gem_purchase_header_dark") + internal static let gemcapLeft = ImageAsset(name: "gemcap_left") + internal static let gemcapRight = ImageAsset(name: "gemcap_right") internal static let giftSubGift = ImageAsset(name: "gift_sub_gift") internal static let grabIndicator = ImageAsset(name: "grab_indicator") internal static let gryphon = ImageAsset(name: "gryphon") diff --git a/HabitRPG/Generated/Storyboard Segues.swift b/HabitRPG/Generated/Storyboard Segues.swift index fd9a70e08..54e247260 100644 --- a/HabitRPG/Generated/Storyboard Segues.swift +++ b/HabitRPG/Generated/Storyboard Segues.swift @@ -66,7 +66,6 @@ internal enum StoryboardSegue { case showWebPromoSegue case subscriptionSegue case tasksBoardSegue - case unwindToList } internal enum Settings: String, SegueType { case fixValuesSegue = "FixValuesSegue" diff --git a/HabitRPG/Generated/Strings.swift b/HabitRPG/Generated/Strings.swift index c33818485..b48c848f7 100644 --- a/HabitRPG/Generated/Strings.swift +++ b/HabitRPG/Generated/Strings.swift @@ -974,6 +974,8 @@ public enum L10n { public static var resetStreak: String { return L10n.tr("Mainstrings", "resetStreak") } /// Resubscribe public static var resubscribe: String { return L10n.tr("Mainstrings", "resubscribe") } + /// Resubscribe to pick up where you left off! + public static var resubscribeToPickUp: String { return L10n.tr("Mainstrings", "resubscribe_to_pick_up") } /// Resume Damage public static var resumeDamage: String { return L10n.tr("Mainstrings", "resume_damage") } /// Resync @@ -1340,6 +1342,10 @@ 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 + public static func xxGemCap(_ p1: Int, _ p2: Int) -> String { + return L10n.tr("Mainstrings", "x_x_gem_cap", p1, p2) + } /// year public static var year: String { return L10n.tr("Mainstrings", "year") } /// Yearly diff --git a/HabitRPG/Images.xcassets/gemcap_left.imageset/Contents.json b/HabitRPG/Images.xcassets/gemcap_left.imageset/Contents.json new file mode 100644 index 000000000..2c2dc432b --- /dev/null +++ b/HabitRPG/Images.xcassets/gemcap_left.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "UnionLeft.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "UnionLeft@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "UnionLeft@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/HabitRPG/Images.xcassets/gemcap_left.imageset/UnionLeft.png b/HabitRPG/Images.xcassets/gemcap_left.imageset/UnionLeft.png new file mode 100644 index 000000000..062a3996c Binary files /dev/null and b/HabitRPG/Images.xcassets/gemcap_left.imageset/UnionLeft.png differ diff --git a/HabitRPG/Images.xcassets/gemcap_left.imageset/UnionLeft@2x.png b/HabitRPG/Images.xcassets/gemcap_left.imageset/UnionLeft@2x.png new file mode 100644 index 000000000..597a47570 Binary files /dev/null and b/HabitRPG/Images.xcassets/gemcap_left.imageset/UnionLeft@2x.png differ diff --git a/HabitRPG/Images.xcassets/gemcap_left.imageset/UnionLeft@3x.png b/HabitRPG/Images.xcassets/gemcap_left.imageset/UnionLeft@3x.png new file mode 100644 index 000000000..74b2e70ef Binary files /dev/null and b/HabitRPG/Images.xcassets/gemcap_left.imageset/UnionLeft@3x.png differ diff --git a/HabitRPG/Images.xcassets/gemcap_right.imageset/Contents.json b/HabitRPG/Images.xcassets/gemcap_right.imageset/Contents.json new file mode 100644 index 000000000..c34ba9d90 --- /dev/null +++ b/HabitRPG/Images.xcassets/gemcap_right.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Union.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Union@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Union@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/HabitRPG/Images.xcassets/gemcap_right.imageset/Union.png b/HabitRPG/Images.xcassets/gemcap_right.imageset/Union.png new file mode 100644 index 000000000..132499cad Binary files /dev/null and b/HabitRPG/Images.xcassets/gemcap_right.imageset/Union.png differ diff --git a/HabitRPG/Images.xcassets/gemcap_right.imageset/Union@2x.png b/HabitRPG/Images.xcassets/gemcap_right.imageset/Union@2x.png new file mode 100644 index 000000000..baf951bae Binary files /dev/null and b/HabitRPG/Images.xcassets/gemcap_right.imageset/Union@2x.png differ diff --git a/HabitRPG/Images.xcassets/gemcap_right.imageset/Union@3x.png b/HabitRPG/Images.xcassets/gemcap_right.imageset/Union@3x.png new file mode 100644 index 000000000..e19371219 Binary files /dev/null and b/HabitRPG/Images.xcassets/gemcap_right.imageset/Union@3x.png differ diff --git a/HabitRPG/Strings/Base.lproj/Mainstrings.strings b/HabitRPG/Strings/Base.lproj/Mainstrings.strings index 88a728368..6ee1a440f 100644 --- a/HabitRPG/Strings/Base.lproj/Mainstrings.strings +++ b/HabitRPG/Strings/Base.lproj/Mainstrings.strings @@ -1402,3 +1402,5 @@ "got_it" = "Got it!"; "open_stats" = "Open Stats"; "continue_benefits" = "Continue Benefits"; +"x_x_gem_cap" = "%d / %d Gem Cap"; +"resubscribe_to_pick_up" = "Resubscribe to pick up where you left off!"; diff --git a/HabitRPG/UI/Purchases/SubscriptionDetailViewUI.swift b/HabitRPG/UI/Purchases/SubscriptionDetailViewUI.swift index c355acf68..bfd67c292 100644 --- a/HabitRPG/UI/Purchases/SubscriptionDetailViewUI.swift +++ b/HabitRPG/UI/Purchases/SubscriptionDetailViewUI.swift @@ -192,7 +192,7 @@ struct SubscriptionDetailViewUI: View { HStack(spacing: 4) { Image(Asset.calendarLarge.name) Text("\(plan.consecutive?.count ?? 0)") - .font(.system(size: 22, weight: .medium)) + .font(.system(size: 22, weight: .bold)) } Text(L10n.Subscription.monthsSubscribed) .font(.system(size: 13, weight: .semibold)) @@ -203,10 +203,10 @@ struct SubscriptionDetailViewUI: View { HStack(spacing: 4) { Image(Asset.bigGem.name) Text("\(plan.gemCapTotal)") - .font(.system(size: 22, weight: .semibold)) + .font(.system(size: 22, weight: .bold)) } Text(L10n.Subscription.monthlyGems) - .font(.system(size: 13, weight: .medium)) + .font(.system(size: 13, weight: .semibold)) } } } @@ -217,7 +217,7 @@ struct SubscriptionDetailViewUI: View { VStack { if let date = nextHourglassDate { Text(date, formatter: monthFormatter) - .font(.system(size: 22, weight: .semibold)) + .font(.system(size: 22, weight: .bold)) } Text(L10n.Subscription.nextHourglassDelivery) .font(.system(size: 13, weight: .semibold)) diff --git a/HabitRPG/UI/Purchases/SubscriptionPage.swift b/HabitRPG/UI/Purchases/SubscriptionPage.swift index 14452e064..94d4399dd 100644 --- a/HabitRPG/UI/Purchases/SubscriptionPage.swift +++ b/HabitRPG/UI/Purchases/SubscriptionPage.swift @@ -300,6 +300,36 @@ struct SubscriptionPage: View { .padding(.horizontal, 24) SubscriptionSeparator() .padding(.horizontal, 24) + if (viewModel.subscriptionPlan?.consecutive?.gemCapExtra ?? 0) > 0 { + VStack(spacing: 0) { + HStack(spacing: 10) { + Image(Asset.gemcapLeft.name) + Text(L10n.xxGemCap(viewModel.subscriptionPlan?.gemCapTotal ?? 0, 50)) + .font(.system(size: 20, weight: .bold)) + Image(Asset.gemcapRight.name) + } + Text(L10n.resubscribeToPickUp).font(.system(size: 13)) + if #available(iOS 15.0, *) { + GeometryReader { reader in + ZStack(alignment: .leading) { + Rectangle() + .foregroundColor(.purple100) + .fill() + .cornerRadius(4) + .frame(maxWidth: .infinity) + .frame(height: 8) + Rectangle() + .foregroundColor(.green100) + .fill() + .cornerRadius(4) + .frame(width: reader.size.width * (CGFloat(viewModel.subscriptionPlan?.gemCapTotal ?? 0) / 50.0), height: 8) + } + } + .padding(.top, 8) + .padding(.horizontal, 41) + } + }.padding(.bottom, 24) + } SubscriptionBenefitListView(presentationPoint: viewModel.presentationPoint, mysteryGear: viewModel.mysteryGear) .padding(.horizontal, 24) ZStack(alignment: .top) { @@ -317,6 +347,8 @@ struct SubscriptionPage: View { } } } + .padding(.horizontal, 24) + .padding(.bottom, 24) Rectangle() .frame(height: viewModel.showHourglassPromo && viewModel.selectedSubscription == viewModel.availableSubscriptions.last ? 186 : 126) .cornerRadius(12)