@fast-simon/dashboard-utilities 1.0.166-beta.0 → 1.0.167-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -114,6 +114,13 @@ export interface smartCollectionsResults {
114
114
  query_understanding?: QueryUnderstanding;
115
115
  reformulation_source?: string;
116
116
  request_url?: string;
117
+ rpi_methodology_assigned?: string | null;
118
+ rpi_methodology_effective?: string | null;
119
+ rpi_methodology_fallback_reason?: string | null;
120
+ rpi_snapshot_computed_at?: string | null;
121
+ rpi_snapshot_covered_until?: string | null;
122
+ rpi_candidate_available?: boolean;
123
+ rpi_candidate_unavailable_reason?: string | null;
117
124
  }
118
125
  export type inventoryCallback = ({}: {
119
126
  action: "products inventory";
@@ -1 +1 @@
1
- {"version":3,"file":"categories.js","sourceRoot":"","sources":["../../src/@types/categories.ts"],"names":[],"mappings":"","sourcesContent":["import {SortBy} from \"./sortBy\";\nimport {Narrow, ServerNarrow} from \"./narrow\";\nimport { ServerProduct} from \"./product\";\nimport {ServerFacet} from \"./facets\";\nimport {ContextFilteringData, QueryUnderstanding} from \"./results\";\n\n\nexport type AncestorCategory = [string, string, string] // category_id, category_name, category_url\nexport interface RelatedCategory {\n id: string\n l: string\n t: string\n u: string\n}\nexport type CategoryAncestor = [string, string, string]\nexport interface Category {\n d: string\n id: string\n l: string\n p_id: string\n t: string\n u: string\n parent_name?: string\n}\nexport interface FastCategory {\n d: string\n id: string\n l: string\n p_id: string\n t: string\n u: string\n parent_name?: string\n}\nexport interface smartCollectionsProps {\n storeID: number\n uuid: string\n siteKey?:string\n cdn: number\n categoryID: string,\n userToken: string,\n sessionStart: number,\n page?: number\n productsPerPage?: number\n sortBy?: SortBy\n narrowBy?: ServerNarrow[]\n facetRequired?: FacetRequired\n withAttributes?: boolean\n recent?: string\n rec?: boolean\n searchWithinSearch?: string,\n segments?: string[],\n hasShopifyMarkets?: boolean,\n disable_turbolinks?:boolean\n disable_strategies?:boolean\n disable_merchandising?:boolean\n disable_semantics?:boolean\n disable_merchandising_rules?:boolean\n disable_antonyms?:boolean\n custom_sort_settings?:{personalization_rank: number, creation_date: number, popularity: number, inventory: number}\n with_product_analytics?:boolean\n market_context?: string | null // Region code for market-specific filtering (e.g., \"US\", \"CA\", \"UK\")\n variation_id?: string | null // A/B test variation ID for reasoning/experiment tracking\n ps?: 'new' | 'returning' | null // Personalization segment for user segment coefficient preview (new/returning user)\n spv?: string | null // Session Product Views JSON for personalization preview (e.g., '{\"pid1\":ts,\"pid2\":ts}')\n spc?: string | null // Session Product Cart-adds JSON for size personalization preview (e.g., '{\"pid::vid\":ts}'); collection-only\n personalization?: string | null // Comma-separated personalization types to enable (e.g., 'gender')\n force_and?: boolean\n session_token?: string // Session token override for AI Explainer (sent as st param)\n}\nexport type FacetRequired = 0 | 1 | 2\nexport type smartCollectionsCallback = ({}: {\n action: \"products\" | \"facets and products\"\n payload: smartCollectionsResults\n}) => void\nexport interface smartCollectionsResults {\n ancestors: CategoryAncestor[]\n categoryID: string\n name: string\n category_name: string\n products: ServerProduct[]\n facets?: ServerFacet[]\n totalResults: number\n sortBy?: SortBy,\n narrow?: Narrow[],\n isNoResults?: boolean\n page?: number\n pageCount?: number\n avoidPrefixList?: string[]\n antonyms?: Record<string, number[]>\n merch?: any\n bannerHTML?: string\n turbolink?:string\n hiddenProducts?:ServerProduct[]\n within_search_results_for?:string\n results_for?: string\n id_list?:number[]\n personalized_products?: number[] // Product IDs affected by RPI personalization\n context?: ContextFilteringData // Context-based filtering data (market contexts)\n analytics?: {\n badges?: {\n winners?: Record<string, string> // Product ID -> tooltip message\n overexposed?: Record<string, string> // Product ID -> tooltip message\n new_arrivals?: string[]\n }\n key_hidden_winners?: string\n key_overexposed?: string\n }\n matching_sets?: Record<string, string> // Product ID -> set name\n group_strategy?: Record<string, string> // Product ID -> group name\n variety_strategy?: number[] // Product IDs affected by variety strategy\n query_understanding?: QueryUnderstanding\n reformulation_source?: string\n request_url?: string // Full URL with all params that was executed (for debugging)\n\n}\nexport type inventoryCallback = ({}: {\n action: \"products inventory\"\n payload: {productsInventory: productsInventoryResults[]}\n}) => void\nexport interface productsInventoryResults {\n id: string;\n totalInventory: number;\n}"]}
1
+ {"version":3,"file":"categories.js","sourceRoot":"","sources":["../../src/@types/categories.ts"],"names":[],"mappings":"","sourcesContent":["import {SortBy} from \"./sortBy\";\nimport {Narrow, ServerNarrow} from \"./narrow\";\nimport { ServerProduct} from \"./product\";\nimport {ServerFacet} from \"./facets\";\nimport {ContextFilteringData, QueryUnderstanding} from \"./results\";\n\n\nexport type AncestorCategory = [string, string, string] // category_id, category_name, category_url\nexport interface RelatedCategory {\n id: string\n l: string\n t: string\n u: string\n}\nexport type CategoryAncestor = [string, string, string]\nexport interface Category {\n d: string\n id: string\n l: string\n p_id: string\n t: string\n u: string\n parent_name?: string\n}\nexport interface FastCategory {\n d: string\n id: string\n l: string\n p_id: string\n t: string\n u: string\n parent_name?: string\n}\nexport interface smartCollectionsProps {\n storeID: number\n uuid: string\n siteKey?:string\n cdn: number\n categoryID: string,\n userToken: string,\n sessionStart: number,\n page?: number\n productsPerPage?: number\n sortBy?: SortBy\n narrowBy?: ServerNarrow[]\n facetRequired?: FacetRequired\n withAttributes?: boolean\n recent?: string\n rec?: boolean\n searchWithinSearch?: string,\n segments?: string[],\n hasShopifyMarkets?: boolean,\n disable_turbolinks?:boolean\n disable_strategies?:boolean\n disable_merchandising?:boolean\n disable_semantics?:boolean\n disable_merchandising_rules?:boolean\n disable_antonyms?:boolean\n custom_sort_settings?:{personalization_rank: number, creation_date: number, popularity: number, inventory: number}\n with_product_analytics?:boolean\n market_context?: string | null // Region code for market-specific filtering (e.g., \"US\", \"CA\", \"UK\")\n variation_id?: string | null // A/B test variation ID for reasoning/experiment tracking\n ps?: 'new' | 'returning' | null // Personalization segment for user segment coefficient preview (new/returning user)\n spv?: string | null // Session Product Views JSON for personalization preview (e.g., '{\"pid1\":ts,\"pid2\":ts}')\n spc?: string | null // Session Product Cart-adds JSON for size personalization preview (e.g., '{\"pid::vid\":ts}'); collection-only\n personalization?: string | null // Comma-separated personalization types to enable (e.g., 'gender')\n force_and?: boolean\n session_token?: string // Session token override for AI Explainer (sent as st param)\n}\nexport type FacetRequired = 0 | 1 | 2\nexport type smartCollectionsCallback = ({}: {\n action: \"products\" | \"facets and products\"\n payload: smartCollectionsResults\n}) => void\nexport interface smartCollectionsResults {\n ancestors: CategoryAncestor[]\n categoryID: string\n name: string\n category_name: string\n products: ServerProduct[]\n facets?: ServerFacet[]\n totalResults: number\n sortBy?: SortBy,\n narrow?: Narrow[],\n isNoResults?: boolean\n page?: number\n pageCount?: number\n avoidPrefixList?: string[]\n antonyms?: Record<string, number[]>\n merch?: any\n bannerHTML?: string\n turbolink?:string\n hiddenProducts?:ServerProduct[]\n within_search_results_for?:string\n results_for?: string\n id_list?:number[]\n personalized_products?: number[] // Product IDs affected by RPI personalization\n context?: ContextFilteringData // Context-based filtering data (market contexts)\n analytics?: {\n badges?: {\n winners?: Record<string, string> // Product ID -> tooltip message\n overexposed?: Record<string, string> // Product ID -> tooltip message\n new_arrivals?: string[]\n }\n key_hidden_winners?: string\n key_overexposed?: string\n }\n matching_sets?: Record<string, string> // Product ID -> set name\n group_strategy?: Record<string, string> // Product ID -> group name\n variety_strategy?: number[] // Product IDs affected by variety strategy\n query_understanding?: QueryUnderstanding\n reformulation_source?: string\n request_url?: string // Full URL with all params that was executed (for debugging)\n rpi_methodology_assigned?: string | null\n rpi_methodology_effective?: string | null\n rpi_methodology_fallback_reason?: string | null\n rpi_snapshot_computed_at?: string | null\n rpi_snapshot_covered_until?: string | null\n rpi_candidate_available?: boolean\n rpi_candidate_unavailable_reason?: string | null\n\n}\nexport type inventoryCallback = ({}: {\n action: \"products inventory\"\n payload: {productsInventory: productsInventoryResults[]}\n}) => void\nexport interface productsInventoryResults {\n id: string;\n totalInventory: number;\n}\n"]}
@@ -31,6 +31,14 @@ export interface FilterCoefEntry {
31
31
  pair_index?: number;
32
32
  }
33
33
  export interface ProductPersonalizationCoefficients {
34
+ rpi?: {
35
+ baseline: number;
36
+ coefficient: number;
37
+ final: number;
38
+ global_rpi?: number;
39
+ global_cpi?: number;
40
+ primary?: 'local_rpi' | 'global_rpi' | 'global_cpi';
41
+ };
34
42
  user_segment_coef?: number;
35
43
  sales_speed_coef?: number;
36
44
  size_availability?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"product.js","sourceRoot":"","sources":["../../src/@types/product.ts"],"names":[],"mappings":"AA+DA,MAAM,CAAN,IAAY,eAKX;AALD,WAAY,eAAe;IACvB,6EAAgB,CAAA;IAChB,yFAAsB,CAAA;IACtB,qFAAoB,CAAA;IACpB,mFAAmB,CAAA;AACvB,CAAC,EALW,eAAe,KAAf,eAAe,QAK1B","sourcesContent":["import type {Currency} from \"./currency\";\nimport {PromoTileConfig} from \"./promoTile\";\n\nexport interface ProductAnalytics {\n global_impressions?: string\n context_impressions?: string\n global_cpi?: string\n context_cpi?: string\n global_rpi?: string\n context_rpi?: string\n global_rpi_corrected?: number\n context_rpi_corrected?: number\n global_rpi_cp_lower?: number\n context_rpi_cp_lower?: number\n global_rpi_corrected_cp_lower?: number\n context_rpi_corrected_cp_lower?: number\n beta_alpha_post_local?: number\n beta_beta_post_local?: number\n aov_for_cdf_local?: number\n sales_days?: number[]\n sales_weeks?: number[]\n sales_months?: number[]\n is_hidden_winner?: boolean\n is_overexposed?: boolean\n explanation?: string\n}\n\nexport interface FilterCoefEntry {\n raw: number;\n power?: number;\n effective?: number;\n pair?: string;\n pair_index?: number;\n}\n\nexport interface ProductPersonalizationCoefficients {\n user_segment_coef?: number;\n sales_speed_coef?: number; // sales-speed ranking multiplier (neutral = 1.0; recent purchase rate vs 90-day baseline)\n size_availability?: number; // size-availability ranking multiplier in [0,1] (from cart-adds / spc)\n price_discrimination?: number; // price-band ranking multiplier (p/pi around 1.0, from clicked products)\n price_discrimination_band?: string; // the product's synthetic band label, e.g. \"dresses_3\"\n filter_coefs?: Record<string, FilterCoefEntry | number>;\n}\n\nexport type PillarKind =\n | 'shopper_intent'\n | 'style_affinity'\n | 'collection_standout'\n | 'audience_demand'\n | 'price_discrimination';\n\nexport type PersonalizationConfidence = 'high' | 'medium' | 'low';\n\nexport interface Pillar {\n kind: PillarKind;\n label: string;\n}\n\nexport interface PersonalizationStory {\n confidence: PersonalizationConfidence;\n pillars: Pillar[];\n}\n\nexport enum FeaturedRanking {\n FEATURED_RANK_NO,\n FEATURED_RANK_ON_MATCH,\n FEATURED_RANK_ALWAYS,\n FEATURED_RANK_NEVER,\n}\n\nexport interface ServerProduct {\n c: Currency\n d: string\n f: FeaturedRanking\n id: productID\n iso: boolean\n l: string\n p: string\n p_c: string\n p_max: string\n p_max_c: string\n p_min: string\n p_min_c: string\n p_spl: number\n p_spl_id?: string\n review?: number\n reviews_count?: number\n s: string\n sku: string\n skus: string[]\n t: string\n t2: string\n u: string\n v_c: number\n v: string\n vra: ServerVariant[]\n vrc: object\n att?: Attribute[]\n real_sku?: string\n image_id?: string\n alt?: AlternativeColor[]\n inventory_lvl?: number\n promotile?: boolean\n imageID?: string\n rec_src?: number\n analytics?: ProductAnalytics\n personalization_coefs?: ProductPersonalizationCoefficients\n personalization_story?: PersonalizationStory\n}\n\nexport type ServerVariant = [number, VariantData[]]\nexport type VariantData = [string, string[]]\n\nexport type Attribute = [string, AttributeData[]]\nexport type AttributeData = string[] | string[][]\n\nexport interface ServerAltProductVariant {\n sellable: boolean;\n size: string;\n v_id: number;\n}\n\nexport interface ServerAltProductData {\n l: string;\n p: string;\n p_c: string;\n p_spl: number;\n p_spl_id?: number;\n sku?: string;\n t: string[];\n vra: ServerAltProductVariant[];\n review?: number;\n reviews_count?: number;\n att?: any[];\n s?: string;\n p_min: string;\n p_max: string;\n}\n\nexport type AlternativeColor = [AlternativeColorName, AlternativeColorURL, productID?, ServerAltProductData?]\n\ntype AlternativeColorName = string\ntype AlternativeColorURL = string\ntype productID = number\n\nexport interface Badge {\n tag: string;\n url: string;\n}\n\nexport interface TextBadge {\n badgeText: string;\n tag: string;\n badgeStyle: {\n backgroundColor: string;\n borderColor: string;\n borderRadius: number;\n horizontal: string;\n vertical: string;\n size: number;\n textColor: string;\n }\n}\n\nexport interface Products {\n [id: string]: Product\n}\n\nexport interface Product {\n currency: Currency\n id: string\n title: string\n description: string\n variants: Variants\n isSoldOut: boolean\n price: number\n minPrice: number\n maxPrice: number\n maxCompare: number\n comparePrice: number\n maxFormattedCompare: string;\n reviewScore: number | undefined\n reviewCount: number | undefined\n imageURL: string\n imageURL2: string\n optimizedURL?: string;\n formattedPrice: string\n formattedCompare: string | undefined\n vendor: string\n sku: string\n s: string\n inventory_lvl?: number\n imagesSrcset: string\n productURL: string\n productBadges: Badge[]\n productTextBadges?: TextBadge[]\n alternativeProducts?: AlternativeProduct[]\n tags?: string[]\n promoTileConfig?: PromoTileConfig\n attributes?: Attribute[]\n p_spl?: number\n p_spl_id?: string\n isIspNoPrice?: boolean\n imageID?: string\n vrc?: object\n analytics?: ProductAnalytics\n personalization_coefs?: ProductPersonalizationCoefficients\n personalization_story?: PersonalizationStory\n}\n\nexport interface Variant {\n id: number,\n attributes: {\n [key: string]: VariantsAttribute\n }\n}\n\nexport type Variants = Variant[]\n\nexport type VariantsAttribute = string | number | boolean | string[] | undefined\n\nexport interface AlternativeProduct {\n color: string,\n url: string,\n id: string,\n variants?: Variants,\n s?: string,\n price: number\n comparePrice: number,\n formattedCompare?: string,\n formattedPrice?: string,\n attributes?: Attribute[] | undefined\n}\n\nexport interface ServerPromotile {\n height: number;\n id: string;\n image: string;\n link: string;\n width: number;\n title: string;\n}"]}
1
+ {"version":3,"file":"product.js","sourceRoot":"","sources":["../../src/@types/product.ts"],"names":[],"mappings":"AAuEA,MAAM,CAAN,IAAY,eAKX;AALD,WAAY,eAAe;IACvB,6EAAgB,CAAA;IAChB,yFAAsB,CAAA;IACtB,qFAAoB,CAAA;IACpB,mFAAmB,CAAA;AACvB,CAAC,EALW,eAAe,KAAf,eAAe,QAK1B","sourcesContent":["import type {Currency} from \"./currency\";\nimport {PromoTileConfig} from \"./promoTile\";\n\nexport interface ProductAnalytics {\n global_impressions?: string\n context_impressions?: string\n global_cpi?: string\n context_cpi?: string\n global_rpi?: string\n context_rpi?: string\n global_rpi_corrected?: number\n context_rpi_corrected?: number\n global_rpi_cp_lower?: number\n context_rpi_cp_lower?: number\n global_rpi_corrected_cp_lower?: number\n context_rpi_corrected_cp_lower?: number\n beta_alpha_post_local?: number\n beta_beta_post_local?: number\n aov_for_cdf_local?: number\n sales_days?: number[]\n sales_weeks?: number[]\n sales_months?: number[]\n is_hidden_winner?: boolean\n is_overexposed?: boolean\n explanation?: string\n}\n\nexport interface FilterCoefEntry {\n raw: number;\n power?: number;\n effective?: number;\n pair?: string;\n pair_index?: number;\n}\n\nexport interface ProductPersonalizationCoefficients {\n rpi?: {\n baseline: number;\n coefficient: number;\n final: number;\n global_rpi?: number;\n global_cpi?: number;\n primary?: 'local_rpi' | 'global_rpi' | 'global_cpi';\n };\n user_segment_coef?: number;\n sales_speed_coef?: number; // ranking multiplier (neutral = 1.0; methodology defines its time windows)\n size_availability?: number; // size-availability ranking multiplier in [0,1] (from cart-adds / spc)\n price_discrimination?: number; // price-band ranking multiplier (p/pi around 1.0, from clicked products)\n price_discrimination_band?: string; // the product's synthetic band label, e.g. \"dresses_3\"\n filter_coefs?: Record<string, FilterCoefEntry | number>;\n}\n\nexport type PillarKind =\n | 'shopper_intent'\n | 'style_affinity'\n | 'collection_standout'\n | 'audience_demand'\n | 'price_discrimination';\n\nexport type PersonalizationConfidence = 'high' | 'medium' | 'low';\n\nexport interface Pillar {\n kind: PillarKind;\n label: string;\n}\n\nexport interface PersonalizationStory {\n confidence: PersonalizationConfidence;\n pillars: Pillar[];\n}\n\nexport enum FeaturedRanking {\n FEATURED_RANK_NO,\n FEATURED_RANK_ON_MATCH,\n FEATURED_RANK_ALWAYS,\n FEATURED_RANK_NEVER,\n}\n\nexport interface ServerProduct {\n c: Currency\n d: string\n f: FeaturedRanking\n id: productID\n iso: boolean\n l: string\n p: string\n p_c: string\n p_max: string\n p_max_c: string\n p_min: string\n p_min_c: string\n p_spl: number\n p_spl_id?: string\n review?: number\n reviews_count?: number\n s: string\n sku: string\n skus: string[]\n t: string\n t2: string\n u: string\n v_c: number\n v: string\n vra: ServerVariant[]\n vrc: object\n att?: Attribute[]\n real_sku?: string\n image_id?: string\n alt?: AlternativeColor[]\n inventory_lvl?: number\n promotile?: boolean\n imageID?: string\n rec_src?: number\n analytics?: ProductAnalytics\n personalization_coefs?: ProductPersonalizationCoefficients\n personalization_story?: PersonalizationStory\n}\n\nexport type ServerVariant = [number, VariantData[]]\nexport type VariantData = [string, string[]]\n\nexport type Attribute = [string, AttributeData[]]\nexport type AttributeData = string[] | string[][]\n\nexport interface ServerAltProductVariant {\n sellable: boolean;\n size: string;\n v_id: number;\n}\n\nexport interface ServerAltProductData {\n l: string;\n p: string;\n p_c: string;\n p_spl: number;\n p_spl_id?: number;\n sku?: string;\n t: string[];\n vra: ServerAltProductVariant[];\n review?: number;\n reviews_count?: number;\n att?: any[];\n s?: string;\n p_min: string;\n p_max: string;\n}\n\nexport type AlternativeColor = [AlternativeColorName, AlternativeColorURL, productID?, ServerAltProductData?]\n\ntype AlternativeColorName = string\ntype AlternativeColorURL = string\ntype productID = number\n\nexport interface Badge {\n tag: string;\n url: string;\n}\n\nexport interface TextBadge {\n badgeText: string;\n tag: string;\n badgeStyle: {\n backgroundColor: string;\n borderColor: string;\n borderRadius: number;\n horizontal: string;\n vertical: string;\n size: number;\n textColor: string;\n }\n}\n\nexport interface Products {\n [id: string]: Product\n}\n\nexport interface Product {\n currency: Currency\n id: string\n title: string\n description: string\n variants: Variants\n isSoldOut: boolean\n price: number\n minPrice: number\n maxPrice: number\n maxCompare: number\n comparePrice: number\n maxFormattedCompare: string;\n reviewScore: number | undefined\n reviewCount: number | undefined\n imageURL: string\n imageURL2: string\n optimizedURL?: string;\n formattedPrice: string\n formattedCompare: string | undefined\n vendor: string\n sku: string\n s: string\n inventory_lvl?: number\n imagesSrcset: string\n productURL: string\n productBadges: Badge[]\n productTextBadges?: TextBadge[]\n alternativeProducts?: AlternativeProduct[]\n tags?: string[]\n promoTileConfig?: PromoTileConfig\n attributes?: Attribute[]\n p_spl?: number\n p_spl_id?: string\n isIspNoPrice?: boolean\n imageID?: string\n vrc?: object\n analytics?: ProductAnalytics\n personalization_coefs?: ProductPersonalizationCoefficients\n personalization_story?: PersonalizationStory\n}\n\nexport interface Variant {\n id: number,\n attributes: {\n [key: string]: VariantsAttribute\n }\n}\n\nexport type Variants = Variant[]\n\nexport type VariantsAttribute = string | number | boolean | string[] | undefined\n\nexport interface AlternativeProduct {\n color: string,\n url: string,\n id: string,\n variants?: Variants,\n s?: string,\n price: number\n comparePrice: number,\n formattedCompare?: string,\n formattedPrice?: string,\n attributes?: Attribute[] | undefined\n}\n\nexport interface ServerPromotile {\n height: number;\n id: string;\n image: string;\n link: string;\n width: number;\n title: string;\n}\n"]}
@@ -150,5 +150,12 @@ export interface FullTextServerResponseAll extends fullTextSearchResponse {
150
150
  query_understanding?: QueryUnderstanding;
151
151
  reformulation_source?: string;
152
152
  request_url?: string;
153
+ rpi_methodology_assigned?: string | null;
154
+ rpi_methodology_effective?: string | null;
155
+ rpi_methodology_fallback_reason?: string | null;
156
+ rpi_snapshot_computed_at?: string | null;
157
+ rpi_snapshot_covered_until?: string | null;
158
+ rpi_candidate_available?: boolean;
159
+ rpi_candidate_unavailable_reason?: string | null;
153
160
  }
154
161
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"results.js","sourceRoot":"","sources":["../../src/@types/results.ts"],"names":[],"mappings":"","sourcesContent":["import type {Narrow, ServerNarrow} from \"./narrow\";\nimport type {SortBy} from \"./sortBy\";\n\nimport type { Facet} from \"./facets\";\nimport {AncestorCategory, RelatedCategory} from \"./categories\";\n\nimport {Product, ServerProduct} from \"./product\";\n\nexport interface PopularSearch {\n label: string\n type: \"p\"\n}\ninterface Base {\n narrow: Narrow,\n sortBy: SortBy,\n totalResults: number,\n page: number,\n totalPages: number,\n products: Product[],\n facets: Facet[],\n avoidTagPrefixes: string[],\n sort: SortBy,\n productIDS: string[],\n bannerHTML: string,\n bannerHTMLMobile: string,\n // ancestors: Ancestor[]\n}\n\nexport interface SearchResults extends Base {\n query: string,\n totalCMS: number,\n didYouMean?: string[],\n personalizedProductIds: number[],\n sessionProductIds: number[],\n resultsFor?: string,\n isRelatedResults?: boolean\n relatedSearch?: string[]\n}\n\nexport interface CategoryResults extends Base {\n categoryID: string,\n categoryName: string,\n personalizationRecencyLimit?: number,\n personalizedProductIds: number[],\n sessionProductIds: number[],\n relatedCategories: RelatedCategory[],\n}\n\nexport interface LandingPageResults extends Base {\n lpSlug: string,\n title: string,\n indexPage: number\n}\n\nexport type FacetRequired = 0 | 1 | 2\nexport type CategoryAncestor = [string, string, string]\n\nexport interface fullTextSearchProps {\n term: string\n storeID: number\n siteKey?:string\n uuid: string\n cdn?: number\n userToken: string,\n sessionStart: number,\n page?: number\n productsPerPage?: number\n sortBy?: SortBy\n narrowBy?: ServerNarrow[]\n facetRequired?: FacetRequired\n withAttributes?: boolean\n recent?: string\n searchWithinSearch?: string,\n segments?: string[]\n hasShopifyMarkets?: boolean\n disable_turbolinks?:boolean\n disable_strategies?:boolean\n disable_merchandising?:boolean\n disable_semantics?:boolean\n disable_merchandising_rules?:boolean\n disable_antonyms?:boolean\n custom_sort_settings?:{personalization_rank: number, creation_date: number, popularity: number, inventory: number}\n with_product_analytics?:boolean\n market_context?: string | null // Region code for market-specific filtering (e.g., \"US\", \"CA\", \"UK\")\n variation_id?: string | null // A/B test variation ID for reasoning/experiment tracking\n force_and?: boolean\n ps?: 'new' | 'returning' | null // Personalization segment for user segment coefficient preview (new/returning user)\n spv?: string | null // Session Product Views JSON for personalization preview (e.g., '{\"pid1\":ts,\"pid2\":ts}')\n personalization?: string | null // Comma-separated personalization types to enable (e.g., 'gender')\n session_token?: string // Session token override for AI Explainer (sent as st param)\n}\nexport interface ContextFilteringData {\n hidden: number[] // Product IDs hidden by context filtering\n unpublished: Record<number, string> // product_id -> region_code (e.g., \"US\", \"CA\")\n unsellable: Record<number, string> // product_id -> region_code (e.g., \"UK\", \"FR\")\n}\n\nexport interface fullTextSearchResponse {\n products: ServerProduct[]\n facets: Facet[]\n total_results: number\n facets_completed?: boolean\n sortBy?: SortBy,\n narrow: [string, string, string][]\n pop_products_no_results?: boolean\n page: number\n total_p: number\n personalized_products?: number[],\n ancestor_categories?: CategoryAncestor[]\n avoid_tag_prefixes?: string\n merch?: any\n}\nexport interface QueryUnderstanding {\n query: string\n has_ai_enrichment: boolean\n structured_attributes: Record<string, string[]>\n social_attributes: Record<string, string[]>\n intent_mapping: string[]\n}\n\nexport interface FullTextServerResponseAll extends fullTextSearchResponse{\n alternatives?: string[]\n term: string\n cms_number_found?: number\n within_search_results_for?: string\n banner_html: string\n banner_html_mobile: string\n turbolink?: string\n personalized_products?: number[]\n session_products?: number[]\n results_for?: string\n related_results?: boolean,\n ancestor_categories?: AncestorCategory[],\n related_search?: string[],\n hidden?:any,\n isNoResults?:any,\n totalResults?:any,\n hiddenProducts?:ServerProduct[],\n pageCount?:number,\n sort_by?: SortBy,\n id_list?:number[]\n antonyms?: Record<string, number[]>\n context?: ContextFilteringData // Context-based filtering data (market contexts)\n analytics?: {\n badges?: {\n winners?: Record<string, string> // Product ID -> tooltip message\n overexposed?: Record<string, string> // Product ID -> tooltip message\n new_arrivals?: string[]\n }\n key_hidden_winners?: string\n key_overexposed?: string\n }\n matching_sets?: Record<string, string> // Product ID -> set name\n group_strategy?: Record<string, string> // Product ID -> group name\n variety_strategy?: number[] // Product IDs affected by variety strategy\n query_understanding?: QueryUnderstanding\n reformulation_source?: string\n request_url?: string // Full URL with all params that was executed (for debugging)\n\n}"]}
1
+ {"version":3,"file":"results.js","sourceRoot":"","sources":["../../src/@types/results.ts"],"names":[],"mappings":"","sourcesContent":["import type {Narrow, ServerNarrow} from \"./narrow\";\nimport type {SortBy} from \"./sortBy\";\n\nimport type { Facet} from \"./facets\";\nimport {AncestorCategory, RelatedCategory} from \"./categories\";\n\nimport {Product, ServerProduct} from \"./product\";\n\nexport interface PopularSearch {\n label: string\n type: \"p\"\n}\ninterface Base {\n narrow: Narrow,\n sortBy: SortBy,\n totalResults: number,\n page: number,\n totalPages: number,\n products: Product[],\n facets: Facet[],\n avoidTagPrefixes: string[],\n sort: SortBy,\n productIDS: string[],\n bannerHTML: string,\n bannerHTMLMobile: string,\n // ancestors: Ancestor[]\n}\n\nexport interface SearchResults extends Base {\n query: string,\n totalCMS: number,\n didYouMean?: string[],\n personalizedProductIds: number[],\n sessionProductIds: number[],\n resultsFor?: string,\n isRelatedResults?: boolean\n relatedSearch?: string[]\n}\n\nexport interface CategoryResults extends Base {\n categoryID: string,\n categoryName: string,\n personalizationRecencyLimit?: number,\n personalizedProductIds: number[],\n sessionProductIds: number[],\n relatedCategories: RelatedCategory[],\n}\n\nexport interface LandingPageResults extends Base {\n lpSlug: string,\n title: string,\n indexPage: number\n}\n\nexport type FacetRequired = 0 | 1 | 2\nexport type CategoryAncestor = [string, string, string]\n\nexport interface fullTextSearchProps {\n term: string\n storeID: number\n siteKey?:string\n uuid: string\n cdn?: number\n userToken: string,\n sessionStart: number,\n page?: number\n productsPerPage?: number\n sortBy?: SortBy\n narrowBy?: ServerNarrow[]\n facetRequired?: FacetRequired\n withAttributes?: boolean\n recent?: string\n searchWithinSearch?: string,\n segments?: string[]\n hasShopifyMarkets?: boolean\n disable_turbolinks?:boolean\n disable_strategies?:boolean\n disable_merchandising?:boolean\n disable_semantics?:boolean\n disable_merchandising_rules?:boolean\n disable_antonyms?:boolean\n custom_sort_settings?:{personalization_rank: number, creation_date: number, popularity: number, inventory: number}\n with_product_analytics?:boolean\n market_context?: string | null // Region code for market-specific filtering (e.g., \"US\", \"CA\", \"UK\")\n variation_id?: string | null // A/B test variation ID for reasoning/experiment tracking\n force_and?: boolean\n ps?: 'new' | 'returning' | null // Personalization segment for user segment coefficient preview (new/returning user)\n spv?: string | null // Session Product Views JSON for personalization preview (e.g., '{\"pid1\":ts,\"pid2\":ts}')\n personalization?: string | null // Comma-separated personalization types to enable (e.g., 'gender')\n session_token?: string // Session token override for AI Explainer (sent as st param)\n}\nexport interface ContextFilteringData {\n hidden: number[] // Product IDs hidden by context filtering\n unpublished: Record<number, string> // product_id -> region_code (e.g., \"US\", \"CA\")\n unsellable: Record<number, string> // product_id -> region_code (e.g., \"UK\", \"FR\")\n}\n\nexport interface fullTextSearchResponse {\n products: ServerProduct[]\n facets: Facet[]\n total_results: number\n facets_completed?: boolean\n sortBy?: SortBy,\n narrow: [string, string, string][]\n pop_products_no_results?: boolean\n page: number\n total_p: number\n personalized_products?: number[],\n ancestor_categories?: CategoryAncestor[]\n avoid_tag_prefixes?: string\n merch?: any\n}\nexport interface QueryUnderstanding {\n query: string\n has_ai_enrichment: boolean\n structured_attributes: Record<string, string[]>\n social_attributes: Record<string, string[]>\n intent_mapping: string[]\n}\n\nexport interface FullTextServerResponseAll extends fullTextSearchResponse{\n alternatives?: string[]\n term: string\n cms_number_found?: number\n within_search_results_for?: string\n banner_html: string\n banner_html_mobile: string\n turbolink?: string\n personalized_products?: number[]\n session_products?: number[]\n results_for?: string\n related_results?: boolean,\n ancestor_categories?: AncestorCategory[],\n related_search?: string[],\n hidden?:any,\n isNoResults?:any,\n totalResults?:any,\n hiddenProducts?:ServerProduct[],\n pageCount?:number,\n sort_by?: SortBy,\n id_list?:number[]\n antonyms?: Record<string, number[]>\n context?: ContextFilteringData // Context-based filtering data (market contexts)\n analytics?: {\n badges?: {\n winners?: Record<string, string> // Product ID -> tooltip message\n overexposed?: Record<string, string> // Product ID -> tooltip message\n new_arrivals?: string[]\n }\n key_hidden_winners?: string\n key_overexposed?: string\n }\n matching_sets?: Record<string, string> // Product ID -> set name\n group_strategy?: Record<string, string> // Product ID -> group name\n variety_strategy?: number[] // Product IDs affected by variety strategy\n query_understanding?: QueryUnderstanding\n reformulation_source?: string\n request_url?: string // Full URL with all params that was executed (for debugging)\n rpi_methodology_assigned?: string | null\n rpi_methodology_effective?: string | null\n rpi_methodology_fallback_reason?: string | null\n rpi_snapshot_computed_at?: string | null\n rpi_snapshot_covered_until?: string | null\n rpi_candidate_available?: boolean\n rpi_candidate_unavailable_reason?: string | null\n\n}\n"]}
@@ -39,5 +39,11 @@ export interface MainTheme {
39
39
  errorRed: string;
40
40
  loadingYellow: string;
41
41
  }
42
+ export declare function analyticsMatchesRankingSnapshot(analyticsPayload: {
43
+ responseRpiMethodologyEffective?: string | null;
44
+ responseRpiSnapshotComputedAt?: string | null;
45
+ }, rankingResponse: any): boolean;
46
+ /** Attach response-level reasoning maps before items are renamed to products. */
47
+ export declare function attachPersonalizationToItems(response: any): void;
42
48
  declare const _default: React.NamedExoticComponent<Props>;
43
49
  export default _default;
@@ -49,8 +49,43 @@ function buildAnalyticsPayload(analyticsResponse, productAnalyticsMap) {
49
49
  variety_strategy: analyticsResponse.variety_strategy,
50
50
  productAnalyticsMap,
51
51
  personalizationStoryMap: analyticsResponse.personalization_story || {},
52
+ // Private race-guard fields: reducer ignores them. Ranking metadata and coefficients must
53
+ // always stay those of the fast response that produced the displayed order.
54
+ responseRpiMethodologyEffective: analyticsResponse.rpi_methodology_effective,
55
+ responseRpiSnapshotComputedAt: analyticsResponse.rpi_snapshot_computed_at,
52
56
  };
53
57
  }
58
+ const PRESENTATION_RPI_METHODOLOGY = 'presentation10_v2';
59
+ export function analyticsMatchesRankingSnapshot(analyticsPayload, rankingResponse) {
60
+ const analyticsIsCandidate = analyticsPayload.responseRpiMethodologyEffective
61
+ === PRESENTATION_RPI_METHODOLOGY;
62
+ const rankingIsCandidate = (rankingResponse === null || rankingResponse === void 0 ? void 0 : rankingResponse.rpi_methodology_effective)
63
+ === PRESENTATION_RPI_METHODOLOGY;
64
+ if (!analyticsIsCandidate && !rankingIsCandidate)
65
+ return true;
66
+ const analyticsSnapshot = analyticsPayload.responseRpiSnapshotComputedAt;
67
+ const rankingSnapshot = rankingResponse === null || rankingResponse === void 0 ? void 0 : rankingResponse.rpi_snapshot_computed_at;
68
+ return analyticsIsCandidate
69
+ && rankingIsCandidate
70
+ && Boolean(analyticsSnapshot)
71
+ && analyticsSnapshot === rankingSnapshot;
72
+ }
73
+ /** Attach response-level reasoning maps before items are renamed to products. */
74
+ export function attachPersonalizationToItems(response) {
75
+ const coefficients = response === null || response === void 0 ? void 0 : response.personalization_coefficients;
76
+ const stories = response === null || response === void 0 ? void 0 : response.personalization_story;
77
+ if ((!coefficients && !stories) || !Array.isArray(response === null || response === void 0 ? void 0 : response.items))
78
+ return;
79
+ for (const item of response.items) {
80
+ if (!item || item.promotile)
81
+ continue;
82
+ const productId = String(item.id);
83
+ if (coefficients === null || coefficients === void 0 ? void 0 : coefficients[productId])
84
+ item.personalization_coefs = coefficients[productId];
85
+ if (stories === null || stories === void 0 ? void 0 : stories[productId])
86
+ item.personalization_story = stories[productId];
87
+ }
88
+ }
54
89
  const FastSimonApi = (_a) => {
55
90
  var _b;
56
91
  var { storeID, uuid, siteKey, children, defaultSort, promoTiles = false, theme, withProductAttributes = false, isInfiniteScroll = false, getTitle, useFilters, noReport = false, customTitleChange, isEnterpriseMerchandising = false, subscription = 0, marketContext = null, forceProductAnalytics = false, variationId = null, customSortSettingsTransform } = _a, props = __rest(_a, ["storeID", "uuid", "siteKey", "children", "defaultSort", "promoTiles", "theme", "withProductAttributes", "isInfiniteScroll", "getTitle", "useFilters", "noReport", "customTitleChange", "isEnterpriseMerchandising", "subscription", "marketContext", "forceProductAnalytics", "variationId", "customSortSettingsTransform"]);
@@ -443,6 +478,7 @@ const FastSimonApi = (_a) => {
443
478
  // Increment staleness counter and clear pending analytics
444
479
  const requestId = ++searchRequestCounterRef.current;
445
480
  pendingAnalyticsRef.current = null;
481
+ let fastRankingResponse = null;
446
482
  const commonRequestParams = Object.assign(Object.assign({}, props), { withAttributes: promoTiles || withProductAttributes, market_context: marketContext, variation_id: state.variation_id, force_and: state.force_and, ps: personalizationSegment, spv: personalizationParams.spv, personalization: personalizationParams.personalization, session_token: state.session_token });
447
483
  // Fire analytics request in parallel (fire-and-forget) — only if analytics needed
448
484
  if (shouldFetchAnalytics) {
@@ -463,6 +499,12 @@ const FastSimonApi = (_a) => {
463
499
  }
464
500
  }
465
501
  const payload = buildAnalyticsPayload(analyticsResponse, productAnalyticsMap);
502
+ if (fastRankingResponse
503
+ && !analyticsMatchesRankingSnapshot(payload, fastRankingResponse)) {
504
+ pendingAnalyticsRef.current = null;
505
+ console.warn('[Analytics] Discarded search analytics from a different RPI snapshot.');
506
+ return;
507
+ }
466
508
  pendingAnalyticsRef.current = payload;
467
509
  dispatchMergeAnalytics(payload);
468
510
  }).catch(err => {
@@ -471,6 +513,8 @@ const FastSimonApi = (_a) => {
471
513
  }
472
514
  // Fire fast request WITHOUT analytics
473
515
  FullTextSearch.getReasoningFullTextSearch(Object.assign(Object.assign({}, commonRequestParams), { with_product_analytics: false })).then((response) => __awaiter(void 0, void 0, void 0, function* () {
516
+ fastRankingResponse = response;
517
+ attachPersonalizationToItems(response);
474
518
  // Don't preserve stale analytics when fetching fresh ones
475
519
  const existingAnalytics = shouldFetchAnalytics ? undefined : results === null || results === void 0 ? void 0 : results.analytics;
476
520
  const existingMatchingSets = shouldFetchAnalytics ? undefined : results === null || results === void 0 ? void 0 : results.matching_sets;
@@ -494,7 +538,13 @@ const FastSimonApi = (_a) => {
494
538
  setIsLoading({ products: false, filters: true });
495
539
  // If analytics arrived before fast response, re-apply to new results
496
540
  if (pendingAnalyticsRef.current && searchRequestCounterRef.current === requestId) {
497
- dispatchMergeAnalytics(pendingAnalyticsRef.current);
541
+ if (analyticsMatchesRankingSnapshot(pendingAnalyticsRef.current, response)) {
542
+ dispatchMergeAnalytics(pendingAnalyticsRef.current);
543
+ }
544
+ else {
545
+ pendingAnalyticsRef.current = null;
546
+ console.warn('[Analytics] Discarded search analytics from a different RPI snapshot.');
547
+ }
498
548
  }
499
549
  // Fire IDs + facets in parallel (previously sequential)
500
550
  const listIdRequestProps = Object.assign({}, props);
@@ -597,6 +647,7 @@ const FastSimonApi = (_a) => {
597
647
  // Increment staleness counter and clear pending analytics
598
648
  const requestId = ++searchRequestCounterRef.current;
599
649
  pendingAnalyticsRef.current = null;
650
+ let fastRankingResponse = null;
600
651
  const commonRequestParams = Object.assign(Object.assign({}, props), { withAttributes: promoTiles || withProductAttributes, market_context: marketContext, variation_id: state.variation_id, ps: personalizationSegment, spv: personalizationParams.spv, spc: personalizationParams.spc, personalization: personalizationParams.personalization, force_and: state.force_and, session_token: state.session_token });
601
652
  // Fire analytics request in parallel (fire-and-forget) — only if analytics needed
602
653
  if (shouldFetchAnalytics) {
@@ -617,6 +668,12 @@ const FastSimonApi = (_a) => {
617
668
  }
618
669
  }
619
670
  const payload = buildAnalyticsPayload(analyticsResponse, productAnalyticsMap);
671
+ if (fastRankingResponse
672
+ && !analyticsMatchesRankingSnapshot(payload, fastRankingResponse)) {
673
+ pendingAnalyticsRef.current = null;
674
+ console.warn('[Analytics] Discarded collection analytics from a different RPI snapshot.');
675
+ return;
676
+ }
620
677
  pendingAnalyticsRef.current = payload;
621
678
  dispatchMergeAnalytics(payload);
622
679
  }).catch(err => {
@@ -625,20 +682,8 @@ const FastSimonApi = (_a) => {
625
682
  }
626
683
  // Fire fast request WITHOUT analytics
627
684
  SmartCollections.getSmartCollections(Object.assign(Object.assign({}, commonRequestParams), { with_product_analytics: false })).then((response) => __awaiter(void 0, void 0, void 0, function* () {
628
- // Attach personalization coefficients + story to each product item (updates every navigation)
629
- const coefs = response.personalization_coefficients;
630
- const stories = response.personalization_story;
631
- if ((coefs || stories) && response.items) {
632
- for (const item of response.items) {
633
- if (!item || item.promotile)
634
- continue;
635
- const pid = String(item.id);
636
- if (coefs === null || coefs === void 0 ? void 0 : coefs[pid])
637
- item.personalization_coefs = coefs[pid];
638
- if (stories === null || stories === void 0 ? void 0 : stories[pid])
639
- item.personalization_story = stories[pid];
640
- }
641
- }
685
+ fastRankingResponse = response;
686
+ attachPersonalizationToItems(response);
642
687
  // Don't preserve stale analytics when fetching fresh ones
643
688
  const existingAnalytics = shouldFetchAnalytics ? undefined : results === null || results === void 0 ? void 0 : results.analytics;
644
689
  const existingMatchingSets = shouldFetchAnalytics ? undefined : results === null || results === void 0 ? void 0 : results.matching_sets;
@@ -650,7 +695,13 @@ const FastSimonApi = (_a) => {
650
695
  setIsLoading({ products: false, filters: true });
651
696
  // If analytics arrived before fast response, re-apply to new results
652
697
  if (pendingAnalyticsRef.current && searchRequestCounterRef.current === requestId) {
653
- dispatchMergeAnalytics(pendingAnalyticsRef.current);
698
+ if (analyticsMatchesRankingSnapshot(pendingAnalyticsRef.current, response)) {
699
+ dispatchMergeAnalytics(pendingAnalyticsRef.current);
700
+ }
701
+ else {
702
+ pendingAnalyticsRef.current = null;
703
+ console.warn('[Analytics] Discarded collection analytics from a different RPI snapshot.');
704
+ }
654
705
  }
655
706
  // Fire IDs + facets in parallel (previously sequential)
656
707
  const listIdRequestProps = Object.assign({}, props);
@@ -1 +1 @@
1
- {"version":3,"file":"FastSimonApi.js","sourceRoot":"","sources":["../../../src/components/FastSimonApi/FastSimonApi.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, {useEffect, useReducer, useRef, useState, useMemo, useCallback} from \"react\";\nimport {ComparisonData, ProductRankChange, CustomSortSettings, FastState, FastStateFunctions, IsLoading, SetStateProps} from \"./context\";\nimport {ThemeProvider} from \"react-jss\";\nimport {fastStateReducer} from \"./reducer\";\nimport {newObject} from \"../common\";\n\nimport {SortBy} from \"../../@types/sortBy\";\nimport {fullTextSearchProps, FullTextServerResponseAll} from \"../../@types/results\";\nimport {getShowSalesAnalyticsSetting} from \"../../utils/getSalesAnalyticsSettings\";\nimport {getLSVectorSearchOn} from \"../../utils/getLSVectorSearch\";\nimport {getPersonalizationSegment, UserSegmentPreview} from \"../../utils/userSegmentPreview\";\nimport {buildPersonalizationParams, PersonalizationPreviewSettings} from \"../../utils/personalizationPreview\";\n\nimport {PersonalizationStory, Product, ProductAnalytics} from \"../../@types/product\";\nimport {FastCategory, smartCollectionsProps, smartCollectionsResults} from \"../../@types/categories\";\nimport {Narrow, ServerNarrow} from \"../../@types/narrow\";\nimport {FullTextSearch} from \"../../services/search\";\nimport {SmartCollections} from \"../../services/smartCollections\";\nimport {autocompleteProps, AutocompleteReasoningResponse} from \"../../@types/autocomplete\";\nimport {Autocomplete} from \"../../services/autocomplete\";\n\nexport type AppType = \"SPA\" | \"MPA\";\n\ninterface Props {\n storeID: number;\n uuid: string;\n type?: AppType;\n onReady?: VoidFunction;\n cartToken?: string;\n defaultSort?: SortBy\n collectionID?: string\n withProductAttributes?: boolean\n promoTiles?: boolean\n getTitle?: ({}: { categoryID?: string, query?: string }) => string\n isInfiniteScroll?: boolean\n useFilters?: boolean\n noReport?: boolean\n customTitleChange?: (results?: FullTextServerResponseAll | smartCollectionsResults) => void\n theme?: Partial<MainTheme>\n children?: React.ReactNode;\n siteKey?:string\n isEnterpriseMerchandising?: boolean;\n subscription?: number;\n marketContext?: string | null; // Region code for market-specific product filtering (e.g., \"US\", \"CA\", \"UK\")\n forceProductAnalytics?: boolean; // When true, always pass with_product_analytics regardless of other conditions\n variationId?: string | null; // A/B test variation ID for reasoning/experiment tracking\n customSortSettingsTransform?: (settings: CustomSortSettings | undefined, isCollection: boolean) => CustomSortSettings | null | undefined;\n}\n\nexport interface MainTheme {\n primaryColor: string\n lighterPrimary: string\n successGreen: string\n errorRed: string\n loadingYellow: string,\n}\n\nconst mainTheme: MainTheme = {\n primaryColor: \"#1976d2\",\n lighterPrimary: \"rgba(25,118,210,0.71)\",\n successGreen: \"#4BB543\",\n errorRed: \"#ff0033\",\n loadingYellow: \"#f3b706\",\n}\n\n// Analytics-enabled responses (with_product_analytics=true) carry personalization_story with\n// momentum pillars populated. This helper centralises payload construction for both the\n// search and collection analytics callbacks.\nfunction buildAnalyticsPayload(\n analyticsResponse: any,\n productAnalyticsMap: Record<string, ProductAnalytics>\n): {\n analytics: any;\n matching_sets: any;\n group_strategy: any;\n variety_strategy: any;\n productAnalyticsMap: Record<string, ProductAnalytics>;\n personalizationStoryMap: Record<string, PersonalizationStory>;\n} {\n return {\n analytics: analyticsResponse.analytics,\n matching_sets: analyticsResponse.matching_sets,\n group_strategy: analyticsResponse.group_strategy,\n variety_strategy: analyticsResponse.variety_strategy,\n productAnalyticsMap,\n personalizationStoryMap: analyticsResponse.personalization_story || {},\n };\n}\n\n\nconst FastSimonApi: React.FC<Props> = ({\n storeID, uuid,siteKey, children,\n defaultSort , promoTiles = false, theme,\n withProductAttributes = false, isInfiniteScroll = false, getTitle,\n useFilters, noReport = false, customTitleChange,\n isEnterpriseMerchandising = false, subscription = 0,\n marketContext = null,\n forceProductAnalytics = false,\n variationId = null,\n customSortSettingsTransform,\n ...props\n }) => {\n const [state, dispatch] = (useReducer as any)?.(fastStateReducer, {\n isReady: false,\n type: props.type ?? 'SPA',\n page: 1,\n query: '',\n sortBy: defaultSort,\n isLoading: {\n products: false,\n filters: false,\n },\n collectionID: props.collectionID,\n narrow: undefined,\n results: undefined,\n recommendations: {},\n singleProducts: {},\n searchWithinSearch: \"\",\n segments: undefined,\n flag:[],\n custom_sort_settings:undefined,\n isAutocomplete:false,\n variation_id: variationId, // Initialize from prop, then updated via setVariationId\n force_and: false,\n user_segment_preview: 'none' as UserSegmentPreview, // User segment preview mode for AI Explainer\n personalization_preview: null as PersonalizationPreviewSettings | null,\n session_token: undefined as string | undefined,\n // Compare Mode state\n comparisonData: null,\n isComparing: false\n });\n\n // Ref for user_segment_preview: enables synchronous reads across closures\n // so that any fetch triggered in the same handler (e.g. setCustomSort) reads the latest value\n const userSegmentPreviewRef = useRef<UserSegmentPreview>(state.user_segment_preview);\n userSegmentPreviewRef.current = state.user_segment_preview;\n\n // Ref for custom_sort_settings: ensures stale setQuery/setCollectionID/etc. closures\n // always read the latest value even when called from memoized components.\n const customSortSettingsRef = useRef<CustomSortSettings | null | undefined>(state.custom_sort_settings);\n customSortSettingsRef.current = state.custom_sort_settings;\n // Typed read for fetchParams — null is stripped to undefined here; fetchResults reads\n // the raw ref (.current) so it can still distinguish null (\"cleared\") from undefined (\"not set\").\n const currentCustomSort = (): CustomSortSettings | undefined => {\n const v = customSortSettingsRef.current;\n return v === null ? undefined : v;\n };\n\n // Ref for personalization_preview: enables synchronous reads across closures\n const personalizationPreviewRef = useRef<PersonalizationPreviewSettings | null>(state.personalization_preview);\n personalizationPreviewRef.current = state.personalization_preview;\n\n // Staleness counter for parallel analytics requests — incremented at start of each onSearch/onCollection\n // Analytics responses check this to discard stale data from superseded queries\n const searchRequestCounterRef = useRef(0);\n\n // Pending analytics payload — stores analytics if it arrives before the fast response (race condition handling)\n const pendingAnalyticsRef = useRef<{\n analytics?: FullTextServerResponseAll['analytics'];\n matching_sets?: Record<string, string>;\n group_strategy?: Record<string, string>;\n variety_strategy?: number[];\n productAnalyticsMap?: Record<string, ProductAnalytics>;\n personalizationStoryMap?: Record<string, PersonalizationStory>;\n } | null>(null);\n\n const [categories, setCategories] = useState<FastCategory[]>([]);\n const [analyticsFetched, setAnalyticsFetched] = useState(false);\n const [lastAnalyticsQuery, setLastAnalyticsQuery] = useState<string>('');\n const [lastAnalyticsCollection, setLastAnalyticsCollection] = useState<string>('');\n const [lastAnalyticsMode, setLastAnalyticsMode] = useState<'search' | 'collection' | ''>('');\n\n // Only enable analytics for enterprise merchants or subscription level 5\n const isAnalyticsEnabled = isEnterpriseMerchandising || subscription === 5;\n\n const {results, isLoading, query, sortBy, type, collectionID, page, narrow, recommendations, singleProducts, isReady, autocomplete, segments,isAutocomplete\n\n } = state;\n\n function setResults(results: FullTextServerResponseAll | smartCollectionsResults | AutocompleteReasoningResponse | undefined) {\n (dispatch as any)?.({type: 'setResults', payload: results});\n }\n\n function mergeResults(results: FullTextServerResponseAll | smartCollectionsResults | AutocompleteReasoningResponse, infiniteScroll: boolean) {\n (dispatch as any)?.({type: 'mergeResults', payload: {results, infiniteScroll}});\n }\n function mergeFacetsWithResults(facets:Narrow[]) {\n (dispatch as any)?.({type: 'mergeFacetsWithResults', payload: facets});\n }\n\n function mergeResultsKeepProduct(results: FullTextServerResponseAll | smartCollectionsResults) {\n (dispatch as any)?.({type: 'mergeResultsKeepProduct', payload: {results}});\n }\n\n function dispatchMergeAnalytics(payload: {\n analytics?: FullTextServerResponseAll['analytics'];\n matching_sets?: Record<string, string>;\n group_strategy?: Record<string, string>;\n variety_strategy?: number[];\n productAnalyticsMap?: Record<string, ProductAnalytics>;\n personalizationStoryMap?: Record<string, PersonalizationStory>;\n }) {\n (dispatch as any)?.({type: 'mergeAnalyticsData', payload});\n }\n\n function setIsLoading(isLoading: IsLoading) {\n (dispatch as any)?.({type: 'setIsLoading', payload: isLoading});\n }\n\n function setIsAutocomplete(isAutocomplete:boolean)\n {\n (dispatch as any)?.({type: 'setIsAutocomplete', payload: isAutocomplete});\n }\n\n function setVariationId(variationId: string | null) {\n (dispatch as any)?.({type: 'setVariationId', payload: variationId});\n }\n\n function setComparisonData(comparisonData: ComparisonData | null) {\n (dispatch as any)?.({type: 'setComparisonData', payload: comparisonData});\n }\n\n function setIsComparing(isComparing: boolean) {\n (dispatch as any)?.({type: 'setIsComparing', payload: isComparing});\n }\n\n function setForceAnd(forceAnd: boolean) {\n (dispatch as any)?.({type: 'setForceAnd', payload: forceAnd});\n }\n\n function updateSettingsAndRefetch(settings: Partial<Pick<typeof state, 'force_and' | 'custom_sort_settings' | 'flag' | 'user_segment_preview' | 'personalization_preview' | 'session_token'>>) {\n if ('custom_sort_settings' in settings) {\n customSortSettingsRef.current = settings.custom_sort_settings ?? undefined;\n }\n (dispatch as any)?.({type: 'updateSettingsAndRefetch', payload: settings});\n }\n\n function setUserSegmentPreview(preview: UserSegmentPreview) {\n userSegmentPreviewRef.current = preview;\n (dispatch as any)?.({type: 'setUserSegmentPreview', payload: preview});\n }\n\n function setPersonalizationPreview(preview: PersonalizationPreviewSettings | null) {\n personalizationPreviewRef.current = preview;\n (dispatch as any)?.({type: 'setPersonalizationPreview', payload: preview});\n }\n\n // Compute detailed comparison between Hybrid ON and Hybrid OFF using full ID lists\n function computeComparisonFromIds(hybridOnIds: string[], hybridOffIds: string[]): ComparisonData {\n // Create rank maps (1-based index)\n const onRankMap = new Map<string, number>();\n const offRankMap = new Map<string, number>();\n\n hybridOnIds.forEach((id, index) => onRankMap.set(id.toString(), index + 1));\n hybridOffIds.forEach((id, index) => offRankMap.set(id.toString(), index + 1));\n\n const productChanges = new Map<string, ProductRankChange>();\n let totalImproved = 0;\n let totalDeclined = 0;\n let totalNew = 0;\n let totalUnchanged = 0;\n\n // Analyze all products in hybrid ON results\n hybridOnIds.forEach((id) => {\n const idStr = id.toString();\n const rankWithHybrid = onRankMap.get(idStr) || -1;\n const rankWithoutHybrid = offRankMap.get(idStr) || -1;\n\n let status: ProductRankChange['status'];\n let rankDelta = 0;\n\n if (rankWithoutHybrid === -1) {\n // Product not in results without hybrid - it's new due to hybrid\n status = 'new';\n totalNew++;\n } else {\n rankDelta = rankWithoutHybrid - rankWithHybrid; // Positive = improved (moved up)\n\n if (rankDelta > 0) {\n status = 'improved';\n totalImproved++;\n } else if (rankDelta < 0) {\n status = 'declined';\n totalDeclined++;\n } else {\n status = 'unchanged';\n totalUnchanged++;\n }\n }\n\n productChanges.set(idStr, {\n productId: idStr,\n rankWithHybrid,\n rankWithoutHybrid,\n rankDelta,\n status\n });\n });\n\n return {\n hybridOnIds: hybridOnIds.map(id => id.toString()),\n hybridOffIds: hybridOffIds.map(id => id.toString()),\n productChanges,\n totalImproved,\n totalDeclined,\n totalNew,\n totalUnchanged\n };\n }\n\n function getDisableFlags(flags: string[]) {\n return {\n disable_merchandising: flags.find((f) => f == \"disable_merchandising\") ? 1 : 0,\n disable_semantics: flags.find((f) => f == \"disable_semantics\") ? 1 : 0,\n disable_turbolinks: flags.find((f) => f == \"disable_turbolinks\") ? 1 : 0,\n disable_strategies: flags.find((f) => f == \"disable_strategies\") ? 1 : 0,\n disable_merchandising_rules: flags.find((f) => f == \"disable_merchandising_rules\") ? 1 : 0,\n disable_antonyms: flags.find((f) => f == \"disable_antonyms\") ? 1 : 0,\n };\n }\n\n function setQuery(query: string , isAutocomplete?:boolean) {\n (dispatch as any)?.({type: 'setQuery', payload: query});\n (dispatch as any)?.({type: 'setIsAutocomplete', payload: isAutocomplete?isAutocomplete:false});\n\n // Create the object with the computed property\n let fetchParams = {\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n term: query,\n sortBy: defaultSort,\n segments: state.segments,\n withProductAttributes:withProductAttributes,\n custom_sort_settings:currentCustomSort(),\n ...getDisableFlags(state.flag),\n };\n\n fetchResults(fetchParams, isInfiniteScroll,isAutocomplete?isAutocomplete:false);\n }\n function setCustomSort(customSortSettings:CustomSortSettings) {\n customSortSettingsRef.current = customSortSettings;\n (dispatch as any)?.({type: 'setCustomSort', payload: customSortSettings});\n // Create the object with the computed property\n let fetchParams = {\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n term: state.query,\n narrowBy: state.narrow,\n sortBy: state.sortBy,\n categoryID: state.collectionID,\n segments: state.segments,\n withProductAttributes:state.withProductAttributes,\n searchWithinSearch:state.searchWithinSearch,\n custom_sort_settings:customSortSettings,\n ...getDisableFlags(state.flag),\n };\n\n fetchResults(fetchParams, isInfiniteScroll);\n\n }\n\n function setFlag(flags: string[]) {\n const flagsToData=flags.map((f)=>{return \"disable_\" + f;});\n (dispatch as any)?.({type: 'setFlag', payload: flagsToData });\n\n // Create the object with the computed property\n let fetchParams = {\n siteKey:siteKey,\n uuid: uuid,\n storeID: storeID,\n term: state.query,\n narrowBy: state.narrow,\n sortBy: state.defaultSort,\n segments: state.segments,\n categoryID: state.collectionID,\n withProductAttributes: withProductAttributes,\n searchWithinSearch:state.searchWithinSearch,\n custom_sort_settings:currentCustomSort(),\n };\n\n if(flags.length>0)\n {\n flags.forEach((f)=>{\n let flagProp = \"disable_\" + f;\n // Add the dynamic key to the object\n // @ts-ignore\n fetchParams[flagProp as any] = true;\n });\n }\n\n\n fetchResults(fetchParams, isInfiniteScroll,state.isAutocomplete);\n }\n\n function setSortBy(sortBy: SortBy) {\n (dispatch as any)?.({type: 'setSortBy', payload: sortBy});\n // Create the object with the computed property\n let fetchParams = {\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n term: state.query,\n narrowBy: state.narrow,\n sortBy: sortBy,\n categoryID: state.collectionID,\n segments: state.segments,\n withProductAttributes:withProductAttributes,\n searchWithinSearch:state.searchWithinSearch,\n custom_sort_settings:currentCustomSort(),\n ...getDisableFlags(state.flag),\n };\n\n fetchResults(fetchParams, isInfiniteScroll);\n\n }\n function setSegments(segments: string[]) {\n (dispatch as any)?.({type: 'setSegments', payload: segments});\n\n let fetchParams = {\n withProductAttributes:withProductAttributes,\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n term: state.query,\n narrowBy: state.narrow,\n sortBy: state.sortBy,\n categoryID: state.collectionID,\n segments: segments,\n searchWithinSearch:state.searchWithinSearch,\n custom_sort_settings:currentCustomSort(),\n ...getDisableFlags(state.flag),\n };\n\n fetchResults(fetchParams, isInfiniteScroll,state.isAutocomplete);\n\n }\n function setType(type: AppType) {\n (dispatch as any)?.({type: 'setType', payload: type});\n }\n\n function setCollectionID(collectionID: string) {\n (dispatch as any)?.({type: 'setCollectionID', payload: collectionID});\n (dispatch as any)?.({type: 'setIsAutocomplete', payload: false});\n\n // Create the object with the computed property\n let fetchParams = {\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n categoryID: collectionID,\n sortBy: defaultSort,\n segments: state.segments,\n custom_sort_settings:currentCustomSort(),\n ...getDisableFlags(state.flag),\n };\n\n fetchResults(fetchParams, isInfiniteScroll);\n\n }\n\n function setPage(page: number) {\n (dispatch as any)?.({type: 'setPage', payload: page});\n\n let fetchParams = {\n withProductAttributes:withProductAttributes,\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n term: state.query,\n narrowBy: state.narrow,\n sortBy: state.sortBy,\n categoryID: state.collectionID,\n page: page,\n segments: state.segments,\n searchWithinSearch:state.searchWithinSearch,\n custom_sort_settings:currentCustomSort(),\n ...getDisableFlags(state.flag),\n };\n\n fetchResults(fetchParams, isInfiniteScroll);\n\n }\n\n function setNarrow(narrow: ServerNarrow[] | undefined) {\n (dispatch as any)?.({type: 'setNarrow', payload: narrow});\n\n let fetchParams = {\n withProductAttributes:withProductAttributes,\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n term: state.query,\n narrowBy: narrow,\n sortBy: state.sortBy,\n categoryID: state.collectionID,\n segments: state.segments,\n searchWithinSearch:state.searchWithinSearch,\n custom_sort_settings:currentCustomSort(),\n ...getDisableFlags(state.flag),\n };\n\n fetchResults(fetchParams, isInfiniteScroll);\n\n }\n\n function setState({...newState}: SetStateProps) {\n (dispatch as any)?.({type: 'setState', payload: newState});\n\n fetchResults({\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n term: newState.query,\n narrowBy: newState.narrow?newState.narrow:undefined,\n sortBy: newState.sortBy ?? defaultSort,\n categoryID: newState.collectionID,\n page: newState.page,\n segments: newState.segments,\n }, Boolean(!results && isInfiniteScroll && newState.page && newState.page > 1));\n }\n\n\n function setSingleProducts(products: Product[]) {\n (dispatch as any)?.({type: \"setSingleProducts\", payload: products});\n }\n\n\n function setReady(isReady: boolean) {\n (dispatch as any)?.({type: \"setReady\", payload: isReady});\n }\n\n function setSearchWithinSearch(searchWithinSearch: string) {\n (dispatch as any)?.({type: \"setSearchWithinSearch\", payload: searchWithinSearch});\n\n let fetchParams = {\n withProductAttributes:withProductAttributes,\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n term: query,\n narrowBy: state.narrow,\n sortBy: state.sortBy,\n categoryID: state.collectionID,\n segments: state.segments,\n searchWithinSearch:searchWithinSearch,\n custom_sort_settings:currentCustomSort(),\n ...getDisableFlags(state.flag),\n };\n\n fetchResults(fetchParams, isInfiniteScroll);\n\n }\n\n function fetchResults(props:{\n uuid:string, storeID:number,siteKey?:string, term?: string, page?: number, narrowBy?: ServerNarrow[] | undefined,\n sortBy?: SortBy, categoryID?: string, searchWithinSearch?: string, segments?: string[] ,withProductAttributes?:boolean,\n disable_semantics?:number,disable_merchandising?:number,disable_strategies?:number,disable_turbolinks?:number,disable_personalization?:number,custom_sort_settings?:CustomSortSettings,\n variation_id?: string | null, force_and?: boolean\n },\n isInfiniteScroll: boolean,\n autocomplete:boolean=false) {\n\n // 1. Apply ref value first — ensures latest custom_sort_settings is used even from\n // stale closures or call sites (e.g. setState) that don't pass custom_sort_settings.\n // null means \"explicitly cleared\" → omit the param from the request.\n const refValue = customSortSettingsRef.current;\n if (refValue !== undefined) {\n const effectiveSort: CustomSortSettings | undefined = refValue === null ? undefined : refValue;\n props = { ...props, custom_sort_settings: effectiveSort };\n }\n\n // 2. Apply transform after ref — transform gets the correct base value and can\n // inject context-aware personalization_rank without stale closure issues.\n if (customSortSettingsTransform) {\n const isCollection = !!props.categoryID && !props.term;\n props = { ...props, custom_sort_settings: customSortSettingsTransform(props.custom_sort_settings, isCollection) as CustomSortSettings | undefined };\n }\n\n // on first request check if we need to fetch more then 1 product\n\n if (props.term && !autocomplete) {\n onSearch(newObject({\n ...props,\n page: props.page || 1,\n infiniteScrollPage: isInfiniteScroll,\n }) as Omit<fullTextSearchProps, \"callback\">, isInfiniteScroll);\n } else if(props.term && autocomplete){\n onAutocompleteSearch(newObject({\n ...props\n }) as Omit<autocompleteProps, \"callback\" | \"page\" | \"narrowBy\" | \"sortBy\" | \"categoryID\" | \"searchWithinSearch\" | \"custom_sort_settings\">);\n } else if (props.categoryID) {\n onCollection(newObject({\n ...props,\n page: props.page || 1,\n infiniteScrollPage: isInfiniteScroll,\n }) as Omit<smartCollectionsProps, \"callback\">, isInfiniteScroll);\n }\n\n return;\n\n }\n\n\n\n useEffect(() => {\n function handleSetQueryEvent(event: any) {\n // Support both string (legacy) and object with isAutocomplete flag\n if (typeof event.detail === 'string') {\n setQuery(event.detail);\n } else {\n setQuery(event.detail.query, event.detail.isAutocomplete);\n }\n }\n\n function handleSetFlagEvent(event: any){\n setFlag(event.details)\n\n }\n function handleSetCollectionEvent(event: any) {\n setCollectionID(typeof event.detail === 'string' ? event.detail : event.detail.collectionID);\n }\n\n function handleSetCollectionURLEvent(event: any) {\n getAllCategories().then(r => {\n const id = r.find(c => c.u === event.detail)?.id;\n\n if (id) {\n setCollectionID(id);\n return;\n }\n\n window.location.href = event.detail;\n })\n }\n\n function handleSetPageEvent(event: any) {\n setPage(event.detail);\n }\n\n function handleSetSortEvent(event: any) {\n setSortBy(event.detail);\n }\n\n function handleSetNarrowEvent(event: any) {\n setNarrow(event.detail);\n }\n\n function handleSetSegmentsEvent(event: any) {\n setSegments(event.detail);\n }\n function handleSetIsAutocomplete(event:any){\n setIsAutocomplete(event.detail)\n }\n window.addEventListener('fast-simon-update-query', handleSetQueryEvent);\n window.addEventListener('fast-simon-update-collection', handleSetCollectionEvent);\n window.addEventListener('fast-simon-update-collection-url', handleSetCollectionURLEvent);\n window.addEventListener('fast-simon-update-page', handleSetPageEvent);\n window.addEventListener('fast-simon-update-sort', handleSetSortEvent);\n window.addEventListener('fast-simon-update-narrow', handleSetNarrowEvent);\n window.addEventListener('fast-simon-update-segments', handleSetSegmentsEvent);\n window.addEventListener('fast-simon-update-flag', handleSetFlagEvent);\n window.addEventListener('fast-simon-update-is-autocomplete', handleSetIsAutocomplete);\n\n return () => {\n window.removeEventListener('fast-simon-update-query', handleSetQueryEvent);\n window.removeEventListener('fast-simon-update-collection', handleSetCollectionEvent);\n window.removeEventListener('fast-simon-update-collection-url', handleSetCollectionURLEvent);\n window.removeEventListener('fast-simon-update-page', handleSetPageEvent);\n window.removeEventListener('fast-simon-update-sort', handleSetSortEvent);\n window.removeEventListener('fast-simon-update-narrow', handleSetNarrowEvent);\n window.removeEventListener('fast-simon-update-segments', handleSetSegmentsEvent);\n window.removeEventListener('fast-simon-update-flag', handleSetFlagEvent);\n window.removeEventListener('fast-simon-update-is-autocomplete', handleSetIsAutocomplete);\n }\n\n }, []);\n\n // Settings modal refetch: triggered after state is updated (no race conditions)\n // All settings (force_and, flags, custom_sort, user_segment_preview, personalization_preview)\n // are batched via updateSettingsAndRefetch to avoid double-fetches and stale-state reads.\n useEffect(() => {\n if (!state.refetchTrigger) return;\n // Build fetchParams from the now-updated state\n const fetchParams = {\n siteKey: siteKey,\n uuid: uuid,\n storeID: storeID,\n term: state.query,\n narrowBy: state.narrow,\n sortBy: state.sortBy ?? defaultSort,\n categoryID: state.collectionID,\n segments: state.segments,\n withProductAttributes: withProductAttributes,\n searchWithinSearch: state.searchWithinSearch,\n custom_sort_settings: currentCustomSort(),\n ...getDisableFlags(state.flag ?? []),\n variation_id: state.variation_id,\n force_and: state.force_and,\n };\n fetchResults(fetchParams, isInfiniteScroll, state.isAutocomplete);\n }, [state.refetchTrigger]);\n\n const onSearch = (props: Omit<fullTextSearchProps, \"callback\">, isInfiniteScroll: boolean) => {\n setIsLoading({products: true, filters: true});\n\n // Clear previous comparison data when starting new search\n setComparisonData(null);\n\n const currentQuery = props.term || '';\n const currentForceAnalytics = forceProductAnalytics || getShowSalesAnalyticsSetting();\n const shouldFetchAnalytics = currentForceAnalytics || (isAnalyticsEnabled && (currentQuery !== lastAnalyticsQuery || lastAnalyticsMode !== 'search'));\n\n // Check if hybrid search is enabled - we'll need to make a comparison call\n const isHybridEnabled = getLSVectorSearchOn();\n\n const personalizationSegment = getPersonalizationSegment(userSegmentPreviewRef.current);\n const personalizationParams = buildPersonalizationParams(\n personalizationPreviewRef.current ?? {enabled: false, spvJson: '', types: ['gender']}\n );\n\n // Increment staleness counter and clear pending analytics\n const requestId = ++searchRequestCounterRef.current;\n pendingAnalyticsRef.current = null;\n\n const commonRequestParams = {\n ...props,\n withAttributes: promoTiles || withProductAttributes,\n market_context: marketContext,\n variation_id: state.variation_id,\n force_and: state.force_and,\n ps: personalizationSegment,\n spv: personalizationParams.spv,\n personalization: personalizationParams.personalization,\n session_token: state.session_token\n };\n\n // Fire analytics request in parallel (fire-and-forget) — only if analytics needed\n if (shouldFetchAnalytics) {\n FullTextSearch.getReasoningFullTextSearch({\n ...commonRequestParams,\n with_product_analytics: true,\n facetRequired: 0,\n }).then(analyticsResponse => {\n if (searchRequestCounterRef.current !== requestId) return; // stale\n\n if (analyticsResponse.analytics?.badges) {\n setAnalyticsFetched(true);\n setLastAnalyticsQuery(currentQuery);\n setLastAnalyticsMode('search');\n }\n\n const productAnalyticsMap: Record<string, ProductAnalytics> = {};\n const items = (analyticsResponse as any).items || analyticsResponse.products || [];\n for (const product of items) {\n if (product.analytics) {\n productAnalyticsMap[String(product.id)] = product.analytics;\n }\n }\n\n const payload = buildAnalyticsPayload(analyticsResponse, productAnalyticsMap);\n pendingAnalyticsRef.current = payload;\n dispatchMergeAnalytics(payload);\n }).catch(err => {\n console.error(\"[Analytics] Failed to fetch search analytics:\", err);\n });\n }\n\n // Fire fast request WITHOUT analytics\n FullTextSearch.getReasoningFullTextSearch({\n ...commonRequestParams,\n with_product_analytics: false,\n }).then(async(response) => {\n // Don't preserve stale analytics when fetching fresh ones\n const existingAnalytics = shouldFetchAnalytics ? undefined : (results as any)?.analytics;\n const existingMatchingSets = shouldFetchAnalytics ? undefined : (results as any)?.matching_sets;\n const existingGroupStrategy = shouldFetchAnalytics ? undefined : (results as any)?.group_strategy;\n const existingVarietyStrategy = shouldFetchAnalytics ? undefined : (results as any)?.variety_strategy;\n response=getFormatedData(response, existingAnalytics, existingMatchingSets, existingGroupStrategy, existingVarietyStrategy);\n\n // Handle turbolink responses - skip additional API calls to prevent errors\n if (response.turbolink && response.totalResults === 0) {\n mergeResults(response, isInfiniteScroll);\n\n if (!customTitleChange) {\n document.title = `Search Result for ${query}`;\n } else {\n customTitleChange(results);\n }\n\n setIsLoading({filters: false, products: false});\n return;\n }\n\n // Show products immediately\n mergeResults(response, isInfiniteScroll);\n setIsLoading({products: false, filters: true});\n\n // If analytics arrived before fast response, re-apply to new results\n if (pendingAnalyticsRef.current && searchRequestCounterRef.current === requestId) {\n dispatchMergeAnalytics(pendingAnalyticsRef.current);\n }\n\n // Fire IDs + facets in parallel (previously sequential)\n const listIdRequestProps = { ...props };\n listIdRequestProps.searchWithinSearch=undefined;\n listIdRequestProps.productsPerPage=1000000;\n listIdRequestProps.page=1;\n listIdRequestProps.market_context = marketContext;\n listIdRequestProps.variation_id = state.variation_id;\n listIdRequestProps.force_and = state.force_and;\n listIdRequestProps.ps = personalizationSegment;\n listIdRequestProps.spv = personalizationParams.spv;\n listIdRequestProps.personalization = personalizationParams.personalization;\n listIdRequestProps.session_token = state.session_token;\n\n const facetsRequestProps = { ...props };\n facetsRequestProps.facetRequired=2;\n facetsRequestProps.searchWithinSearch=props.searchWithinSearch;\n facetsRequestProps.productsPerPage=props.productsPerPage;\n facetsRequestProps.page=props.page;\n facetsRequestProps.market_context = marketContext;\n facetsRequestProps.variation_id = state.variation_id;\n facetsRequestProps.force_and = state.force_and;\n facetsRequestProps.ps = personalizationSegment;\n facetsRequestProps.spv = personalizationParams.spv;\n facetsRequestProps.personalization = personalizationParams.personalization;\n\n const [listIdRes, facetsRes] = await Promise.all([\n FullTextSearch.getReasoningFullTextSearchProductsIds(listIdRequestProps),\n FullTextSearch.getReasoningFullTextSearch(facetsRequestProps)\n ]);\n\n // Merge IDs and complete facets into existing results\n mergeResultsKeepProduct({id_list: listIdRes.id_list, facets: facetsRes.facets} as any);\n\n if (!customTitleChange) {\n document.title = `Search Result for ${query}`;\n } else {\n customTitleChange(results);\n }\n\n setIsLoading({filters: false, products: false});\n\n // Compare Mode: Make comparison call using IDs endpoint if hybrid search is enabled\n console.log(\"[Compare Mode] isHybridEnabled:\", isHybridEnabled, \"hasIdList:\", !!listIdRes.id_list);\n if (isHybridEnabled && listIdRes.id_list && listIdRes.id_list.length > 0) {\n setIsComparing(true);\n console.log(\"[Compare Mode] Making comparison IDs call...\");\n try {\n // Get all IDs WITHOUT hybrid_search_settings\n const comparisonResponse = await FullTextSearch.getComparisonProductIds({\n ...props,\n market_context: marketContext,\n variation_id: state.variation_id,\n force_and: state.force_and,\n ps: personalizationSegment,\n spv: personalizationParams.spv,\n personalization: personalizationParams.personalization\n });\n\n const hybridOffIds = (comparisonResponse.id_list || []).map(id => id.toString());\n const hybridOnIds = (listIdRes.id_list || []).map(id => id.toString());\n console.log(\"[Compare Mode] Hybrid ON IDs count:\", hybridOnIds.length);\n console.log(\"[Compare Mode] Hybrid OFF IDs count:\", hybridOffIds.length);\n\n if (hybridOffIds.length > 0) {\n const diff = computeComparisonFromIds(hybridOnIds, hybridOffIds);\n console.log(\"[Compare Mode] Diff computed - improved:\", diff.totalImproved, \"declined:\", diff.totalDeclined, \"new:\", diff.totalNew);\n setComparisonData(diff);\n }\n } catch (error) {\n console.error(\"[Compare Mode] Failed to fetch comparison IDs:\", error);\n setComparisonData(null);\n } finally {\n setIsComparing(false);\n }\n }\n });\n }\n const onAutocompleteSearch = (props: Omit<autocompleteProps, \"callback\">) => {\n setIsLoading({products: true, filters: true});\n const personalizationSegment = getPersonalizationSegment(userSegmentPreviewRef.current);\n const personalizationParams = buildPersonalizationParams(\n personalizationPreviewRef.current ?? {enabled: false, spvJson: '', types: ['gender']}\n );\n\n Autocomplete.getAutocompleteReasoning({\n ...props,\n withAttributes: promoTiles || withProductAttributes,\n market_context: marketContext,\n variation_id: state.variation_id,\n force_and: state.force_and,\n ps: personalizationSegment,\n spv: personalizationParams.spv,\n personalization: personalizationParams.personalization\n }).then(async(response) => {\n response=getFormatedData(response);\n\n mergeResults(response, false);\n\n if (!customTitleChange) {\n document.title = `Autocomplete Result for ${query}`;\n } else {\n customTitleChange(results);\n }\n\n if (!response) {\n setIsLoading({\n filters: true, products: false\n });\n } else {\n setIsLoading({\n filters: false, products: false\n });\n }\n });\n }\n\n const onCollection = (props: Omit<smartCollectionsProps, \"callback\">, isInfiniteScroll: boolean) => {\n setIsLoading({products: true, filters: true});\n\n const currentCollection = props.categoryID || '';\n const currentForceAnalytics = forceProductAnalytics || getShowSalesAnalyticsSetting();\n const shouldFetchAnalytics = currentForceAnalytics || (isAnalyticsEnabled && (currentCollection !== lastAnalyticsCollection || lastAnalyticsMode !== 'collection'));\n\n const personalizationSegment = getPersonalizationSegment(userSegmentPreviewRef.current);\n const personalizationParams = buildPersonalizationParams(\n personalizationPreviewRef.current ?? {enabled: false, spvJson: '', types: ['gender']}\n );\n\n // Increment staleness counter and clear pending analytics\n const requestId = ++searchRequestCounterRef.current;\n pendingAnalyticsRef.current = null;\n\n const commonRequestParams = {\n ...props,\n withAttributes: promoTiles || withProductAttributes,\n market_context: marketContext,\n variation_id: state.variation_id,\n ps: personalizationSegment,\n spv: personalizationParams.spv,\n\n spc: personalizationParams.spc,\n personalization: personalizationParams.personalization,\n force_and: state.force_and,\n session_token: state.session_token\n };\n\n // Fire analytics request in parallel (fire-and-forget) — only if analytics needed\n if (shouldFetchAnalytics) {\n SmartCollections.getSmartCollections({\n ...commonRequestParams,\n with_product_analytics: true,\n facetRequired: 0,\n }).then(analyticsResponse => {\n if (searchRequestCounterRef.current !== requestId) return; // stale\n\n if (analyticsResponse.analytics?.badges) {\n setAnalyticsFetched(true);\n setLastAnalyticsCollection(currentCollection);\n setLastAnalyticsMode('collection');\n }\n\n const productAnalyticsMap: Record<string, ProductAnalytics> = {};\n const items = (analyticsResponse as any).items || analyticsResponse.products || [];\n for (const product of items) {\n if (product.analytics) {\n productAnalyticsMap[String(product.id)] = product.analytics;\n }\n }\n\n const payload = buildAnalyticsPayload(analyticsResponse, productAnalyticsMap);\n pendingAnalyticsRef.current = payload;\n dispatchMergeAnalytics(payload);\n }).catch(err => {\n console.error(\"[Analytics] Failed to fetch collection analytics:\", err);\n });\n }\n\n // Fire fast request WITHOUT analytics\n SmartCollections.getSmartCollections({\n ...commonRequestParams,\n with_product_analytics: false,\n }).then(async (response) => {\n // Attach personalization coefficients + story to each product item (updates every navigation)\n const coefs = (response as any).personalization_coefficients;\n const stories = (response as any).personalization_story;\n if ((coefs || stories) && (response as any).items) {\n for (const item of (response as any).items) {\n if (!item || item.promotile) continue;\n const pid = String(item.id);\n if (coefs?.[pid]) item.personalization_coefs = coefs[pid];\n if (stories?.[pid]) item.personalization_story = stories[pid];\n }\n }\n\n // Don't preserve stale analytics when fetching fresh ones\n const existingAnalytics = shouldFetchAnalytics ? undefined : (results as any)?.analytics;\n const existingMatchingSets = shouldFetchAnalytics ? undefined : (results as any)?.matching_sets;\n const existingGroupStrategy = shouldFetchAnalytics ? undefined : (results as any)?.group_strategy;\n const existingVarietyStrategy = shouldFetchAnalytics ? undefined : (results as any)?.variety_strategy;\n response=getFormatedData(response, existingAnalytics, existingMatchingSets, existingGroupStrategy, existingVarietyStrategy);\n\n // Show products immediately\n mergeResults(response, isInfiniteScroll);\n setIsLoading({products: false, filters: true});\n\n // If analytics arrived before fast response, re-apply to new results\n if (pendingAnalyticsRef.current && searchRequestCounterRef.current === requestId) {\n dispatchMergeAnalytics(pendingAnalyticsRef.current);\n }\n\n // Fire IDs + facets in parallel (previously sequential)\n const listIdRequestProps = { ...props };\n listIdRequestProps.searchWithinSearch=undefined;\n listIdRequestProps.productsPerPage=1000000;\n listIdRequestProps.page=1;\n listIdRequestProps.market_context = marketContext;\n listIdRequestProps.variation_id = state.variation_id;\n listIdRequestProps.force_and = state.force_and;\n listIdRequestProps.ps = personalizationSegment;\n listIdRequestProps.spv = personalizationParams.spv;\n listIdRequestProps.spc = personalizationParams.spc;\n listIdRequestProps.personalization = personalizationParams.personalization;\n listIdRequestProps.session_token = state.session_token;\n\n const facetsRequestProps = { ...props };\n facetsRequestProps.facetRequired=2;\n facetsRequestProps.searchWithinSearch=props.searchWithinSearch;\n facetsRequestProps.productsPerPage=props.productsPerPage;\n facetsRequestProps.page=props.page;\n facetsRequestProps.market_context = marketContext;\n facetsRequestProps.variation_id = state.variation_id;\n facetsRequestProps.force_and = state.force_and;\n facetsRequestProps.ps = personalizationSegment;\n facetsRequestProps.spv = personalizationParams.spv;\n facetsRequestProps.spc = personalizationParams.spc;\n facetsRequestProps.personalization = personalizationParams.personalization;\n\n const [listIdRes, facetsRes] = await Promise.all([\n SmartCollections.getSmartCollectionsProductsIds(listIdRequestProps),\n SmartCollections.getSmartCollections(facetsRequestProps)\n ]);\n\n // Merge IDs and complete facets into existing results\n mergeResultsKeepProduct({id_list: listIdRes.id_list, facets: facetsRes.facets} as any);\n\n setIsLoading({filters: false, products: false});\n\n getAllCategories().then(r => {\n if (!customTitleChange) {\n document.title = r.find(c => c.id === props.categoryID)?.l ?? \"Collection\";\n } else {\n customTitleChange(results);\n }\n });\n });\n }\n\n // Memoize to prevent unnecessary recreation\n const getAllCategories = useCallback(async () => {\n if (categories.length > 0) {\n return new Promise<FastCategory[]>(resolve => resolve(categories))\n }\n\n const data = categories || [];\n\n setCategories(data)\n\n return data;\n }, [categories]);\n\n const getFormatedData = (response: any, existingAnalytics?: any, existingMatchingSets?: any, existingGroupStrategy?: any, existingVarietyStrategy?: any) => {\n const results = response;\n\n results.products = response.items;\n delete results.items;\n results.totalResults = response.total_results;\n delete results.total_results;\n if (response.sort_by) {\n results.sortBy = response.sort_by;\n delete results.sort_by;\n }\n\n if (response.pop_products_no_results) {\n results.isNoResults = true;\n }\n\n if (response.total_p) {\n results.pageCount = response.total_p;\n delete results.total_p;\n }\n\n\n if (response.ancestor_categories) {\n results.ancestors = response.ancestor_categories;\n delete results.ancestor_categories;\n }\n\n if (response.avoid_tag_prefixes) {\n results.avoidPrefixList = response.avoid_tag_prefixes.split(\",\");\n }\n\n\n results.page = response.p || 1;\n delete results.p;\n\n // Preserve analytics field if present (contains winners/overexposed data)\n // If response has new analytics, use it; otherwise keep existing analytics\n if (response.analytics) {\n results.analytics = response.analytics;\n } else if (existingAnalytics) {\n results.analytics = existingAnalytics;\n }\n\n // Preserve matching_sets field if present (product ID -> set name)\n // If response has new matching_sets, use it; otherwise keep existing\n if (response.matching_sets) {\n results.matching_sets = response.matching_sets;\n } else if (existingMatchingSets) {\n results.matching_sets = existingMatchingSets;\n }\n\n if (response.group_strategy) {\n results.group_strategy = response.group_strategy;\n } else if (existingGroupStrategy) {\n results.group_strategy = existingGroupStrategy;\n }\n if (response.variety_strategy) {\n results.variety_strategy = response.variety_strategy;\n } else if (existingVarietyStrategy) {\n results.variety_strategy = existingVarietyStrategy;\n }\n\n if (results.personalized_products?.length) {\n const context = results.category_name\n ? `Collection: ${results.category_name}`\n : state.query\n ? `Search: \"${state.query}\"`\n : 'Unknown context';\n console.log(`[Personalized Products] ${context}`, results.personalized_products);\n }\n\n return results;\n };\n\n\n // Memoize state context to prevent unnecessary re-renders\n const stateContextValue = useMemo(() => ({\n narrow,\n results,\n page,\n query,\n sortBy,\n type,\n collectionID,\n isLoading,\n recommendations,\n singleProducts,\n isReady,\n autocomplete,\n isAutocomplete,\n variation_id: state.variation_id,\n force_and: state.force_and,\n flag: state.flag,\n comparisonData: state.comparisonData,\n isComparing: state.isComparing\n }), [narrow, results, page, query, sortBy, type, collectionID, isLoading, recommendations, singleProducts, isReady, autocomplete, isAutocomplete, state.variation_id, state.force_and, state.flag, state.comparisonData, state.isComparing]);\n\n // Memoize theme to prevent unnecessary object creation\n const mergedTheme = useMemo(() => ({...mainTheme, ...theme}), [theme]);\n\n // @ts-ignore\n return (\n <FastStateFunctions.Provider\n value={{\n setQuery,\n setSort: setSortBy,\n setNarrow,\n setPage,\n getAllCategories,\n setCollection: setCollectionID,\n setState,\n setSearchWithinSearch,\n setSegments,\n setFlag,\n setCustomSort,\n setIsAutocomplete,\n setVariationId,\n setForceAnd,\n setUserSegmentPreview,\n setPersonalizationPreview,\n updateSettingsAndRefetch\n }}>\n <FastState.Provider value={stateContextValue}>\n <ThemeProvider theme={mergedTheme}>\n {children}\n </ThemeProvider>\n </FastState.Provider>\n </FastStateFunctions.Provider>\n )\n};\n\n// Memoize component to prevent unnecessary re-renders when parent updates\nexport default React.memo(FastSimonApi);"]}
1
+ {"version":3,"file":"FastSimonApi.js","sourceRoot":"","sources":["../../../src/components/FastSimonApi/FastSimonApi.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, {useEffect, useReducer, useRef, useState, useMemo, useCallback} from \"react\";\nimport {ComparisonData, ProductRankChange, CustomSortSettings, FastState, FastStateFunctions, IsLoading, SetStateProps} from \"./context\";\nimport {ThemeProvider} from \"react-jss\";\nimport {fastStateReducer} from \"./reducer\";\nimport {newObject} from \"../common\";\n\nimport {SortBy} from \"../../@types/sortBy\";\nimport {fullTextSearchProps, FullTextServerResponseAll} from \"../../@types/results\";\nimport {getShowSalesAnalyticsSetting} from \"../../utils/getSalesAnalyticsSettings\";\nimport {getLSVectorSearchOn} from \"../../utils/getLSVectorSearch\";\nimport {getPersonalizationSegment, UserSegmentPreview} from \"../../utils/userSegmentPreview\";\nimport {buildPersonalizationParams, PersonalizationPreviewSettings} from \"../../utils/personalizationPreview\";\n\nimport {PersonalizationStory, Product, ProductAnalytics} from \"../../@types/product\";\nimport {FastCategory, smartCollectionsProps, smartCollectionsResults} from \"../../@types/categories\";\nimport {Narrow, ServerNarrow} from \"../../@types/narrow\";\nimport {FullTextSearch} from \"../../services/search\";\nimport {SmartCollections} from \"../../services/smartCollections\";\nimport {autocompleteProps, AutocompleteReasoningResponse} from \"../../@types/autocomplete\";\nimport {Autocomplete} from \"../../services/autocomplete\";\n\nexport type AppType = \"SPA\" | \"MPA\";\n\ninterface Props {\n storeID: number;\n uuid: string;\n type?: AppType;\n onReady?: VoidFunction;\n cartToken?: string;\n defaultSort?: SortBy\n collectionID?: string\n withProductAttributes?: boolean\n promoTiles?: boolean\n getTitle?: ({}: { categoryID?: string, query?: string }) => string\n isInfiniteScroll?: boolean\n useFilters?: boolean\n noReport?: boolean\n customTitleChange?: (results?: FullTextServerResponseAll | smartCollectionsResults) => void\n theme?: Partial<MainTheme>\n children?: React.ReactNode;\n siteKey?:string\n isEnterpriseMerchandising?: boolean;\n subscription?: number;\n marketContext?: string | null; // Region code for market-specific product filtering (e.g., \"US\", \"CA\", \"UK\")\n forceProductAnalytics?: boolean; // When true, always pass with_product_analytics regardless of other conditions\n variationId?: string | null; // A/B test variation ID for reasoning/experiment tracking\n customSortSettingsTransform?: (settings: CustomSortSettings | undefined, isCollection: boolean) => CustomSortSettings | null | undefined;\n}\n\nexport interface MainTheme {\n primaryColor: string\n lighterPrimary: string\n successGreen: string\n errorRed: string\n loadingYellow: string,\n}\n\nconst mainTheme: MainTheme = {\n primaryColor: \"#1976d2\",\n lighterPrimary: \"rgba(25,118,210,0.71)\",\n successGreen: \"#4BB543\",\n errorRed: \"#ff0033\",\n loadingYellow: \"#f3b706\",\n}\n\n// Analytics-enabled responses (with_product_analytics=true) carry personalization_story with\n// momentum pillars populated. This helper centralises payload construction for both the\n// search and collection analytics callbacks.\nfunction buildAnalyticsPayload(\n analyticsResponse: any,\n productAnalyticsMap: Record<string, ProductAnalytics>\n): {\n analytics: any;\n matching_sets: any;\n group_strategy: any;\n variety_strategy: any;\n productAnalyticsMap: Record<string, ProductAnalytics>;\n personalizationStoryMap: Record<string, PersonalizationStory>;\n responseRpiMethodologyEffective?: string | null;\n responseRpiSnapshotComputedAt?: string | null;\n} {\n return {\n analytics: analyticsResponse.analytics,\n matching_sets: analyticsResponse.matching_sets,\n group_strategy: analyticsResponse.group_strategy,\n variety_strategy: analyticsResponse.variety_strategy,\n productAnalyticsMap,\n personalizationStoryMap: analyticsResponse.personalization_story || {},\n // Private race-guard fields: reducer ignores them. Ranking metadata and coefficients must\n // always stay those of the fast response that produced the displayed order.\n responseRpiMethodologyEffective: analyticsResponse.rpi_methodology_effective,\n responseRpiSnapshotComputedAt: analyticsResponse.rpi_snapshot_computed_at,\n };\n}\n\nconst PRESENTATION_RPI_METHODOLOGY = 'presentation10_v2';\n\nexport function analyticsMatchesRankingSnapshot(analyticsPayload: {\n responseRpiMethodologyEffective?: string | null;\n responseRpiSnapshotComputedAt?: string | null;\n}, rankingResponse: any): boolean {\n const analyticsIsCandidate = analyticsPayload.responseRpiMethodologyEffective\n === PRESENTATION_RPI_METHODOLOGY;\n const rankingIsCandidate = rankingResponse?.rpi_methodology_effective\n === PRESENTATION_RPI_METHODOLOGY;\n if (!analyticsIsCandidate && !rankingIsCandidate) return true;\n\n const analyticsSnapshot = analyticsPayload.responseRpiSnapshotComputedAt;\n const rankingSnapshot = rankingResponse?.rpi_snapshot_computed_at;\n return analyticsIsCandidate\n && rankingIsCandidate\n && Boolean(analyticsSnapshot)\n && analyticsSnapshot === rankingSnapshot;\n}\n\n/** Attach response-level reasoning maps before items are renamed to products. */\nexport function attachPersonalizationToItems(response: any): void {\n const coefficients = response?.personalization_coefficients;\n const stories = response?.personalization_story;\n if ((!coefficients && !stories) || !Array.isArray(response?.items)) return;\n for (const item of response.items) {\n if (!item || item.promotile) continue;\n const productId = String(item.id);\n if (coefficients?.[productId]) item.personalization_coefs = coefficients[productId];\n if (stories?.[productId]) item.personalization_story = stories[productId];\n }\n}\n\n\nconst FastSimonApi: React.FC<Props> = ({\n storeID, uuid,siteKey, children,\n defaultSort , promoTiles = false, theme,\n withProductAttributes = false, isInfiniteScroll = false, getTitle,\n useFilters, noReport = false, customTitleChange,\n isEnterpriseMerchandising = false, subscription = 0,\n marketContext = null,\n forceProductAnalytics = false,\n variationId = null,\n customSortSettingsTransform,\n ...props\n }) => {\n const [state, dispatch] = (useReducer as any)?.(fastStateReducer, {\n isReady: false,\n type: props.type ?? 'SPA',\n page: 1,\n query: '',\n sortBy: defaultSort,\n isLoading: {\n products: false,\n filters: false,\n },\n collectionID: props.collectionID,\n narrow: undefined,\n results: undefined,\n recommendations: {},\n singleProducts: {},\n searchWithinSearch: \"\",\n segments: undefined,\n flag:[],\n custom_sort_settings:undefined,\n isAutocomplete:false,\n variation_id: variationId, // Initialize from prop, then updated via setVariationId\n force_and: false,\n user_segment_preview: 'none' as UserSegmentPreview, // User segment preview mode for AI Explainer\n personalization_preview: null as PersonalizationPreviewSettings | null,\n session_token: undefined as string | undefined,\n // Compare Mode state\n comparisonData: null,\n isComparing: false\n });\n\n // Ref for user_segment_preview: enables synchronous reads across closures\n // so that any fetch triggered in the same handler (e.g. setCustomSort) reads the latest value\n const userSegmentPreviewRef = useRef<UserSegmentPreview>(state.user_segment_preview);\n userSegmentPreviewRef.current = state.user_segment_preview;\n\n // Ref for custom_sort_settings: ensures stale setQuery/setCollectionID/etc. closures\n // always read the latest value even when called from memoized components.\n const customSortSettingsRef = useRef<CustomSortSettings | null | undefined>(state.custom_sort_settings);\n customSortSettingsRef.current = state.custom_sort_settings;\n // Typed read for fetchParams — null is stripped to undefined here; fetchResults reads\n // the raw ref (.current) so it can still distinguish null (\"cleared\") from undefined (\"not set\").\n const currentCustomSort = (): CustomSortSettings | undefined => {\n const v = customSortSettingsRef.current;\n return v === null ? undefined : v;\n };\n\n // Ref for personalization_preview: enables synchronous reads across closures\n const personalizationPreviewRef = useRef<PersonalizationPreviewSettings | null>(state.personalization_preview);\n personalizationPreviewRef.current = state.personalization_preview;\n\n // Staleness counter for parallel analytics requests — incremented at start of each onSearch/onCollection\n // Analytics responses check this to discard stale data from superseded queries\n const searchRequestCounterRef = useRef(0);\n\n // Pending analytics payload — stores analytics if it arrives before the fast response (race condition handling)\n const pendingAnalyticsRef = useRef<{\n analytics?: FullTextServerResponseAll['analytics'];\n matching_sets?: Record<string, string>;\n group_strategy?: Record<string, string>;\n variety_strategy?: number[];\n productAnalyticsMap?: Record<string, ProductAnalytics>;\n personalizationStoryMap?: Record<string, PersonalizationStory>;\n responseRpiMethodologyEffective?: string | null;\n responseRpiSnapshotComputedAt?: string | null;\n } | null>(null);\n\n const [categories, setCategories] = useState<FastCategory[]>([]);\n const [analyticsFetched, setAnalyticsFetched] = useState(false);\n const [lastAnalyticsQuery, setLastAnalyticsQuery] = useState<string>('');\n const [lastAnalyticsCollection, setLastAnalyticsCollection] = useState<string>('');\n const [lastAnalyticsMode, setLastAnalyticsMode] = useState<'search' | 'collection' | ''>('');\n\n // Only enable analytics for enterprise merchants or subscription level 5\n const isAnalyticsEnabled = isEnterpriseMerchandising || subscription === 5;\n\n const {results, isLoading, query, sortBy, type, collectionID, page, narrow, recommendations, singleProducts, isReady, autocomplete, segments,isAutocomplete\n\n } = state;\n\n function setResults(results: FullTextServerResponseAll | smartCollectionsResults | AutocompleteReasoningResponse | undefined) {\n (dispatch as any)?.({type: 'setResults', payload: results});\n }\n\n function mergeResults(results: FullTextServerResponseAll | smartCollectionsResults | AutocompleteReasoningResponse, infiniteScroll: boolean) {\n (dispatch as any)?.({type: 'mergeResults', payload: {results, infiniteScroll}});\n }\n function mergeFacetsWithResults(facets:Narrow[]) {\n (dispatch as any)?.({type: 'mergeFacetsWithResults', payload: facets});\n }\n\n function mergeResultsKeepProduct(results: FullTextServerResponseAll | smartCollectionsResults) {\n (dispatch as any)?.({type: 'mergeResultsKeepProduct', payload: {results}});\n }\n\n function dispatchMergeAnalytics(payload: {\n analytics?: FullTextServerResponseAll['analytics'];\n matching_sets?: Record<string, string>;\n group_strategy?: Record<string, string>;\n variety_strategy?: number[];\n productAnalyticsMap?: Record<string, ProductAnalytics>;\n personalizationStoryMap?: Record<string, PersonalizationStory>;\n }) {\n (dispatch as any)?.({type: 'mergeAnalyticsData', payload});\n }\n\n function setIsLoading(isLoading: IsLoading) {\n (dispatch as any)?.({type: 'setIsLoading', payload: isLoading});\n }\n\n function setIsAutocomplete(isAutocomplete:boolean)\n {\n (dispatch as any)?.({type: 'setIsAutocomplete', payload: isAutocomplete});\n }\n\n function setVariationId(variationId: string | null) {\n (dispatch as any)?.({type: 'setVariationId', payload: variationId});\n }\n\n function setComparisonData(comparisonData: ComparisonData | null) {\n (dispatch as any)?.({type: 'setComparisonData', payload: comparisonData});\n }\n\n function setIsComparing(isComparing: boolean) {\n (dispatch as any)?.({type: 'setIsComparing', payload: isComparing});\n }\n\n function setForceAnd(forceAnd: boolean) {\n (dispatch as any)?.({type: 'setForceAnd', payload: forceAnd});\n }\n\n function updateSettingsAndRefetch(settings: Partial<Pick<typeof state, 'force_and' | 'custom_sort_settings' | 'flag' | 'user_segment_preview' | 'personalization_preview' | 'session_token'>>) {\n if ('custom_sort_settings' in settings) {\n customSortSettingsRef.current = settings.custom_sort_settings ?? undefined;\n }\n (dispatch as any)?.({type: 'updateSettingsAndRefetch', payload: settings});\n }\n\n function setUserSegmentPreview(preview: UserSegmentPreview) {\n userSegmentPreviewRef.current = preview;\n (dispatch as any)?.({type: 'setUserSegmentPreview', payload: preview});\n }\n\n function setPersonalizationPreview(preview: PersonalizationPreviewSettings | null) {\n personalizationPreviewRef.current = preview;\n (dispatch as any)?.({type: 'setPersonalizationPreview', payload: preview});\n }\n\n // Compute detailed comparison between Hybrid ON and Hybrid OFF using full ID lists\n function computeComparisonFromIds(hybridOnIds: string[], hybridOffIds: string[]): ComparisonData {\n // Create rank maps (1-based index)\n const onRankMap = new Map<string, number>();\n const offRankMap = new Map<string, number>();\n\n hybridOnIds.forEach((id, index) => onRankMap.set(id.toString(), index + 1));\n hybridOffIds.forEach((id, index) => offRankMap.set(id.toString(), index + 1));\n\n const productChanges = new Map<string, ProductRankChange>();\n let totalImproved = 0;\n let totalDeclined = 0;\n let totalNew = 0;\n let totalUnchanged = 0;\n\n // Analyze all products in hybrid ON results\n hybridOnIds.forEach((id) => {\n const idStr = id.toString();\n const rankWithHybrid = onRankMap.get(idStr) || -1;\n const rankWithoutHybrid = offRankMap.get(idStr) || -1;\n\n let status: ProductRankChange['status'];\n let rankDelta = 0;\n\n if (rankWithoutHybrid === -1) {\n // Product not in results without hybrid - it's new due to hybrid\n status = 'new';\n totalNew++;\n } else {\n rankDelta = rankWithoutHybrid - rankWithHybrid; // Positive = improved (moved up)\n\n if (rankDelta > 0) {\n status = 'improved';\n totalImproved++;\n } else if (rankDelta < 0) {\n status = 'declined';\n totalDeclined++;\n } else {\n status = 'unchanged';\n totalUnchanged++;\n }\n }\n\n productChanges.set(idStr, {\n productId: idStr,\n rankWithHybrid,\n rankWithoutHybrid,\n rankDelta,\n status\n });\n });\n\n return {\n hybridOnIds: hybridOnIds.map(id => id.toString()),\n hybridOffIds: hybridOffIds.map(id => id.toString()),\n productChanges,\n totalImproved,\n totalDeclined,\n totalNew,\n totalUnchanged\n };\n }\n\n function getDisableFlags(flags: string[]) {\n return {\n disable_merchandising: flags.find((f) => f == \"disable_merchandising\") ? 1 : 0,\n disable_semantics: flags.find((f) => f == \"disable_semantics\") ? 1 : 0,\n disable_turbolinks: flags.find((f) => f == \"disable_turbolinks\") ? 1 : 0,\n disable_strategies: flags.find((f) => f == \"disable_strategies\") ? 1 : 0,\n disable_merchandising_rules: flags.find((f) => f == \"disable_merchandising_rules\") ? 1 : 0,\n disable_antonyms: flags.find((f) => f == \"disable_antonyms\") ? 1 : 0,\n };\n }\n\n function setQuery(query: string , isAutocomplete?:boolean) {\n (dispatch as any)?.({type: 'setQuery', payload: query});\n (dispatch as any)?.({type: 'setIsAutocomplete', payload: isAutocomplete?isAutocomplete:false});\n\n // Create the object with the computed property\n let fetchParams = {\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n term: query,\n sortBy: defaultSort,\n segments: state.segments,\n withProductAttributes:withProductAttributes,\n custom_sort_settings:currentCustomSort(),\n ...getDisableFlags(state.flag),\n };\n\n fetchResults(fetchParams, isInfiniteScroll,isAutocomplete?isAutocomplete:false);\n }\n function setCustomSort(customSortSettings:CustomSortSettings) {\n customSortSettingsRef.current = customSortSettings;\n (dispatch as any)?.({type: 'setCustomSort', payload: customSortSettings});\n // Create the object with the computed property\n let fetchParams = {\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n term: state.query,\n narrowBy: state.narrow,\n sortBy: state.sortBy,\n categoryID: state.collectionID,\n segments: state.segments,\n withProductAttributes:state.withProductAttributes,\n searchWithinSearch:state.searchWithinSearch,\n custom_sort_settings:customSortSettings,\n ...getDisableFlags(state.flag),\n };\n\n fetchResults(fetchParams, isInfiniteScroll);\n\n }\n\n function setFlag(flags: string[]) {\n const flagsToData=flags.map((f)=>{return \"disable_\" + f;});\n (dispatch as any)?.({type: 'setFlag', payload: flagsToData });\n\n // Create the object with the computed property\n let fetchParams = {\n siteKey:siteKey,\n uuid: uuid,\n storeID: storeID,\n term: state.query,\n narrowBy: state.narrow,\n sortBy: state.defaultSort,\n segments: state.segments,\n categoryID: state.collectionID,\n withProductAttributes: withProductAttributes,\n searchWithinSearch:state.searchWithinSearch,\n custom_sort_settings:currentCustomSort(),\n };\n\n if(flags.length>0)\n {\n flags.forEach((f)=>{\n let flagProp = \"disable_\" + f;\n // Add the dynamic key to the object\n // @ts-ignore\n fetchParams[flagProp as any] = true;\n });\n }\n\n\n fetchResults(fetchParams, isInfiniteScroll,state.isAutocomplete);\n }\n\n function setSortBy(sortBy: SortBy) {\n (dispatch as any)?.({type: 'setSortBy', payload: sortBy});\n // Create the object with the computed property\n let fetchParams = {\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n term: state.query,\n narrowBy: state.narrow,\n sortBy: sortBy,\n categoryID: state.collectionID,\n segments: state.segments,\n withProductAttributes:withProductAttributes,\n searchWithinSearch:state.searchWithinSearch,\n custom_sort_settings:currentCustomSort(),\n ...getDisableFlags(state.flag),\n };\n\n fetchResults(fetchParams, isInfiniteScroll);\n\n }\n function setSegments(segments: string[]) {\n (dispatch as any)?.({type: 'setSegments', payload: segments});\n\n let fetchParams = {\n withProductAttributes:withProductAttributes,\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n term: state.query,\n narrowBy: state.narrow,\n sortBy: state.sortBy,\n categoryID: state.collectionID,\n segments: segments,\n searchWithinSearch:state.searchWithinSearch,\n custom_sort_settings:currentCustomSort(),\n ...getDisableFlags(state.flag),\n };\n\n fetchResults(fetchParams, isInfiniteScroll,state.isAutocomplete);\n\n }\n function setType(type: AppType) {\n (dispatch as any)?.({type: 'setType', payload: type});\n }\n\n function setCollectionID(collectionID: string) {\n (dispatch as any)?.({type: 'setCollectionID', payload: collectionID});\n (dispatch as any)?.({type: 'setIsAutocomplete', payload: false});\n\n // Create the object with the computed property\n let fetchParams = {\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n categoryID: collectionID,\n sortBy: defaultSort,\n segments: state.segments,\n custom_sort_settings:currentCustomSort(),\n ...getDisableFlags(state.flag),\n };\n\n fetchResults(fetchParams, isInfiniteScroll);\n\n }\n\n function setPage(page: number) {\n (dispatch as any)?.({type: 'setPage', payload: page});\n\n let fetchParams = {\n withProductAttributes:withProductAttributes,\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n term: state.query,\n narrowBy: state.narrow,\n sortBy: state.sortBy,\n categoryID: state.collectionID,\n page: page,\n segments: state.segments,\n searchWithinSearch:state.searchWithinSearch,\n custom_sort_settings:currentCustomSort(),\n ...getDisableFlags(state.flag),\n };\n\n fetchResults(fetchParams, isInfiniteScroll);\n\n }\n\n function setNarrow(narrow: ServerNarrow[] | undefined) {\n (dispatch as any)?.({type: 'setNarrow', payload: narrow});\n\n let fetchParams = {\n withProductAttributes:withProductAttributes,\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n term: state.query,\n narrowBy: narrow,\n sortBy: state.sortBy,\n categoryID: state.collectionID,\n segments: state.segments,\n searchWithinSearch:state.searchWithinSearch,\n custom_sort_settings:currentCustomSort(),\n ...getDisableFlags(state.flag),\n };\n\n fetchResults(fetchParams, isInfiniteScroll);\n\n }\n\n function setState({...newState}: SetStateProps) {\n (dispatch as any)?.({type: 'setState', payload: newState});\n\n fetchResults({\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n term: newState.query,\n narrowBy: newState.narrow?newState.narrow:undefined,\n sortBy: newState.sortBy ?? defaultSort,\n categoryID: newState.collectionID,\n page: newState.page,\n segments: newState.segments,\n }, Boolean(!results && isInfiniteScroll && newState.page && newState.page > 1));\n }\n\n\n function setSingleProducts(products: Product[]) {\n (dispatch as any)?.({type: \"setSingleProducts\", payload: products});\n }\n\n\n function setReady(isReady: boolean) {\n (dispatch as any)?.({type: \"setReady\", payload: isReady});\n }\n\n function setSearchWithinSearch(searchWithinSearch: string) {\n (dispatch as any)?.({type: \"setSearchWithinSearch\", payload: searchWithinSearch});\n\n let fetchParams = {\n withProductAttributes:withProductAttributes,\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n term: query,\n narrowBy: state.narrow,\n sortBy: state.sortBy,\n categoryID: state.collectionID,\n segments: state.segments,\n searchWithinSearch:searchWithinSearch,\n custom_sort_settings:currentCustomSort(),\n ...getDisableFlags(state.flag),\n };\n\n fetchResults(fetchParams, isInfiniteScroll);\n\n }\n\n function fetchResults(props:{\n uuid:string, storeID:number,siteKey?:string, term?: string, page?: number, narrowBy?: ServerNarrow[] | undefined,\n sortBy?: SortBy, categoryID?: string, searchWithinSearch?: string, segments?: string[] ,withProductAttributes?:boolean,\n disable_semantics?:number,disable_merchandising?:number,disable_strategies?:number,disable_turbolinks?:number,disable_personalization?:number,custom_sort_settings?:CustomSortSettings,\n variation_id?: string | null, force_and?: boolean\n },\n isInfiniteScroll: boolean,\n autocomplete:boolean=false) {\n\n // 1. Apply ref value first — ensures latest custom_sort_settings is used even from\n // stale closures or call sites (e.g. setState) that don't pass custom_sort_settings.\n // null means \"explicitly cleared\" → omit the param from the request.\n const refValue = customSortSettingsRef.current;\n if (refValue !== undefined) {\n const effectiveSort: CustomSortSettings | undefined = refValue === null ? undefined : refValue;\n props = { ...props, custom_sort_settings: effectiveSort };\n }\n\n // 2. Apply transform after ref — transform gets the correct base value and can\n // inject context-aware personalization_rank without stale closure issues.\n if (customSortSettingsTransform) {\n const isCollection = !!props.categoryID && !props.term;\n props = { ...props, custom_sort_settings: customSortSettingsTransform(props.custom_sort_settings, isCollection) as CustomSortSettings | undefined };\n }\n\n // on first request check if we need to fetch more then 1 product\n\n if (props.term && !autocomplete) {\n onSearch(newObject({\n ...props,\n page: props.page || 1,\n infiniteScrollPage: isInfiniteScroll,\n }) as Omit<fullTextSearchProps, \"callback\">, isInfiniteScroll);\n } else if(props.term && autocomplete){\n onAutocompleteSearch(newObject({\n ...props\n }) as Omit<autocompleteProps, \"callback\" | \"page\" | \"narrowBy\" | \"sortBy\" | \"categoryID\" | \"searchWithinSearch\" | \"custom_sort_settings\">);\n } else if (props.categoryID) {\n onCollection(newObject({\n ...props,\n page: props.page || 1,\n infiniteScrollPage: isInfiniteScroll,\n }) as Omit<smartCollectionsProps, \"callback\">, isInfiniteScroll);\n }\n\n return;\n\n }\n\n\n\n useEffect(() => {\n function handleSetQueryEvent(event: any) {\n // Support both string (legacy) and object with isAutocomplete flag\n if (typeof event.detail === 'string') {\n setQuery(event.detail);\n } else {\n setQuery(event.detail.query, event.detail.isAutocomplete);\n }\n }\n\n function handleSetFlagEvent(event: any){\n setFlag(event.details)\n\n }\n function handleSetCollectionEvent(event: any) {\n setCollectionID(typeof event.detail === 'string' ? event.detail : event.detail.collectionID);\n }\n\n function handleSetCollectionURLEvent(event: any) {\n getAllCategories().then(r => {\n const id = r.find(c => c.u === event.detail)?.id;\n\n if (id) {\n setCollectionID(id);\n return;\n }\n\n window.location.href = event.detail;\n })\n }\n\n function handleSetPageEvent(event: any) {\n setPage(event.detail);\n }\n\n function handleSetSortEvent(event: any) {\n setSortBy(event.detail);\n }\n\n function handleSetNarrowEvent(event: any) {\n setNarrow(event.detail);\n }\n\n function handleSetSegmentsEvent(event: any) {\n setSegments(event.detail);\n }\n function handleSetIsAutocomplete(event:any){\n setIsAutocomplete(event.detail)\n }\n window.addEventListener('fast-simon-update-query', handleSetQueryEvent);\n window.addEventListener('fast-simon-update-collection', handleSetCollectionEvent);\n window.addEventListener('fast-simon-update-collection-url', handleSetCollectionURLEvent);\n window.addEventListener('fast-simon-update-page', handleSetPageEvent);\n window.addEventListener('fast-simon-update-sort', handleSetSortEvent);\n window.addEventListener('fast-simon-update-narrow', handleSetNarrowEvent);\n window.addEventListener('fast-simon-update-segments', handleSetSegmentsEvent);\n window.addEventListener('fast-simon-update-flag', handleSetFlagEvent);\n window.addEventListener('fast-simon-update-is-autocomplete', handleSetIsAutocomplete);\n\n return () => {\n window.removeEventListener('fast-simon-update-query', handleSetQueryEvent);\n window.removeEventListener('fast-simon-update-collection', handleSetCollectionEvent);\n window.removeEventListener('fast-simon-update-collection-url', handleSetCollectionURLEvent);\n window.removeEventListener('fast-simon-update-page', handleSetPageEvent);\n window.removeEventListener('fast-simon-update-sort', handleSetSortEvent);\n window.removeEventListener('fast-simon-update-narrow', handleSetNarrowEvent);\n window.removeEventListener('fast-simon-update-segments', handleSetSegmentsEvent);\n window.removeEventListener('fast-simon-update-flag', handleSetFlagEvent);\n window.removeEventListener('fast-simon-update-is-autocomplete', handleSetIsAutocomplete);\n }\n\n }, []);\n\n // Settings modal refetch: triggered after state is updated (no race conditions)\n // All settings (force_and, flags, custom_sort, user_segment_preview, personalization_preview)\n // are batched via updateSettingsAndRefetch to avoid double-fetches and stale-state reads.\n useEffect(() => {\n if (!state.refetchTrigger) return;\n // Build fetchParams from the now-updated state\n const fetchParams = {\n siteKey: siteKey,\n uuid: uuid,\n storeID: storeID,\n term: state.query,\n narrowBy: state.narrow,\n sortBy: state.sortBy ?? defaultSort,\n categoryID: state.collectionID,\n segments: state.segments,\n withProductAttributes: withProductAttributes,\n searchWithinSearch: state.searchWithinSearch,\n custom_sort_settings: currentCustomSort(),\n ...getDisableFlags(state.flag ?? []),\n variation_id: state.variation_id,\n force_and: state.force_and,\n };\n fetchResults(fetchParams, isInfiniteScroll, state.isAutocomplete);\n }, [state.refetchTrigger]);\n\n const onSearch = (props: Omit<fullTextSearchProps, \"callback\">, isInfiniteScroll: boolean) => {\n setIsLoading({products: true, filters: true});\n\n // Clear previous comparison data when starting new search\n setComparisonData(null);\n\n const currentQuery = props.term || '';\n const currentForceAnalytics = forceProductAnalytics || getShowSalesAnalyticsSetting();\n const shouldFetchAnalytics = currentForceAnalytics || (isAnalyticsEnabled && (currentQuery !== lastAnalyticsQuery || lastAnalyticsMode !== 'search'));\n\n // Check if hybrid search is enabled - we'll need to make a comparison call\n const isHybridEnabled = getLSVectorSearchOn();\n\n const personalizationSegment = getPersonalizationSegment(userSegmentPreviewRef.current);\n const personalizationParams = buildPersonalizationParams(\n personalizationPreviewRef.current ?? {enabled: false, spvJson: '', types: ['gender']}\n );\n\n // Increment staleness counter and clear pending analytics\n const requestId = ++searchRequestCounterRef.current;\n pendingAnalyticsRef.current = null;\n let fastRankingResponse: any = null;\n\n const commonRequestParams = {\n ...props,\n withAttributes: promoTiles || withProductAttributes,\n market_context: marketContext,\n variation_id: state.variation_id,\n force_and: state.force_and,\n ps: personalizationSegment,\n spv: personalizationParams.spv,\n personalization: personalizationParams.personalization,\n session_token: state.session_token\n };\n\n // Fire analytics request in parallel (fire-and-forget) — only if analytics needed\n if (shouldFetchAnalytics) {\n FullTextSearch.getReasoningFullTextSearch({\n ...commonRequestParams,\n with_product_analytics: true,\n facetRequired: 0,\n }).then(analyticsResponse => {\n if (searchRequestCounterRef.current !== requestId) return; // stale\n\n if (analyticsResponse.analytics?.badges) {\n setAnalyticsFetched(true);\n setLastAnalyticsQuery(currentQuery);\n setLastAnalyticsMode('search');\n }\n\n const productAnalyticsMap: Record<string, ProductAnalytics> = {};\n const items = (analyticsResponse as any).items || analyticsResponse.products || [];\n for (const product of items) {\n if (product.analytics) {\n productAnalyticsMap[String(product.id)] = product.analytics;\n }\n }\n\n const payload = buildAnalyticsPayload(analyticsResponse, productAnalyticsMap);\n if (fastRankingResponse\n && !analyticsMatchesRankingSnapshot(payload, fastRankingResponse)) {\n pendingAnalyticsRef.current = null;\n console.warn('[Analytics] Discarded search analytics from a different RPI snapshot.');\n return;\n }\n pendingAnalyticsRef.current = payload;\n dispatchMergeAnalytics(payload);\n }).catch(err => {\n console.error(\"[Analytics] Failed to fetch search analytics:\", err);\n });\n }\n\n // Fire fast request WITHOUT analytics\n FullTextSearch.getReasoningFullTextSearch({\n ...commonRequestParams,\n with_product_analytics: false,\n }).then(async(response) => {\n fastRankingResponse = response;\n attachPersonalizationToItems(response);\n // Don't preserve stale analytics when fetching fresh ones\n const existingAnalytics = shouldFetchAnalytics ? undefined : (results as any)?.analytics;\n const existingMatchingSets = shouldFetchAnalytics ? undefined : (results as any)?.matching_sets;\n const existingGroupStrategy = shouldFetchAnalytics ? undefined : (results as any)?.group_strategy;\n const existingVarietyStrategy = shouldFetchAnalytics ? undefined : (results as any)?.variety_strategy;\n response=getFormatedData(response, existingAnalytics, existingMatchingSets, existingGroupStrategy, existingVarietyStrategy);\n\n // Handle turbolink responses - skip additional API calls to prevent errors\n if (response.turbolink && response.totalResults === 0) {\n mergeResults(response, isInfiniteScroll);\n\n if (!customTitleChange) {\n document.title = `Search Result for ${query}`;\n } else {\n customTitleChange(results);\n }\n\n setIsLoading({filters: false, products: false});\n return;\n }\n\n // Show products immediately\n mergeResults(response, isInfiniteScroll);\n setIsLoading({products: false, filters: true});\n\n // If analytics arrived before fast response, re-apply to new results\n if (pendingAnalyticsRef.current && searchRequestCounterRef.current === requestId) {\n if (analyticsMatchesRankingSnapshot(pendingAnalyticsRef.current, response)) {\n dispatchMergeAnalytics(pendingAnalyticsRef.current);\n } else {\n pendingAnalyticsRef.current = null;\n console.warn('[Analytics] Discarded search analytics from a different RPI snapshot.');\n }\n }\n\n // Fire IDs + facets in parallel (previously sequential)\n const listIdRequestProps = { ...props };\n listIdRequestProps.searchWithinSearch=undefined;\n listIdRequestProps.productsPerPage=1000000;\n listIdRequestProps.page=1;\n listIdRequestProps.market_context = marketContext;\n listIdRequestProps.variation_id = state.variation_id;\n listIdRequestProps.force_and = state.force_and;\n listIdRequestProps.ps = personalizationSegment;\n listIdRequestProps.spv = personalizationParams.spv;\n listIdRequestProps.personalization = personalizationParams.personalization;\n listIdRequestProps.session_token = state.session_token;\n\n const facetsRequestProps = { ...props };\n facetsRequestProps.facetRequired=2;\n facetsRequestProps.searchWithinSearch=props.searchWithinSearch;\n facetsRequestProps.productsPerPage=props.productsPerPage;\n facetsRequestProps.page=props.page;\n facetsRequestProps.market_context = marketContext;\n facetsRequestProps.variation_id = state.variation_id;\n facetsRequestProps.force_and = state.force_and;\n facetsRequestProps.ps = personalizationSegment;\n facetsRequestProps.spv = personalizationParams.spv;\n facetsRequestProps.personalization = personalizationParams.personalization;\n\n const [listIdRes, facetsRes] = await Promise.all([\n FullTextSearch.getReasoningFullTextSearchProductsIds(listIdRequestProps),\n FullTextSearch.getReasoningFullTextSearch(facetsRequestProps)\n ]);\n\n // Merge IDs and complete facets into existing results\n mergeResultsKeepProduct({id_list: listIdRes.id_list, facets: facetsRes.facets} as any);\n\n if (!customTitleChange) {\n document.title = `Search Result for ${query}`;\n } else {\n customTitleChange(results);\n }\n\n setIsLoading({filters: false, products: false});\n\n // Compare Mode: Make comparison call using IDs endpoint if hybrid search is enabled\n console.log(\"[Compare Mode] isHybridEnabled:\", isHybridEnabled, \"hasIdList:\", !!listIdRes.id_list);\n if (isHybridEnabled && listIdRes.id_list && listIdRes.id_list.length > 0) {\n setIsComparing(true);\n console.log(\"[Compare Mode] Making comparison IDs call...\");\n try {\n // Get all IDs WITHOUT hybrid_search_settings\n const comparisonResponse = await FullTextSearch.getComparisonProductIds({\n ...props,\n market_context: marketContext,\n variation_id: state.variation_id,\n force_and: state.force_and,\n ps: personalizationSegment,\n spv: personalizationParams.spv,\n personalization: personalizationParams.personalization\n });\n\n const hybridOffIds = (comparisonResponse.id_list || []).map(id => id.toString());\n const hybridOnIds = (listIdRes.id_list || []).map(id => id.toString());\n console.log(\"[Compare Mode] Hybrid ON IDs count:\", hybridOnIds.length);\n console.log(\"[Compare Mode] Hybrid OFF IDs count:\", hybridOffIds.length);\n\n if (hybridOffIds.length > 0) {\n const diff = computeComparisonFromIds(hybridOnIds, hybridOffIds);\n console.log(\"[Compare Mode] Diff computed - improved:\", diff.totalImproved, \"declined:\", diff.totalDeclined, \"new:\", diff.totalNew);\n setComparisonData(diff);\n }\n } catch (error) {\n console.error(\"[Compare Mode] Failed to fetch comparison IDs:\", error);\n setComparisonData(null);\n } finally {\n setIsComparing(false);\n }\n }\n });\n }\n const onAutocompleteSearch = (props: Omit<autocompleteProps, \"callback\">) => {\n setIsLoading({products: true, filters: true});\n const personalizationSegment = getPersonalizationSegment(userSegmentPreviewRef.current);\n const personalizationParams = buildPersonalizationParams(\n personalizationPreviewRef.current ?? {enabled: false, spvJson: '', types: ['gender']}\n );\n\n Autocomplete.getAutocompleteReasoning({\n ...props,\n withAttributes: promoTiles || withProductAttributes,\n market_context: marketContext,\n variation_id: state.variation_id,\n force_and: state.force_and,\n ps: personalizationSegment,\n spv: personalizationParams.spv,\n personalization: personalizationParams.personalization\n }).then(async(response) => {\n response=getFormatedData(response);\n\n mergeResults(response, false);\n\n if (!customTitleChange) {\n document.title = `Autocomplete Result for ${query}`;\n } else {\n customTitleChange(results);\n }\n\n if (!response) {\n setIsLoading({\n filters: true, products: false\n });\n } else {\n setIsLoading({\n filters: false, products: false\n });\n }\n });\n }\n\n const onCollection = (props: Omit<smartCollectionsProps, \"callback\">, isInfiniteScroll: boolean) => {\n setIsLoading({products: true, filters: true});\n\n const currentCollection = props.categoryID || '';\n const currentForceAnalytics = forceProductAnalytics || getShowSalesAnalyticsSetting();\n const shouldFetchAnalytics = currentForceAnalytics || (isAnalyticsEnabled && (currentCollection !== lastAnalyticsCollection || lastAnalyticsMode !== 'collection'));\n\n const personalizationSegment = getPersonalizationSegment(userSegmentPreviewRef.current);\n const personalizationParams = buildPersonalizationParams(\n personalizationPreviewRef.current ?? {enabled: false, spvJson: '', types: ['gender']}\n );\n\n // Increment staleness counter and clear pending analytics\n const requestId = ++searchRequestCounterRef.current;\n pendingAnalyticsRef.current = null;\n let fastRankingResponse: any = null;\n\n const commonRequestParams = {\n ...props,\n withAttributes: promoTiles || withProductAttributes,\n market_context: marketContext,\n variation_id: state.variation_id,\n ps: personalizationSegment,\n spv: personalizationParams.spv,\n\n spc: personalizationParams.spc,\n personalization: personalizationParams.personalization,\n force_and: state.force_and,\n session_token: state.session_token\n };\n\n // Fire analytics request in parallel (fire-and-forget) — only if analytics needed\n if (shouldFetchAnalytics) {\n SmartCollections.getSmartCollections({\n ...commonRequestParams,\n with_product_analytics: true,\n facetRequired: 0,\n }).then(analyticsResponse => {\n if (searchRequestCounterRef.current !== requestId) return; // stale\n\n if (analyticsResponse.analytics?.badges) {\n setAnalyticsFetched(true);\n setLastAnalyticsCollection(currentCollection);\n setLastAnalyticsMode('collection');\n }\n\n const productAnalyticsMap: Record<string, ProductAnalytics> = {};\n const items = (analyticsResponse as any).items || analyticsResponse.products || [];\n for (const product of items) {\n if (product.analytics) {\n productAnalyticsMap[String(product.id)] = product.analytics;\n }\n }\n\n const payload = buildAnalyticsPayload(analyticsResponse, productAnalyticsMap);\n if (fastRankingResponse\n && !analyticsMatchesRankingSnapshot(payload, fastRankingResponse)) {\n pendingAnalyticsRef.current = null;\n console.warn('[Analytics] Discarded collection analytics from a different RPI snapshot.');\n return;\n }\n pendingAnalyticsRef.current = payload;\n dispatchMergeAnalytics(payload);\n }).catch(err => {\n console.error(\"[Analytics] Failed to fetch collection analytics:\", err);\n });\n }\n\n // Fire fast request WITHOUT analytics\n SmartCollections.getSmartCollections({\n ...commonRequestParams,\n with_product_analytics: false,\n }).then(async (response) => {\n fastRankingResponse = response;\n attachPersonalizationToItems(response);\n\n // Don't preserve stale analytics when fetching fresh ones\n const existingAnalytics = shouldFetchAnalytics ? undefined : (results as any)?.analytics;\n const existingMatchingSets = shouldFetchAnalytics ? undefined : (results as any)?.matching_sets;\n const existingGroupStrategy = shouldFetchAnalytics ? undefined : (results as any)?.group_strategy;\n const existingVarietyStrategy = shouldFetchAnalytics ? undefined : (results as any)?.variety_strategy;\n response=getFormatedData(response, existingAnalytics, existingMatchingSets, existingGroupStrategy, existingVarietyStrategy);\n\n // Show products immediately\n mergeResults(response, isInfiniteScroll);\n setIsLoading({products: false, filters: true});\n\n // If analytics arrived before fast response, re-apply to new results\n if (pendingAnalyticsRef.current && searchRequestCounterRef.current === requestId) {\n if (analyticsMatchesRankingSnapshot(pendingAnalyticsRef.current, response)) {\n dispatchMergeAnalytics(pendingAnalyticsRef.current);\n } else {\n pendingAnalyticsRef.current = null;\n console.warn('[Analytics] Discarded collection analytics from a different RPI snapshot.');\n }\n }\n\n // Fire IDs + facets in parallel (previously sequential)\n const listIdRequestProps = { ...props };\n listIdRequestProps.searchWithinSearch=undefined;\n listIdRequestProps.productsPerPage=1000000;\n listIdRequestProps.page=1;\n listIdRequestProps.market_context = marketContext;\n listIdRequestProps.variation_id = state.variation_id;\n listIdRequestProps.force_and = state.force_and;\n listIdRequestProps.ps = personalizationSegment;\n listIdRequestProps.spv = personalizationParams.spv;\n listIdRequestProps.spc = personalizationParams.spc;\n listIdRequestProps.personalization = personalizationParams.personalization;\n listIdRequestProps.session_token = state.session_token;\n\n const facetsRequestProps = { ...props };\n facetsRequestProps.facetRequired=2;\n facetsRequestProps.searchWithinSearch=props.searchWithinSearch;\n facetsRequestProps.productsPerPage=props.productsPerPage;\n facetsRequestProps.page=props.page;\n facetsRequestProps.market_context = marketContext;\n facetsRequestProps.variation_id = state.variation_id;\n facetsRequestProps.force_and = state.force_and;\n facetsRequestProps.ps = personalizationSegment;\n facetsRequestProps.spv = personalizationParams.spv;\n facetsRequestProps.spc = personalizationParams.spc;\n facetsRequestProps.personalization = personalizationParams.personalization;\n\n const [listIdRes, facetsRes] = await Promise.all([\n SmartCollections.getSmartCollectionsProductsIds(listIdRequestProps),\n SmartCollections.getSmartCollections(facetsRequestProps)\n ]);\n\n // Merge IDs and complete facets into existing results\n mergeResultsKeepProduct({id_list: listIdRes.id_list, facets: facetsRes.facets} as any);\n\n setIsLoading({filters: false, products: false});\n\n getAllCategories().then(r => {\n if (!customTitleChange) {\n document.title = r.find(c => c.id === props.categoryID)?.l ?? \"Collection\";\n } else {\n customTitleChange(results);\n }\n });\n });\n }\n\n // Memoize to prevent unnecessary recreation\n const getAllCategories = useCallback(async () => {\n if (categories.length > 0) {\n return new Promise<FastCategory[]>(resolve => resolve(categories))\n }\n\n const data = categories || [];\n\n setCategories(data)\n\n return data;\n }, [categories]);\n\n const getFormatedData = (response: any, existingAnalytics?: any, existingMatchingSets?: any, existingGroupStrategy?: any, existingVarietyStrategy?: any) => {\n const results = response;\n\n results.products = response.items;\n delete results.items;\n results.totalResults = response.total_results;\n delete results.total_results;\n if (response.sort_by) {\n results.sortBy = response.sort_by;\n delete results.sort_by;\n }\n\n if (response.pop_products_no_results) {\n results.isNoResults = true;\n }\n\n if (response.total_p) {\n results.pageCount = response.total_p;\n delete results.total_p;\n }\n\n\n if (response.ancestor_categories) {\n results.ancestors = response.ancestor_categories;\n delete results.ancestor_categories;\n }\n\n if (response.avoid_tag_prefixes) {\n results.avoidPrefixList = response.avoid_tag_prefixes.split(\",\");\n }\n\n\n results.page = response.p || 1;\n delete results.p;\n\n // Preserve analytics field if present (contains winners/overexposed data)\n // If response has new analytics, use it; otherwise keep existing analytics\n if (response.analytics) {\n results.analytics = response.analytics;\n } else if (existingAnalytics) {\n results.analytics = existingAnalytics;\n }\n\n // Preserve matching_sets field if present (product ID -> set name)\n // If response has new matching_sets, use it; otherwise keep existing\n if (response.matching_sets) {\n results.matching_sets = response.matching_sets;\n } else if (existingMatchingSets) {\n results.matching_sets = existingMatchingSets;\n }\n\n if (response.group_strategy) {\n results.group_strategy = response.group_strategy;\n } else if (existingGroupStrategy) {\n results.group_strategy = existingGroupStrategy;\n }\n if (response.variety_strategy) {\n results.variety_strategy = response.variety_strategy;\n } else if (existingVarietyStrategy) {\n results.variety_strategy = existingVarietyStrategy;\n }\n\n if (results.personalized_products?.length) {\n const context = results.category_name\n ? `Collection: ${results.category_name}`\n : state.query\n ? `Search: \"${state.query}\"`\n : 'Unknown context';\n console.log(`[Personalized Products] ${context}`, results.personalized_products);\n }\n\n return results;\n };\n\n\n // Memoize state context to prevent unnecessary re-renders\n const stateContextValue = useMemo(() => ({\n narrow,\n results,\n page,\n query,\n sortBy,\n type,\n collectionID,\n isLoading,\n recommendations,\n singleProducts,\n isReady,\n autocomplete,\n isAutocomplete,\n variation_id: state.variation_id,\n force_and: state.force_and,\n flag: state.flag,\n comparisonData: state.comparisonData,\n isComparing: state.isComparing\n }), [narrow, results, page, query, sortBy, type, collectionID, isLoading, recommendations, singleProducts, isReady, autocomplete, isAutocomplete, state.variation_id, state.force_and, state.flag, state.comparisonData, state.isComparing]);\n\n // Memoize theme to prevent unnecessary object creation\n const mergedTheme = useMemo(() => ({...mainTheme, ...theme}), [theme]);\n\n // @ts-ignore\n return (\n <FastStateFunctions.Provider\n value={{\n setQuery,\n setSort: setSortBy,\n setNarrow,\n setPage,\n getAllCategories,\n setCollection: setCollectionID,\n setState,\n setSearchWithinSearch,\n setSegments,\n setFlag,\n setCustomSort,\n setIsAutocomplete,\n setVariationId,\n setForceAnd,\n setUserSegmentPreview,\n setPersonalizationPreview,\n updateSettingsAndRefetch\n }}>\n <FastState.Provider value={stateContextValue}>\n <ThemeProvider theme={mergedTheme}>\n {children}\n </ThemeProvider>\n </FastState.Provider>\n </FastStateFunctions.Provider>\n )\n};\n\n// Memoize component to prevent unnecessary re-renders when parent updates\nexport default React.memo(FastSimonApi);\n"]}
@@ -151,6 +151,13 @@ export declare function fastStateReducer(state: FastStateProps, action: FastStat
151
151
  query_understanding?: import("../../@types/results").QueryUnderstanding | undefined;
152
152
  reformulation_source?: string | undefined;
153
153
  request_url?: string | undefined;
154
+ rpi_methodology_assigned?: string | null | undefined;
155
+ rpi_methodology_effective?: string | null | undefined;
156
+ rpi_methodology_fallback_reason?: string | null | undefined;
157
+ rpi_snapshot_computed_at?: string | null | undefined;
158
+ rpi_snapshot_covered_until?: string | null | undefined;
159
+ rpi_candidate_available?: boolean | undefined;
160
+ rpi_candidate_unavailable_reason?: string | null | undefined;
154
161
  facets: import("../../@types/facets").Facet[];
155
162
  total_results: number;
156
163
  facets_completed?: boolean | undefined;
@@ -200,6 +207,13 @@ export declare function fastStateReducer(state: FastStateProps, action: FastStat
200
207
  query_understanding?: import("../../@types/results").QueryUnderstanding | undefined;
201
208
  reformulation_source?: string | undefined;
202
209
  request_url?: string | undefined;
210
+ rpi_methodology_assigned?: string | null | undefined;
211
+ rpi_methodology_effective?: string | null | undefined;
212
+ rpi_methodology_fallback_reason?: string | null | undefined;
213
+ rpi_snapshot_computed_at?: string | null | undefined;
214
+ rpi_snapshot_covered_until?: string | null | undefined;
215
+ rpi_candidate_available?: boolean | undefined;
216
+ rpi_candidate_unavailable_reason?: string | null | undefined;
203
217
  } | {
204
218
  products: import("../../@types/product").ServerProduct[];
205
219
  alternatives?: string[] | undefined;
@@ -239,6 +253,13 @@ export declare function fastStateReducer(state: FastStateProps, action: FastStat
239
253
  query_understanding?: import("../../@types/results").QueryUnderstanding | undefined;
240
254
  reformulation_source?: string | undefined;
241
255
  request_url?: string | undefined;
256
+ rpi_methodology_assigned?: string | null | undefined;
257
+ rpi_methodology_effective?: string | null | undefined;
258
+ rpi_methodology_fallback_reason?: string | null | undefined;
259
+ rpi_snapshot_computed_at?: string | null | undefined;
260
+ rpi_snapshot_covered_until?: string | null | undefined;
261
+ rpi_candidate_available?: boolean | undefined;
262
+ rpi_candidate_unavailable_reason?: string | null | undefined;
242
263
  facets: import("../../@types/facets").Facet[];
243
264
  total_results: number;
244
265
  facets_completed?: boolean | undefined;
@@ -288,6 +309,13 @@ export declare function fastStateReducer(state: FastStateProps, action: FastStat
288
309
  query_understanding?: import("../../@types/results").QueryUnderstanding | undefined;
289
310
  reformulation_source?: string | undefined;
290
311
  request_url?: string | undefined;
312
+ rpi_methodology_assigned?: string | null | undefined;
313
+ rpi_methodology_effective?: string | null | undefined;
314
+ rpi_methodology_fallback_reason?: string | null | undefined;
315
+ rpi_snapshot_computed_at?: string | null | undefined;
316
+ rpi_snapshot_covered_until?: string | null | undefined;
317
+ rpi_candidate_available?: boolean | undefined;
318
+ rpi_candidate_unavailable_reason?: string | null | undefined;
291
319
  alternatives?: string[] | undefined;
292
320
  term: string;
293
321
  cms_number_found?: number | undefined;
@@ -343,6 +371,13 @@ export declare function fastStateReducer(state: FastStateProps, action: FastStat
343
371
  query_understanding?: import("../../@types/results").QueryUnderstanding | undefined;
344
372
  reformulation_source?: string | undefined;
345
373
  request_url?: string | undefined;
374
+ rpi_methodology_assigned?: string | null | undefined;
375
+ rpi_methodology_effective?: string | null | undefined;
376
+ rpi_methodology_fallback_reason?: string | null | undefined;
377
+ rpi_snapshot_computed_at?: string | null | undefined;
378
+ rpi_snapshot_covered_until?: string | null | undefined;
379
+ rpi_candidate_available?: boolean | undefined;
380
+ rpi_candidate_unavailable_reason?: string | null | undefined;
346
381
  facets: import("../../@types/facets").Facet[];
347
382
  total_results: number;
348
383
  facets_completed?: boolean | undefined;
@@ -398,6 +433,13 @@ export declare function fastStateReducer(state: FastStateProps, action: FastStat
398
433
  query_understanding?: import("../../@types/results").QueryUnderstanding | undefined;
399
434
  reformulation_source?: string | undefined;
400
435
  request_url?: string | undefined;
436
+ rpi_methodology_assigned?: string | null | undefined;
437
+ rpi_methodology_effective?: string | null | undefined;
438
+ rpi_methodology_fallback_reason?: string | null | undefined;
439
+ rpi_snapshot_computed_at?: string | null | undefined;
440
+ rpi_snapshot_covered_until?: string | null | undefined;
441
+ rpi_candidate_available?: boolean | undefined;
442
+ rpi_candidate_unavailable_reason?: string | null | undefined;
401
443
  } | {
402
444
  products: import("../../@types/product").ServerProduct[];
403
445
  alternatives?: string[] | undefined;
@@ -437,6 +479,13 @@ export declare function fastStateReducer(state: FastStateProps, action: FastStat
437
479
  query_understanding?: import("../../@types/results").QueryUnderstanding | undefined;
438
480
  reformulation_source?: string | undefined;
439
481
  request_url?: string | undefined;
482
+ rpi_methodology_assigned?: string | null | undefined;
483
+ rpi_methodology_effective?: string | null | undefined;
484
+ rpi_methodology_fallback_reason?: string | null | undefined;
485
+ rpi_snapshot_computed_at?: string | null | undefined;
486
+ rpi_snapshot_covered_until?: string | null | undefined;
487
+ rpi_candidate_available?: boolean | undefined;
488
+ rpi_candidate_unavailable_reason?: string | null | undefined;
440
489
  facets: import("../../@types/facets").Facet[];
441
490
  total_results: number;
442
491
  facets_completed?: boolean | undefined;
@@ -489,6 +538,13 @@ export declare function fastStateReducer(state: FastStateProps, action: FastStat
489
538
  query_understanding?: import("../../@types/results").QueryUnderstanding | undefined;
490
539
  reformulation_source?: string | undefined;
491
540
  request_url?: string | undefined;
541
+ rpi_methodology_assigned?: string | null | undefined;
542
+ rpi_methodology_effective?: string | null | undefined;
543
+ rpi_methodology_fallback_reason?: string | null | undefined;
544
+ rpi_snapshot_computed_at?: string | null | undefined;
545
+ rpi_snapshot_covered_until?: string | null | undefined;
546
+ rpi_candidate_available?: boolean | undefined;
547
+ rpi_candidate_unavailable_reason?: string | null | undefined;
492
548
  auto_facets?: boolean | undefined;
493
549
  isp_quick_view_mode?: number | undefined;
494
550
  term: string;
@@ -1 +1 @@
1
- {"version":3,"file":"reducer.js","sourceRoot":"","sources":["../../../src/components/FastSimonApi/reducer.ts"],"names":[],"mappings":"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","sourcesContent":["import {ComparisonData, CustomSortSettings, FastStateProps, IsLoading} from \"./context\";\nimport {PersonalizationPreviewSettings} from \"../../utils/personalizationPreview\";\nimport {AppType} from \"./FastSimonApi\";\nimport {SortBy} from \"../../@types/sortBy\";\nimport {FullTextServerResponseAll} from \"../../@types/results\";\nimport {smartCollectionsResults} from \"../../@types/categories\";\nimport {Narrow, ServerNarrow} from \"../../@types/narrow\";\nimport {PersonalizationStory, Product, ProductAnalytics} from \"../../@types/product\";\n\nimport {Widget} from \"../../@types/widget\";\nimport {AutocompleteReasoningResponse, AutocompleteResults} from \"../../@types/autocomplete\";\n\ntype FastStateAction =\n | { type: 'setReady', payload: boolean }\n | { type: 'setType', payload: AppType }\n | { type: 'setPage', payload: number }\n | { type: 'setQuery', payload: string }\n | { type: 'setSortBy', payload: SortBy }\n | { type: 'setIsLoading', payload: IsLoading }\n | { type: 'setCollectionID', payload: string }\n | { type: 'setNarrow', payload: ServerNarrow[] | undefined }\n | { type: 'setResults', payload: FullTextServerResponseAll | smartCollectionsResults | AutocompleteReasoningResponse | undefined }\n | { type: 'mergeResults', payload: { results: FullTextServerResponseAll | smartCollectionsResults | AutocompleteReasoningResponse, infiniteScroll: boolean } }\n | { type: 'mergeFacetsWithResults', payload:Narrow[] }\n | { type: 'mergeResultsKeepProduct', payload: { results: FullTextServerResponseAll | smartCollectionsResults } }\n | { type: 'setState', payload: Partial<FastStateProps> }\n | { type: 'setRecommendations', payload: { id: string, widget: Widget } }\n | { type: 'setSingleProducts', payload: Product[] }\n | { type: 'setIsAutocomplete', payload: boolean }\n | { type: 'setAutocomplete', payload: AutocompleteResults }\n | { type: 'setSearchWithinSearch', payload: string }\n | { type: 'setSegments', payload: string[] }\n | { type: 'setFlag', payload: string[] }\n | { type: 'setCustomSort',payload:CustomSortSettings}\n | { type: 'setVariationId', payload: string | null }\n | { type: 'setForceAnd', payload: boolean }\n | { type: 'setUserSegmentPreview', payload: 'none' | 'new' | 'returning' }\n | { type: 'setComparisonData', payload: ComparisonData | null }\n | { type: 'setIsComparing', payload: boolean }\n | { type: 'setPersonalizationPreview', payload: PersonalizationPreviewSettings | null }\n | { type: 'mergeAnalyticsData', payload: {\n analytics?: FullTextServerResponseAll['analytics'],\n matching_sets?: Record<string, string>,\n group_strategy?: Record<string, string>,\n variety_strategy?: number[],\n productAnalyticsMap?: Record<string, ProductAnalytics>,\n personalizationStoryMap?: Record<string, PersonalizationStory>\n }}\n | { type: 'updateSettingsAndRefetch', payload: Partial<Pick<FastStateProps, 'force_and' | 'custom_sort_settings' | 'flag' | 'user_segment_preview' | 'personalization_preview' | 'session_token'>> }\n\n\n\nexport function fastStateReducer(state: FastStateProps, action: FastStateAction) {\n switch (action.type) {\n case \"setReady\":\n return {...state, isReady: action.payload}\n\n case 'setType':\n return {...state, type: action.payload};\n\n case 'setPage':\n return {...state, page: action.payload};\n\n case 'setQuery':\n return {...state, query: action.payload, collectionID: undefined, page: 1, narrow: undefined, searchWithinSearch: undefined, sortBy:undefined};\n\n case 'setSortBy':\n return {...state, sortBy: action.payload, page: 1};\n\n case 'setSegments':\n return {...state, segments: action.payload, page: 1};\n\n case 'setIsLoading':\n return {...state, isLoading: action.payload};\n\n case 'setCollectionID':\n return {...state, collectionID: action.payload, query: \"\", page: 1, narrow: undefined, searchWithinSearch: undefined , sortBy:undefined};\n\n case 'setNarrow':\n return {...state, narrow: action.payload, page: 1};\n\n case 'setResults':\n return {...state, results: {isNoResults: false, ...action.payload}} as FastStateProps;\n\n case 'mergeResultsKeepProduct': {\n return {...state, results: {...state.results, ...action.payload.results, products: state.results?.products || []}};\n }\n\n case 'mergeFacetsWithResults':{\n return {...state, narrow: action.payload};\n }\n\n case 'mergeResults': {\n // Don't adopt the sort the server echoes back. sortBy should reflect only the caller's\n // intent — the initial defaultSort prop (FastSimonApi) plus the user's explicit\n // setSortBy, reset by setQuery/setCollectionID. Adopting the echo locked the\n // server-resolved sort in as an explicit sort_by that was then re-sent on pagination,\n // overriding the site default and resetting a user-chosen sort on the next page. Where\n // no defaultSort is passed (e.g. the AI Explainer) sortBy stays undefined until the user\n // picks, so requests omit sort_by and the server keeps applying the site default.\n // See AI Explainer sort bugs.\n if (!action.payload.infiniteScroll) {\n return {...state, results: { ...action.payload.results}} as FastStateProps;\n }\n\n const products = state.results?.products ?? [];\n const newProducts = action.payload.results.products ?? [];\n\n // Optimize: Use Set for O(1) lookup instead of O(n) find() - prevents O(n²)\n const existingIds = new Set(products.map(p => p.id));\n const uniqueNewProducts = newProducts.filter(p => !existingIds.has(p.id));\n\n // Only merge if there are actually new products\n if (uniqueNewProducts.length > 0) {\n return {\n ...state,\n results: {...state.results, isNoResults: false, ...action.payload.results, products: [...products, ...uniqueNewProducts]}\n } as FastStateProps;\n }\n\n return {\n ...state,\n results: {...state.results, isNoResults: false, ...action.payload.results, products: products}\n } as FastStateProps;\n\n }\n\n case 'setState': {\n if (action.payload.query) {\n return {...state, ...action.payload, collectionID: undefined, searchWithinSearch: undefined, segments: undefined}\n } else {\n return {...state, ...action.payload, query: \"\", searchWithinSearch: undefined, segments: undefined};\n }\n }\n\n case \"setRecommendations\": {\n return {\n ...state,\n recommendations: {\n ...state.recommendations,\n [action.payload.id]: action.payload.widget\n }\n }\n }\n\n case \"setSingleProducts\": {\n const products: { [id: string]: Product } = {...state.singleProducts};\n\n for (const product of action.payload) {\n products[product.id] = product;\n }\n\n return {...state, singleProducts: products}\n }\n case \"setIsAutocomplete\":{\n return {...state, isAutocomplete: action.payload}\n }\n\n case \"setAutocomplete\": {\n return {...state, autocomplete: action.payload}\n }\n\n case \"setSearchWithinSearch\": {\n return {...state, searchWithinSearch: action.payload}\n }\n case 'setFlag':\n return {...state, flag: action.payload};\n\n case 'setCustomSort':\n return {...state, custom_sort_settings: action.payload};\n\n case 'setVariationId':\n return {...state, variation_id: action.payload};\n\n case 'setForceAnd':\n return {...state, force_and: action.payload};\n\n case 'setUserSegmentPreview':\n return {...state, user_segment_preview: action.payload};\n\n case 'setComparisonData':\n return {...state, comparisonData: action.payload};\n\n case 'setIsComparing':\n return {...state, isComparing: action.payload};\n\n case 'setPersonalizationPreview':\n return {...state, personalization_preview: action.payload};\n\n case 'mergeAnalyticsData': {\n if (!state.results || !state.results.products) return state;\n\n const updatedResults = { ...state.results };\n\n if (action.payload.analytics) {\n (updatedResults as any).analytics = action.payload.analytics;\n }\n\n if (action.payload.matching_sets) {\n (updatedResults as any).matching_sets = action.payload.matching_sets;\n }\n\n if (action.payload.group_strategy) {\n (updatedResults as any).group_strategy = action.payload.group_strategy;\n }\n\n if (action.payload.variety_strategy) {\n (updatedResults as any).variety_strategy = action.payload.variety_strategy;\n }\n\n if (action.payload.productAnalyticsMap || action.payload.personalizationStoryMap) {\n const analyticsMap = action.payload.productAnalyticsMap;\n const storyMap = action.payload.personalizationStoryMap;\n updatedResults.products = updatedResults.products.map(product => {\n const pid = String(product.id);\n const productAnalytics = analyticsMap?.[pid];\n const productStory = storyMap?.[pid];\n if (!productAnalytics && !productStory) return product;\n const next = { ...product };\n if (productAnalytics) next.analytics = productAnalytics;\n if (productStory) next.personalization_story = productStory;\n return next;\n });\n }\n\n return { ...state, results: updatedResults } as FastStateProps;\n }\n\n case 'updateSettingsAndRefetch':\n return {...state, ...action.payload, refetchTrigger: (state.refetchTrigger ?? 0) + 1};\n\n }\n}\n\n"]}
1
+ {"version":3,"file":"reducer.js","sourceRoot":"","sources":["../../../src/components/FastSimonApi/reducer.ts"],"names":[],"mappings":"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","sourcesContent":["import {ComparisonData, CustomSortSettings, FastStateProps, IsLoading} from \"./context\";\nimport {PersonalizationPreviewSettings} from \"../../utils/personalizationPreview\";\nimport {AppType} from \"./FastSimonApi\";\nimport {SortBy} from \"../../@types/sortBy\";\nimport {FullTextServerResponseAll} from \"../../@types/results\";\nimport {smartCollectionsResults} from \"../../@types/categories\";\nimport {Narrow, ServerNarrow} from \"../../@types/narrow\";\nimport {PersonalizationStory, Product, ProductAnalytics} from \"../../@types/product\";\n\nimport {Widget} from \"../../@types/widget\";\nimport {AutocompleteReasoningResponse, AutocompleteResults} from \"../../@types/autocomplete\";\n\ntype FastStateAction =\n | { type: 'setReady', payload: boolean }\n | { type: 'setType', payload: AppType }\n | { type: 'setPage', payload: number }\n | { type: 'setQuery', payload: string }\n | { type: 'setSortBy', payload: SortBy }\n | { type: 'setIsLoading', payload: IsLoading }\n | { type: 'setCollectionID', payload: string }\n | { type: 'setNarrow', payload: ServerNarrow[] | undefined }\n | { type: 'setResults', payload: FullTextServerResponseAll | smartCollectionsResults | AutocompleteReasoningResponse | undefined }\n | { type: 'mergeResults', payload: { results: FullTextServerResponseAll | smartCollectionsResults | AutocompleteReasoningResponse, infiniteScroll: boolean } }\n | { type: 'mergeFacetsWithResults', payload:Narrow[] }\n | { type: 'mergeResultsKeepProduct', payload: { results: FullTextServerResponseAll | smartCollectionsResults } }\n | { type: 'setState', payload: Partial<FastStateProps> }\n | { type: 'setRecommendations', payload: { id: string, widget: Widget } }\n | { type: 'setSingleProducts', payload: Product[] }\n | { type: 'setIsAutocomplete', payload: boolean }\n | { type: 'setAutocomplete', payload: AutocompleteResults }\n | { type: 'setSearchWithinSearch', payload: string }\n | { type: 'setSegments', payload: string[] }\n | { type: 'setFlag', payload: string[] }\n | { type: 'setCustomSort',payload:CustomSortSettings}\n | { type: 'setVariationId', payload: string | null }\n | { type: 'setForceAnd', payload: boolean }\n | { type: 'setUserSegmentPreview', payload: 'none' | 'new' | 'returning' }\n | { type: 'setComparisonData', payload: ComparisonData | null }\n | { type: 'setIsComparing', payload: boolean }\n | { type: 'setPersonalizationPreview', payload: PersonalizationPreviewSettings | null }\n | { type: 'mergeAnalyticsData', payload: {\n analytics?: FullTextServerResponseAll['analytics'],\n matching_sets?: Record<string, string>,\n group_strategy?: Record<string, string>,\n variety_strategy?: number[],\n productAnalyticsMap?: Record<string, ProductAnalytics>,\n personalizationStoryMap?: Record<string, PersonalizationStory>\n }}\n | { type: 'updateSettingsAndRefetch', payload: Partial<Pick<FastStateProps, 'force_and' | 'custom_sort_settings' | 'flag' | 'user_segment_preview' | 'personalization_preview' | 'session_token'>> }\n\n\n\nexport function fastStateReducer(state: FastStateProps, action: FastStateAction) {\n switch (action.type) {\n case \"setReady\":\n return {...state, isReady: action.payload}\n\n case 'setType':\n return {...state, type: action.payload};\n\n case 'setPage':\n return {...state, page: action.payload};\n\n case 'setQuery':\n return {...state, query: action.payload, collectionID: undefined, page: 1, narrow: undefined, searchWithinSearch: undefined, sortBy:undefined};\n\n case 'setSortBy':\n return {...state, sortBy: action.payload, page: 1};\n\n case 'setSegments':\n return {...state, segments: action.payload, page: 1};\n\n case 'setIsLoading':\n return {...state, isLoading: action.payload};\n\n case 'setCollectionID':\n return {...state, collectionID: action.payload, query: \"\", page: 1, narrow: undefined, searchWithinSearch: undefined , sortBy:undefined};\n\n case 'setNarrow':\n return {...state, narrow: action.payload, page: 1};\n\n case 'setResults':\n return {...state, results: {isNoResults: false, ...action.payload}} as FastStateProps;\n\n case 'mergeResultsKeepProduct': {\n return {...state, results: {...state.results, ...action.payload.results, products: state.results?.products || []}};\n }\n\n case 'mergeFacetsWithResults':{\n return {...state, narrow: action.payload};\n }\n\n case 'mergeResults': {\n // Don't adopt the sort the server echoes back. sortBy should reflect only the caller's\n // intent — the initial defaultSort prop (FastSimonApi) plus the user's explicit\n // setSortBy, reset by setQuery/setCollectionID. Adopting the echo locked the\n // server-resolved sort in as an explicit sort_by that was then re-sent on pagination,\n // overriding the site default and resetting a user-chosen sort on the next page. Where\n // no defaultSort is passed (e.g. the AI Explainer) sortBy stays undefined until the user\n // picks, so requests omit sort_by and the server keeps applying the site default.\n // See AI Explainer sort bugs.\n if (!action.payload.infiniteScroll) {\n return {...state, results: { ...action.payload.results}} as FastStateProps;\n }\n\n const products = state.results?.products ?? [];\n const newProducts = action.payload.results.products ?? [];\n\n // Optimize: Use Set for O(1) lookup instead of O(n) find() - prevents O(n²)\n const existingIds = new Set(products.map(p => p.id));\n const uniqueNewProducts = newProducts.filter(p => !existingIds.has(p.id));\n\n // Only merge if there are actually new products\n if (uniqueNewProducts.length > 0) {\n return {\n ...state,\n results: {...state.results, isNoResults: false, ...action.payload.results, products: [...products, ...uniqueNewProducts]}\n } as FastStateProps;\n }\n\n return {\n ...state,\n results: {...state.results, isNoResults: false, ...action.payload.results, products: products}\n } as FastStateProps;\n\n }\n\n case 'setState': {\n if (action.payload.query) {\n return {...state, ...action.payload, collectionID: undefined, searchWithinSearch: undefined, segments: undefined}\n } else {\n return {...state, ...action.payload, query: \"\", searchWithinSearch: undefined, segments: undefined};\n }\n }\n\n case \"setRecommendations\": {\n return {\n ...state,\n recommendations: {\n ...state.recommendations,\n [action.payload.id]: action.payload.widget\n }\n }\n }\n\n case \"setSingleProducts\": {\n const products: { [id: string]: Product } = {...state.singleProducts};\n\n for (const product of action.payload) {\n products[product.id] = product;\n }\n\n return {...state, singleProducts: products}\n }\n case \"setIsAutocomplete\":{\n return {...state, isAutocomplete: action.payload}\n }\n\n case \"setAutocomplete\": {\n return {...state, autocomplete: action.payload}\n }\n\n case \"setSearchWithinSearch\": {\n return {...state, searchWithinSearch: action.payload}\n }\n case 'setFlag':\n return {...state, flag: action.payload};\n\n case 'setCustomSort':\n return {...state, custom_sort_settings: action.payload};\n\n case 'setVariationId':\n return {...state, variation_id: action.payload};\n\n case 'setForceAnd':\n return {...state, force_and: action.payload};\n\n case 'setUserSegmentPreview':\n return {...state, user_segment_preview: action.payload};\n\n case 'setComparisonData':\n return {...state, comparisonData: action.payload};\n\n case 'setIsComparing':\n return {...state, isComparing: action.payload};\n\n case 'setPersonalizationPreview':\n return {...state, personalization_preview: action.payload};\n\n case 'mergeAnalyticsData': {\n if (!state.results || !state.results.products) return state;\n\n const updatedResults = { ...state.results };\n\n if (action.payload.analytics) {\n (updatedResults as any).analytics = action.payload.analytics;\n }\n\n if (action.payload.matching_sets) {\n (updatedResults as any).matching_sets = action.payload.matching_sets;\n }\n\n if (action.payload.group_strategy) {\n (updatedResults as any).group_strategy = action.payload.group_strategy;\n }\n\n if (action.payload.variety_strategy) {\n (updatedResults as any).variety_strategy = action.payload.variety_strategy;\n }\n\n if (action.payload.productAnalyticsMap || action.payload.personalizationStoryMap) {\n const analyticsMap = action.payload.productAnalyticsMap;\n const storyMap = action.payload.personalizationStoryMap;\n updatedResults.products = updatedResults.products.map(product => {\n const pid = String(product.id);\n const productAnalytics = analyticsMap?.[pid];\n const productStory = storyMap?.[pid];\n if (!productAnalytics && !productStory) return product;\n const next = { ...product };\n if (productAnalytics) next.analytics = productAnalytics;\n if (productStory) next.personalization_story = productStory;\n return next;\n });\n }\n\n return { ...state, results: updatedResults } as FastStateProps;\n }\n\n case 'updateSettingsAndRefetch':\n return {...state, ...action.payload, refetchTrigger: (state.refetchTrigger ?? 0) + 1};\n\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fast-simon/dashboard-utilities",
3
- "version": "1.0.166-beta.0",
3
+ "version": "1.0.167-beta.0",
4
4
  "scripts": {
5
5
  "dev": "vite",
6
6
  "preview": "vite preview",