diff --git a/Sources/CollectionView/SelectableForEach.swift b/Sources/CollectionView/SelectableForEach.swift index 4ca0646..58de315 100644 --- a/Sources/CollectionView/SelectableForEach.swift +++ b/Sources/CollectionView/SelectableForEach.swift @@ -33,17 +33,13 @@ public struct SelectableForEach< public var body: some View { ForEach(IndexedCollection(data)) { element in - let isSelected: Bool = selection.isSelected(for: element.id) + let isSelected: Bool = selection.isSelected(for: element.value.id) let isDisabled: Bool = !selection.isEnabled(for: element.id) - cell(element.index, element.value) - .disabled(isDisabled) - .environment(\.collectionView_isSelected, isSelected) - .environment( - \.collectionView_updateSelection, - { [selection] isSelected in - selection.update(isSelected: isSelected, for: element.value) - }) + selection.applyEnvironments( + for: cell(element.index, element.value), + item: element.value + ) } } diff --git a/Sources/CollectionView/SelectionState.swift b/Sources/CollectionView/SelectionState.swift index b52ecb2..a41327e 100644 --- a/Sources/CollectionView/SelectionState.swift +++ b/Sources/CollectionView/SelectionState.swift @@ -1,3 +1,4 @@ +import SwiftUI public enum SelectAction { case selected @@ -18,6 +19,26 @@ public protocol SelectionState { func update(isSelected: Bool, for item: Item) } +extension SelectionState { + + public func applyEnvironments(for body: Body, item: Item) -> some View { + + let isSelected: Bool = isSelected(for: item.id) + let isDisabled: Bool = !isEnabled(for: item.id) + + return body + .disabled(isDisabled) + .environment(\.collectionView_isSelected, isSelected) + .environment( + \.collectionView_updateSelection, + { isSelected in + self.update(isSelected: isSelected, for: item) + } + ) + } + +} + extension SelectionState { public static func single(