From 4fc7a6edb1aa80900cfdd7b8945e8af32c0e0945 Mon Sep 17 00:00:00 2001 From: Huong Do Date: Tue, 2 Dec 2025 12:12:47 +0700 Subject: [PATCH 1/2] Fix separator on top of list --- .../Classes/Bookings/BookingList/BookingListView.swift | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/WooCommerce/Classes/Bookings/BookingList/BookingListView.swift b/WooCommerce/Classes/Bookings/BookingList/BookingListView.swift index f641db640ce..6e8292ee8e5 100644 --- a/WooCommerce/Classes/Bookings/BookingList/BookingListView.swift +++ b/WooCommerce/Classes/Bookings/BookingList/BookingListView.swift @@ -109,6 +109,9 @@ private extension BookingListView { Section { ForEach(bookings) { item in bookingItem(item) + .if(item == bookings.first) { + $0.listSectionSeparator(.hidden, edges: .top) + } .tag(item) } @@ -131,11 +134,9 @@ private extension BookingListView { $0.listStyle(.plain) } else { $0.listStyle(.grouped) + .scrollContentBackground(.hidden) } } - .listStyle(.grouped) - .scrollContentBackground(.hidden) - .listSectionSeparator(.hidden, edges: .top) .background(Color(.listBackground)) .refreshable { await onRefresh() From bd7ecb8c7bb634951636a56fb8406958eecc0156 Mon Sep 17 00:00:00 2001 From: Huong Do Date: Tue, 2 Dec 2025 12:29:41 +0700 Subject: [PATCH 2/2] Update search content view to fix refreshable --- .../BookingList/BookingListView.swift | 70 ++++++++++++------- 1 file changed, 45 insertions(+), 25 deletions(-) diff --git a/WooCommerce/Classes/Bookings/BookingList/BookingListView.swift b/WooCommerce/Classes/Bookings/BookingList/BookingListView.swift index 6e8292ee8e5..4e932cf214d 100644 --- a/WooCommerce/Classes/Bookings/BookingList/BookingListView.swift +++ b/WooCommerce/Classes/Bookings/BookingList/BookingListView.swift @@ -49,6 +49,7 @@ private extension BookingListView { loadingView case .results: bookingList(with: viewModel.bookings, + isSearching: false, onNextPage: { viewModel.onLoadNextPageAction() }, onRefresh: { await viewModel.onRefreshAction() }) } @@ -66,15 +67,18 @@ private extension BookingListView { } var searchContentView: some View { - VStack { + VStack(spacing: 0) { if searchViewModel.isSearching { loadingView } else if searchViewModel.searchResults.isEmpty { + header emptyStateView(isSearching: true) { await searchViewModel.onRefreshAction() } } else { + header bookingList(with: searchViewModel.searchResults, + isSearching: true, onNextPage: { searchViewModel.onLoadNextPageAction() }, onRefresh: { await searchViewModel.onRefreshAction() }) } @@ -103,27 +107,20 @@ private extension BookingListView { } func bookingList(with bookings: [Booking], + isSearching: Bool, onNextPage: @escaping () -> Void, onRefresh: @escaping () async -> Void) -> some View { List(selection: $selectedBooking) { - Section { - ForEach(bookings) { item in - bookingItem(item) - .if(item == bookings.first) { - $0.listSectionSeparator(.hidden, edges: .top) - } - .tag(item) + if isSearching { + bookingListSection(with: bookings, onNextPage: onNextPage) + } else { + Section { + bookingListSection(with: bookings, onNextPage: onNextPage) + } header: { + header + .listRowInsets(EdgeInsets()) + .textCase(nil) } - - InfiniteScrollIndicator(showContent: viewModel.shouldShowBottomActivityIndicator) - .padding(.top, BookingListViewLayout.viewPadding) - .onAppear { - onNextPage() - } - } header: { - header - .listRowInsets(EdgeInsets()) - .textCase(nil) } } .apply { @@ -143,6 +140,23 @@ private extension BookingListView { } } + @ViewBuilder + func bookingListSection(with bookings: [Booking], onNextPage: @escaping () -> Void) -> some View { + ForEach(bookings) { item in + bookingItem(item) + .if(item == bookings.first) { + $0.listSectionSeparator(.hidden, edges: .top) + } + .tag(item) + } + + InfiniteScrollIndicator(showContent: viewModel.shouldShowBottomActivityIndicator) + .padding(.top, BookingListViewLayout.viewPadding) + .onAppear { + onNextPage() + } + } + func bookingItem(_ booking: Booking) -> some View { VStack(alignment: .leading, spacing: BookingListViewLayout.bookingSummaryBadgeSpacing) { VStack(alignment: .leading, spacing: BookingListViewLayout.bookingSummarySpacing) { @@ -182,13 +196,19 @@ private extension BookingListView { func emptyStateView(isSearching: Bool, onRefresh: @escaping () async -> Void) -> some View { GeometryReader { proxy in ScrollView { - LazyVStack(spacing: 0, pinnedViews: .sectionHeaders) { - Section { - emptyStateContent(isSearching: isSearching) - .frame(minWidth: proxy.size.width, - minHeight: proxy.size.height - BookingListViewLayout.defaultHeaderHeight * scale) - } header: { - header + if isSearching { + emptyStateContent(isSearching: isSearching) + .frame(minWidth: proxy.size.width, + minHeight: proxy.size.height) + } else { + LazyVStack(spacing: 0, pinnedViews: .sectionHeaders) { + Section { + emptyStateContent(isSearching: isSearching) + .frame(minWidth: proxy.size.width, + minHeight: proxy.size.height - BookingListViewLayout.defaultHeaderHeight * scale) + } header: { + header + } } } }