ET-5955: Added unlimited upsell design in SidebarScreen

This commit is contained in:
Robin Dorpe
2026-03-23 14:10:26 +01:00
parent d1998ae3ff
commit f14dbb15cc
10 changed files with 35 additions and 26 deletions
@@ -32,8 +32,4 @@ extension UpsellConfiguration {
false
#endif
}
var humanReadableUpsoldPlanName: String {
"Mail Plus"
}
}
@@ -241,8 +241,6 @@ struct SidebarScreen: View {
@ViewBuilder
private func upsellSidebarItem(item: SidebarItem, upsellType: UpsellType) -> some View {
let planName = UpsellConfiguration.mail.humanReadableUpsoldPlanName
SidebarItemButton(
item: item,
isTappable: isButtonTappable,
@@ -250,7 +248,7 @@ struct SidebarScreen: View {
content: {
HStack(spacing: .zero) {
sidebarItemImage(icon: upsellType.icon.image, isSelected: false, renderingMode: .original)
itemNameLabel(name: upsellType.title(planName: planName), isSelected: false, foregroundColor: upsellType.tint)
itemNameLabel(name: upsellType.title, isSelected: false)
Spacer()
}
}
@@ -379,11 +377,11 @@ struct SidebarScreen: View {
.accessibilityIdentifier(SidebarScreenIdentifiers.badgeIcon)
}
private func itemNameLabel(name: String, isSelected: Bool, foregroundColor: Color? = nil) -> some View {
private func itemNameLabel(name: String, isSelected: Bool) -> some View {
Text(name)
.font(.subheadline)
.fontWeight(isSelected ? .bold : .regular)
.foregroundStyle(foregroundColor ?? (isSelected ? DS.Color.Sidebar.textSelected : DS.Color.Sidebar.textNorm))
.foregroundStyle(isSelected ? DS.Color.Sidebar.textSelected : DS.Color.Sidebar.textNorm)
.lineLimit(1)
.accessibilityIdentifier(SidebarScreenIdentifiers.textItem)
}
@@ -464,24 +462,25 @@ private extension SidebarOtherItem {
}
private extension UpsellType {
var planName: String {
switch self {
case .mailPlus:
"Mail Plus"
case .unlimited:
"Unlimited"
}
}
var icon: ImageResource {
switch self {
case .mailPlus, .unlimited:
case .mailPlus:
DS.Icon.icDiamond
case .unlimited:
DS.Icon.icInfinity
}
}
func title(planName: String) -> String {
switch self {
case .mailPlus, .unlimited:
L10n.Sidebar.upgrade(to: planName).string
}
}
var tint: Color? {
switch self {
case .mailPlus, .unlimited:
nil
}
var title: String {
L10n.Sidebar.upgrade(to: planName).string
}
}
@@ -37,9 +37,10 @@ final class SidebarScreenSnapshotTests {
createFolder: .createFolder
)
@Test(arguments: [UIUserInterfaceStyle.light, .dark])
func testSidebarWithDataLayoutsCorrectOnIphoneX(style: UIUserInterfaceStyle) {
@Test(arguments: [UIUserInterfaceStyle.light, .dark], [UpsellType.mailPlus, .unlimited])
func testSidebarWithDataLayoutsCorrectOnIphoneX(style: UIUserInterfaceStyle, upsellType: UpsellType) {
var state = self.state
state.upsell = .upsell(upsellType)
state.folders = [SidebarCustomFolder.topSecretFolder].map(\.sidebarFolder)
state.system = [PMSystemLabel.inbox, .sent, .outbox].compactMap(\.sidebarSystemFolder)
@@ -48,13 +49,13 @@ final class SidebarScreenSnapshotTests {
let sidebarScreen = SidebarScreen(
state: state,
userSession: .dummy,
upsellEligibilityPublisher: .init(constant: .eligible(.mailPlus)),
upsellEligibilityPublisher: .init(constant: .eligible(upsellType)),
appVersionProvider: .init(bundle: bundleStub, sdkVersionProvider: .init(sdkVersion: "0.61.0")),
sidebarFactory: { _ in SidebarSpy() }
) { _ in }
.environmentObject(AppUIStateStore(sidebarState: .init(zIndex: .zero, visibleWidth: 320)))
assertSnapshotsOnIPhoneX(of: sidebarScreen, styles: [style])
assertSnapshotsOnIPhoneX(of: sidebarScreen, named: "\(upsellType)", styles: [style])
}
@Test(arguments: [UIUserInterfaceStyle.light, .dark])
@@ -98,6 +98,7 @@ public extension DS.Icon {
public extension DS.Icon {
static let icCode = ImageResource.icCode
static let icDiamond = ImageResource.icDiamond
static let icInfinity = ImageResource.icInfinity
static let icEnvelopeDot = ImageResource.icEnvelopeDot
static let icEnvelopeOpen = ImageResource.icEnvelopeOpen
static let icFileLines = ImageResource.icFileLines
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "icon.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}