@@ -15,6 +15,7 @@ final class ProductDetailsViewModel: ProductDetailsViewModelProtocol {
1515 private( set) var colorSelectionConfiguration : ColorAndSizingSelectorConfiguration < ColorSwatch > = . init( items: [ ] )
1616 private( set) var sizingSelectionConfiguration : ColorAndSizingSelectorConfiguration < SizingSwatch > = . init( items: [ ] )
1717 public let productId : String
18+ private let initialSelectedProduct : SelectedProduct ?
1819
1920 private var product : Product ? {
2021 guard case . success( let model) = state else {
@@ -26,7 +27,7 @@ final class ProductDetailsViewModel: ProductDetailsViewModelProtocol {
2627
2728 private var selectedVariant : Product . Variant ? {
2829 guard case . success( let model) = state else {
29- return baseProduct? . defaultVariant
30+ return initialSelectedProduct ? . selectedVariant ?? baseProduct? . defaultVariant
3031 }
3132
3233 return model. selectedVariant
@@ -87,16 +88,32 @@ final class ProductDetailsViewModel: ProductDetailsViewModelProtocol {
8788 product? . priceType
8889 }
8990
90- init ( productId: String , product: Product ? , dependencies: ProductDetailsDependencyContainer ) {
91+ init (
92+ productId: String ,
93+ product: Product ? ,
94+ selectedProduct: SelectedProduct ? = nil ,
95+ dependencies: ProductDetailsDependencyContainer
96+ ) {
9197 self . productId = productId
98+ self . initialSelectedProduct = selectedProduct
9299 baseProduct = product
93100 self . dependencies = dependencies
94101
95- if let baseProduct {
102+ switch ( product, selectedProduct) {
103+ case ( . some( let product) , . none) :
96104 buildColorAndSizingSelectionConfigurations (
97- product: baseProduct ,
98- selectedVariant: baseProduct . defaultVariant
105+ product: product ,
106+ selectedVariant: product . defaultVariant
99107 )
108+
109+ case ( _, . some( let selectedProduct) ) :
110+ buildColorAndSizingSelectionConfigurations (
111+ product: selectedProduct. product,
112+ selectedVariant: selectedProduct. selectedVariant
113+ )
114+
115+ default :
116+ break
100117 }
101118 }
102119
@@ -204,13 +221,14 @@ final class ProductDetailsViewModel: ProductDetailsViewModelProtocol {
204221 return
205222 }
206223
207- buildColorAndSizingSelectionConfigurations ( product: product, selectedVariant: product. defaultVariant)
208- state = . success( . init( product: product, selectedVariant: product. defaultVariant) )
224+ let selectedVariant = initialSelectedProduct? . selectedVariant ?? product. defaultVariant
225+ buildColorAndSizingSelectionConfigurations ( product: product, selectedVariant: selectedVariant)
226+ state = . success( . init( product: product, selectedVariant: selectedVariant) )
209227 }
210228
211- private func buildColorAndSizingSelectionConfigurations( product: Product , selectedVariant: Product . Variant ? ) {
212- buildColorSelectionConfiguration ( product: product, selectedVariant: product . defaultVariant )
213- buildSizingSelectionConfiguration ( product: product, selectedVariant: product . defaultVariant )
229+ private func buildColorAndSizingSelectionConfigurations( product: Product , selectedVariant: Product . Variant ) {
230+ buildColorSelectionConfiguration ( product: product, selectedVariant: selectedVariant )
231+ buildSizingSelectionConfiguration ( product: product, selectedVariant: selectedVariant )
214232 }
215233
216234 private func buildColorSelectionConfiguration( product: Product , selectedVariant: Product . Variant ? ) {
@@ -363,14 +381,14 @@ final class ProductDetailsViewModel: ProductDetailsViewModelProtocol {
363381 state = . success( . init( product: product, selectedVariant: variant) )
364382 }
365383
366- private var selectedProduct : SelectionProduct ? {
384+ private var selectedProduct : SelectedProduct ? {
367385 guard
368386 let product,
369387 let selectedVariant
370388 else {
371- return nil
389+ return initialSelectedProduct
372390 }
373391
374- return SelectionProduct ( product: product, selectedVariant: selectedVariant)
392+ return SelectedProduct ( product: product, selectedVariant: selectedVariant)
375393 }
376394}
0 commit comments