Skip to content

Commit a2fee5b

Browse files
[Bookings][Part 5] Booking details split view navigation (#16202)
2 parents ddfaa9f + a3ed9d0 commit a2fee5b

File tree

4 files changed

+56
-57
lines changed

4 files changed

+56
-57
lines changed

WooCommerce/Classes/Bookings/BookingList/BookingListContainerView.swift

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,38 +3,37 @@ import struct Yosemite.Booking
33

44
struct BookingListContainerView: View {
55
@ObservedObject private var viewModel: BookingListContainerViewModel
6+
@Binding var selectedBooking: Booking?
67

7-
init(viewModel: BookingListContainerViewModel) {
8+
init(viewModel: BookingListContainerViewModel, selectedBooking: Binding<Booking?>) {
89
self.viewModel = viewModel
10+
self._selectedBooking = selectedBooking
911
}
1012

1113
var body: some View {
12-
NavigationStack {
13-
VStack(spacing: 0) {
14-
headerView
15-
TabView(selection: $viewModel.selectedTab) {
16-
ForEach(BookingListTab.allCases, id: \.rawValue) { tab in
17-
BookingListView(viewModel: viewModel.listViewModel(for: tab))
18-
.tag(tab)
19-
}
14+
VStack(spacing: 0) {
15+
headerView
16+
TabView(selection: $viewModel.selectedTab) {
17+
ForEach(BookingListTab.allCases, id: \.rawValue) { tab in
18+
BookingListView(
19+
viewModel: viewModel.listViewModel(for: tab),
20+
selectedBooking: $selectedBooking
21+
)
22+
.tag(tab)
2023
}
21-
.tabViewStyle(.page(indexDisplayMode: .never))
2224
}
23-
.navigationTitle(Localization.viewTitle)
24-
.toolbar {
25-
ToolbarItem(placement: .confirmationAction) {
26-
Button {
27-
// TODO
28-
} label: {
29-
Image(systemName: "magnifyingglass")
30-
}
25+
.tabViewStyle(.page(indexDisplayMode: .never))
26+
}
27+
.navigationTitle(Localization.viewTitle)
28+
.toolbar {
29+
ToolbarItem(placement: .confirmationAction) {
30+
Button {
31+
// TODO
32+
} label: {
33+
Image(systemName: "magnifyingglass")
3134
}
3235
}
3336
}
34-
.navigationDestination(for: Booking.self) { booking in
35-
let viewModel = BookingDetailsViewModel(booking: booking)
36-
BookingDetailsView(viewModel)
37-
}
3837
}
3938
}
4039

WooCommerce/Classes/Bookings/BookingList/BookingListView.swift

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@ import struct Yosemite.Booking
33

44
struct BookingListView: View {
55
@ObservedObject private var viewModel: BookingListViewModel
6+
@Binding var selectedBooking: Booking?
67

7-
init(viewModel: BookingListViewModel) {
8+
init(viewModel: BookingListViewModel, selectedBooking: Binding<Booking?>) {
89
self.viewModel = viewModel
10+
self._selectedBooking = selectedBooking
911
}
1012

1113
var body: some View {
@@ -31,22 +33,20 @@ struct BookingListView: View {
3133

3234
private extension BookingListView {
3335
var bookingList: some View {
34-
ScrollView {
35-
LazyVStack(spacing: 0) {
36-
ForEach(viewModel.bookings) { item in
37-
NavigationLink(value: item) {
38-
bookingItem(item)
39-
}
40-
.buttonStyle(.plain)
41-
}
42-
43-
InfiniteScrollIndicator(showContent: viewModel.shouldShowBottomActivityIndicator)
44-
.padding(.top, Layout.viewPadding)
45-
.onAppear {
46-
viewModel.onLoadNextPageAction()
47-
}
36+
List(selection: $selectedBooking) {
37+
ForEach(viewModel.bookings) { item in
38+
bookingItem(item)
39+
.tag(item)
4840
}
41+
42+
InfiniteScrollIndicator(showContent: viewModel.shouldShowBottomActivityIndicator)
43+
.padding(.top, Layout.viewPadding)
44+
.onAppear {
45+
viewModel.onLoadNextPageAction()
46+
}
4947
}
48+
.listStyle(.plain)
49+
.accentColor(Color(.listSelectedBackground))
5050
.refreshable {
5151
await viewModel.onRefreshAction()
5252
}
@@ -61,6 +61,7 @@ private extension BookingListView {
6161
.font(.body)
6262
.fontWeight(.medium)
6363
.frame(maxWidth: .infinity, alignment: .leading)
64+
.foregroundStyle(Color.primary)
6465

6566
// TODO: fetch bookable products & customer to get names or wait for API update
6667
Text(String(format: "%@ • %@", "Women's Hair cut", "Marianne"))
@@ -76,17 +77,13 @@ private extension BookingListView {
7677
Spacer()
7778
}
7879
}
79-
.padding(Layout.viewPadding)
80-
81-
Divider()
82-
.padding(.leading, Layout.viewPadding)
8380
}
84-
.background(Color(.listForeground(modal: false))) // TODO: update selected background color as part of selection handling
8581
}
8682

8783
func statusBadge(text: String, color: Color) -> some View {
8884
Text(text)
8985
.font(.caption2)
86+
.foregroundStyle(Color.primary)
9087
.padding(.horizontal, 8)
9188
.padding(.vertical, 4)
9289
.background(color.clipShape(RoundedRectangle(cornerRadius: 4)))

WooCommerce/Classes/Bookings/BookingsTabView.swift

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import SwiftUI
2+
import struct Yosemite.Booking
23

34
/// Hosting view for `BookingsTabView`
45
///
@@ -37,19 +38,24 @@ private extension BookingsTabViewHostingController {
3738
/// Main content of the Bookings tab
3839
///
3940
struct BookingsTabView: View {
40-
@State private var visibility: NavigationSplitViewVisibility = .all
41-
42-
private let siteID: Int64
41+
@State private var selectedBooking: Booking?
42+
@State private var visibility: NavigationSplitViewVisibility = .automatic
43+
@StateObject private var bookingListContainerViewModel: BookingListContainerViewModel
4344

4445
init(siteID: Int64) {
45-
self.siteID = siteID
46+
_bookingListContainerViewModel = StateObject(wrappedValue: BookingListContainerViewModel(siteID: siteID))
4647
}
4748

4849
var body: some View {
4950
NavigationSplitView(columnVisibility: $visibility) {
50-
BookingListContainerView(viewModel: BookingListContainerViewModel(siteID: siteID))
51+
BookingListContainerView(viewModel: bookingListContainerViewModel, selectedBooking: $selectedBooking)
5152
} detail: {
52-
Text("Booking Detail Screen")
53+
if let selectedBooking {
54+
let viewModel = BookingDetailsViewModel(booking: selectedBooking)
55+
BookingDetailsView(viewModel)
56+
} else {
57+
Text("Select a booking to see details.")
58+
}
5359
}
5460
.navigationSplitViewStyle(.balanced)
5561
}

WooCommerce/Classes/ViewRelated/Bookings/Booking Details/BookingDetailsView.swift

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import Networking
33

44
struct BookingDetailsView: View {
55
@Environment(\.safeAreaInsets) var safeAreaInsets: EdgeInsets
6-
@Environment(\.dismiss) private var dismiss
6+
77
@State private var showingOptions = false
88
@State private var showingStatusSheet = false
99
@State private var showingCancelAlert = false
@@ -43,15 +43,7 @@ struct BookingDetailsView: View {
4343
.navigationBarTitleDisplayMode(.inline)
4444
.navigationTitle(viewModel.navigationTitle)
4545
.background(Color(uiColor: .systemGroupedBackground))
46-
.navigationBarBackButtonHidden(true)
4746
.toolbar {
48-
ToolbarItem(placement: .navigationBarLeading) {
49-
Button {
50-
dismiss()
51-
} label: {
52-
Image(systemName: "chevron.backward")
53-
}
54-
}
5547
ToolbarItem(placement: .navigationBarTrailing) {
5648
Button {
5749
showingOptions = true
@@ -71,6 +63,11 @@ struct BookingDetailsView: View {
7163
}
7264
}
7365
}
66+
.if(UIDevice.current.userInterfaceIdiom == .phone) {
67+
/// Removes back button title for iPhone layout
68+
/// Applied only for phones because it affects navigation title positioning on tablets
69+
$0.toolbarRole(.editor)
70+
}
7471
.sheet(isPresented: $showingStatusSheet) {
7572
UpdateAttendanceStatusView { selectedStatus in
7673
print("Selected status: \(selectedStatus)")

0 commit comments

Comments
 (0)