Skip to content

Commit

Permalink
Paywalls: iPad polish (#3061)
Browse files Browse the repository at this point in the history
  • Loading branch information
NachoSoto committed Sep 6, 2023
1 parent d52ccf7 commit f10da24
Show file tree
Hide file tree
Showing 17 changed files with 244 additions and 26 deletions.
29 changes: 29 additions & 0 deletions RevenueCatUI/Data/Constants.swift
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,33 @@ enum Constants {
/// For UI elements that wouldn't make sense to keep scaling up forever
static let maximumDynamicTypeSize: DynamicTypeSize = .accessibility3

static func defaultHorizontalPaddingLength(_ idiom: UserInterfaceIdiom) -> CGFloat? {
if idiom == .pad {
return 24
} else {
return nil
}
}

static func defaultVerticalPaddingLength(_ idiom: UserInterfaceIdiom) -> CGFloat? {
if idiom == .pad {
return 16
} else {
return nil
}
}

}

@available(iOS 15.0, macOS 12.0, tvOS 15.0, *)
extension TemplateViewType {

var defaultHorizontalPaddingLength: CGFloat? {
return Constants.defaultHorizontalPaddingLength(self.userInterfaceIdiom)
}

var defaultVerticalPaddingLength: CGFloat? {
return Constants.defaultVerticalPaddingLength(self.userInterfaceIdiom)
}

}
79 changes: 79 additions & 0 deletions RevenueCatUI/Data/UserInterfaceIdiom.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
//
// UserInterfaceIdiom.swift
//
//
// Created by Nacho Soto on 8/23/23.
//

#if canImport(SwiftUI)

import SwiftUI

enum UserInterfaceIdiom {

case phone
case pad
case mac
case unknown

}

extension UserInterfaceIdiom {

#if canImport(UIKit)
static let `default`: Self = UIDevice.interfaceIdiom
#elseif os(macOS)
static let `default`: Self = .mac
#else
static let `default`: Self = .unknown
#endif

}

@available(iOS 13.0, tvOS 13.0, macOS 10.15, watchOS 6.2, *)
struct UserInterfaceIdiomEnvironmentKey: EnvironmentKey {

static var defaultValue: UserInterfaceIdiom = .default

}

@available(iOS 13.0, tvOS 13.0, macOS 10.15, watchOS 6.2, *)
extension EnvironmentValues {

var userInterfaceIdiom: UserInterfaceIdiom {
get { self[UserInterfaceIdiomEnvironmentKey.self] }
set { self[UserInterfaceIdiomEnvironmentKey.self] = newValue }
}

}

// MARK: - UIKit

#if canImport(UIKit)

private extension UIDevice {

static var interfaceIdiom: UserInterfaceIdiom {
switch UIDevice.current.userInterfaceIdiom {
case .phone: return .phone
case .pad: return .pad
case .mac: return .mac

case .tv: return .unknown
case .carPlay: return .unknown

#if swift(>=5.9)
case .vision: return .unknown
#endif

case .unspecified: fallthrough
@unknown default:
return .unknown
}
}

}

#endif

#endif
5 changes: 4 additions & 1 deletion RevenueCatUI/Helpers/PreviewHelpers.swift
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,9 @@ struct PreviewableTemplate<T: TemplateViewType>: View {

typealias Creator = @Sendable @MainActor (TemplateViewConfiguration) -> T

@Environment(\.userInterfaceIdiom)
private var interfaceIdiom

private let configuration: Result<TemplateViewConfiguration, Error>
private let presentInSheet: Bool
private let creator: Creator
Expand Down Expand Up @@ -79,7 +82,7 @@ struct PreviewableTemplate<T: TemplateViewType>: View {
}

var body: some View {
if self.presentInSheet {
if self.presentInSheet || self.interfaceIdiom == .pad {
Rectangle()
.hidden()
.sheet(isPresented: .constant(true)) {
Expand Down
47 changes: 47 additions & 0 deletions RevenueCatUI/Modifiers/ViewExtensions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,53 @@ extension View {
}
}

// MARK: - Padding

@available(iOS 15.0, macOS 12.0, tvOS 15.0, *)
extension View {

func defaultHorizontalPadding() -> some View {
return self.modifier(DefaultHorizontalPaddingModifier())
}

func defaultVerticalPadding() -> some View {
return self.modifier(DefaultVerticalPaddingModifier())
}

func defaultPadding() -> some View {
return self
.defaultHorizontalPadding()
.defaultVerticalPadding()
}

}

@available(iOS 15.0, macOS 12.0, tvOS 15.0, *)
private struct DefaultHorizontalPaddingModifier: ViewModifier {

@Environment(\.userInterfaceIdiom)
private var interfaceIdiom

func body(content: Content) -> some View {
content
.padding(.horizontal, Constants.defaultHorizontalPaddingLength(self.interfaceIdiom))
}

}

@available(iOS 15.0, macOS 12.0, tvOS 15.0, *)
private struct DefaultVerticalPaddingModifier: ViewModifier {

@Environment(\.userInterfaceIdiom)
private var interfaceIdiom

func body(content: Content) -> some View {
content
.padding(.vertical, Constants.defaultVerticalPaddingLength(self.interfaceIdiom))
}

}

// MARK: - scrollableIfNecessary

@available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *)
Expand Down
11 changes: 7 additions & 4 deletions RevenueCatUI/Templates/Template1View.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ struct Template1View: TemplateViewType {
let configuration: TemplateViewConfiguration
private var localization: ProcessedLocalizedConfiguration

@Environment(\.userInterfaceIdiom)
var userInterfaceIdiom

@EnvironmentObject
private var introEligibilityViewModel: IntroEligibilityViewModel
@EnvironmentObject
Expand All @@ -32,7 +35,7 @@ struct Template1View: TemplateViewType {
}

var body: some View {
VStack {
VStack(spacing: self.defaultVerticalPaddingLength) {
self.scrollableContent
.scrollableIfNecessary()
.scrollBounceBehaviorBasedOnSize()
Expand All @@ -47,10 +50,10 @@ struct Template1View: TemplateViewType {
)
.font(self.font(for: .callout))
.multilineTextAlignment(.center)
.padding(.horizontal)
.defaultHorizontalPadding()

self.button
.padding(.horizontal)
.defaultHorizontalPadding()

FooterView(configuration: self.configuration,
purchaseHandler: self.purchaseHandler)
Expand All @@ -59,7 +62,7 @@ struct Template1View: TemplateViewType {

@ViewBuilder
private var scrollableContent: some View {
VStack {
VStack(spacing: self.defaultVerticalPaddingLength) {
if self.configuration.mode.shouldDisplayIcon {
self.headerImage
}
Expand Down
17 changes: 10 additions & 7 deletions RevenueCatUI/Templates/Template2View.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ struct Template2View: TemplateViewType {
@State
private var displayingAllPlans: Bool

@Environment(\.userInterfaceIdiom)
var userInterfaceIdiom

@EnvironmentObject
private var introEligibilityViewModel: IntroEligibilityViewModel
@EnvironmentObject
Expand All @@ -47,7 +50,7 @@ struct Template2View: TemplateViewType {

@ViewBuilder
var content: some View {
VStack(spacing: 10) {
VStack(spacing: self.defaultVerticalPaddingLength) {
Spacer()

self.scrollableContent
Expand All @@ -58,7 +61,7 @@ struct Template2View: TemplateViewType {
}

self.subscribeButton
.padding(.horizontal)
.defaultHorizontalPadding()

FooterView(configuration: self.configuration,
purchaseHandler: self.purchaseHandler,
Expand All @@ -70,7 +73,7 @@ struct Template2View: TemplateViewType {
}

private var scrollableContent: some View {
VStack {
VStack(spacing: self.defaultVerticalPaddingLength) {
if self.configuration.mode.shouldDisplayIcon {
Spacer()
self.iconImage
Expand All @@ -81,14 +84,14 @@ struct Template2View: TemplateViewType {
Text(.init(self.selectedLocalization.title))
.foregroundColor(self.configuration.colors.text1Color)
.font(self.font(for: .largeTitle).bold())
.padding(.horizontal)
.defaultHorizontalPadding()

Spacer()

Text(.init(self.selectedLocalization.subtitle ?? ""))
.foregroundColor(self.configuration.colors.text1Color)
.font(self.font(for: .title3))
.padding(.horizontal)
.defaultHorizontalPadding()

Spacer()
}
Expand Down Expand Up @@ -119,7 +122,7 @@ struct Template2View: TemplateViewType {
.buttonStyle(PackageButtonStyle(isSelected: isSelected))
}
}
.padding(.horizontal)
.defaultHorizontalPadding()

Spacer()
}
Expand All @@ -132,7 +135,7 @@ struct Template2View: TemplateViewType {
self.offerDetails(package: package, selected: selected)
}
.font(self.font(for: .body).weight(.medium))
.padding()
.defaultPadding()
.multilineTextAlignment(.leading)
.frame(maxWidth: .infinity, alignment: Self.packageButtonAlignment)
.overlay {
Expand Down
11 changes: 7 additions & 4 deletions RevenueCatUI/Templates/Template3View.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ struct Template3View: TemplateViewType {
let configuration: TemplateViewConfiguration
private let localization: ProcessedLocalizedConfiguration

@Environment(\.userInterfaceIdiom)
var userInterfaceIdiom

@EnvironmentObject
private var introEligibilityViewModel: IntroEligibilityViewModel
@EnvironmentObject
Expand All @@ -32,7 +35,7 @@ struct Template3View: TemplateViewType {
}

var body: some View {
VStack {
VStack(spacing: self.defaultVerticalPaddingLength) {
if self.configuration.mode.shouldDisplayIcon {
if let url = self.configuration.iconImageURL {
RemoteImage(url: url, aspectRatio: 1)
Expand Down Expand Up @@ -78,8 +81,8 @@ struct Template3View: TemplateViewType {
FooterView(configuration: self.configuration,
purchaseHandler: self.purchaseHandler)
}
.padding(.horizontal)
.padding(.top)
.defaultHorizontalPadding()
.padding(.top, self.defaultVerticalPaddingLength)
}

private var features: some View {
Expand All @@ -91,7 +94,7 @@ struct Template3View: TemplateViewType {
.accessibilityElement(children: .combine)
}
}
.padding(.horizontal)
.defaultHorizontalPadding()
}

private var introEligibility: IntroEligibilityStatus? {
Expand Down
Loading

0 comments on commit f10da24

Please sign in to comment.