From cee23f8bc274b8cdb9bd482aebbf98f6db571504 Mon Sep 17 00:00:00 2001 From: michele-theleftbit Date: Thu, 26 Feb 2026 09:40:26 +0100 Subject: [PATCH 1/2] Refine SwipeableListView swipe logic --- .../SwiftUI/Views/SwipeableListView.swift | 42 ++++++++++++------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/Sources/BSWInterfaceKit/SwiftUI/Views/SwipeableListView.swift b/Sources/BSWInterfaceKit/SwiftUI/Views/SwipeableListView.swift index 9850ab8b..49dc2c95 100644 --- a/Sources/BSWInterfaceKit/SwiftUI/Views/SwipeableListView.swift +++ b/Sources/BSWInterfaceKit/SwiftUI/Views/SwipeableListView.swift @@ -16,6 +16,7 @@ private struct Item: Identifiable, Equatable { } #Preview { + @Previewable @State var items: [Item] = [ @@ -78,7 +79,7 @@ private struct Item: Identifiable, Equatable { NavigationStack { ScrollView { SwipeableListView( - items: items, + items: $items, isSwipeDisabled: { $0.id == "milan" }, rowContent: { item in /// This is intentionally a Button to prove the swipe still works. @@ -134,7 +135,7 @@ private struct Item: Identifiable, Equatable { public struct SwipeableListView: View { - @State + @Binding var items: [Item] @State @@ -151,39 +152,48 @@ public struct SwipeableListView: View { public init( spacing: Double = 4, - items: [Item], + items: Binding<[Item]>, isSwipeDisabled: @escaping (Item) -> Bool = { _ in false }, @ViewBuilder rowContent: @escaping (Item) -> RowContent, onDelete: @escaping Handler ) { self.spacing = spacing - self.items = items + self._items = items self.isSwipeDisabled = isSwipeDisabled self.rowContent = rowContent self.onDelete = onDelete } public var body: some View { - LazyVStack(spacing: spacing) { + listStack(spacing: spacing) { ForEach(items) { item in SwipeableRow( id: item.id, isDisabled: isSwipeDisabled(item), openRowID: $openRowID, content: { rowContent(item) }, - handler: { id in - /// Remove locally to keep UI consistency while - /// the parent-owned source of truth updates. - onDelete(id) - withAnimation(.swipeable) { - items.removeAll { $0.id == id } - } - } + handler: onDelete ) .transition(.swipeableRow) } } } + + @ViewBuilder + private func listStack( + spacing: Double, + @ViewBuilder content: () -> Content + ) -> some View { + #if os(Android) + VStack(spacing: spacing) { + content() + } + #else + LazyVStack(spacing: spacing) { + content() + } + #endif + } } // MARK: - SwipeableRow @@ -246,7 +256,11 @@ struct SwipeableRow: View { .overlay(alignment: .trailing) { if !isDisabled { Color.clear - .frame(width: Constants.swipeActivationWidth) + .frame( + maxWidth: baseOffsetX != 0 + ? .infinity + : Constants.swipeActivationWidth + ) .contentRectangleShape() .gesture(dragGesture) .zIndex(999) From a052c1689c2085e511f62bf5b53d516321a91393 Mon Sep 17 00:00:00 2001 From: michele-theleftbit Date: Thu, 26 Feb 2026 12:55:16 +0100 Subject: [PATCH 2/2] Add animation --- Sources/BSWInterfaceKit/SwiftUI/Views/SwipeableListView.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Sources/BSWInterfaceKit/SwiftUI/Views/SwipeableListView.swift b/Sources/BSWInterfaceKit/SwiftUI/Views/SwipeableListView.swift index 49dc2c95..be3a73ed 100644 --- a/Sources/BSWInterfaceKit/SwiftUI/Views/SwipeableListView.swift +++ b/Sources/BSWInterfaceKit/SwiftUI/Views/SwipeableListView.swift @@ -133,7 +133,7 @@ private struct Item: Identifiable, Equatable { // MARK: - SwipeableListView -public struct SwipeableListView: View { +public struct SwipeableListView: View { @Binding var items: [Item] @@ -177,6 +177,7 @@ public struct SwipeableListView: View { .transition(.swipeableRow) } } + .animation(.swipeable, value: items) } @ViewBuilder