@fast-simon/dashboard-utilities 1.0.182-beta.1 → 1.0.183-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.
@@ -77,6 +77,7 @@ export type smartCollectionsCallback = ({}: {
77
77
  payload: smartCollectionsResults;
78
78
  }) => void;
79
79
  export interface smartCollectionsResults {
80
+ sentSessionToken?: boolean;
80
81
  ancestors: CategoryAncestor[];
81
82
  categoryID: string;
82
83
  name: string;
@@ -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 include_unpublished?: boolean // AI Explainer \"Unpublished products\" switch; sent only on the page and analytics requests\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_preview_requested?: boolean\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 rpi_candidate_readiness_status?: 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"]}
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 include_unpublished?: boolean // AI Explainer \"Unpublished products\" switch; sent only on the page and analytics requests\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 // Set by FastSimonApi, not serving: whether the request carried a session token, which is\n // what serving freezes a page under. The later merges into results keep it.\n sentSessionToken?: boolean\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_preview_requested?: boolean\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 rpi_candidate_readiness_status?: 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"]}
@@ -57,6 +57,7 @@ export interface Pillar {
57
57
  export interface PersonalizationStory {
58
58
  confidence: PersonalizationConfidence;
59
59
  pillars: Pillar[];
60
+ for_you?: boolean;
60
61
  }
61
62
  export declare enum FeaturedRanking {
62
63
  FEATURED_RANK_NO = 0,
@@ -1 +1 @@
1
- {"version":3,"file":"product.js","sourceRoot":"","sources":["../../src/@types/product.ts"],"names":[],"mappings":"AAyEA,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 secondary_coefficient?: number;\n final: number;\n local_cpi?: number;\n global_rpi?: number;\n global_cpi?: number;\n primary?: 'local' | 'local_cpi' | '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"]}
1
+ {"version":3,"file":"product.js","sourceRoot":"","sources":["../../src/@types/product.ts"],"names":[],"mappings":"AA2EA,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 secondary_coefficient?: number;\n final: number;\n local_cpi?: number;\n global_rpi?: number;\n global_cpi?: number;\n primary?: 'local' | 'local_cpi' | '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 // Set when the product kept a For You badge on this page.\n for_you?: boolean;\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"]}
@@ -33,8 +33,6 @@ interface Props {
33
33
  allowSearchPreview?: boolean;
34
34
  variationId?: string | null;
35
35
  customSortSettingsTransform?: (settings: CustomSortSettings | undefined, isCollection: boolean) => CustomSortSettings | null | undefined;
36
- merchantToken?: string;
37
- onMerchantTokenRejected?: () => Promise<string>;
38
36
  }
39
37
  export interface MainTheme {
40
38
  primaryColor: string;
@@ -34,7 +34,6 @@ export { analyticsMatchesRankingSnapshot } from "../../utils/rpiSnapshot";
34
34
  import { FullTextSearch } from "../../services/search";
35
35
  import { SmartCollections } from "../../services/smartCollections";
36
36
  import { Autocomplete } from "../../services/autocomplete";
37
- import { setMerchantToken, setOnMerchantTokenRejected } from "../../services/API";
38
37
  const mainTheme = {
39
38
  primaryColor: "#1976d2",
40
39
  lighterPrimary: "rgba(25,118,210,0.71)",
@@ -77,15 +76,7 @@ export function attachPersonalizationToItems(response) {
77
76
  }
78
77
  const FastSimonApi = (_a) => {
79
78
  var _b;
80
- 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, allowSearchPreview = true, variationId = null, customSortSettingsTransform, merchantToken, onMerchantTokenRejected } = _a, props = __rest(_a, ["storeID", "uuid", "siteKey", "children", "defaultSort", "promoTiles", "theme", "withProductAttributes", "isInfiniteScroll", "getTitle", "useFilters", "noReport", "customTitleChange", "isEnterpriseMerchandising", "subscription", "marketContext", "forceProductAnalytics", "allowSearchPreview", "variationId", "customSortSettingsTransform", "merchantToken", "onMerchantTokenRejected"]);
81
- // During render, not in an effect: effects run child-first, so a child's first request would leave before a
82
- // parent's effect set the token. Only when passed: a host that passes none may have set them on the module.
83
- if (merchantToken !== undefined) {
84
- setMerchantToken(merchantToken);
85
- }
86
- if (onMerchantTokenRejected) {
87
- setOnMerchantTokenRejected(onMerchantTokenRejected);
88
- }
79
+ 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, allowSearchPreview = true, variationId = null, customSortSettingsTransform } = _a, props = __rest(_a, ["storeID", "uuid", "siteKey", "children", "defaultSort", "promoTiles", "theme", "withProductAttributes", "isInfiniteScroll", "getTitle", "useFilters", "noReport", "customTitleChange", "isEnterpriseMerchandising", "subscription", "marketContext", "forceProductAnalytics", "allowSearchPreview", "variationId", "customSortSettingsTransform"]);
89
80
  const [state, dispatch] = useReducer === null || useReducer === void 0 ? void 0 : useReducer(fastStateReducer, {
90
81
  isReady: false,
91
82
  type: (_b = props.type) !== null && _b !== void 0 ? _b : 'SPA',
@@ -184,7 +175,15 @@ const FastSimonApi = (_a) => {
184
175
  function setForceAnd(forceAnd) {
185
176
  dispatch === null || dispatch === void 0 ? void 0 : dispatch({ type: 'setForceAnd', payload: forceAnd });
186
177
  }
187
- function updateSettingsAndRefetch(settings) {
178
+ // The refetch this call triggers leaves the session token off (`omitSessionTokenOnce`).
179
+ const omitTokenPendingRef = useRef(false);
180
+ /**
181
+ * `omitSessionTokenOnce`: the session token is set for every later request, but the refetch
182
+ * this call triggers goes out without it. Serving saves a page's served positions only under
183
+ * a token (position freezing), so that refetch freezes nothing. A later call writing the token
184
+ * without the option supersedes it.
185
+ */
186
+ function updateSettingsAndRefetch(settings, { omitSessionTokenOnce = false } = {}) {
188
187
  var _a;
189
188
  if ('custom_sort_settings' in settings) {
190
189
  customSortSettingsRef.current = (_a = settings.custom_sort_settings) !== null && _a !== void 0 ? _a : undefined;
@@ -192,6 +191,10 @@ const FastSimonApi = (_a) => {
192
191
  if ('include_unpublished' in settings) {
193
192
  includeUnpublishedRef.current = !!settings.include_unpublished;
194
193
  }
194
+ // Set before the dispatch, so no effect flush can run the refetch without it.
195
+ if ('session_token' in settings) {
196
+ omitTokenPendingRef.current = omitSessionTokenOnce;
197
+ }
195
198
  dispatch === null || dispatch === void 0 ? void 0 : dispatch({ type: 'updateSettingsAndRefetch', payload: settings });
196
199
  }
197
200
  function setUserSegmentPreview(preview) {
@@ -368,7 +371,7 @@ const FastSimonApi = (_a) => {
368
371
  let fetchParams = Object.assign({ withProductAttributes: withProductAttributes, siteKey: siteKey, uuid: uuid, storeID: storeID, term: query, narrowBy: state.narrow, sortBy: state.sortBy, categoryID: state.collectionID, segments: state.segments, searchWithinSearch: searchWithinSearch, custom_sort_settings: currentCustomSort() }, getDisableFlags(state.flag));
369
372
  fetchResults(fetchParams, isInfiniteScroll);
370
373
  }
371
- function fetchResults(props, isInfiniteScroll, autocomplete = false) {
374
+ function fetchResults(props, isInfiniteScroll, autocomplete = false, omitSessionToken = false) {
372
375
  // 1. Apply ref value first — ensures latest custom_sort_settings is used even from
373
376
  // stale closures or call sites (e.g. setState) that don't pass custom_sort_settings.
374
377
  // null means "explicitly cleared" → omit the param from the request.
@@ -385,13 +388,13 @@ const FastSimonApi = (_a) => {
385
388
  }
386
389
  // on first request check if we need to fetch more then 1 product
387
390
  if (props.term && !autocomplete) {
388
- onSearch(newObject(Object.assign(Object.assign({}, props), { page: props.page || 1, infiniteScrollPage: isInfiniteScroll })), isInfiniteScroll);
391
+ onSearch(newObject(Object.assign(Object.assign({}, props), { page: props.page || 1, infiniteScrollPage: isInfiniteScroll })), isInfiniteScroll, omitSessionToken);
389
392
  }
390
393
  else if (props.term && autocomplete) {
391
394
  onAutocompleteSearch(newObject(Object.assign({}, props)));
392
395
  }
393
396
  else if (props.categoryID) {
394
- onCollection(newObject(Object.assign(Object.assign({}, props), { page: props.page || 1, infiniteScrollPage: isInfiniteScroll })), isInfiniteScroll);
397
+ onCollection(newObject(Object.assign(Object.assign({}, props), { page: props.page || 1, infiniteScrollPage: isInfiniteScroll })), isInfiniteScroll, omitSessionToken);
395
398
  }
396
399
  return;
397
400
  }
@@ -467,9 +470,11 @@ const FastSimonApi = (_a) => {
467
470
  return;
468
471
  // Build fetchParams from the now-updated state
469
472
  const fetchParams = Object.assign(Object.assign({ siteKey: siteKey, uuid: uuid, storeID: storeID, term: state.query, narrowBy: state.narrow, sortBy: (_a = state.sortBy) !== null && _a !== void 0 ? _a : defaultSort, categoryID: state.collectionID, segments: state.segments, withProductAttributes: withProductAttributes, searchWithinSearch: state.searchWithinSearch, custom_sort_settings: currentCustomSort() }, getDisableFlags((_b = state.flag) !== null && _b !== void 0 ? _b : [])), { variation_id: state.variation_id, force_and: state.force_and });
470
- fetchResults(fetchParams, isInfiniteScroll, state.isAutocomplete);
473
+ const omitSessionToken = omitTokenPendingRef.current;
474
+ omitTokenPendingRef.current = false;
475
+ fetchResults(fetchParams, isInfiniteScroll, state.isAutocomplete, omitSessionToken);
471
476
  }, [state.refetchTrigger]);
472
- const onSearch = (props, isInfiniteScroll) => {
477
+ const onSearch = (props, isInfiniteScroll, omitSessionToken = false) => {
473
478
  var _a;
474
479
  setIsLoading({ products: true, filters: true });
475
480
  // Clear previous comparison state when starting new search. isComparing too: a superseded
@@ -486,7 +491,7 @@ const FastSimonApi = (_a) => {
486
491
  ps: getPersonalizationSegment(userSegmentPreviewRef.current),
487
492
  spv: personalizationPreview.spv,
488
493
  personalization: personalizationPreview.personalization,
489
- session_token: state.session_token,
494
+ session_token: omitSessionToken ? undefined : state.session_token,
490
495
  });
491
496
  const personalizationSegment = searchPreview.ps;
492
497
  const personalizationParams = { spv: searchPreview.spv, personalization: searchPreview.personalization };
@@ -672,7 +677,7 @@ const FastSimonApi = (_a) => {
672
677
  }
673
678
  }));
674
679
  };
675
- const onCollection = (props, isInfiniteScroll) => {
680
+ const onCollection = (props, isInfiniteScroll, omitSessionToken = false) => {
676
681
  var _a;
677
682
  setIsLoading({ products: true, filters: true });
678
683
  // Supersedes any search comparison still loading, which then leaves isComparing alone, and
@@ -688,7 +693,7 @@ const FastSimonApi = (_a) => {
688
693
  const requestId = ++searchRequestCounterRef.current;
689
694
  pendingAnalyticsRef.current = null;
690
695
  let fastRankingResponse = null;
691
- 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,
696
+ 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: omitSessionToken ? undefined : state.session_token,
692
697
  // Only the page and analytics requests carry it; the ids-only and facets-only requests below are
693
698
  // built from `props`, which never holds it, so id_list stays the live list.
694
699
  include_unpublished: includeUnpublishedRef.current });
@@ -735,6 +740,7 @@ const FastSimonApi = (_a) => {
735
740
  const existingGroupStrategy = shouldFetchAnalytics ? undefined : results === null || results === void 0 ? void 0 : results.group_strategy;
736
741
  const existingVarietyStrategy = shouldFetchAnalytics ? undefined : results === null || results === void 0 ? void 0 : results.variety_strategy;
737
742
  response = getFormatedData(response, existingAnalytics, existingMatchingSets, existingGroupStrategy, existingVarietyStrategy);
743
+ response.sentSessionToken = !!commonRequestParams.session_token;
738
744
  // Show products immediately
739
745
  mergeResults(response, isInfiniteScroll);
740
746
  setIsLoading({ products: false, filters: true });
@@ -760,7 +766,7 @@ const FastSimonApi = (_a) => {
760
766
  listIdRequestProps.spv = personalizationParams.spv;
761
767
  listIdRequestProps.spc = personalizationParams.spc;
762
768
  listIdRequestProps.personalization = personalizationParams.personalization;
763
- listIdRequestProps.session_token = state.session_token;
769
+ listIdRequestProps.session_token = commonRequestParams.session_token;
764
770
  listIdRequestProps.include_unpublished = false;
765
771
  const facetsRequestProps = Object.assign({}, props);
766
772
  facetsRequestProps.include_unpublished = false;
@@ -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\";\nimport {analyticsMatchesRankingSnapshot} from \"../../utils/rpiSnapshot\";\nimport {searchPreviewParams} from \"../../utils/searchPreview\";\nexport {analyticsMatchesRankingSnapshot} from \"../../utils/rpiSnapshot\";\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\";\nimport {setMerchantToken, setOnMerchantTokenRejected} from \"../../services/API\";\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 allowSearchPreview?: boolean; // When false, search and autocomplete requests carry no Personalized Preview params (see searchPreviewParams)\n variationId?: string | null; // A/B test variation ID for reasoning/experiment tracking\n customSortSettingsTransform?: (settings: CustomSortSettings | undefined, isCollection: boolean) => CustomSortSettings | null | undefined;\n merchantToken?: string; // The dashboard-signed token every serving call sends as `sid`\n onMerchantTokenRejected?: () => Promise<string>; // On a 401: resolves to the refreshed token, and the call retries once\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\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 allowSearchPreview = true,\n variationId = null,\n customSortSettingsTransform,\n merchantToken,\n onMerchantTokenRejected,\n ...props\n }) => {\n // During render, not in an effect: effects run child-first, so a child's first request would leave before a\n // parent's effect set the token. Only when passed: a host that passes none may have set them on the module.\n if (merchantToken !== undefined) {\n setMerchantToken(merchantToken);\n }\n if (onMerchantTokenRejected) {\n setOnMerchantTokenRejected(onMerchantTokenRejected);\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 include_unpublished: false,\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 include_unpublished: a memoized caller (the mount-time event handlers among them) reaches\n // onCollection through a stale closure whose `state` predates a toggle, so the requests read the ref,\n // never `state`, and the chip and the requests cannot disagree.\n const includeUnpublishedRef = useRef<boolean>(!!state.include_unpublished);\n includeUnpublishedRef.current = !!state.include_unpublished;\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' | 'include_unpublished'>>) {\n if ('custom_sort_settings' in settings) {\n customSortSettingsRef.current = settings.custom_sort_settings ?? undefined;\n }\n if ('include_unpublished' in settings) {\n includeUnpublishedRef.current = !!settings.include_unpublished;\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 state when starting new search. isComparing too: a superseded\n // comparison no longer clears it (see the Compare Mode block), so a new search must.\n setComparisonData(null);\n setIsComparing(false);\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 personalizationPreview = buildPersonalizationParams(\n personalizationPreviewRef.current ?? {enabled: false, spvJson: '', types: ['gender']}\n );\n const searchPreview = searchPreviewParams(allowSearchPreview, {\n ps: getPersonalizationSegment(userSegmentPreviewRef.current),\n spv: personalizationPreview.spv,\n personalization: personalizationPreview.personalization,\n session_token: state.session_token,\n });\n const personalizationSegment = searchPreview.ps;\n const personalizationParams = {spv: searchPreview.spv, personalization: searchPreview.personalization};\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: searchPreview.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 // Drop a response that a newer search or collection request has superseded. Without\n // this the older one wins whenever it lands last, which happens when settings change\n // right after the context does and two requests are in flight (the AI Explainer's\n // preview push after a collection change is the common case).\n if (searchRequestCounterRef.current !== requestId) return;\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 = searchPreview.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 if (searchRequestCounterRef.current !== requestId) return; // superseded while these loaded\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 if (searchRequestCounterRef.current !== requestId) return; // superseded while this loaded\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 if (searchRequestCounterRef.current !== requestId) return;\n console.error(\"[Compare Mode] Failed to fetch comparison IDs:\", error);\n setComparisonData(null);\n } finally {\n // A superseded comparison must not end the newer search's loading state.\n if (searchRequestCounterRef.current === requestId) setIsComparing(false);\n }\n }\n });\n }\n const onAutocompleteSearch = (props: Omit<autocompleteProps, \"callback\">) => {\n setIsLoading({products: true, filters: true});\n const personalizationPreview = buildPersonalizationParams(\n personalizationPreviewRef.current ?? {enabled: false, spvJson: '', types: ['gender']}\n );\n const searchPreview = searchPreviewParams(allowSearchPreview, {\n ps: getPersonalizationSegment(userSegmentPreviewRef.current),\n spv: personalizationPreview.spv,\n personalization: personalizationPreview.personalization,\n session_token: undefined,\n });\n const personalizationSegment = searchPreview.ps;\n const personalizationParams = {spv: searchPreview.spv, personalization: searchPreview.personalization};\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 // Supersedes any search comparison still loading, which then leaves isComparing alone, and\n // a finished one's results do not describe a collection.\n setComparisonData(null);\n setIsComparing(false);\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 // Only the page and analytics requests carry it; the ids-only and facets-only requests below are\n // built from `props`, which never holds it, so id_list stays the live list.\n include_unpublished: includeUnpublishedRef.current,\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 if (searchRequestCounterRef.current !== requestId) return; // superseded; see onSearch\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 listIdRequestProps.include_unpublished = false;\n\n const facetsRequestProps = { ...props };\n facetsRequestProps.include_unpublished = false;\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 if (searchRequestCounterRef.current !== requestId) return; // superseded while these loaded\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 include_unpublished: state.include_unpublished\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, state.include_unpublished]);\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"]}
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\";\nimport {analyticsMatchesRankingSnapshot} from \"../../utils/rpiSnapshot\";\nimport {searchPreviewParams} from \"../../utils/searchPreview\";\nexport {analyticsMatchesRankingSnapshot} from \"../../utils/rpiSnapshot\";\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 allowSearchPreview?: boolean; // When false, search and autocomplete requests carry no Personalized Preview params (see searchPreviewParams)\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\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 allowSearchPreview = true,\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 include_unpublished: false,\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 include_unpublished: a memoized caller (the mount-time event handlers among them) reaches\n // onCollection through a stale closure whose `state` predates a toggle, so the requests read the ref,\n // never `state`, and the chip and the requests cannot disagree.\n const includeUnpublishedRef = useRef<boolean>(!!state.include_unpublished);\n includeUnpublishedRef.current = !!state.include_unpublished;\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 // The refetch this call triggers leaves the session token off (`omitSessionTokenOnce`).\n const omitTokenPendingRef = useRef(false);\n\n /**\n * `omitSessionTokenOnce`: the session token is set for every later request, but the refetch\n * this call triggers goes out without it. Serving saves a page's served positions only under\n * a token (position freezing), so that refetch freezes nothing. A later call writing the token\n * without the option supersedes it.\n */\n function updateSettingsAndRefetch(\n settings: Partial<Pick<typeof state, 'force_and' | 'custom_sort_settings' | 'flag' | 'user_segment_preview' | 'personalization_preview' | 'session_token' | 'include_unpublished'>>,\n {omitSessionTokenOnce = false}: {omitSessionTokenOnce?: boolean} = {},\n ) {\n if ('custom_sort_settings' in settings) {\n customSortSettingsRef.current = settings.custom_sort_settings ?? undefined;\n }\n if ('include_unpublished' in settings) {\n includeUnpublishedRef.current = !!settings.include_unpublished;\n }\n // Set before the dispatch, so no effect flush can run the refetch without it.\n if ('session_token' in settings) {\n omitTokenPendingRef.current = omitSessionTokenOnce;\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 omitSessionToken = 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, omitSessionToken);\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, omitSessionToken);\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 const omitSessionToken = omitTokenPendingRef.current;\n omitTokenPendingRef.current = false;\n fetchResults(fetchParams, isInfiniteScroll, state.isAutocomplete, omitSessionToken);\n }, [state.refetchTrigger]);\n\n const onSearch = (props: Omit<fullTextSearchProps, \"callback\">, isInfiniteScroll: boolean, omitSessionToken = false) => {\n setIsLoading({products: true, filters: true});\n\n // Clear previous comparison state when starting new search. isComparing too: a superseded\n // comparison no longer clears it (see the Compare Mode block), so a new search must.\n setComparisonData(null);\n setIsComparing(false);\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 personalizationPreview = buildPersonalizationParams(\n personalizationPreviewRef.current ?? {enabled: false, spvJson: '', types: ['gender']}\n );\n const searchPreview = searchPreviewParams(allowSearchPreview, {\n ps: getPersonalizationSegment(userSegmentPreviewRef.current),\n spv: personalizationPreview.spv,\n personalization: personalizationPreview.personalization,\n session_token: omitSessionToken ? undefined : state.session_token,\n });\n const personalizationSegment = searchPreview.ps;\n const personalizationParams = {spv: searchPreview.spv, personalization: searchPreview.personalization};\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: searchPreview.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 // Drop a response that a newer search or collection request has superseded. Without\n // this the older one wins whenever it lands last, which happens when settings change\n // right after the context does and two requests are in flight (the AI Explainer's\n // preview push after a collection change is the common case).\n if (searchRequestCounterRef.current !== requestId) return;\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 = searchPreview.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 if (searchRequestCounterRef.current !== requestId) return; // superseded while these loaded\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 if (searchRequestCounterRef.current !== requestId) return; // superseded while this loaded\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 if (searchRequestCounterRef.current !== requestId) return;\n console.error(\"[Compare Mode] Failed to fetch comparison IDs:\", error);\n setComparisonData(null);\n } finally {\n // A superseded comparison must not end the newer search's loading state.\n if (searchRequestCounterRef.current === requestId) setIsComparing(false);\n }\n }\n });\n }\n const onAutocompleteSearch = (props: Omit<autocompleteProps, \"callback\">) => {\n setIsLoading({products: true, filters: true});\n const personalizationPreview = buildPersonalizationParams(\n personalizationPreviewRef.current ?? {enabled: false, spvJson: '', types: ['gender']}\n );\n const searchPreview = searchPreviewParams(allowSearchPreview, {\n ps: getPersonalizationSegment(userSegmentPreviewRef.current),\n spv: personalizationPreview.spv,\n personalization: personalizationPreview.personalization,\n session_token: undefined,\n });\n const personalizationSegment = searchPreview.ps;\n const personalizationParams = {spv: searchPreview.spv, personalization: searchPreview.personalization};\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, omitSessionToken = false) => {\n setIsLoading({products: true, filters: true});\n // Supersedes any search comparison still loading, which then leaves isComparing alone, and\n // a finished one's results do not describe a collection.\n setComparisonData(null);\n setIsComparing(false);\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: omitSessionToken ? undefined : state.session_token,\n // Only the page and analytics requests carry it; the ids-only and facets-only requests below are\n // built from `props`, which never holds it, so id_list stays the live list.\n include_unpublished: includeUnpublishedRef.current,\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 if (searchRequestCounterRef.current !== requestId) return; // superseded; see onSearch\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 response.sentSessionToken = !!commonRequestParams.session_token;\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 = commonRequestParams.session_token;\n listIdRequestProps.include_unpublished = false;\n\n const facetsRequestProps = { ...props };\n facetsRequestProps.include_unpublished = false;\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 if (searchRequestCounterRef.current !== requestId) return; // superseded while these loaded\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 include_unpublished: state.include_unpublished\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, state.include_unpublished]);\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"]}
@@ -85,7 +85,9 @@ export interface FastStateFunctionsProps {
85
85
  setForceAnd: (forceAnd: boolean) => void;
86
86
  setUserSegmentPreview: (preview: 'none' | 'new' | 'returning') => void;
87
87
  setPersonalizationPreview: (preview: PersonalizationPreviewSettings | null) => void;
88
- updateSettingsAndRefetch: (settings: Partial<Pick<FastStateProps, 'force_and' | 'custom_sort_settings' | 'flag' | 'user_segment_preview' | 'personalization_preview' | 'session_token' | 'include_unpublished'>>) => void;
88
+ updateSettingsAndRefetch: (settings: Partial<Pick<FastStateProps, 'force_and' | 'custom_sort_settings' | 'flag' | 'user_segment_preview' | 'personalization_preview' | 'session_token' | 'include_unpublished'>>, options?: {
89
+ omitSessionTokenOnce?: boolean;
90
+ }) => void;
89
91
  }
90
92
  export declare const FastState: React.Context<FastStateProps>;
91
93
  export declare const FastStateFunctions: React.Context<FastStateFunctionsProps>;
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/components/FastSimonApi/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAC,UAAU,EAAC,MAAM,OAAO,CAAC;AA4GxC,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,CAAC,aAAa,CAAC,EAAoB,CAAC,CAAA;AAClE,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC,aAAa,CAAC,EAA6B,CAAC,CAAA;AAEpF,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,EAAE;IACtC,OAAO,UAAU,CAAC,kBAAkB,CAAC,CAAC;AAC1C,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,EAAE;IAC7B,OAAO,UAAU,CAAC,SAAS,CAAC,CAAA;AAChC,CAAC,CAAA","sourcesContent":["import React, {useContext} from \"react\";\n\n\nimport {FullTextServerResponseAll} from \"../../@types/results\";\nimport {Narrow, ServerNarrow} from \"../../@types/narrow\";\nimport {SortBy} from \"../../@types/sortBy\";\nimport {Product} from \"../../@types/product\";\nimport {FastCategory, smartCollectionsResults} from \"../../@types/categories\";\nimport {AppType} from \"./FastSimonApi\";\nimport {Widget} from \"../../@types/widget\";\nimport {AutocompleteReasoningResponse, AutocompleteResults} from \"../../@types/autocomplete\";\nimport {PersonalizationPreviewSettings} from \"../../utils/personalizationPreview\";\n\n\nexport interface SetStateProps extends Partial<FastStateProps> {\n\n}\n\nexport interface IsLoading {\n products: boolean,\n filters: boolean,\n}\nexport interface CustomSortSettings{\n personalization_rank: number,\n creation_date: number,\n popularity: number,\n inventory: number\n}\n\n// Compare Mode: Shows impact of Hybrid Search by comparing results WITH vs WITHOUT hybrid_search_settings\nexport interface ProductRankChange {\n productId: string;\n rankWithHybrid: number; // Position in results WITH hybrid (1-based, -1 if not found)\n rankWithoutHybrid: number; // Position in results WITHOUT hybrid (1-based, -1 if not found)\n rankDelta: number; // Positive = moved up with hybrid, negative = moved down\n status: 'improved' | 'declined' | 'new' | 'unchanged'; // How hybrid affected this product\n}\n\nexport interface ComparisonData {\n // Full ID lists for detailed comparison\n hybridOnIds: string[]; // All product IDs with Hybrid ON\n hybridOffIds: string[]; // All product IDs with Hybrid OFF\n // Per-product rank changes (for products currently displayed)\n productChanges: Map<string, ProductRankChange>;\n // Summary stats\n totalImproved: number; // Products that moved up in rank\n totalDeclined: number; // Products that moved down in rank\n totalNew: number; // Products that appeared due to hybrid (not in top N without)\n totalUnchanged: number;\n}\n\nexport interface FastStateProps {\n isReady: boolean\n isLoading: IsLoading,\n results?: FullTextServerResponseAll | smartCollectionsResults | AutocompleteReasoningResponse\n query: string\n page: number,\n narrow?: ServerNarrow[]\n type: AppType\n collectionID?: string\n sortBy?: SortBy\n recommendations?: {\n [id: string]: Widget\n },\n singleProducts?: {\n [id: string]: Product\n }\n autocomplete?: AutocompleteResults\n searchWithinSearch?: string,\n segments?: string[],\n flag?:string[]\n custom_sort_settings?:CustomSortSettings\n isAutocomplete?:boolean\n variation_id?: string | null\n force_and?: boolean\n user_segment_preview?: 'none' | 'new' | 'returning' // User segment preview mode for AI Explainer\n // Compare Mode state\n comparisonData?: ComparisonData | null\n isComparing?: boolean\n personalization_preview?: PersonalizationPreviewSettings | null\n session_token?: string // Session token for AI Explainer (passed as st param)\n // AI Explainer \"Unpublished products\" switch (collections only). The one value the chip, the notice and\n // the requests read; FastSimonApi remounts off on a site switch.\n include_unpublished?: boolean\n // Settings refetch trigger - incremented when settings modal confirms to trigger a refetch after state is updated\n refetchTrigger?: number\n}\n\nexport interface FastStateFunctionsProps {\n setQuery: (query: string, isAutocomplete?:boolean) => void,\n setSort: (sortBy: SortBy) => void,\n setNarrow: (narrow?: ServerNarrow[]) => void,\n setPage: (page: number) => void,\n getAllCategories: () => Promise<FastCategory[]>\n setCollection: (id: string) => void\n setState: (newState: SetStateProps) => void\n setFlag:(flags:string[])=>void\n setSearchWithinSearch: (query: string) => void,\n setSegments: (segments: string[]) => void,\n setCustomSort:(customSortSettings:CustomSortSettings)=>void,\n setIsAutocomplete:(isAutocomplete:boolean)=>void,\n setVariationId:(variationId: string | null)=>void,\n setForceAnd:(forceAnd: boolean)=>void,\n setUserSegmentPreview:(preview: 'none' | 'new' | 'returning')=>void,\n setPersonalizationPreview:(preview: PersonalizationPreviewSettings | null)=>void,\n updateSettingsAndRefetch:(settings: Partial<Pick<FastStateProps, 'force_and' | 'custom_sort_settings' | 'flag' | 'user_segment_preview' | 'personalization_preview' | 'session_token' | 'include_unpublished'>>)=>void,\n}\n\nexport const FastState = React.createContext({} as FastStateProps)\nexport const FastStateFunctions = React.createContext({} as FastStateFunctionsProps)\n\nexport const useFastStateFunctions = () => {\n return useContext(FastStateFunctions);\n}\n\nexport const useFastState = () => {\n return useContext(FastState)\n}"]}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/components/FastSimonApi/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAC,UAAU,EAAC,MAAM,OAAO,CAAC;AA6GxC,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,CAAC,aAAa,CAAC,EAAoB,CAAC,CAAA;AAClE,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC,aAAa,CAAC,EAA6B,CAAC,CAAA;AAEpF,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,EAAE;IACtC,OAAO,UAAU,CAAC,kBAAkB,CAAC,CAAC;AAC1C,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,EAAE;IAC7B,OAAO,UAAU,CAAC,SAAS,CAAC,CAAA;AAChC,CAAC,CAAA","sourcesContent":["import React, {useContext} from \"react\";\n\n\nimport {FullTextServerResponseAll} from \"../../@types/results\";\nimport {Narrow, ServerNarrow} from \"../../@types/narrow\";\nimport {SortBy} from \"../../@types/sortBy\";\nimport {Product} from \"../../@types/product\";\nimport {FastCategory, smartCollectionsResults} from \"../../@types/categories\";\nimport {AppType} from \"./FastSimonApi\";\nimport {Widget} from \"../../@types/widget\";\nimport {AutocompleteReasoningResponse, AutocompleteResults} from \"../../@types/autocomplete\";\nimport {PersonalizationPreviewSettings} from \"../../utils/personalizationPreview\";\n\n\nexport interface SetStateProps extends Partial<FastStateProps> {\n\n}\n\nexport interface IsLoading {\n products: boolean,\n filters: boolean,\n}\nexport interface CustomSortSettings{\n personalization_rank: number,\n creation_date: number,\n popularity: number,\n inventory: number\n}\n\n// Compare Mode: Shows impact of Hybrid Search by comparing results WITH vs WITHOUT hybrid_search_settings\nexport interface ProductRankChange {\n productId: string;\n rankWithHybrid: number; // Position in results WITH hybrid (1-based, -1 if not found)\n rankWithoutHybrid: number; // Position in results WITHOUT hybrid (1-based, -1 if not found)\n rankDelta: number; // Positive = moved up with hybrid, negative = moved down\n status: 'improved' | 'declined' | 'new' | 'unchanged'; // How hybrid affected this product\n}\n\nexport interface ComparisonData {\n // Full ID lists for detailed comparison\n hybridOnIds: string[]; // All product IDs with Hybrid ON\n hybridOffIds: string[]; // All product IDs with Hybrid OFF\n // Per-product rank changes (for products currently displayed)\n productChanges: Map<string, ProductRankChange>;\n // Summary stats\n totalImproved: number; // Products that moved up in rank\n totalDeclined: number; // Products that moved down in rank\n totalNew: number; // Products that appeared due to hybrid (not in top N without)\n totalUnchanged: number;\n}\n\nexport interface FastStateProps {\n isReady: boolean\n isLoading: IsLoading,\n results?: FullTextServerResponseAll | smartCollectionsResults | AutocompleteReasoningResponse\n query: string\n page: number,\n narrow?: ServerNarrow[]\n type: AppType\n collectionID?: string\n sortBy?: SortBy\n recommendations?: {\n [id: string]: Widget\n },\n singleProducts?: {\n [id: string]: Product\n }\n autocomplete?: AutocompleteResults\n searchWithinSearch?: string,\n segments?: string[],\n flag?:string[]\n custom_sort_settings?:CustomSortSettings\n isAutocomplete?:boolean\n variation_id?: string | null\n force_and?: boolean\n user_segment_preview?: 'none' | 'new' | 'returning' // User segment preview mode for AI Explainer\n // Compare Mode state\n comparisonData?: ComparisonData | null\n isComparing?: boolean\n personalization_preview?: PersonalizationPreviewSettings | null\n session_token?: string // Session token for AI Explainer (passed as st param)\n // AI Explainer \"Unpublished products\" switch (collections only). The one value the chip, the notice and\n // the requests read; FastSimonApi remounts off on a site switch.\n include_unpublished?: boolean\n // Settings refetch trigger - incremented when settings modal confirms to trigger a refetch after state is updated\n refetchTrigger?: number\n}\n\nexport interface FastStateFunctionsProps {\n setQuery: (query: string, isAutocomplete?:boolean) => void,\n setSort: (sortBy: SortBy) => void,\n setNarrow: (narrow?: ServerNarrow[]) => void,\n setPage: (page: number) => void,\n getAllCategories: () => Promise<FastCategory[]>\n setCollection: (id: string) => void\n setState: (newState: SetStateProps) => void\n setFlag:(flags:string[])=>void\n setSearchWithinSearch: (query: string) => void,\n setSegments: (segments: string[]) => void,\n setCustomSort:(customSortSettings:CustomSortSettings)=>void,\n setIsAutocomplete:(isAutocomplete:boolean)=>void,\n setVariationId:(variationId: string | null)=>void,\n setForceAnd:(forceAnd: boolean)=>void,\n setUserSegmentPreview:(preview: 'none' | 'new' | 'returning')=>void,\n setPersonalizationPreview:(preview: PersonalizationPreviewSettings | null)=>void,\n updateSettingsAndRefetch:(settings: Partial<Pick<FastStateProps, 'force_and' | 'custom_sort_settings' | 'flag' | 'user_segment_preview' | 'personalization_preview' | 'session_token' | 'include_unpublished'>>,\n options?: {omitSessionTokenOnce?: boolean})=>void,\n}\n\nexport const FastState = React.createContext({} as FastStateProps)\nexport const FastStateFunctions = React.createContext({} as FastStateFunctionsProps)\n\nexport const useFastStateFunctions = () => {\n return useContext(FastStateFunctions);\n}\n\nexport const useFastState = () => {\n return useContext(FastState)\n}"]}
@@ -172,6 +172,7 @@ export declare function fastStateReducer(state: FastStateProps, action: FastStat
172
172
  merch?: any;
173
173
  } | {
174
174
  products: import("../../@types/product").ServerProduct[];
175
+ sentSessionToken?: boolean | undefined;
175
176
  ancestors: import("../../@types/categories").CategoryAncestor[];
176
177
  categoryID: string;
177
178
  name: string;
@@ -278,6 +279,7 @@ export declare function fastStateReducer(state: FastStateProps, action: FastStat
278
279
  merch?: any;
279
280
  } | {
280
281
  products: import("../../@types/product").ServerProduct[];
282
+ sentSessionToken?: boolean | undefined;
281
283
  ancestors: import("../../@types/categories").CategoryAncestor[];
282
284
  categoryID: string;
283
285
  name: string;
@@ -398,6 +400,7 @@ export declare function fastStateReducer(state: FastStateProps, action: FastStat
398
400
  total_p: number;
399
401
  avoid_tag_prefixes?: string | undefined;
400
402
  merch?: any;
403
+ sentSessionToken?: boolean | undefined;
401
404
  ancestors: import("../../@types/categories").CategoryAncestor[];
402
405
  categoryID: string;
403
406
  name: string;
@@ -406,6 +409,7 @@ export declare function fastStateReducer(state: FastStateProps, action: FastStat
406
409
  bannerHTML?: string | undefined;
407
410
  } | {
408
411
  products: import("../../@types/product").ServerProduct[];
412
+ sentSessionToken?: boolean | undefined;
409
413
  ancestors: import("../../@types/categories").CategoryAncestor[];
410
414
  categoryID: string;
411
415
  name: string;
@@ -515,6 +519,7 @@ export declare function fastStateReducer(state: FastStateProps, action: FastStat
515
519
  uuid: string;
516
520
  } | {
517
521
  products: import("../../@types/product").ServerProduct[];
522
+ sentSessionToken?: boolean | undefined;
518
523
  ancestors: import("../../@types/categories").CategoryAncestor[];
519
524
  categoryID: string;
520
525
  name: string;
@@ -16,9 +16,6 @@ interface PostProps {
16
16
  data?: Params;
17
17
  config?: AxiosRequestConfig;
18
18
  }
19
- export declare function setMerchantToken(token?: string): void;
20
- export declare function setOnMerchantTokenRejected(handler?: () => Promise<string>): void;
21
- export declare const merchantTokenHeaders: () => Record<string, string>;
22
19
  export declare const API: {
23
20
  get: <T>({ url, params, config }: GetProps) => Promise<T>;
24
21
  getWithUrl: <T_1>({ url, params, config }: GetProps) => Promise<ApiResponseWithUrl<T_1>>;
@@ -16,47 +16,10 @@ const buildUrlWithParams = (url, params) => {
16
16
  .join('&');
17
17
  return `${url}?${queryString}`;
18
18
  };
19
- // The dashboard's signed credential for this site, sent as `sid` on every serving and chat-bots call. The host owns
20
- // it: it sets the token, and on a 401 hands back a refreshed one through the rejected handler.
21
- let merchantToken = '';
22
- let onMerchantTokenRejected;
23
- export function setMerchantToken(token) {
24
- merchantToken = token !== null && token !== void 0 ? token : '';
25
- }
26
- export function setOnMerchantTokenRejected(handler) {
27
- onMerchantTokenRejected = handler;
28
- }
29
- export const merchantTokenHeaders = () => merchantToken ? { sid: merchantToken } : {};
30
- // Whether the host produced a refreshed token to retry with.
31
- function refreshRejectedToken() {
32
- return __awaiter(this, void 0, void 0, function* () {
33
- if (!onMerchantTokenRejected) {
34
- return false;
35
- }
36
- try {
37
- merchantToken = yield onMerchantTokenRejected();
38
- return true;
39
- }
40
- catch (error) {
41
- return false;
42
- }
43
- });
44
- }
45
- // `send` reads the token itself, so the one retry carries the refreshed one.
46
- function sendWithTokenRetry(send) {
47
- return __awaiter(this, void 0, void 0, function* () {
48
- const response = yield send();
49
- if (response.status !== 401 || !(yield refreshRejectedToken())) {
50
- return response;
51
- }
52
- return yield send();
53
- });
54
- }
55
19
  export const API = {
56
20
  get: function ({ url, params, config }) {
57
21
  return __awaiter(this, void 0, void 0, function* () {
58
- const fullUrl = url + `?${Object.entries(params).filter(param => param[1]).map((param) => `${param[0]}=${param[1]}`).join('&')}`;
59
- const response = yield sendWithTokenRetry(() => fetch(fullUrl, { headers: merchantTokenHeaders() }));
22
+ const response = yield fetch(url + `?${Object.entries(params).filter(param => param[1]).map((param) => `${param[0]}=${param[1]}`).join('&')}`);
60
23
  return yield response.json();
61
24
  });
62
25
  },
@@ -64,7 +27,7 @@ export const API = {
64
27
  getWithUrl: function ({ url, params, config }) {
65
28
  return __awaiter(this, void 0, void 0, function* () {
66
29
  const fullUrl = buildUrlWithParams(url, params);
67
- const response = yield sendWithTokenRetry(() => fetch(fullUrl, { headers: merchantTokenHeaders() }));
30
+ const response = yield fetch(fullUrl);
68
31
  const data = yield response.json();
69
32
  return {
70
33
  data,
@@ -73,7 +36,6 @@ export const API = {
73
36
  });
74
37
  },
75
38
  post: function ({ url, config, data }) {
76
- var _a;
77
39
  return __awaiter(this, void 0, void 0, function* () {
78
40
  const instance = axios.create({
79
41
  baseURL: url,
@@ -85,17 +47,7 @@ export const API = {
85
47
  if ('SiteKey' in instance.defaults.headers) {
86
48
  delete (instance.defaults.headers['SiteKey']);
87
49
  }
88
- const post = () => instance.post(url, data, Object.assign(Object.assign({}, config), { headers: Object.assign(Object.assign({}, config === null || config === void 0 ? void 0 : config.headers), merchantTokenHeaders()) }));
89
- let response;
90
- try {
91
- response = yield post();
92
- }
93
- catch (error) {
94
- if (((_a = error === null || error === void 0 ? void 0 : error.response) === null || _a === void 0 ? void 0 : _a.status) !== 401 || !(yield refreshRejectedToken())) {
95
- throw error;
96
- }
97
- response = yield post();
98
- }
50
+ const response = yield instance.post(url, data, config);
99
51
  return response.data;
100
52
  });
101
53
  },
@@ -120,11 +72,11 @@ export function fastSimonPost(endpoint, path, params) {
120
72
  const body = Object.assign({ src: "visual-editor" }, params);
121
73
  // Remove undefined/null values
122
74
  const cleanBody = Object.fromEntries(Object.entries(body).filter(([_, v]) => v !== undefined && v !== null));
123
- const response = yield sendWithTokenRetry(() => fetch(`${endpoint}/${path}`, {
75
+ const response = yield fetch(`${endpoint}/${path}`, {
124
76
  method: 'POST',
125
- headers: Object.assign({ 'Content-Type': 'application/json' }, merchantTokenHeaders()),
77
+ headers: { 'Content-Type': 'application/json' },
126
78
  body: JSON.stringify(cleanBody),
127
- }));
79
+ });
128
80
  return yield response.json();
129
81
  });
130
82
  }
@@ -1 +1 @@
1
- {"version":3,"file":"API.js","sourceRoot":"","sources":["../../src/services/API.ts"],"names":[],"mappings":"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","sourcesContent":["import axios, {AxiosRequestConfig} from \"axios\";\n\ninterface Params {\n [key: string]: string | number | object | undefined | boolean\n}\n\ninterface GetProps {\n url: string,\n params: Params,\n config?: AxiosRequestConfig\n}\n\nexport interface ApiResponseWithUrl<T> {\n data: T;\n request_url: string;\n}\n\ninterface PostProps {\n url: string,\n data?: Params,\n config?: AxiosRequestConfig\n}\n\n// Helper function to construct URL with query params\nconst buildUrlWithParams = (url: string, params: Params): string => {\n const queryString = Object.entries(params)\n .filter(param => param[1] !== undefined && param[1] !== null && param[1] !== '')\n .map((param) => `${param[0]}=${encodeURIComponent(String(param[1]))}`)\n .join('&');\n return `${url}?${queryString}`;\n};\n\n// The dashboard's signed credential for this site, sent as `sid` on every serving and chat-bots call. The host owns\n// it: it sets the token, and on a 401 hands back a refreshed one through the rejected handler.\nlet merchantToken = '';\nlet onMerchantTokenRejected: (() => Promise<string>) | undefined;\n\nexport function setMerchantToken(token?: string) {\n merchantToken = token ?? '';\n}\n\nexport function setOnMerchantTokenRejected(handler?: () => Promise<string>) {\n onMerchantTokenRejected = handler;\n}\n\nexport const merchantTokenHeaders = (): Record<string, string> => merchantToken ? {sid: merchantToken} : {};\n\n// Whether the host produced a refreshed token to retry with.\nasync function refreshRejectedToken(): Promise<boolean> {\n if(!onMerchantTokenRejected) {\n return false;\n }\n try {\n merchantToken = await onMerchantTokenRejected();\n return true;\n } catch(error) {\n return false;\n }\n}\n\n// `send` reads the token itself, so the one retry carries the refreshed one.\nasync function sendWithTokenRetry(send: () => Promise<Response>): Promise<Response> {\n const response = await send();\n if(response.status !== 401 || !(await refreshRejectedToken())) {\n return response;\n }\n return await send();\n}\n\nexport const API = {\n get: async function <T>({url, params, config}: GetProps): Promise<T> {\n\n const fullUrl = url + `?${Object.entries(params).filter(param => param[1]).map((param) => `${param[0]}=${param[1]}`).join('&')}`;\n const response = await sendWithTokenRetry(() => fetch(fullUrl, {headers: merchantTokenHeaders()}));\n\n return await response.json();\n },\n\n // Same as get but also returns the full request URL for debugging\n getWithUrl: async function <T>({url, params, config}: GetProps): Promise<ApiResponseWithUrl<T>> {\n const fullUrl = buildUrlWithParams(url, params);\n const response = await sendWithTokenRetry(() => fetch(fullUrl, {headers: merchantTokenHeaders()}));\n const data = await response.json();\n\n return {\n data,\n request_url: fullUrl\n };\n },\n\n post: async function <T>({url, config, data}: PostProps) {\n const instance = axios.create({\n baseURL: url,\n data: data\n });\n if('Session' in instance.defaults.headers) {\n delete ((instance.defaults.headers as Record<string, any>)['Session']);\n }\n if('SiteKey' in instance.defaults.headers) {\n delete ((instance.defaults.headers as Record<string, any>)['SiteKey']);\n }\n const post = () => instance.post(url, data, {...config, headers: {...config?.headers, ...merchantTokenHeaders()}});\n let response;\n try {\n response = await post();\n } catch(error: any) {\n if(error?.response?.status !== 401 || !(await refreshRejectedToken())) {\n throw error;\n }\n response = await post();\n }\n\n return response.data as T;\n },\n};\n\nexport const parseUrl = (url: string) => {\n const fixed = url.replace(\"https://\", \"\").replace(\"http://\", \"\");\n if (fixed[fixed.length - 1] === \"/\") {\n return fixed.slice(0, fixed.length - 1)\n }\n return fixed;\n};\n\nexport async function fastSimonGet<T>(endpoint: string, path: string, params?: Params) {\n return await API.get<T>({\n url: `${endpoint}/${path}`,\n params: {\n src: \"visual-editor\",\n ...params\n }\n })\n}\n\nexport async function fastSimonPost<T>(endpoint: string, path: string, params?: Params): Promise<T> {\n const body = {\n src: \"visual-editor\",\n ...params\n };\n // Remove undefined/null values\n const cleanBody = Object.fromEntries(\n Object.entries(body).filter(([_, v]) => v !== undefined && v !== null)\n );\n const response = await sendWithTokenRetry(() => fetch(`${endpoint}/${path}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...merchantTokenHeaders() },\n body: JSON.stringify(cleanBody),\n }));\n return await response.json();\n}"]}
1
+ {"version":3,"file":"API.js","sourceRoot":"","sources":["../../src/services/API.ts"],"names":[],"mappings":"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","sourcesContent":["import axios, {AxiosRequestConfig} from \"axios\";\n\ninterface Params {\n [key: string]: string | number | object | undefined | boolean\n}\n\ninterface GetProps {\n url: string,\n params: Params,\n config?: AxiosRequestConfig\n}\n\nexport interface ApiResponseWithUrl<T> {\n data: T;\n request_url: string;\n}\n\ninterface PostProps {\n url: string,\n data?: Params,\n config?: AxiosRequestConfig\n}\n\n// Helper function to construct URL with query params\nconst buildUrlWithParams = (url: string, params: Params): string => {\n const queryString = Object.entries(params)\n .filter(param => param[1] !== undefined && param[1] !== null && param[1] !== '')\n .map((param) => `${param[0]}=${encodeURIComponent(String(param[1]))}`)\n .join('&');\n return `${url}?${queryString}`;\n};\n\nexport const API = {\n get: async function <T>({url, params, config}: GetProps): Promise<T> {\n\n const response = await fetch(url + `?${Object.entries(params).filter(param => param[1]).map((param) => `${param[0]}=${param[1]}`).join('&')}`);\n\n return await response.json();\n },\n\n // Same as get but also returns the full request URL for debugging\n getWithUrl: async function <T>({url, params, config}: GetProps): Promise<ApiResponseWithUrl<T>> {\n const fullUrl = buildUrlWithParams(url, params);\n const response = await fetch(fullUrl);\n const data = await response.json();\n\n return {\n data,\n request_url: fullUrl\n };\n },\n\n post: async function <T>({url, config, data}: PostProps) {\n const instance = axios.create({\n baseURL: url,\n data: data\n });\n if('Session' in instance.defaults.headers) {\n delete ((instance.defaults.headers as Record<string, any>)['Session']);\n }\n if('SiteKey' in instance.defaults.headers) {\n delete ((instance.defaults.headers as Record<string, any>)['SiteKey']);\n }\n const response = await instance.post(url, data, config);\n\n return response.data as T;\n },\n};\n\nexport const parseUrl = (url: string) => {\n const fixed = url.replace(\"https://\", \"\").replace(\"http://\", \"\");\n if (fixed[fixed.length - 1] === \"/\") {\n return fixed.slice(0, fixed.length - 1)\n }\n return fixed;\n};\n\nexport async function fastSimonGet<T>(endpoint: string, path: string, params?: Params) {\n return await API.get<T>({\n url: `${endpoint}/${path}`,\n params: {\n src: \"visual-editor\",\n ...params\n }\n })\n}\n\nexport async function fastSimonPost<T>(endpoint: string, path: string, params?: Params): Promise<T> {\n const body = {\n src: \"visual-editor\",\n ...params\n };\n // Remove undefined/null values\n const cleanBody = Object.fromEntries(\n Object.entries(body).filter(([_, v]) => v !== undefined && v !== null)\n );\n const response = await fetch(`${endpoint}/${path}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(cleanBody),\n });\n return await response.json();\n}"]}
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@fast-simon/dashboard-utilities",
3
- "version": "1.0.182-beta.1",
3
+ "version": "1.0.183-beta.0",
4
4
  "scripts": {
5
5
  "dev": "vite",
6
6
  "preview": "vite preview",
7
7
  "build": "tsc -p tsconfig-build.json && npm test",
8
- "test": "node --test tests/rpiSnapshot.test.cjs tests/searchPreview.test.cjs tests/smartCollections.test.cjs tests/editorRequestSource.test.cjs tests/merchantToken.test.cjs",
8
+ "test": "node --test tests/rpiSnapshot.test.cjs tests/searchPreview.test.cjs tests/smartCollections.test.cjs tests/editorRequestSource.test.cjs",
9
9
  "postbuild": "copyfiles -u 2 \"src/components/**/*.css\" dist/components && copyfiles -u 2 \"src/icons/**/*.css\" dist/icons && copyfiles -u 2 \"src/assets/**/*.gif\" dist/assets"
10
10
  },
11
11
  "main": "dist/index.js",