diff --git a/WooCommerce/Classes/Extensions/Booking+Helpers.swift b/WooCommerce/Classes/Extensions/Booking+Helpers.swift index a1263360371..9e5e687a63f 100644 --- a/WooCommerce/Classes/Extensions/Booking+Helpers.swift +++ b/WooCommerce/Classes/Extensions/Booking+Helpers.swift @@ -19,6 +19,10 @@ extension Booking { .joined(separator: " • ") } + var hasAssociatedOrder: 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..35324ee305c 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.hasAssociatedOrder headerContent.update(with: booking) diff --git a/WooCommerce/Classes/ViewModels/Booking Details/PaymentContent.swift b/WooCommerce/Classes/ViewModels/Booking Details/PaymentContent.swift index 1de7916a44f..63843f3c377 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.hasAssociatedOrder ? [.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") 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)) + } }