From c215534bd86198e8f0d5cb696f0bf7d8923e556e Mon Sep 17 00:00:00 2001 From: OleS Date: Tue, 3 Mar 2026 13:05:06 +0200 Subject: [PATCH 1/2] - Fix: No size available text instead of max size issue - Fix: Virtusize widget recommended size incorrect --- CHANGES.md | 4 ++++ .../Sources/Flutter/VirtusizeFlutter.swift | 11 ++++++---- .../VirtusizeFlutterProductEventHandler.swift | 2 +- .../Models/VirtusizeServerProduct.swift | 14 ++++++------- .../Sources/UI/VirtusizeInPageMini.swift | 9 +++++++-- .../Sources/UI/VirtusizeInPageStandard.swift | 6 +++++- .../UI/VirtusizeViewEventProtocol.swift | 7 +++++++ Virtusize/Sources/Virtusize.swift | 20 +++++++++++++++++-- 8 files changed, 56 insertions(+), 17 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 54b2fecc..ce6cfc00 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -10,6 +10,10 @@ Use list notation, and following prefixes: - Bugfix - when fixing any major bug - Docs - for any improvement to documentation +### Changes: +- Fix: No size availble text instead max size issue +- Fix: Virtusize widget recommended size incorrect + ### 2.12.25 - Fix: Prevent send event userSawProduct when productValid = false or repeated product load diff --git a/Virtusize/Sources/Flutter/VirtusizeFlutter.swift b/Virtusize/Sources/Flutter/VirtusizeFlutter.swift index fde1bac9..5537767a 100644 --- a/Virtusize/Sources/Flutter/VirtusizeFlutter.swift +++ b/Virtusize/Sources/Flutter/VirtusizeFlutter.swift @@ -140,22 +140,25 @@ public class VirtusizeFlutter: Virtusize { } @objc private static func didReceiveSizeRecommendationData(_ notification: Notification) { + guard let notificationData = notification.userInfo as? [String: Any], - let sizeRecData = notificationData[NotificationKey.sizeRecommendationData] as? Virtusize.SizeRecommendationData else { + let sizeRecData = notificationData[NotificationKey.sizeRecommendationData] as? Virtusize.SizeRecommendationData + else { return } let serverProduct = sizeRecData.serverProduct - let clientProductImageURL = self.storeProductSet.first(where: {product in product.externalId == serverProduct.externalId})?.imageURL + let clientProductImageURL = self.storeProductSet.first(where: { product in product.externalId == serverProduct.externalId })?.imageURL let bestUserProduct = sizeRecData.sizeComparisonRecommendedSize?.bestUserProduct let bodyProfileWillFit = sizeRecData.bodyProfileRecommendedSize?.willFit + let recommendationText = serverProduct.getRecommendationText( VirtusizeRepository.shared.i18nLocalization!, sizeRecData.sizeComparisonRecommendedSize, sizeRecData.bodyProfileRecommendedSize?.getSizeName, VirtusizeI18nLocalization.TrimType.MULTIPLELINES, - bodyProfileWillFit + bodyProfileWillFit ?? true ) flutterHandler?.onSizeRecommendationData( externalId: serverProduct.externalId, @@ -163,7 +166,7 @@ public class VirtusizeFlutter: Virtusize { storeProduct: serverProduct, bestUserProduct: bestUserProduct, recommendationText: recommendationText, - willFit: bodyProfileWillFit + willFit: bodyProfileWillFit ?? true ) } diff --git a/Virtusize/Sources/Flutter/VirtusizeFlutterProductEventHandler.swift b/Virtusize/Sources/Flutter/VirtusizeFlutterProductEventHandler.swift index 9744a4df..d4301e2c 100644 --- a/Virtusize/Sources/Flutter/VirtusizeFlutterProductEventHandler.swift +++ b/Virtusize/Sources/Flutter/VirtusizeFlutterProductEventHandler.swift @@ -33,7 +33,7 @@ public protocol VirtusizeFlutterProductEventHandler { storeProduct: VirtusizeServerProduct, bestUserProduct: VirtusizeServerProduct?, recommendationText: String, - willFit: Bool? + willFit: Bool ) func onLanguageClick(language: VirtusizeLanguage) func onInPageError(externalId: String) diff --git a/Virtusize/Sources/Models/VirtusizeServerProduct.swift b/Virtusize/Sources/Models/VirtusizeServerProduct.swift index 8896cda7..166b84a3 100644 --- a/Virtusize/Sources/Models/VirtusizeServerProduct.swift +++ b/Virtusize/Sources/Models/VirtusizeServerProduct.swift @@ -119,7 +119,7 @@ public class VirtusizeServerProduct: Codable { _ sizeComparisonRecommendedSize: SizeComparisonRecommendedSize?, _ bodyProfileRecommendedSizeName: String?, _ trimType: VirtusizeI18nLocalization.TrimType = VirtusizeI18nLocalization.TrimType.ONELINE, - _ bodyProfileWillFit: Bool? = nil + _ bodyProfileWillFit: Bool ) -> String { guard let i18nLocalization = i18nLocalization else { return Localization.shared.localize("inpage_default_accessory_text") @@ -157,11 +157,11 @@ public class VirtusizeServerProduct: Codable { // For one-size products with body data provided if hasBodyData { - // If willFit is true and we have a recommended size, show the will fit message - if bodyProfileWillFit != false { + // If willFit is explicitly true, show the will fit message + if bodyProfileWillFit == true { return i18nLocalization.getOneSizeBodyProfileText() } - // If willFit is false or no recommended size, show "Your size not found" + // If willFit is false or nil (no willFit from API), show "Your size not found" return i18nLocalization.getWillNotFitResultText() } @@ -186,15 +186,15 @@ public class VirtusizeServerProduct: Codable { // For multi-size products with body data provided if hasBodyData { - // If willFit is true and we have a recommended size, show it + // If willFit is explicitly true and we have a recommended size, show it if - bodyProfileWillFit != false, + bodyProfileWillFit == true, let bodyProfileRecommendedSizeName = bodyProfileRecommendedSizeName, !bodyProfileRecommendedSizeName.isEmpty { return i18nLocalization.getMultiSizeBodyProfileText(bodyProfileRecommendedSizeName) } - // If willFit is false or no recommended size, show "Your size not found" + // If willFit is false or nil (no willFit from API), show "Your size not found" return i18nLocalization.getWillNotFitResultText() } diff --git a/Virtusize/Sources/UI/VirtusizeInPageMini.swift b/Virtusize/Sources/UI/VirtusizeInPageMini.swift index 252ff52e..ac13b4aa 100644 --- a/Virtusize/Sources/UI/VirtusizeInPageMini.swift +++ b/Virtusize/Sources/UI/VirtusizeInPageMini.swift @@ -82,6 +82,8 @@ public class VirtusizeInPageMini: VirtusizeInPageView { self.sizeComparisonRecommendedSize = sizeRecData.sizeComparisonRecommendedSize self.bodyProfileRecommendedSize = sizeRecData.bodyProfileRecommendedSize + let bodyProfileWillFit = sizeRecData.bodyProfileRecommendedSize?.willFit + setLoadingScreen(loading: false) inPageMiniMessageLabel.attributedText = NSAttributedString( string: @@ -89,7 +91,8 @@ public class VirtusizeInPageMini: VirtusizeInPageView { VirtusizeRepository.shared.i18nLocalization, sizeComparisonRecommendedSize, bodyProfileRecommendedSize?.getSizeName, - VirtusizeI18nLocalization.TrimType.ONELINE + VirtusizeI18nLocalization.TrimType.ONELINE, + bodyProfileWillFit ?? true ) ).lineSpacing(self.verticalMargin/2) } @@ -127,13 +130,15 @@ public class VirtusizeInPageMini: VirtusizeInPageView { inPageMiniMessageLabel.text = Localization.shared.localize("inpage_error_short_text", language: language) } else { if let product = serverProduct { + let bodyProfileWillFit = bodyProfileRecommendedSize?.willFit inPageMiniMessageLabel.attributedText = NSAttributedString( string: product.getRecommendationText( VirtusizeRepository.shared.i18nLocalization!, sizeComparisonRecommendedSize, bodyProfileRecommendedSize?.getSizeName, - VirtusizeI18nLocalization.TrimType.ONELINE + VirtusizeI18nLocalization.TrimType.ONELINE, + bodyProfileWillFit ?? true ) ).lineSpacing(self.verticalMargin/2) } diff --git a/Virtusize/Sources/UI/VirtusizeInPageStandard.swift b/Virtusize/Sources/UI/VirtusizeInPageStandard.swift index b29ca6d2..32d48da7 100644 --- a/Virtusize/Sources/UI/VirtusizeInPageStandard.swift +++ b/Virtusize/Sources/UI/VirtusizeInPageStandard.swift @@ -591,13 +591,17 @@ public class VirtusizeInPageStandard: VirtusizeInPageView { // swiftlint:disable return } + let bodyProfileWillFit = bodyProfileRecommendedSize?.willFit + let trimType = VirtusizeI18nLocalization.TrimType.MULTIPLELINES let recommendationText = serverProduct.getRecommendationText( i18nLocalization, sizeComparisonRecommendedSize, bodyProfileRecommendedSize?.getSizeName, - trimType + trimType, + bodyProfileWillFit ?? true ) + let recommendationTextArray = recommendationText.components(separatedBy: trimType.rawValue) if recommendationTextArray.count == 2 { self.topMessageLabel.attributedText = NSAttributedString( diff --git a/Virtusize/Sources/UI/VirtusizeViewEventProtocol.swift b/Virtusize/Sources/UI/VirtusizeViewEventProtocol.swift index 829cf510..208e5db8 100644 --- a/Virtusize/Sources/UI/VirtusizeViewEventProtocol.swift +++ b/Virtusize/Sources/UI/VirtusizeViewEventProtocol.swift @@ -82,6 +82,13 @@ extension VirtusizeViewEventProtocol { Task { VirtusizeRepository.shared.updateUserBodyRecommendedSize(recommendedSize) VirtusizeRepository.shared.updateInPageRecommendation(type: .body) + + await VirtusizeRepository.shared.fetchDataForInPageRecommendation( + shouldUpdateUserProducts: false, + shouldUpdateBodyProfile: true + ) + + VirtusizeRepository.shared.updateInPageRecommendation() } } diff --git a/Virtusize/Sources/Virtusize.swift b/Virtusize/Sources/Virtusize.swift index ee44f832..7e5ce48a 100644 --- a/Virtusize/Sources/Virtusize.swift +++ b/Virtusize/Sources/Virtusize.swift @@ -73,10 +73,26 @@ public class Virtusize { bodyProfileRecommendedSize: BodyProfileRecommendedSize? ) + /// Lock for thread-safe access to sizeRecData + private static let sizeRecDataLock = NSLock() + + /// The backing storage for size recommendation data + private static var _sizeRecData: SizeRecommendationData? + /// The property to be set to updating the size recommendation data for InPage views. internal static var sizeRecData: SizeRecommendationData? { - didSet { - if let sizeRecData = sizeRecData { + get { + sizeRecDataLock.lock() + defer { sizeRecDataLock.unlock() } + return _sizeRecData + } + set { + sizeRecDataLock.lock() + _sizeRecData = newValue + let value = _sizeRecData + sizeRecDataLock.unlock() + + if let sizeRecData = value { DispatchQueue.main.async { NotificationCenter.default.post( name: .sizeRecommendationData, From 9c53e72943d16edea8e5b17f505edd0af17b493a Mon Sep 17 00:00:00 2001 From: OleS Date: Tue, 3 Mar 2026 13:05:16 +0200 Subject: [PATCH 2/2] Changes --- CHANGES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index ce6cfc00..fa5b43bd 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -11,7 +11,7 @@ Use list notation, and following prefixes: - Docs - for any improvement to documentation ### Changes: -- Fix: No size availble text instead max size issue +- Fix: No size available text instead of max size issue - Fix: Virtusize widget recommended size incorrect ### 2.12.25