Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Custom Fields: Prepare list view and viewmodel to be reusable #13639

Merged
merged 8 commits into from
Aug 21, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ final class OrderDetailsViewModel {
private let stores: StoresManager
private let storageManager: StorageManagerType
private let currencyFormatter: CurrencyFormatter
let featureFlagService: FeatureFlagService

private(set) var order: Order

Expand All @@ -29,11 +30,13 @@ final class OrderDetailsViewModel {
init(order: Order,
stores: StoresManager = ServiceLocator.stores,
storageManager: StorageManagerType = ServiceLocator.storageManager,
currencyFormatter: CurrencyFormatter = CurrencyFormatter(currencySettings: ServiceLocator.currencySettings)) {
currencyFormatter: CurrencyFormatter = CurrencyFormatter(currencySettings: ServiceLocator.currencySettings),
featureFlagService: FeatureFlagService = ServiceLocator.featureFlagService) {
self.order = order
self.stores = stores
self.storageManager = storageManager
self.currencyFormatter = currencyFormatter
self.featureFlagService = featureFlagService
self.configurationLoader = CardPresentConfigurationLoader(stores: stores)
self.dataSource = OrderDetailsDataSource(order: order,
cardPresentPaymentsConfiguration: configurationLoader.configuration)
Expand Down Expand Up @@ -477,9 +480,12 @@ extension OrderDetailsViewModel {
case .customFields:
ServiceLocator.analytics.track(.orderViewCustomFieldsTapped)
let customFields = order.customFields.map {
OrderCustomFieldsViewModel(metadata: $0)
CustomFieldsViewModel(metadata: $0)
}
let customFieldsView = UIHostingController(rootView: OrderCustomFieldsDetails(customFields: customFields))
let customFieldsView = UIHostingController(
rootView: CustomFieldsDetailsView(
isEditable: featureFlagService.isFeatureFlagEnabled(.viewEditCustomFieldsInProductsAndOrders),
customFields: customFields))
viewController.present(customFieldsView, animated: true)
case .seeReceipt:
let countryCode = configurationLoader.configuration.countryCode
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,22 @@
import SwiftUI

struct OrderCustomFieldsDetails: View {
struct CustomFieldsDetailsView: View {
@Environment(\.presentationMode) var presentationMode

let customFields: [OrderCustomFieldsViewModel]
let isEditable: Bool
let customFields: [CustomFieldsViewModel]

var body: some View {
NavigationView {
GeometryReader { geometry in
ScrollView {
VStack(alignment: .leading) {
ForEach(customFields) { customField in
CustomFieldRow(title: customField.title,
CustomFieldRow(isEditable: isEditable,
title: customField.title,
content: customField.content,
contentURL: customField.contentURL)

Divider()
.padding(.leading)
}
Expand Down Expand Up @@ -42,6 +45,9 @@ struct OrderCustomFieldsDetails: View {
}

private struct CustomFieldRow: View {
/// Determines if the row is editable
let isEditable: Bool

/// Custom Field title
///
let title: String
Expand Down Expand Up @@ -81,22 +87,37 @@ private struct CustomFieldRow: View {
openURL(url) // Open in associated app for URL scheme
}
}
.lineLimit(isEditable ? 3 : nil)
} else { // Display content as plain text
Text(content)
.footnoteStyle()
.lineLimit(isEditable ? 3 : nil)
}
}.padding([.leading, .trailing], Constants.vStackPadding)

Spacer()

if isEditable {
// Chevron icon
Image(uiImage: .chevronImage)
.flipsForRightToLeftLayoutDirection(true)
.foregroundStyle(Color(.textTertiary))
}
}
.padding([.top, .bottom], Constants.hStackPadding)
.padding(Constants.hStackPadding)
.frame(minHeight: Constants.height)
.onTapGesture {
if isEditable {
// todo-13493 add tap handling
}
}
}
}


// MARK: - Constants
//
extension OrderCustomFieldsDetails {
extension CustomFieldsDetailsView {
enum Localization {
static let title = NSLocalizedString("Custom Fields", comment: "Title for the order custom fields list")
}
Expand All @@ -115,9 +136,11 @@ private extension CustomFieldRow {

struct OrderCustomFieldsDetails_Previews: PreviewProvider {
static var previews: some View {
OrderCustomFieldsDetails(customFields: [
OrderCustomFieldsViewModel(id: 0, title: "First Title", content: "First Content"),
OrderCustomFieldsViewModel(id: 1, title: "Second Title", content: "Second Content", contentURL: URL(string: "https://woocommerce.com/"))
CustomFieldsDetailsView(
isEditable: false,
customFields: [
CustomFieldsViewModel(id: 0, title: "First Title", content: "First Content"),
CustomFieldsViewModel(id: 1, title: "Second Title", content: "Second Content", contentURL: URL(string: "https://woocommerce.com/"))
])
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import Foundation
import Yosemite

/// ViewModel for `OrderCustomFieldsDetails`
struct OrderCustomFieldsViewModel: Identifiable {
/// ViewModel for `CustomFieldsDetailsView`
struct CustomFieldsViewModel: Identifiable {
/// Unique identifier, required by `SwiftUI`
///
let id: Int64
Expand Down
38 changes: 23 additions & 15 deletions WooCommerce/WooCommerce.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -1876,7 +1876,7 @@
B60B5026292D308A00178C26 /* AnalyticsTimeRangeCard.swift in Sources */ = {isa = PBXBuildFile; fileRef = B60B5025292D308A00178C26 /* AnalyticsTimeRangeCard.swift */; };
B61F212A2AA13CA700B0C8EB /* ShippingLabelHazmatCategory.swift in Sources */ = {isa = PBXBuildFile; fileRef = B61F21292AA13CA700B0C8EB /* ShippingLabelHazmatCategory.swift */; };
B622BC74289CF19400B10CEC /* WaitingTimeTrackerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B622BC73289CF19400B10CEC /* WaitingTimeTrackerTests.swift */; };
B626C71B287659D60083820C /* OrderCustomFieldsDetails.swift in Sources */ = {isa = PBXBuildFile; fileRef = B626C71A287659D60083820C /* OrderCustomFieldsDetails.swift */; };
B626C71B287659D60083820C /* CustomFieldsDetailsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B626C71A287659D60083820C /* CustomFieldsDetailsView.swift */; };
B63AAF4B254AD2C6000B28A2 /* URL+SurveyViewControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B63AAF4A254AD2C6000B28A2 /* URL+SurveyViewControllerTests.swift */; };
B63D9009293E56E300BB5C9D /* AnalyticsHubQuarterToDateRangeData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B63D9008293E56E300BB5C9D /* AnalyticsHubQuarterToDateRangeData.swift */; };
B6440FB6292E72DA0012D506 /* AnalyticsHubTimeRangeSelection.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6440FB5292E72DA0012D506 /* AnalyticsHubTimeRangeSelection.swift */; };
Expand All @@ -1892,7 +1892,7 @@
B6C78B8C293BADAA008934A1 /* AnalyticsHubLastWeekRangeData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6C78B8B293BADAA008934A1 /* AnalyticsHubLastWeekRangeData.swift */; };
B6C78B8E293BAE68008934A1 /* AnalyticsHubLastMonthRangeData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6C78B8D293BAE68008934A1 /* AnalyticsHubLastMonthRangeData.swift */; };
B6C78B90293BAF37008934A1 /* AnalyticsHubLastYearRangeData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6C78B8F293BAF37008934A1 /* AnalyticsHubLastYearRangeData.swift */; };
B6C838DE28793B3A003AB786 /* OrderCustomFieldsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6C838DD28793B3A003AB786 /* OrderCustomFieldsViewModel.swift */; };
B6C838DE28793B3A003AB786 /* CustomFieldsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6C838DD28793B3A003AB786 /* CustomFieldsViewModel.swift */; };
B6D2468C2A0ED4C400B79B9C /* EUCustomsScenarioValidatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6D2468B2A0ED4C400B79B9C /* EUCustomsScenarioValidatorTests.swift */; };
B6E7DB64293A7C390049B001 /* AnalyticsHubYesterdayRangeData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6E7DB63293A7C390049B001 /* AnalyticsHubYesterdayRangeData.swift */; };
B6E851F3276320C70041D1BA /* RefundCustomAmountsDetailsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6E851F2276320C70041D1BA /* RefundCustomAmountsDetailsViewModel.swift */; };
Expand Down Expand Up @@ -2064,7 +2064,7 @@
CC53FB402759042600C4CA4F /* ProductSelectorViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC53FB3F2759042600C4CA4F /* ProductSelectorViewModelTests.swift */; };
CC593A6726EA116300EF0E04 /* ShippingLabelAddNewPackageViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC593A6626EA116300EF0E04 /* ShippingLabelAddNewPackageViewModelTests.swift */; };
CC593A6B26EA640800EF0E04 /* PackageCreationError+UI.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC593A6A26EA640800EF0E04 /* PackageCreationError+UI.swift */; };
CC5BA5F5287EDC900072F307 /* OrderCustomFieldsViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC5BA5F4287EDC900072F307 /* OrderCustomFieldsViewModelTests.swift */; };
CC5BA5F5287EDC900072F307 /* CustomFieldsViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC5BA5F4287EDC900072F307 /* CustomFieldsViewModelTests.swift */; };
CC5C278727EE19A700B25D2A /* UnifiedOrderScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC5C278627EE19A600B25D2A /* UnifiedOrderScreen.swift */; };
CC5C278B27EE314F00B25D2A /* orders_3337_create_order.json in Resources */ = {isa = PBXBuildFile; fileRef = CC5C278A27EE314E00B25D2A /* orders_3337_create_order.json */; };
CC666F2427F329DC0045AF1E /* View+DiscardChanges.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC666F2327F329DC0045AF1E /* View+DiscardChanges.swift */; };
Expand Down Expand Up @@ -4872,7 +4872,7 @@
B60B5025292D308A00178C26 /* AnalyticsTimeRangeCard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnalyticsTimeRangeCard.swift; sourceTree = "<group>"; };
B61F21292AA13CA700B0C8EB /* ShippingLabelHazmatCategory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShippingLabelHazmatCategory.swift; sourceTree = "<group>"; };
B622BC73289CF19400B10CEC /* WaitingTimeTrackerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WaitingTimeTrackerTests.swift; sourceTree = "<group>"; };
B626C71A287659D60083820C /* OrderCustomFieldsDetails.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderCustomFieldsDetails.swift; sourceTree = "<group>"; };
B626C71A287659D60083820C /* CustomFieldsDetailsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomFieldsDetailsView.swift; sourceTree = "<group>"; };
B63AAF4A254AD2C6000B28A2 /* URL+SurveyViewControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "URL+SurveyViewControllerTests.swift"; sourceTree = "<group>"; };
B63D9008293E56E300BB5C9D /* AnalyticsHubQuarterToDateRangeData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnalyticsHubQuarterToDateRangeData.swift; sourceTree = "<group>"; };
B6440FB5292E72DA0012D506 /* AnalyticsHubTimeRangeSelection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnalyticsHubTimeRangeSelection.swift; sourceTree = "<group>"; };
Expand All @@ -4888,7 +4888,7 @@
B6C78B8B293BADAA008934A1 /* AnalyticsHubLastWeekRangeData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnalyticsHubLastWeekRangeData.swift; sourceTree = "<group>"; };
B6C78B8D293BAE68008934A1 /* AnalyticsHubLastMonthRangeData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnalyticsHubLastMonthRangeData.swift; sourceTree = "<group>"; };
B6C78B8F293BAF37008934A1 /* AnalyticsHubLastYearRangeData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnalyticsHubLastYearRangeData.swift; sourceTree = "<group>"; };
B6C838DD28793B3A003AB786 /* OrderCustomFieldsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderCustomFieldsViewModel.swift; sourceTree = "<group>"; };
B6C838DD28793B3A003AB786 /* CustomFieldsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomFieldsViewModel.swift; sourceTree = "<group>"; };
B6D2468B2A0ED4C400B79B9C /* EUCustomsScenarioValidatorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EUCustomsScenarioValidatorTests.swift; sourceTree = "<group>"; };
B6E7DB63293A7C390049B001 /* AnalyticsHubYesterdayRangeData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnalyticsHubYesterdayRangeData.swift; sourceTree = "<group>"; };
B6E851F2276320C70041D1BA /* RefundCustomAmountsDetailsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefundCustomAmountsDetailsViewModel.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -5061,7 +5061,7 @@
CC53FB3F2759042600C4CA4F /* ProductSelectorViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductSelectorViewModelTests.swift; sourceTree = "<group>"; };
CC593A6626EA116300EF0E04 /* ShippingLabelAddNewPackageViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShippingLabelAddNewPackageViewModelTests.swift; sourceTree = "<group>"; };
CC593A6A26EA640800EF0E04 /* PackageCreationError+UI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PackageCreationError+UI.swift"; sourceTree = "<group>"; };
CC5BA5F4287EDC900072F307 /* OrderCustomFieldsViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderCustomFieldsViewModelTests.swift; sourceTree = "<group>"; };
CC5BA5F4287EDC900072F307 /* CustomFieldsViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomFieldsViewModelTests.swift; sourceTree = "<group>"; };
CC5C278627EE19A600B25D2A /* UnifiedOrderScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnifiedOrderScreen.swift; sourceTree = "<group>"; };
CC5C278A27EE314E00B25D2A /* orders_3337_create_order.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = orders_3337_create_order.json; sourceTree = "<group>"; };
CC666F2327F329DC0045AF1E /* View+DiscardChanges.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+DiscardChanges.swift"; sourceTree = "<group>"; };
Expand Down Expand Up @@ -9139,7 +9139,6 @@
26C6E8E126E2D85300C7BB0F /* Addresses */,
025678042575EA1B009D7E6C /* ProductDetailsCellViewModelTests.swift */,
578195FB25AD1D7C004A5C12 /* OrderFulfillmentUseCaseTests.swift */,
CC5BA5F4287EDC900072F307 /* OrderCustomFieldsViewModelTests.swift */,
);
path = "Order Details";
sourceTree = "<group>";
Expand Down Expand Up @@ -9618,6 +9617,14 @@
path = Reviews;
sourceTree = "<group>";
};
864059FE2C6F67A000DA04DC /* Custom Fields */ = {
isa = PBXGroup;
children = (
CC5BA5F4287EDC900072F307 /* CustomFieldsViewModelTests.swift */,
);
path = "Custom Fields";
sourceTree = "<group>";
};
8646A9B82B46C79A001F606C /* AdDestination */ = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -10038,6 +10045,7 @@
B56DB3EF2049C06D00D4AA8E /* ViewRelated */ = {
isa = PBXGroup;
children = (
B626C7192876599B0083820C /* Custom Fields */,
86023FA82B15CA8D00A28F07 /* Themes */,
DED91DF72AD78A0C00CDCC53 /* Blaze */,
EE45E2AB2A409B4C0085F227 /* Feature Highlight */,
Expand Down Expand Up @@ -10409,13 +10417,13 @@
path = Model;
sourceTree = "<group>";
};
B626C7192876599B0083820C /* Order Custom Fields */ = {
B626C7192876599B0083820C /* Custom Fields */ = {
isa = PBXGroup;
children = (
B626C71A287659D60083820C /* OrderCustomFieldsDetails.swift */,
B6C838DD28793B3A003AB786 /* OrderCustomFieldsViewModel.swift */,
B626C71A287659D60083820C /* CustomFieldsDetailsView.swift */,
B6C838DD28793B3A003AB786 /* CustomFieldsViewModel.swift */,
);
path = "Order Custom Fields";
path = "Custom Fields";
sourceTree = "<group>";
};
B6440FB7292E73E50012D506 /* Analytics Hub */ = {
Expand Down Expand Up @@ -11450,7 +11458,6 @@
isa = PBXGroup;
children = (
6850C5EF2B69E7300026A93B /* Receipts */,
B626C7192876599B0083820C /* Order Custom Fields */,
CEE006072077D14C0079161F /* OrderDetailsViewController.swift */,
DE6906DA27D5F69900735E3B /* OrderDetailsViewController.xib */,
B53B3F36219C75AC00DF1EB6 /* OrderLoaderViewController.swift */,
Expand Down Expand Up @@ -12005,6 +12012,7 @@
D816DDBA22265D8000903E59 /* ViewRelated */ = {
isa = PBXGroup;
children = (
864059FE2C6F67A000DA04DC /* Custom Fields */,
86023FAB2B16D80E00A28F07 /* Themes */,
EE45E2C02A42C9C70085F227 /* Feature Highlight */,
024D4E952A2EC6790090E0E6 /* Blaze */,
Expand Down Expand Up @@ -15401,7 +15409,7 @@
31FC8CE927B476BA004B9456 /* CardReaderSettingsResultsControllers.swift in Sources */,
022266BC2AE7707000614F34 /* ConfigurableBundleItemViewModel.swift in Sources */,
D449C52926DFBCCC00D75B02 /* WhatsNewHostingController.swift in Sources */,
B626C71B287659D60083820C /* OrderCustomFieldsDetails.swift in Sources */,
B626C71B287659D60083820C /* CustomFieldsDetailsView.swift in Sources */,
025E32BC251D8FEF00685C4A /* ProductFormDataModel+ProductsTabProductViewModel.swift in Sources */,
02ECD1E624FFB4E900735BE5 /* ProductFactory.swift in Sources */,
260520F42B87BA23005D5D59 /* WooAnalyticsEvent+ConnectivityTool.swift in Sources */,
Expand Down Expand Up @@ -15757,7 +15765,7 @@
02AC30CF2888EC8100146A25 /* WooAnalyticsEvent+LoginOnboarding.swift in Sources */,
02B9243F2C2200D600DC75F2 /* PointOfSaleCardPresentPaymentReaderUpdateFailedLowBatteryAlertViewModel.swift in Sources */,
2667BFEB2535FF09008099D4 /* RefundShippingCalculationUseCase.swift in Sources */,
B6C838DE28793B3A003AB786 /* OrderCustomFieldsViewModel.swift in Sources */,
B6C838DE28793B3A003AB786 /* CustomFieldsViewModel.swift in Sources */,
DE65C1F72C48E7DC003EF8D1 /* SupportButton.swift in Sources */,
20D210BE2B14C9B90099E517 /* WooPaymentsDepositStatusDisplayDetails.swift in Sources */,
026225212C21F01F00700977 /* PointOfSaleCardPresentPaymentReaderUpdateFailedNonRetryableAlertViewModel.swift in Sources */,
Expand Down Expand Up @@ -16491,7 +16499,7 @@
4572641B27F1FDF2004E1F95 /* AddEditCouponViewModelTests.swift in Sources */,
AEE1D4FF25D1580E006A490B /* AttributeOptionListSelectorCommandTests.swift in Sources */,
DE4D23A829B0D11E003A4B5D /* WPComPasswordLoginViewModelTests.swift in Sources */,
CC5BA5F5287EDC900072F307 /* OrderCustomFieldsViewModelTests.swift in Sources */,
CC5BA5F5287EDC900072F307 /* CustomFieldsViewModelTests.swift in Sources */,
02B653AC2429F7BF00A9C839 /* MockTaxClassStoresManager.swift in Sources */,
0277AEA5256CAA4200F45C4A /* MockShippingLabel.swift in Sources */,
02BAB02324D0250300F8B06E /* ProductVariation+ProductFormTests.swift in Sources */,
Expand Down
Loading