From 5abee5247c14c157ed2b6f0d55d9cc9249c7b14d Mon Sep 17 00:00:00 2001 From: Huong Do Date: Fri, 7 Nov 2025 11:38:24 +0700 Subject: [PATCH 1/3] Split summary text into 2 lines for booking details header --- .../Classes/Bookings/BookingList/BookingListView.swift | 2 +- WooCommerce/Classes/Extensions/Booking+Helpers.swift | 4 ++-- .../Classes/ViewModels/Booking Details/HeaderContent.swift | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/WooCommerce/Classes/Bookings/BookingList/BookingListView.swift b/WooCommerce/Classes/Bookings/BookingList/BookingListView.swift index e9142b7eefc..a6734c991f2 100644 --- a/WooCommerce/Classes/Bookings/BookingList/BookingListView.swift +++ b/WooCommerce/Classes/Bookings/BookingList/BookingListView.swift @@ -128,7 +128,7 @@ private extension BookingListView { .frame(maxWidth: .infinity, alignment: .leading) .foregroundStyle(Color.primary) - Text(booking.summaryText) + Text(booking.summaryText(separateLines: false)) .font(.footnote) .fontWeight(.medium) .foregroundStyle(Color.secondary) diff --git a/WooCommerce/Classes/Extensions/Booking+Helpers.swift b/WooCommerce/Classes/Extensions/Booking+Helpers.swift index 8c86a703be5..11bc2e04a1e 100644 --- a/WooCommerce/Classes/Extensions/Booking+Helpers.swift +++ b/WooCommerce/Classes/Extensions/Booking+Helpers.swift @@ -2,7 +2,7 @@ import Foundation import struct Yosemite.Booking extension Booking { - var summaryText: String { + func summaryText(separateLines: Bool) -> String { let productName = orderInfo?.productInfo?.name let customerName: String = { guard let name = orderInfo?.customerInfo?.billingAddress.fullName else { @@ -12,7 +12,7 @@ extension Booking { }() return [productName, customerName] .compactMap { $0 } - .joined(separator: " • ") + .joined(separator: separateLines ? "\n" : " • ") } private enum Localization { diff --git a/WooCommerce/Classes/ViewModels/Booking Details/HeaderContent.swift b/WooCommerce/Classes/ViewModels/Booking Details/HeaderContent.swift index eae058c9fb7..14901460456 100644 --- a/WooCommerce/Classes/ViewModels/Booking Details/HeaderContent.swift +++ b/WooCommerce/Classes/ViewModels/Booking Details/HeaderContent.swift @@ -19,7 +19,7 @@ extension BookingDetailsViewModel { timeStyle: .short, timeZone: BookingListTab.utcTimeZone ) - serviceAndCustomerLine = booking.summaryText + serviceAndCustomerLine = booking.summaryText(separateLines: true) attendanceStatus = booking.attendanceStatus bookingStatus = booking.bookingStatus } From c8b94d316eeec31001c1995620892b02885acd97 Mon Sep 17 00:00:00 2001 From: Huong Do Date: Fri, 7 Nov 2025 14:57:00 +0700 Subject: [PATCH 2/3] Fix failed test --- .../ViewRelated/Bookings/BookingDetailsViewModelTests.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WooCommerce/WooCommerceTests/ViewRelated/Bookings/BookingDetailsViewModelTests.swift b/WooCommerce/WooCommerceTests/ViewRelated/Bookings/BookingDetailsViewModelTests.swift index b857d06f723..5b25df51630 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/Bookings/BookingDetailsViewModelTests.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/Bookings/BookingDetailsViewModelTests.swift @@ -159,7 +159,7 @@ final class BookingDetailsViewModelTests: XCTestCase { return } - XCTAssertEqual(headerContent.serviceAndCustomerLine, "Massage Therapy • Jane Smith") + XCTAssertEqual(headerContent.serviceAndCustomerLine, "Massage Therapy\nJane Smith") } func test_customer_content_populated_from_billing_address() { From d5c7f925bda3a9462ca9e7cf4b8daf196ff4989b Mon Sep 17 00:00:00 2001 From: Huong Do Date: Fri, 7 Nov 2025 16:03:07 +0700 Subject: [PATCH 3/3] Separate customer and service variables --- .../BookingList/BookingListView.swift | 2 +- .../Classes/Extensions/Booking+Helpers.swift | 22 +++++++++++-------- .../Booking Details/HeaderContent.swift | 6 +++-- .../Booking Details/BookingDetailsView.swift | 4 ++-- .../Bookings/Booking Details/HeaderView.swift | 11 +++++++--- .../BookingDetailsViewModelTests.swift | 5 +++-- 6 files changed, 31 insertions(+), 19 deletions(-) diff --git a/WooCommerce/Classes/Bookings/BookingList/BookingListView.swift b/WooCommerce/Classes/Bookings/BookingList/BookingListView.swift index a6734c991f2..e9142b7eefc 100644 --- a/WooCommerce/Classes/Bookings/BookingList/BookingListView.swift +++ b/WooCommerce/Classes/Bookings/BookingList/BookingListView.swift @@ -128,7 +128,7 @@ private extension BookingListView { .frame(maxWidth: .infinity, alignment: .leading) .foregroundStyle(Color.primary) - Text(booking.summaryText(separateLines: false)) + Text(booking.summaryText) .font(.footnote) .fontWeight(.medium) .foregroundStyle(Color.secondary) diff --git a/WooCommerce/Classes/Extensions/Booking+Helpers.swift b/WooCommerce/Classes/Extensions/Booking+Helpers.swift index 11bc2e04a1e..a1263360371 100644 --- a/WooCommerce/Classes/Extensions/Booking+Helpers.swift +++ b/WooCommerce/Classes/Extensions/Booking+Helpers.swift @@ -2,17 +2,21 @@ import Foundation import struct Yosemite.Booking extension Booking { - func summaryText(separateLines: Bool) -> String { - let productName = orderInfo?.productInfo?.name - let customerName: String = { - guard let name = orderInfo?.customerInfo?.billingAddress.fullName else { - return Localization.guest - } - return name.isEmpty ? Localization.guest : name - }() + var productName: String? { + orderInfo?.productInfo?.name + } + + var customerName: String { + guard let name = orderInfo?.customerInfo?.billingAddress.fullName else { + return Localization.guest + } + return name.isEmpty ? Localization.guest : name + } + + var summaryText: String { return [productName, customerName] .compactMap { $0 } - .joined(separator: separateLines ? "\n" : " • ") + .joined(separator: " • ") } private enum Localization { diff --git a/WooCommerce/Classes/ViewModels/Booking Details/HeaderContent.swift b/WooCommerce/Classes/ViewModels/Booking Details/HeaderContent.swift index 14901460456..83817addc7e 100644 --- a/WooCommerce/Classes/ViewModels/Booking Details/HeaderContent.swift +++ b/WooCommerce/Classes/ViewModels/Booking Details/HeaderContent.swift @@ -11,7 +11,8 @@ extension BookingDetailsViewModel { @Published private(set) var bookingDate: String = "" @Published private(set) var attendanceStatus: BookingAttendanceStatus = .unknown @Published private(set) var bookingStatus: BookingStatus = .unknown - @Published private(set) var serviceAndCustomerLine: String = "" + @Published private(set) var serviceLine: String = "" + @Published private(set) var customerLine: String = "" func update(with booking: Booking) { bookingDate = booking.startDate.toString( @@ -19,7 +20,8 @@ extension BookingDetailsViewModel { timeStyle: .short, timeZone: BookingListTab.utcTimeZone ) - serviceAndCustomerLine = booking.summaryText(separateLines: true) + serviceLine = booking.productName ?? "" + customerLine = booking.customerName attendanceStatus = booking.attendanceStatus bookingStatus = booking.bookingStatus } diff --git a/WooCommerce/Classes/ViewRelated/Bookings/Booking Details/BookingDetailsView.swift b/WooCommerce/Classes/ViewRelated/Bookings/Booking Details/BookingDetailsView.swift index baecbc78318..6191a146fda 100644 --- a/WooCommerce/Classes/ViewRelated/Bookings/Booking Details/BookingDetailsView.swift +++ b/WooCommerce/Classes/ViewRelated/Bookings/Booking Details/BookingDetailsView.swift @@ -14,8 +14,8 @@ struct BookingDetailsView: View { enum Layout { static let contentSidePadding: CGFloat = 16 static let contentVerticalPadding: CGFloat = 16 - static let headerContentVerticalPadding: CGFloat = 6 - static let headerBadgesAdditionalTopPadding: CGFloat = 4 + static let headerContentVerticalPadding: CGFloat = 2 + static let headerBadgesAdditionalTopPadding: CGFloat = 6 static let sectionFooterTextVerticalPadding: CGFloat = 8 static let rowTextVerticalPadding: CGFloat = 11 } diff --git a/WooCommerce/Classes/ViewRelated/Bookings/Booking Details/HeaderView.swift b/WooCommerce/Classes/ViewRelated/Bookings/Booking Details/HeaderView.swift index 3e17b5024a4..b4091d817de 100644 --- a/WooCommerce/Classes/ViewRelated/Bookings/Booking Details/HeaderView.swift +++ b/WooCommerce/Classes/ViewRelated/Bookings/Booking Details/HeaderView.swift @@ -11,9 +11,14 @@ extension BookingDetailsView { .font(TextFont.bodyMedium) .foregroundColor(.primary) } - if !content.serviceAndCustomerLine.isEmpty { - Text(content.serviceAndCustomerLine) - .font(.footnote.weight(.medium)) + if !content.serviceLine.isEmpty { + Text(content.serviceLine) + .font(.body) + .foregroundColor(.secondary) + } + if !content.customerLine.isEmpty { + Text(content.customerLine) + .font(.body) .foregroundColor(.secondary) } HStack { diff --git a/WooCommerce/WooCommerceTests/ViewRelated/Bookings/BookingDetailsViewModelTests.swift b/WooCommerce/WooCommerceTests/ViewRelated/Bookings/BookingDetailsViewModelTests.swift index 5b25df51630..08b2eb1dc19 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/Bookings/BookingDetailsViewModelTests.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/Bookings/BookingDetailsViewModelTests.swift @@ -126,7 +126,7 @@ final class BookingDetailsViewModelTests: XCTestCase { XCTAssertFalse(hasCustomerSection) } - func test_header_content_uses_booking_summary_text() { + func test_header_content_uses_correct_contents() { // Given let billingAddress = Address.fake().copy( firstName: "Jane", @@ -159,7 +159,8 @@ final class BookingDetailsViewModelTests: XCTestCase { return } - XCTAssertEqual(headerContent.serviceAndCustomerLine, "Massage Therapy\nJane Smith") + XCTAssertEqual(headerContent.serviceLine, "Massage Therapy") + XCTAssertEqual(headerContent.customerLine, "Jane Smith") } func test_customer_content_populated_from_billing_address() {