From 9db44daefb452a558fe9314e1d035bcbf64d6da0 Mon Sep 17 00:00:00 2001 From: OleS Date: Tue, 23 Dec 2025 01:30:23 +0200 Subject: [PATCH 1/4] Fix: issue with no size found text fixed --- .../Models/VirtusizeI18nLocalization.swift | 5 ++ .../Models/VirtusizeServerProduct.swift | 51 +++++++++++++++---- .../en.lproj/VirtusizeLocalizable.strings | 2 +- 3 files changed, 46 insertions(+), 12 deletions(-) diff --git a/Virtusize/Sources/Models/VirtusizeI18nLocalization.swift b/Virtusize/Sources/Models/VirtusizeI18nLocalization.swift index c8662e2b..bdea401d 100644 --- a/Virtusize/Sources/Models/VirtusizeI18nLocalization.swift +++ b/Virtusize/Sources/Models/VirtusizeI18nLocalization.swift @@ -122,4 +122,9 @@ public class VirtusizeI18nLocalization { let willFitResultText = self.willFitResultText ?? Localization.shared.localize("inpage_will_fit_result") return "\(willFitResultText) %{boldStart}\(bodyProfileRecommendedSizeName)%{boldEnd}" } + + /// Gets the "will not fit" text when body data is provided but no size fits + internal func getWillNotFitResultText() -> String { + return willNotFitResultText ?? Localization.shared.localize("inpage_will_not_fit_result") + } } diff --git a/Virtusize/Sources/Models/VirtusizeServerProduct.swift b/Virtusize/Sources/Models/VirtusizeServerProduct.swift index dce87e22..c39e722c 100644 --- a/Virtusize/Sources/Models/VirtusizeServerProduct.swift +++ b/Virtusize/Sources/Models/VirtusizeServerProduct.swift @@ -118,7 +118,8 @@ public class VirtusizeServerProduct: Codable { _ i18nLocalization: VirtusizeI18nLocalization?, _ sizeComparisonRecommendedSize: SizeComparisonRecommendedSize?, _ bodyProfileRecommendedSizeName: String?, - _ trimType: VirtusizeI18nLocalization.TrimType = VirtusizeI18nLocalization.TrimType.ONELINE + _ trimType: VirtusizeI18nLocalization.TrimType = VirtusizeI18nLocalization.TrimType.ONELINE, + _ bodyProfileWillFit: Bool? = nil ) -> String { guard let i18nLocalization = i18nLocalization else { return Localization.shared.localize("inpage_default_accessory_text") @@ -128,9 +129,9 @@ public class VirtusizeServerProduct: Codable { if isAccessory() { text = accessoryText(i18nLocalization, sizeComparisonRecommendedSize) } else if self.sizes.count == 1 { - text = oneSizeText(i18nLocalization, sizeComparisonRecommendedSize, bodyProfileRecommendedSizeName) + text = oneSizeText(i18nLocalization, sizeComparisonRecommendedSize, bodyProfileRecommendedSizeName, bodyProfileWillFit) } else { - text = multiSizeText(i18nLocalization, sizeComparisonRecommendedSize, bodyProfileRecommendedSizeName) + text = multiSizeText(i18nLocalization, sizeComparisonRecommendedSize, bodyProfileRecommendedSizeName, bodyProfileWillFit) } return text.trimI18nText(trimType) } @@ -148,14 +149,28 @@ public class VirtusizeServerProduct: Codable { private func oneSizeText( _ i18nLocalization: VirtusizeI18nLocalization, _ sizeComparisonRecommendedSize: SizeComparisonRecommendedSize?, - _ bodyProfileRecommendedSizeName: String? + _ bodyProfileRecommendedSizeName: String?, + _ bodyProfileWillFit: Bool? ) -> String { - if bodyProfileRecommendedSizeName != nil { - return i18nLocalization.getOneSizeBodyProfileText() - } + // Check if body data is provided (bodyProfileRecommendedSizeName is not nil means body data was provided) + let hasBodyData = bodyProfileRecommendedSizeName != nil + + // 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 == true { + return i18nLocalization.getOneSizeBodyProfileText() + } + // If willFit is false or no recommended size, show "Your size not found" + return i18nLocalization.getWillNotFitResultText() + } + + // No body data provided, check for product comparison if let sizeComparisonRecommendedSize = sizeComparisonRecommendedSize, sizeComparisonRecommendedSize.isValid() { return i18nLocalization.getOneSizeProductComparisonText(sizeComparisonRecommendedSize) } + + // No data at all, show body data empty message return i18nLocalization.getBodyDataEmptyText() } @@ -163,14 +178,28 @@ public class VirtusizeServerProduct: Codable { private func multiSizeText( _ i18nLocalization: VirtusizeI18nLocalization, _ sizeComparisonRecommendedSize: SizeComparisonRecommendedSize?, - _ bodyProfileRecommendedSizeName: String? + _ bodyProfileRecommendedSizeName: String?, + _ bodyProfileWillFit: Bool? ) -> String { - if let bodyProfileRecommendedSizeName = bodyProfileRecommendedSizeName { - return i18nLocalization.getMultiSizeBodyProfileText(bodyProfileRecommendedSizeName) - } + // Check if body data is provided + let hasBodyData = bodyProfileRecommendedSizeName != nil + + // For multi-size products with body data provided + if hasBodyData { + // If willFit is true and we have a recommended size, show it + if bodyProfileWillFit == true, let bodyProfileRecommendedSizeName = bodyProfileRecommendedSizeName, !bodyProfileRecommendedSizeName.isEmpty { + return i18nLocalization.getMultiSizeBodyProfileText(bodyProfileRecommendedSizeName) + } + // If willFit is false or no recommended size, show "Your size not found" + return i18nLocalization.getWillNotFitResultText() + } + + // No body data provided, check for product comparison if let sizeComparisonRecommendedSizeName = sizeComparisonRecommendedSize?.bestStoreProductSize?.name { return i18nLocalization.getMultiSizeProductionComparisonText(sizeComparisonRecommendedSizeName) } + + // No data at all, show body data empty message return i18nLocalization.getBodyDataEmptyText() } diff --git a/VirtusizeCore/Sources/Resources/Localizations/en.lproj/VirtusizeLocalizable.strings b/VirtusizeCore/Sources/Resources/Localizations/en.lproj/VirtusizeLocalizable.strings index 5f842665..d7e2c057 100644 --- a/VirtusizeCore/Sources/Resources/Localizations/en.lproj/VirtusizeLocalizable.strings +++ b/VirtusizeCore/Sources/Resources/Localizations/en.lproj/VirtusizeLocalizable.strings @@ -14,7 +14,7 @@ "inpage_multi_size_comparison_text" = "The closest size to your item is"; "inpage_body_data_empty_text" = "Find your right size"; "inpage_will_fit_result" = "Your recommended size is"; -"inpage_will_not_fit_result" = "Check how it fits you"; +"inpage_will_not_fit_result" = "Your size not found"; "inpage_loading_text" = "Analyzing the size"; "inpage_error_long_text" = "Virtusize is not available at the moment.\nPlease enjoy shopping without us."; "inpage_error_short_text" = "Virtusize is not available at the moment."; From 43851c74cc8d3236d64bb554570a4bbc4c3ba5a1 Mon Sep 17 00:00:00 2001 From: OleS Date: Tue, 23 Dec 2025 12:42:33 +0200 Subject: [PATCH 2/4] Added Flutter native implementation --- .../Sources/Flutter/VirtusizeFlutterProductEventHandler.swift | 3 ++- Virtusize/Sources/Models/VirtusizeI18nLocalization.swift | 2 +- Virtusize/Tests/i18n_en.json | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Virtusize/Sources/Flutter/VirtusizeFlutterProductEventHandler.swift b/Virtusize/Sources/Flutter/VirtusizeFlutterProductEventHandler.swift index 87ee63ae..b633c12e 100644 --- a/Virtusize/Sources/Flutter/VirtusizeFlutterProductEventHandler.swift +++ b/Virtusize/Sources/Flutter/VirtusizeFlutterProductEventHandler.swift @@ -32,7 +32,8 @@ public protocol VirtusizeFlutterProductEventHandler { clientProductImageURL: String?, storeProduct: VirtusizeServerProduct, bestUserProduct: VirtusizeServerProduct?, - recommendationText: String + recommendationText: String, + willFit: Bool? ) func onLanguageClick(language: VirtusizeLanguage) func onInPageError(externalId: String) diff --git a/Virtusize/Sources/Models/VirtusizeI18nLocalization.swift b/Virtusize/Sources/Models/VirtusizeI18nLocalization.swift index bdea401d..1632f445 100644 --- a/Virtusize/Sources/Models/VirtusizeI18nLocalization.swift +++ b/Virtusize/Sources/Models/VirtusizeI18nLocalization.swift @@ -125,6 +125,6 @@ public class VirtusizeI18nLocalization { /// Gets the "will not fit" text when body data is provided but no size fits internal func getWillNotFitResultText() -> String { - return willNotFitResultText ?? Localization.shared.localize("inpage_will_not_fit_result") + return Localization.shared.localize("inpage_will_not_fit_result") } } diff --git a/Virtusize/Tests/i18n_en.json b/Virtusize/Tests/i18n_en.json index 37b4aea1..5c255577 100644 --- a/Virtusize/Tests/i18n_en.json +++ b/Virtusize/Tests/i18n_en.json @@ -23,7 +23,7 @@ "errorTextShort": "Virtusize is not available at the moment.", "oneSizeText": "There is only size %{value}", "details": "Details", - "willNotFitResult": "Check how it fits you", + "willNotFitResult": "Your size not found", "tryItOn": "Try it on", "accessoriesEmpty": "See what fits inside", "hasProductAccessoryText": "See the size difference from %{boldStart}your own item%{boldEnd}", From dadbc74a1ac5ec898d339043be8398e135063eea Mon Sep 17 00:00:00 2001 From: OleS Date: Tue, 23 Dec 2025 15:15:48 +0200 Subject: [PATCH 3/4] Update changelog --- CHANGES.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index e372190d..08a1f11f 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -10,6 +10,8 @@ Use list notation, and following prefixes: - Bugfix - when fixing any major bug - Docs - for any improvement to documentation +### Changes +- Fix: issue with no size found text ### 2.12.21 - Bugfix: Added async Task cancellation to fix concurrency crash From fe9517a208ca5626695bbdce9351c63326601bf0 Mon Sep 17 00:00:00 2001 From: OleS Date: Wed, 31 Dec 2025 00:00:29 +0200 Subject: [PATCH 4/4] Missed file added --- .../Sources/Flutter/VirtusizeFlutter.swift | 9 ++-- .../Tests/VirtusizeServerProductTests.swift | 48 +++++++++++++++++-- 2 files changed, 51 insertions(+), 6 deletions(-) diff --git a/Virtusize/Sources/Flutter/VirtusizeFlutter.swift b/Virtusize/Sources/Flutter/VirtusizeFlutter.swift index ccd993e4..8ccb3263 100644 --- a/Virtusize/Sources/Flutter/VirtusizeFlutter.swift +++ b/Virtusize/Sources/Flutter/VirtusizeFlutter.swift @@ -146,20 +146,23 @@ public class VirtusizeFlutter: Virtusize { let serverProduct = sizeRecData.serverProduct 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 + VirtusizeI18nLocalization.TrimType.MULTIPLELINES, + bodyProfileWillFit ) flutterHandler?.onSizeRecommendationData( externalId: serverProduct.externalId, clientProductImageURL: clientProductImageURL?.absoluteString, storeProduct: serverProduct, bestUserProduct: bestUserProduct, - recommendationText: recommendationText + recommendationText: recommendationText, + willFit: bodyProfileWillFit ) } diff --git a/Virtusize/Tests/VirtusizeServerProductTests.swift b/Virtusize/Tests/VirtusizeServerProductTests.swift index 6c589331..7204441a 100644 --- a/Virtusize/Tests/VirtusizeServerProductTests.swift +++ b/Virtusize/Tests/VirtusizeServerProductTests.swift @@ -179,18 +179,44 @@ class VirtusizeServerProductTests: XCTestCase { oneSizeProduct!.getRecommendationText( i18nLocalization, nil, - bodyProfileRecommendedSizeName + bodyProfileRecommendedSizeName, + VirtusizeI18nLocalization.TrimType.ONELINE, + true ).contains(i18nLocalization.oneSizeWillFitResultText!) ) XCTAssertTrue( oneSizeProduct!.getRecommendationText( i18nLocalization, nil, - bodyProfileRecommendedSizeName + bodyProfileRecommendedSizeName, + VirtusizeI18nLocalization.TrimType.ONELINE, + true ).contains(i18nLocalization.oneSizeWillFitResultText!) ) } + func testGetRecommendationText_oneSizeProduct_bodyProfileRecommendedSizeNotFit_returnOneSizeBodyProfileText() { + let bodyProfileRecommendedSizeName = "Small" + XCTAssertTrue( + oneSizeProduct!.getRecommendationText( + i18nLocalization, + nil, + bodyProfileRecommendedSizeName, + VirtusizeI18nLocalization.TrimType.ONELINE, + false + ).contains(i18nLocalization.willNotFitResultText!) + ) + XCTAssertTrue( + oneSizeProduct!.getRecommendationText( + i18nLocalization, + nil, + bodyProfileRecommendedSizeName, + VirtusizeI18nLocalization.TrimType.ONELINE, + false + ).contains(i18nLocalization.willNotFitResultText!) + ) + } + func testGetRecommendationText_multiSizeProduct_hasSizeComparisonRecommendedSize_returnMultiSizeComparisonText() { let storeProduct1 = TestFixtures.getStoreProduct(productType: 1, gender: nil) var sizeComparisonRecommendedSize = SizeComparisonRecommendedSize() @@ -211,11 +237,27 @@ class VirtusizeServerProductTests: XCTestCase { storeProduct4!.getRecommendationText( i18nLocalization, nil, - bodyProfileRecommendedSizeName + bodyProfileRecommendedSizeName, + VirtusizeI18nLocalization.TrimType.ONELINE, + true ).contains(i18nLocalization.willFitResultText!) ) } + func testGetRecommendationText_multiSizeProduct_bodyProfileRecommendedSizeNotFit_returnMultiSizeBodyProfileText() { + let storeProduct4 = TestFixtures.getStoreProduct(productType: 4, gender: nil) + let bodyProfileRecommendedSizeName = "S" + XCTAssertTrue( + storeProduct4!.getRecommendationText( + i18nLocalization, + nil, + bodyProfileRecommendedSizeName, + VirtusizeI18nLocalization.TrimType.ONELINE, + false + ).contains(i18nLocalization.willNotFitResultText!) + ) + } + func testGetRecommendationText_multiSizeProduct_noRecommendedSizes_returnBodyDataEmptyText() { let storeProduct7 = TestFixtures.getStoreProduct(productType: 7, gender: nil) XCTAssertEqual(