From 87cc3abf261053f6925a15753116f330ec980c0f Mon Sep 17 00:00:00 2001 From: RafaelKayumov Date: Mon, 10 Nov 2025 16:41:03 +0300 Subject: [PATCH 1/3] Hide "View order" options from screen and ellipsis menu --- WooCommerce/Classes/Extensions/Booking+Helpers.swift | 4 ++++ .../Booking Details/BookingDetailsViewModel.swift | 2 ++ .../Classes/ViewModels/Booking Details/PaymentContent.swift | 5 ++--- .../Bookings/Booking Details/BookingDetailsView.swift | 6 ++++-- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/WooCommerce/Classes/Extensions/Booking+Helpers.swift b/WooCommerce/Classes/Extensions/Booking+Helpers.swift index a1263360371..6759e7753d8 100644 --- a/WooCommerce/Classes/Extensions/Booking+Helpers.swift +++ b/WooCommerce/Classes/Extensions/Booking+Helpers.swift @@ -19,6 +19,10 @@ extension Booking { .joined(separator: " • ") } + var isOrderValid: Bool { + return orderID != 0 + } + private enum Localization { static let guest = NSLocalizedString( "bookings.guest", diff --git a/WooCommerce/Classes/ViewModels/Booking Details/BookingDetailsViewModel.swift b/WooCommerce/Classes/ViewModels/Booking Details/BookingDetailsViewModel.swift index e26793b0ea5..1267902af99 100644 --- a/WooCommerce/Classes/ViewModels/Booking Details/BookingDetailsViewModel.swift +++ b/WooCommerce/Classes/ViewModels/Booking Details/BookingDetailsViewModel.swift @@ -27,6 +27,7 @@ final class BookingDetailsViewModel: ObservableObject { @Published private(set) var navigationTitle = "" @Published private(set) var sections: [Section] = [] + @Published private(set) var isViewOrderAvailable = true @Published var notice: Notice? var bookingAttendanceStatus: BookingAttendanceStatus { @@ -83,6 +84,7 @@ private extension BookingDetailsViewModel { func updateDisplayProperties(from booking: Booking) { navigationTitle = Self.navigationTitle(for: booking) + isViewOrderAvailable = booking.isOrderValid headerContent.update(with: booking) diff --git a/WooCommerce/Classes/ViewModels/Booking Details/PaymentContent.swift b/WooCommerce/Classes/ViewModels/Booking Details/PaymentContent.swift index 1de7916a44f..962c258e698 100644 --- a/WooCommerce/Classes/ViewModels/Booking Details/PaymentContent.swift +++ b/WooCommerce/Classes/ViewModels/Booking Details/PaymentContent.swift @@ -28,9 +28,8 @@ extension BookingDetailsViewModel { actions = [ .markAsPaid, - .issueRefund, - .viewOrder - ] + .issueRefund + ] + (booking.isOrderValid ? [.viewOrder] : []) } } } diff --git a/WooCommerce/Classes/ViewRelated/Bookings/Booking Details/BookingDetailsView.swift b/WooCommerce/Classes/ViewRelated/Bookings/Booking Details/BookingDetailsView.swift index 6191a146fda..337acaf264b 100644 --- a/WooCommerce/Classes/ViewRelated/Bookings/Booking Details/BookingDetailsView.swift +++ b/WooCommerce/Classes/ViewRelated/Bookings/Booking Details/BookingDetailsView.swift @@ -63,8 +63,10 @@ struct BookingDetailsView: View { Button(Localization.markAsPaid) { print("On mark as paid tap") } - Button(Localization.viewOrder) { - viewModel.navigateToOrderDetails() + if viewModel.isViewOrderAvailable { + Button(Localization.viewOrder) { + viewModel.navigateToOrderDetails() + } } Button(Localization.cancelBookingAction, role: .destructive) { print("On cancel booking tap") From e79890243d5ba170c3992ba260a4f70574cf8437 Mon Sep 17 00:00:00 2001 From: RafaelKayumov Date: Mon, 10 Nov 2025 16:41:08 +0300 Subject: [PATCH 2/3] Add tests --- .../BookingDetailsViewModelTests.swift | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/WooCommerce/WooCommerceTests/ViewRelated/Bookings/BookingDetailsViewModelTests.swift b/WooCommerce/WooCommerceTests/ViewRelated/Bookings/BookingDetailsViewModelTests.swift index 08b2eb1dc19..9305f1cde27 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/Bookings/BookingDetailsViewModelTests.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/Bookings/BookingDetailsViewModelTests.swift @@ -357,4 +357,31 @@ final class BookingDetailsViewModelTests: XCTestCase { XCTAssertFalse(containsAttendanceSection) } + + func test_view_order_is_hidden_when_booking_order_id_is_invalid() { + // Given + let booking = Booking.fake().copy( + orderID: 0 + ) + + // When + let viewModel = BookingDetailsViewModel(booking: booking, stores: storesManager) + + // Then + let paymentSection = viewModel.sections.first { section in + if case .payment = section.content { + return true + } + return false + } + + guard let paymentSection = paymentSection, + case let .payment(paymentContent) = paymentSection.content else { + XCTFail("Payment section not found") + return + } + + XCTAssertFalse(viewModel.isViewOrderAvailable) + XCTAssertFalse(paymentContent.actions.contains(.viewOrder)) + } } From d059642b5a8b1f735c606fe2751e9a1ab84264f4 Mon Sep 17 00:00:00 2001 From: RafaelKayumov Date: Tue, 11 Nov 2025 14:37:37 +0300 Subject: [PATCH 3/3] Update booking order validation --- WooCommerce/Classes/Extensions/Booking+Helpers.swift | 4 ++-- .../ViewModels/Booking Details/BookingDetailsViewModel.swift | 2 +- .../Classes/ViewModels/Booking Details/PaymentContent.swift | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/WooCommerce/Classes/Extensions/Booking+Helpers.swift b/WooCommerce/Classes/Extensions/Booking+Helpers.swift index 6759e7753d8..9e5e687a63f 100644 --- a/WooCommerce/Classes/Extensions/Booking+Helpers.swift +++ b/WooCommerce/Classes/Extensions/Booking+Helpers.swift @@ -19,8 +19,8 @@ extension Booking { .joined(separator: " • ") } - var isOrderValid: Bool { - return orderID != 0 + var hasAssociatedOrder: Bool { + return orderID > 0 } private enum Localization { diff --git a/WooCommerce/Classes/ViewModels/Booking Details/BookingDetailsViewModel.swift b/WooCommerce/Classes/ViewModels/Booking Details/BookingDetailsViewModel.swift index 1267902af99..35324ee305c 100644 --- a/WooCommerce/Classes/ViewModels/Booking Details/BookingDetailsViewModel.swift +++ b/WooCommerce/Classes/ViewModels/Booking Details/BookingDetailsViewModel.swift @@ -84,7 +84,7 @@ private extension BookingDetailsViewModel { func updateDisplayProperties(from booking: Booking) { navigationTitle = Self.navigationTitle(for: booking) - isViewOrderAvailable = booking.isOrderValid + isViewOrderAvailable = booking.hasAssociatedOrder headerContent.update(with: booking) diff --git a/WooCommerce/Classes/ViewModels/Booking Details/PaymentContent.swift b/WooCommerce/Classes/ViewModels/Booking Details/PaymentContent.swift index 962c258e698..63843f3c377 100644 --- a/WooCommerce/Classes/ViewModels/Booking Details/PaymentContent.swift +++ b/WooCommerce/Classes/ViewModels/Booking Details/PaymentContent.swift @@ -29,7 +29,7 @@ extension BookingDetailsViewModel { actions = [ .markAsPaid, .issueRefund - ] + (booking.isOrderValid ? [.viewOrder] : []) + ] + (booking.hasAssociatedOrder ? [.viewOrder] : []) } } }