diff --git a/WooCommerce/Classes/Authentication/Store Creation/Plan/StoreCreationPlanFeaturesView.swift b/WooCommerce/Classes/Authentication/Store Creation/Plan/StoreCreationPlanFeaturesView.swift new file mode 100644 index 00000000000..f4c07b2561f --- /dev/null +++ b/WooCommerce/Classes/Authentication/Store Creation/Plan/StoreCreationPlanFeaturesView.swift @@ -0,0 +1,28 @@ +import SwiftUI + +/// Displays a vertical list of features included in the WPCOM plan during the store creation flow. +struct StoreCreationPlanFeaturesView: View { + /// Features to show in a vertical list. + let features: [StoreCreationPlanViewModel.Feature] + + var body: some View { + VStack(alignment: .leading, spacing: 16) { + ForEach(features, id: \.title) { feature in + HStack(spacing: 12) { + Image(uiImage: feature.icon) + .renderingMode(.template) + .foregroundColor(Color(.wooCommercePurple(.shade90))) + Text(feature.title) + .foregroundColor(Color(.label)) + .bodyStyle() + } + } + } + } +} + +struct StoreCreationPlanFeaturesView_Previews: PreviewProvider { + static var previews: some View { + StoreCreationPlanFeaturesView(features: [.init(icon: .megaphoneIcon, title: "Get updates!")]) + } +} diff --git a/WooCommerce/Classes/Authentication/Store Creation/Plan/StoreCreationPlanView.swift b/WooCommerce/Classes/Authentication/Store Creation/Plan/StoreCreationPlanView.swift new file mode 100644 index 00000000000..cea6f489042 --- /dev/null +++ b/WooCommerce/Classes/Authentication/Store Creation/Plan/StoreCreationPlanView.swift @@ -0,0 +1,203 @@ +import SwiftUI + +/// Hosting controller that wraps the `StoreCreationPlanView`. +final class StoreCreationPlanHostingController: UIHostingController { + private let onPurchase: () -> Void + private let onClose: () -> Void + + init(viewModel: StoreCreationPlanViewModel, + onPurchase: @escaping () -> Void, + onClose: @escaping () -> Void) { + self.onPurchase = onPurchase + self.onClose = onClose + super.init(rootView: StoreCreationPlanView(viewModel: viewModel)) + + rootView.onPurchase = { [weak self] in + self?.onPurchase() + } + } + + @available(*, unavailable) + required dynamic init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func viewDidLoad() { + super.viewDidLoad() + + configureNavigationBarAppearance() + } + + /// Shows a transparent navigation bar without a bottom border and with a close button to dismiss. + func configureNavigationBarAppearance() { + addCloseNavigationBarButton(target: self, action: #selector(closeButtonTapped)) + + let appearance = UINavigationBarAppearance() + appearance.configureWithTransparentBackground() + appearance.backgroundColor = .withColorStudio(.wooCommercePurple, shade: .shade90) + + navigationItem.standardAppearance = appearance + navigationItem.scrollEdgeAppearance = appearance + navigationItem.compactAppearance = appearance + } + + @objc private func closeButtonTapped() { + onClose() + } +} + +/// Displays the WPCOM eCommerce plan for purchase during the store creation flow. +struct StoreCreationPlanView: View { + /// Set in the hosting controller. + var onPurchase: (() -> Void) = {} + + let viewModel: StoreCreationPlanViewModel + + var body: some View { + VStack(alignment: .leading, spacing: 0) { + ScrollView { + VStack(alignment: .leading, spacing: 0) { + HStack(alignment: .center) { + VStack(alignment: .leading, spacing: 12) { + // Plan name. + Text(Localization.planTitle) + .fontWeight(.semibold) + .font(.title3) + .foregroundColor(.white) + + // Price information. + HStack(alignment: .bottom) { + Text(viewModel.plan.displayPrice) + .fontWeight(.bold) + .foregroundColor(.white) + .largeTitleStyle() + Text(Localization.priceDuration) + .foregroundColor(Color(.secondaryLabel)) + .bodyStyle() + } + } + .padding(.horizontal, insets: .init(top: 0, leading: 24, bottom: 0, trailing: 0)) + + Spacer() + + Image(uiImage: .storeCreationPlanImage) + } + + Divider() + .frame(height: Layout.dividerHeight) + .foregroundColor(Color(Layout.dividerColor)) + .padding(.horizontal, insets: Layout.defaultPadding) + + VStack(alignment: .leading, spacing: 0) { + Spacer() + .frame(height: 8) + + // Header label. + Text(Localization.subtitle) + .fontWeight(.bold) + .foregroundColor(Color(.white)) + .titleStyle() + + Spacer() + .frame(height: 16) + + // Powered by WPCOM. + HStack(spacing: 5) { + Text(Localization.poweredByWPCOMPrompt) + .foregroundColor(Color(.secondaryLabel)) + .footnoteStyle() + Image(uiImage: .wpcomLogoImage) + } + + Spacer() + .frame(height: 32) + + // Plan features. + StoreCreationPlanFeaturesView(features: viewModel.features) + } + .padding(Layout.defaultPadding) + } + } + + VStack(spacing: 0) { + Divider() + .frame(height: Layout.dividerHeight) + .foregroundColor(Color(Layout.dividerColor)) + + // Continue button. + Button(String(format: Localization.continueButtonTitleFormat, viewModel.plan.displayPrice)) { + onPurchase() + } + .buttonStyle(PrimaryButtonStyle()) + .padding(Layout.defaultButtonPadding) + + // Refund information. + Text(Localization.refundableNote) + .multilineTextAlignment(.center) + .foregroundColor(Color(.secondaryLabel)) + .bodyStyle() + + Spacer() + .frame(height: 24) + } + } + .background(Color(.withColorStudio(.wooCommercePurple, shade: .shade90))) + // This screen is using the dark theme for both light and dark modes. + .environment(\.colorScheme, .dark) + } +} + +private extension StoreCreationPlanView { + enum Layout { + static let dividerHeight: CGFloat = 1 + static let defaultPadding: EdgeInsets = .init(top: 16, leading: 16, bottom: 16, trailing: 16) + static let defaultButtonPadding: EdgeInsets = .init(top: 16, leading: 16, bottom: 16, trailing: 16) + static let dividerColor: UIColor = .separator + } + + enum Localization { + static let planTitle = NSLocalizedString( + "eCommerce", + comment: "Title of the store creation plan on the plan screen.") + static let priceDuration = NSLocalizedString( + "/month", + comment: "The text is preceded by the monthly price on the store creation plan screen.") + static let subtitle = NSLocalizedString( + "All the featues you need, already built in", + comment: "Subtitle of the store creation plan screen.") + static let poweredByWPCOMPrompt = NSLocalizedString( + "Powered by", + comment: "The text is followed by a WordPress.com logo on the store creation plan screen.") + static let continueButtonTitleFormat = NSLocalizedString( + "Create Store for %1$@/month", + comment: "Title of the button on the store creation plan view to purchase the plan. " + + "%1$@ is replaced by the monthly price." + ) + static let refundableNote = NSLocalizedString( + "There’s no risk, you can cancel for a full refund within 30 days.", + comment: "Refund policy under the purchase button on the store creation plan screen." + ) + } +} + +#if DEBUG + +/// Only used for `StoreCreationPlanView` preview. +private struct Plan: WPComPlanProduct { + let displayName: String + let description: String + let id: String + let displayPrice: String +} + +struct StoreCreationPlanView_Previews: PreviewProvider { + static var previews: some View { + StoreCreationPlanView(viewModel: + .init(plan: Plan(displayName: "Debug Monthly", + description: "1 Month of Debug Woo", + id: "debug.woocommerce.ecommerce.monthly", + displayPrice: "$69.99"))) + } +} + +#endif diff --git a/WooCommerce/Classes/Authentication/Store Creation/Plan/StoreCreationPlanViewModel.swift b/WooCommerce/Classes/Authentication/Store Creation/Plan/StoreCreationPlanViewModel.swift new file mode 100644 index 00000000000..0909a1b7e86 --- /dev/null +++ b/WooCommerce/Classes/Authentication/Store Creation/Plan/StoreCreationPlanViewModel.swift @@ -0,0 +1,58 @@ +import UIKit + +/// View model for `StoreCreationPlanView`. +struct StoreCreationPlanViewModel { + /// Describes a feature for the WPCOM plan with an icon. + struct Feature { + let icon: UIImage + let title: String + } + + /// The WPCOM plan to purchase. + let plan: WPComPlanProduct + + /// A list of features included in the WPCOM plan. + let features: [Feature] = [ + .init(icon: .gridicon(.starOutline), title: Localization.themeFeature), + .init(icon: .gridicon(.product), title: Localization.productsFeature), + .init(icon: .gridicon(.gift), title: Localization.subscriptionsFeature), + .init(icon: .gridicon(.statsAlt), title: Localization.reportFeature), + // TODO: 8108 - update icon + .init(icon: .gridicon(.money), title: Localization.paymentOptionsFeature), + .init(icon: .gridicon(.shipping), title: Localization.shippingLabelsFeature), + .init(icon: .megaphoneIcon, title: Localization.salesChannelsFeature), + ] +} + +private extension StoreCreationPlanViewModel { + enum Localization { + static let themeFeature = NSLocalizedString( + "Premium themes", + comment: "Title of eCommerce plan feature on the store creation plan screen." + ) + static let productsFeature = NSLocalizedString( + "Unlimited products", + comment: "Title of eCommerce plan feature on the store creation plan screen." + ) + static let subscriptionsFeature = NSLocalizedString( + "Subscriptions & giftcards", + comment: "Title of eCommerce plan feature on the store creation plan screen." + ) + static let reportFeature = NSLocalizedString( + "Ecommerce reports", + comment: "Title of eCommerce plan feature on the store creation plan screen." + ) + static let paymentOptionsFeature = NSLocalizedString( + "Multiple payment options", + comment: "Title of eCommerce plan feature on the store creation plan screen." + ) + static let shippingLabelsFeature = NSLocalizedString( + "Shipping labels", + comment: "Title of eCommerce plan feature on the store creation plan screen." + ) + static let salesChannelsFeature = NSLocalizedString( + "Sales channels", + comment: "Title of eCommerce plan feature on the store creation plan screen." + ) + } +} diff --git a/WooCommerce/Classes/Extensions/UIImage+Woo.swift b/WooCommerce/Classes/Extensions/UIImage+Woo.swift index f69812ef173..56e0cafb7b1 100644 --- a/WooCommerce/Classes/Extensions/UIImage+Woo.swift +++ b/WooCommerce/Classes/Extensions/UIImage+Woo.swift @@ -367,6 +367,12 @@ extension UIImage { return UIImage(named: "icon-mailbox")! } + /// Store plan image used in the store creation flow. + /// + static var storeCreationPlanImage: UIImage { + UIImage(named: "store-creation-plan")! + } + /// Store Image /// static var storeImage: UIImage { @@ -1077,6 +1083,12 @@ extension UIImage { static var sitesImage: UIImage { UIImage.gridicon(.site).imageFlippedForRightToLeftLayoutDirection() } + + /// WordPress.com logo image. + /// + static var wpcomLogoImage: UIImage { + UIImage(named: "wpcom-logo")! + } } private extension UIImage { diff --git a/WooCommerce/Resources/Images.xcassets/store-creation-plan.imageset/Contents.json b/WooCommerce/Resources/Images.xcassets/store-creation-plan.imageset/Contents.json new file mode 100644 index 00000000000..b2ade1042ab --- /dev/null +++ b/WooCommerce/Resources/Images.xcassets/store-creation-plan.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "store-creation-plan.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/WooCommerce/Resources/Images.xcassets/store-creation-plan.imageset/store-creation-plan.pdf b/WooCommerce/Resources/Images.xcassets/store-creation-plan.imageset/store-creation-plan.pdf new file mode 100644 index 00000000000..545f080906a Binary files /dev/null and b/WooCommerce/Resources/Images.xcassets/store-creation-plan.imageset/store-creation-plan.pdf differ diff --git a/WooCommerce/Resources/Images.xcassets/wpcom-logo.imageset/Contents.json b/WooCommerce/Resources/Images.xcassets/wpcom-logo.imageset/Contents.json new file mode 100644 index 00000000000..5e3489649c8 --- /dev/null +++ b/WooCommerce/Resources/Images.xcassets/wpcom-logo.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "wpcom-logo.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/WooCommerce/Resources/Images.xcassets/wpcom-logo.imageset/wpcom-logo.pdf b/WooCommerce/Resources/Images.xcassets/wpcom-logo.imageset/wpcom-logo.pdf new file mode 100644 index 00000000000..f1341e0e949 Binary files /dev/null and b/WooCommerce/Resources/Images.xcassets/wpcom-logo.imageset/wpcom-logo.pdf differ diff --git a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj index 908aea41850..9f73c740724 100644 --- a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj +++ b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj @@ -30,6 +30,7 @@ 02077F72253816FF005A78EF /* ProductFormActionsFactory+ReadonlyProductTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02077F71253816FF005A78EF /* ProductFormActionsFactory+ReadonlyProductTests.swift */; }; 020886572499E643001D784E /* ProductExternalLinkViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 020886562499E642001D784E /* ProductExternalLinkViewController.swift */; }; 020A55F127F6C605007843F0 /* CardReaderConnectionAnalyticsTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 020A55F027F6C605007843F0 /* CardReaderConnectionAnalyticsTracker.swift */; }; + 020AF66329235860007760E5 /* StoreCreationPlanViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 020AF66229235860007760E5 /* StoreCreationPlanViewModel.swift */; }; 020B2F8F23BD9F1F00BD79AD /* IntegerInputFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 020B2F8E23BD9F1F00BD79AD /* IntegerInputFormatter.swift */; }; 020B2F9123BDD71500BD79AD /* IntegerInputFormatterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 020B2F9023BDD71500BD79AD /* IntegerInputFormatterTests.swift */; }; 020B2F9423BDDBDC00BD79AD /* ProductUpdateError+UI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 020B2F9323BDDBDC00BD79AD /* ProductUpdateError+UI.swift */; }; @@ -277,6 +278,7 @@ 0282DD96233C960C006A5FDB /* SearchResultCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0282DD95233C960C006A5FDB /* SearchResultCell.swift */; }; 0282DD98233CA093006A5FDB /* OrderSearchUICommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0282DD97233CA093006A5FDB /* OrderSearchUICommand.swift */; }; 0285BF7022FBD91C003A2525 /* TopPerformersSectionHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0285BF6F22FBD91C003A2525 /* TopPerformersSectionHeaderView.swift */; }; + 02863F6A29246E18006A06AA /* StoreCreationPlanFeaturesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02863F6929246E18006A06AA /* StoreCreationPlanFeaturesView.swift */; }; 0286837727B25930000E5785 /* HubMenuViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0286837627B25930000E5785 /* HubMenuViewModelTests.swift */; }; 0286B27A23C7051F003D784B /* ProductImagesCollectionViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0286B27623C7051F003D784B /* ProductImagesCollectionViewController.xib */; }; 0286B27B23C7051F003D784B /* ProductImagesCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0286B27723C7051F003D784B /* ProductImagesCollectionViewController.swift */; }; @@ -427,6 +429,7 @@ 02ECD1E124FF496200735BE5 /* PaginationTrackerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02ECD1E024FF496200735BE5 /* PaginationTrackerTests.swift */; }; 02ECD1E424FF5E0B00735BE5 /* AddProductCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02ECD1E324FF5E0B00735BE5 /* AddProductCoordinator.swift */; }; 02ECD1E624FFB4E900735BE5 /* ProductFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02ECD1E524FFB4E900735BE5 /* ProductFactory.swift */; }; + 02EEA9282923338100D05F47 /* StoreCreationPlanView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02EEA9272923338100D05F47 /* StoreCreationPlanView.swift */; }; 02EEB5C42424AFAA00B8A701 /* TextFieldTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02EEB5C22424AFAA00B8A701 /* TextFieldTableViewCell.swift */; }; 02EEB5C52424AFAA00B8A701 /* TextFieldTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 02EEB5C32424AFAA00B8A701 /* TextFieldTableViewCell.xib */; }; 02F49ADA23BF356E00FA0BFA /* TitleAndTextFieldTableViewCell.ViewModel+State.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02F49AD923BF356E00FA0BFA /* TitleAndTextFieldTableViewCell.ViewModel+State.swift */; }; @@ -1991,6 +1994,7 @@ 02077F71253816FF005A78EF /* ProductFormActionsFactory+ReadonlyProductTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ProductFormActionsFactory+ReadonlyProductTests.swift"; sourceTree = ""; }; 020886562499E642001D784E /* ProductExternalLinkViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductExternalLinkViewController.swift; sourceTree = ""; }; 020A55F027F6C605007843F0 /* CardReaderConnectionAnalyticsTracker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardReaderConnectionAnalyticsTracker.swift; sourceTree = ""; }; + 020AF66229235860007760E5 /* StoreCreationPlanViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreCreationPlanViewModel.swift; sourceTree = ""; }; 020B2F8E23BD9F1F00BD79AD /* IntegerInputFormatter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntegerInputFormatter.swift; sourceTree = ""; }; 020B2F9023BDD71500BD79AD /* IntegerInputFormatterTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntegerInputFormatterTests.swift; sourceTree = ""; }; 020B2F9323BDDBDC00BD79AD /* ProductUpdateError+UI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ProductUpdateError+UI.swift"; sourceTree = ""; }; @@ -2239,6 +2243,7 @@ 0282DD95233C960C006A5FDB /* SearchResultCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultCell.swift; sourceTree = ""; }; 0282DD97233CA093006A5FDB /* OrderSearchUICommand.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderSearchUICommand.swift; sourceTree = ""; }; 0285BF6F22FBD91C003A2525 /* TopPerformersSectionHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopPerformersSectionHeaderView.swift; sourceTree = ""; }; + 02863F6929246E18006A06AA /* StoreCreationPlanFeaturesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreCreationPlanFeaturesView.swift; sourceTree = ""; }; 0286837627B25930000E5785 /* HubMenuViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HubMenuViewModelTests.swift; sourceTree = ""; }; 0286B27623C7051F003D784B /* ProductImagesCollectionViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ProductImagesCollectionViewController.xib; sourceTree = ""; }; 0286B27723C7051F003D784B /* ProductImagesCollectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProductImagesCollectionViewController.swift; sourceTree = ""; }; @@ -2388,6 +2393,7 @@ 02ECD1E024FF496200735BE5 /* PaginationTrackerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaginationTrackerTests.swift; sourceTree = ""; }; 02ECD1E324FF5E0B00735BE5 /* AddProductCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddProductCoordinator.swift; sourceTree = ""; }; 02ECD1E524FFB4E900735BE5 /* ProductFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductFactory.swift; sourceTree = ""; }; + 02EEA9272923338100D05F47 /* StoreCreationPlanView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreCreationPlanView.swift; sourceTree = ""; }; 02EEB5C22424AFAA00B8A701 /* TextFieldTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextFieldTableViewCell.swift; sourceTree = ""; }; 02EEB5C32424AFAA00B8A701 /* TextFieldTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TextFieldTableViewCell.xib; sourceTree = ""; }; 02F49AD923BF356E00FA0BFA /* TitleAndTextFieldTableViewCell.ViewModel+State.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TitleAndTextFieldTableViewCell.ViewModel+State.swift"; sourceTree = ""; }; @@ -4527,6 +4533,7 @@ 02759B8F28FFA06F00918176 /* Store Creation */ = { isa = PBXGroup; children = ( + 02EEA92929233F0F00D05F47 /* Plan */, 02759B9028FFA09600918176 /* StoreCreationWebViewModel.swift */, 02E3B63029066858007E0F13 /* StoreCreationCoordinator.swift */, 02EAA4C7290F992B00918DAB /* LoggedOutStoreCreationCoordinator.swift */, @@ -4939,6 +4946,16 @@ path = "Add Product"; sourceTree = ""; }; + 02EEA92929233F0F00D05F47 /* Plan */ = { + isa = PBXGroup; + children = ( + 02EEA9272923338100D05F47 /* StoreCreationPlanView.swift */, + 020AF66229235860007760E5 /* StoreCreationPlanViewModel.swift */, + 02863F6929246E18006A06AA /* StoreCreationPlanFeaturesView.swift */, + ); + path = Plan; + sourceTree = ""; + }; 02F4F50C237AFBB700E13A9C /* Cells */ = { isa = PBXGroup; children = ( @@ -10125,6 +10142,7 @@ 0245465B24EE7637004F531C /* ProductFormEventLoggerProtocol.swift in Sources */, 02C1853D27FF153A00ABD764 /* CardPresentRefundOrchestrator.swift in Sources */, AEC95D432774D07B001571F5 /* CreateOrderAddressFormViewModel.swift in Sources */, + 020AF66329235860007760E5 /* StoreCreationPlanViewModel.swift in Sources */, 024DF31B23742E1C006658FE /* FormatBarItemViewProperties.swift in Sources */, 26B119BB24D0B62E00FED5C7 /* SurveyViewController.swift in Sources */, CCD2F51A26D67BB50010E679 /* ShippingLabelServicePackageList.swift in Sources */, @@ -10316,6 +10334,7 @@ DE4B3B5826A7041800EEF2D8 /* EdgeInsets+Woo.swift in Sources */, 02CE4304276993DA0006EAEF /* CaptureDevicePermissionChecker.swift in Sources */, 74A33D8021C3F234009E25DE /* LicensesViewController.swift in Sources */, + 02EEA9282923338100D05F47 /* StoreCreationPlanView.swift in Sources */, 454453CA27566CDE00464AC5 /* HubMenuViewModel.swift in Sources */, 934CB123224EAB150005CCB9 /* main.swift in Sources */, 456396AE25C81D81001F1A26 /* ShippingLabelFormViewModel.swift in Sources */, @@ -10481,6 +10500,7 @@ DE0A2EAA281BA083007A8015 /* ProductCategoryList.swift in Sources */, 02AC30CF2888EC8100146A25 /* WooAnalyticsEvent+LoginOnboarding.swift in Sources */, 2667BFEB2535FF09008099D4 /* RefundShippingCalculationUseCase.swift in Sources */, + 02863F6A29246E18006A06AA /* StoreCreationPlanFeaturesView.swift in Sources */, B6C838DE28793B3A003AB786 /* OrderCustomFieldsViewModel.swift in Sources */, E1E125AA26EB42530068A9B0 /* CardPresentModalUpdateProgress.swift in Sources */, E1C5E78226C2A971008D4C47 /* InPersonPaymentsPluginNotSetup.swift in Sources */, diff --git a/WooCommerce/WooCommerceTests/Extensions/IconsTests.swift b/WooCommerce/WooCommerceTests/Extensions/IconsTests.swift index c1e4e0108d8..d0a4b08af5e 100644 --- a/WooCommerce/WooCommerceTests/Extensions/IconsTests.swift +++ b/WooCommerce/WooCommerceTests/Extensions/IconsTests.swift @@ -212,6 +212,10 @@ final class IconsTests: XCTestCase { XCTAssertNotNil(UIImage.mailboxImage) } + func test_storeCreationPlanImage_is_not_nil() { + XCTAssertNotNil(UIImage.storeCreationPlanImage) + } + func testStoreImageIsNotNil() { XCTAssertNotNil(UIImage.storeImage) } @@ -688,4 +692,8 @@ final class IconsTests: XCTestCase { func test_sites_icon_is_not_nil() { XCTAssertNotNil(UIImage.sitesImage) } + + func test_wpcomLogoImage_is_not_nil() { + XCTAssertNotNil(UIImage.wpcomLogoImage) + } }