diff --git a/TIEcommerce/Sources/Filters/FiltersCollectionCell/Views/DefaultFilterCollectionCell.swift b/TIEcommerce/Sources/Filters/FiltersCollectionCell/Views/DefaultFilterCollectionCell.swift index 6023ee26..82b3b606 100644 --- a/TIEcommerce/Sources/Filters/FiltersCollectionCell/Views/DefaultFilterCollectionCell.swift +++ b/TIEcommerce/Sources/Filters/FiltersCollectionCell/Views/DefaultFilterCollectionCell.swift @@ -70,6 +70,7 @@ open class DefaultFilterCollectionCell: ContainerCollectionViewCell, backgroundColor = cellAppearance.normalBgColor layer.borderColor = cellAppearance.normalBorderColor.cgColor layer.borderWidth = cellAppearance.normalBorderWidth + case .selected: wrappedView.textColor = cellAppearance.selectedFontColor backgroundColor = cellAppearance.selectedBgColor diff --git a/TIEcommerce/Sources/Filters/FiltersCollectionView/Helpers/Array+FilterPropertyValueRepresenter.swift b/TIEcommerce/Sources/Filters/FiltersCollectionView/Helpers/Array+FilterPropertyValueRepresenter.swift new file mode 100644 index 00000000..1a28fb70 --- /dev/null +++ b/TIEcommerce/Sources/Filters/FiltersCollectionView/Helpers/Array+FilterPropertyValueRepresenter.swift @@ -0,0 +1,30 @@ +// +// Copyright (c) 2022 Touch Instinct +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the Software), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import UIKit + +public extension Array where Element: FilterPropertyValueRepresenter { + + func contains(_ property: Element) -> Bool { + contains(where: { $0.id == property.id }) + } +} \ No newline at end of file diff --git a/TIEcommerce/Sources/Filters/FiltersCollectionView/Helpers/UICollectionViewLayout+DefaultLayout.swift b/TIEcommerce/Sources/Filters/FiltersCollectionView/Helpers/UICollectionViewLayout+DefaultLayout.swift index 004ac01e..48ca34de 100644 --- a/TIEcommerce/Sources/Filters/FiltersCollectionView/Helpers/UICollectionViewLayout+DefaultLayout.swift +++ b/TIEcommerce/Sources/Filters/FiltersCollectionView/Helpers/UICollectionViewLayout+DefaultLayout.swift @@ -26,31 +26,31 @@ import TIUIKitCore @available(iOS 13, *) public extension UICollectionViewLayout { - static func gridLayout(_ conf: FiltersLayoutConfiguration) -> UICollectionViewLayout { - let item = NSCollectionLayoutItem(layoutSize: conf.itemSize) + static func gridLayout(_ configuration: FiltersLayoutConfiguration) -> UICollectionViewLayout { + let item = NSCollectionLayoutItem(layoutSize: configuration.itemSize) let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), - heightDimension: conf.itemSize.heightDimension) + heightDimension: configuration.itemSize.heightDimension) let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item]) - group.interItemSpacing = .fixed(conf.horizontalItemSpacing) + group.interItemSpacing = .fixed(configuration.horizontalItemSpacing) let section = NSCollectionLayoutSection(group: group) - section.contentInsets = NSDirectionalEdgeInsets(insets: conf.contentInsets) - section.interGroupSpacing = conf.verticalItemSpacing + section.contentInsets = NSDirectionalEdgeInsets(insets: configuration.contentInsets) + section.interGroupSpacing = configuration.verticalItemSpacing return UICollectionViewCompositionalLayout(section: section) } - static func horizontalScrollLayout(_ conf: FiltersLayoutConfiguration) -> UICollectionViewLayout { - let item = NSCollectionLayoutItem(layoutSize: conf.itemSize) + static func horizontalScrollLayout(_ configuration: FiltersLayoutConfiguration) -> UICollectionViewLayout { + let item = NSCollectionLayoutItem(layoutSize: configuration.itemSize) - let groupSize = NSCollectionLayoutSize(widthDimension: conf.itemSize.widthDimension, + let groupSize = NSCollectionLayoutSize(widthDimension: configuration.itemSize.widthDimension, heightDimension: .fractionalHeight(1)) let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item]) let section = NSCollectionLayoutSection(group: group) - section.contentInsets = NSDirectionalEdgeInsets(insets: conf.contentInsets) - section.interGroupSpacing = conf.horizontalItemSpacing + section.contentInsets = NSDirectionalEdgeInsets(insets: configuration.contentInsets) + section.interGroupSpacing = configuration.horizontalItemSpacing section.orthogonalScrollingBehavior = .continuous return UICollectionViewCompositionalLayout(section: section) diff --git a/TIEcommerce/Sources/Filters/FiltersCollectionView/Models/DefaultFilterPropertyValue.swift b/TIEcommerce/Sources/Filters/FiltersCollectionView/Models/DefaultFilterPropertyValue.swift index 55ee1907..b4bcb5ef 100644 --- a/TIEcommerce/Sources/Filters/FiltersCollectionView/Models/DefaultFilterPropertyValue.swift +++ b/TIEcommerce/Sources/Filters/FiltersCollectionView/Models/DefaultFilterPropertyValue.swift @@ -26,17 +26,15 @@ public struct DefaultFilterPropertyValue: FilterPropertyValueRepresenter { public let id: String public let title: String - public let excludingProperties: [String] + public let excludingPropertiesIds: [String] public var isSelected: Bool -} -public extension DefaultFilterPropertyValue { - init(id: String, title: String, excludingProperties: [String] = []) { + public init(id: String, title: String, excludingPropertiesIds: [String] = [], isSelected: Bool = false) { self.id = id self.title = title - self.excludingProperties = excludingProperties - self.isSelected = false + self.excludingPropertiesIds = excludingPropertiesIds + self.isSelected = isSelected } } diff --git a/TIEcommerce/Sources/Filters/FiltersCollectionView/Protocols/FilterPropertyValueRepresenter.swift b/TIEcommerce/Sources/Filters/FiltersCollectionView/Protocols/FilterPropertyValueRepresenter.swift index 7cb4c304..27c9df50 100644 --- a/TIEcommerce/Sources/Filters/FiltersCollectionView/Protocols/FilterPropertyValueRepresenter.swift +++ b/TIEcommerce/Sources/Filters/FiltersCollectionView/Protocols/FilterPropertyValueRepresenter.swift @@ -22,6 +22,6 @@ public protocol FilterPropertyValueRepresenter { var id: String { get } - var excludingProperties: [String] { get } + var excludingPropertiesIds: [String] { get } var isSelected: Bool { get set } } diff --git a/TIEcommerce/Sources/Filters/FiltersCollectionView/Protocols/FilterViewModelProtocol.swift b/TIEcommerce/Sources/Filters/FiltersCollectionView/Protocols/FilterViewModelProtocol.swift index 925c752a..6e7b98de 100644 --- a/TIEcommerce/Sources/Filters/FiltersCollectionView/Protocols/FilterViewModelProtocol.swift +++ b/TIEcommerce/Sources/Filters/FiltersCollectionView/Protocols/FilterViewModelProtocol.swift @@ -25,9 +25,9 @@ import Foundation public protocol FilterViewModelProtocol: AnyObject { associatedtype Property: FilterPropertyValueRepresenter & Hashable - associatedtype CellViewModel: FilterCellViewModelProtocol & Hashable + associatedtype CellViewModelType: FilterCellViewModelProtocol & Hashable - typealias Change = (indexPath: IndexPath, viewModel: CellViewModel) + typealias Change = (indexPath: IndexPath, viewModel: CellViewModelType) var properties: [Property] { get set } var selectedProperties: [Property] { get set } @@ -70,15 +70,15 @@ public extension FilterViewModelProtocol { } private func excludeProperties(_ filter: Property) -> [Property] { - let propertiesToExclude = filter.excludingProperties + let propertiesIdsToExclude = filter.excludingPropertiesIds - guard !propertiesToExclude.isEmpty else { + guard !propertiesIdsToExclude.isEmpty else { return [] } var excludedProperties = [Property]() - for propertiesIdToExclude in propertiesToExclude { + for propertiesIdToExclude in propertiesIdsToExclude { let propertyToExclude = selectedProperties.first { property in property.id == propertiesIdToExclude } diff --git a/TIEcommerce/Sources/Filters/FiltersCollectionView/ViewModels/BaseFilterViewModel.swift b/TIEcommerce/Sources/Filters/FiltersCollectionView/ViewModels/BaseFilterViewModel.swift index aa948b32..d54b816e 100644 --- a/TIEcommerce/Sources/Filters/FiltersCollectionView/ViewModels/BaseFilterViewModel.swift +++ b/TIEcommerce/Sources/Filters/FiltersCollectionView/ViewModels/BaseFilterViewModel.swift @@ -29,7 +29,7 @@ open class BaseFilterViewModel [Change] { let (selected, deselected) = toggleProperty(atIndexPath: indexPath) - let changedFilters = properties + let changedProperties = properties .enumerated() - .filter { isPropertyInArray($0.element, properties: selected) || isPropertyInArray($0.element, properties: deselected) } + .filter { selected.contains($0.element) || deselected.contains($0.element) } - for (offset, element) in changedFilters { - let isSelected = isPropertyInArray(element, properties: selectedProperties) + changedProperties.forEach { index, element in + let isSelected = selectedProperties.contains(element) - setSelectedCell(atIndex: offset, isSelected: isSelected) - properties[offset].isSelected = isSelected + setSelectedCell(atIndex: index, isSelected: isSelected) + setSelectedProperty(atIndex: index, isSelected: isSelected) } - let changedItems = changedFilters + let changedItems = changedProperties .map { Change(indexPath: IndexPath(item: $0.offset, section: .zero), viewModel: cellsViewModels[$0.offset]) @@ -78,6 +78,10 @@ open class BaseFilterViewModel Bool { properties.contains(where: { $0.id == property.id }) } diff --git a/TIEcommerce/Sources/Filters/FiltersCollectionView/Views/BaseFiltersCollectionView.swift b/TIEcommerce/Sources/Filters/FiltersCollectionView/Views/BaseFiltersCollectionView.swift index b6d8e32d..5b46cafb 100644 --- a/TIEcommerce/Sources/Filters/FiltersCollectionView/Views/BaseFiltersCollectionView.swift +++ b/TIEcommerce/Sources/Filters/FiltersCollectionView/Views/BaseFiltersCollectionView.swift @@ -156,8 +156,8 @@ open class BaseFiltersCollectionView