@fast-simon/dashboard-utilities 1.0.167-beta.1 → 1.0.167
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.
- package/dist/@types/autocomplete.d.ts +7 -0
- package/dist/@types/autocomplete.js.map +1 -1
- package/dist/@types/categories.d.ts +2 -0
- package/dist/@types/categories.js.map +1 -1
- package/dist/@types/results.d.ts +2 -0
- package/dist/@types/results.js.map +1 -1
- package/dist/components/FastSimonApi/FastSimonApi.d.ts +1 -4
- package/dist/components/FastSimonApi/FastSimonApi.js +2 -15
- package/dist/components/FastSimonApi/FastSimonApi.js.map +1 -1
- package/dist/components/FastSimonApi/reducer.d.ts +16 -0
- package/dist/utils/rpiSnapshot.d.ts +11 -0
- package/dist/utils/rpiSnapshot.js +21 -0
- package/dist/utils/rpiSnapshot.js.map +1 -0
- package/package.json +3 -2
|
@@ -63,4 +63,11 @@ export interface AutocompleteReasoningResponse {
|
|
|
63
63
|
query_understanding?: QueryUnderstanding;
|
|
64
64
|
reformulation_source?: string;
|
|
65
65
|
request_url?: string;
|
|
66
|
+
rpi_methodology_assigned?: string | null;
|
|
67
|
+
rpi_methodology_preview_requested?: boolean;
|
|
68
|
+
rpi_methodology_effective?: string | null;
|
|
69
|
+
rpi_methodology_fallback_reason?: string | null;
|
|
70
|
+
rpi_candidate_available?: boolean;
|
|
71
|
+
rpi_candidate_unavailable_reason?: string | null;
|
|
72
|
+
rpi_candidate_readiness_status?: string | null;
|
|
66
73
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autocomplete.js","sourceRoot":"","sources":["../../src/@types/autocomplete.ts"],"names":[],"mappings":"","sourcesContent":["import {ServerProduct} from \"./product\";\nimport {Facet, FastCategory, FastTurbolinks} from \"./facets\";\nimport {PopularSearch, ContextFilteringData, QueryUnderstanding} from \"./results\";\nimport {SortBy} from \"./sortBy\";\n\n\n\nexport interface AutocompleteResults {\n totalResults: number,\n categories?: FastCategory[],\n products: ServerProduct[]\n turbolinks?: FastTurbolinks[]\n popularSearches: PopularSearch[]\n query: string\n}\n\nexport interface autocompleteProps {\n storeID: number\n uuid: string\n siteKey?:string\n cdn?: number\n term: string,\n userToken: string,\n sessionStart: number,\n withAttributes?: boolean\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 market_context?: string | null // Region code for market-specific filtering (e.g., \"US\", \"CA\", \"UK\")\n variation_id?: string | null // A/B test variation ID for reasoning/experiment tracking\n force_and?: boolean\n ps?: 'new' | 'returning' | null\n spv?: string | null // Session Product Views JSON for personalization preview\n personalization?: string | null // Comma-separated personalization types to enable (e.g., 'gender')\n}\nexport interface AutocompleteReasoningResponse {\n auto_facets?: boolean\n isp_quick_view_mode?: number\n products: ServerProduct[]\n merch: {\n prorduct:any,\n rules:any,\n strategy:any,\n visual:any\n }\n personalized_products:any[]\n term:string\n totalResults: number\n uuid:string\n\n antonyms?: Record<string, number[]>\n\n //all bellow wont be never field but to keep consistent with all the AIExplainer implementation\n sortBy?:SortBy\n within_search_results_for?: string,\n isNoResults?:any,\n pageCount?:number,\n narrow?: [string, string, string][],\n facets?: Facet[],\n page?: number,\n results_for?: string,\n id_list?:number[]\n turbolink?: string\n context?: ContextFilteringData // Context-based filtering data (market contexts)\n query_understanding?: QueryUnderstanding\n reformulation_source?: string\n request_url?: string // Full URL with all params that was executed (for debugging)\n}"]}
|
|
1
|
+
{"version":3,"file":"autocomplete.js","sourceRoot":"","sources":["../../src/@types/autocomplete.ts"],"names":[],"mappings":"","sourcesContent":["import {ServerProduct} from \"./product\";\nimport {Facet, FastCategory, FastTurbolinks} from \"./facets\";\nimport {PopularSearch, ContextFilteringData, QueryUnderstanding} from \"./results\";\nimport {SortBy} from \"./sortBy\";\n\n\n\nexport interface AutocompleteResults {\n totalResults: number,\n categories?: FastCategory[],\n products: ServerProduct[]\n turbolinks?: FastTurbolinks[]\n popularSearches: PopularSearch[]\n query: string\n}\n\nexport interface autocompleteProps {\n storeID: number\n uuid: string\n siteKey?:string\n cdn?: number\n term: string,\n userToken: string,\n sessionStart: number,\n withAttributes?: boolean\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 market_context?: string | null // Region code for market-specific filtering (e.g., \"US\", \"CA\", \"UK\")\n variation_id?: string | null // A/B test variation ID for reasoning/experiment tracking\n force_and?: boolean\n ps?: 'new' | 'returning' | null\n spv?: string | null // Session Product Views JSON for personalization preview\n personalization?: string | null // Comma-separated personalization types to enable (e.g., 'gender')\n}\nexport interface AutocompleteReasoningResponse {\n auto_facets?: boolean\n isp_quick_view_mode?: number\n products: ServerProduct[]\n merch: {\n prorduct:any,\n rules:any,\n strategy:any,\n visual:any\n }\n personalized_products:any[]\n term:string\n totalResults: number\n uuid:string\n\n antonyms?: Record<string, number[]>\n\n //all bellow wont be never field but to keep consistent with all the AIExplainer implementation\n sortBy?:SortBy\n within_search_results_for?: string,\n isNoResults?:any,\n pageCount?:number,\n narrow?: [string, string, string][],\n facets?: Facet[],\n page?: number,\n results_for?: string,\n id_list?:number[]\n turbolink?: string\n context?: ContextFilteringData // Context-based filtering data (market contexts)\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_candidate_available?: boolean\n rpi_candidate_unavailable_reason?: string | null\n rpi_candidate_readiness_status?: string | null\n}\n"]}
|
|
@@ -115,12 +115,14 @@ export interface smartCollectionsResults {
|
|
|
115
115
|
reformulation_source?: string;
|
|
116
116
|
request_url?: string;
|
|
117
117
|
rpi_methodology_assigned?: string | null;
|
|
118
|
+
rpi_methodology_preview_requested?: boolean;
|
|
118
119
|
rpi_methodology_effective?: string | null;
|
|
119
120
|
rpi_methodology_fallback_reason?: string | null;
|
|
120
121
|
rpi_snapshot_computed_at?: string | null;
|
|
121
122
|
rpi_snapshot_covered_until?: string | null;
|
|
122
123
|
rpi_candidate_available?: boolean;
|
|
123
124
|
rpi_candidate_unavailable_reason?: string | null;
|
|
125
|
+
rpi_candidate_readiness_status?: string | null;
|
|
124
126
|
}
|
|
125
127
|
export type inventoryCallback = ({}: {
|
|
126
128
|
action: "products inventory";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"categories.js","sourceRoot":"","sources":["../../src/@types/categories.ts"],"names":[],"mappings":"","sourcesContent":["import {SortBy} from \"./sortBy\";\nimport {Narrow, ServerNarrow} from \"./narrow\";\nimport { ServerProduct} from \"./product\";\nimport {ServerFacet} from \"./facets\";\nimport {ContextFilteringData, QueryUnderstanding} from \"./results\";\n\n\nexport type AncestorCategory = [string, string, string] // category_id, category_name, category_url\nexport interface RelatedCategory {\n id: string\n l: string\n t: string\n u: string\n}\nexport type CategoryAncestor = [string, string, string]\nexport interface Category {\n d: string\n id: string\n l: string\n p_id: string\n t: string\n u: string\n parent_name?: string\n}\nexport interface FastCategory {\n d: string\n id: string\n l: string\n p_id: string\n t: string\n u: string\n parent_name?: string\n}\nexport interface smartCollectionsProps {\n storeID: number\n uuid: string\n siteKey?:string\n cdn: number\n categoryID: string,\n userToken: string,\n sessionStart: number,\n page?: number\n productsPerPage?: number\n sortBy?: SortBy\n narrowBy?: ServerNarrow[]\n facetRequired?: FacetRequired\n withAttributes?: boolean\n recent?: string\n rec?: boolean\n searchWithinSearch?: string,\n segments?: string[],\n hasShopifyMarkets?: boolean,\n disable_turbolinks?:boolean\n disable_strategies?:boolean\n disable_merchandising?:boolean\n disable_semantics?:boolean\n disable_merchandising_rules?:boolean\n disable_antonyms?:boolean\n custom_sort_settings?:{personalization_rank: number, creation_date: number, popularity: number, inventory: number}\n with_product_analytics?:boolean\n market_context?: string | null // Region code for market-specific filtering (e.g., \"US\", \"CA\", \"UK\")\n variation_id?: string | null // A/B test variation ID for reasoning/experiment tracking\n ps?: 'new' | 'returning' | null // Personalization segment for user segment coefficient preview (new/returning user)\n spv?: string | null // Session Product Views JSON for personalization preview (e.g., '{\"pid1\":ts,\"pid2\":ts}')\n spc?: string | null // Session Product Cart-adds JSON for size personalization preview (e.g., '{\"pid::vid\":ts}'); collection-only\n personalization?: string | null // Comma-separated personalization types to enable (e.g., 'gender')\n force_and?: boolean\n session_token?: string // Session token override for AI Explainer (sent as st param)\n}\nexport type FacetRequired = 0 | 1 | 2\nexport type smartCollectionsCallback = ({}: {\n action: \"products\" | \"facets and products\"\n payload: smartCollectionsResults\n}) => void\nexport interface smartCollectionsResults {\n ancestors: CategoryAncestor[]\n categoryID: string\n name: string\n category_name: string\n products: ServerProduct[]\n facets?: ServerFacet[]\n totalResults: number\n sortBy?: SortBy,\n narrow?: Narrow[],\n isNoResults?: boolean\n page?: number\n pageCount?: number\n avoidPrefixList?: string[]\n antonyms?: Record<string, number[]>\n merch?: any\n bannerHTML?: string\n turbolink?:string\n hiddenProducts?:ServerProduct[]\n within_search_results_for?:string\n results_for?: string\n id_list?:number[]\n personalized_products?: number[] // Product IDs affected by RPI personalization\n context?: ContextFilteringData // Context-based filtering data (market contexts)\n analytics?: {\n badges?: {\n winners?: Record<string, string> // Product ID -> tooltip message\n overexposed?: Record<string, string> // Product ID -> tooltip message\n new_arrivals?: string[]\n }\n key_hidden_winners?: string\n key_overexposed?: string\n }\n matching_sets?: Record<string, string> // Product ID -> set name\n group_strategy?: Record<string, string> // Product ID -> group name\n variety_strategy?: number[] // Product IDs affected by variety strategy\n query_understanding?: QueryUnderstanding\n reformulation_source?: string\n request_url?: string // Full URL with all params that was executed (for debugging)\n rpi_methodology_assigned?: string | null\n rpi_methodology_effective?: string | null\n rpi_methodology_fallback_reason?: string | null\n rpi_snapshot_computed_at?: string | null\n rpi_snapshot_covered_until?: string | null\n rpi_candidate_available?: boolean\n rpi_candidate_unavailable_reason?: string | null\n\n}\nexport type inventoryCallback = ({}: {\n action: \"products inventory\"\n payload: {productsInventory: productsInventoryResults[]}\n}) => void\nexport interface productsInventoryResults {\n id: string;\n totalInventory: number;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"categories.js","sourceRoot":"","sources":["../../src/@types/categories.ts"],"names":[],"mappings":"","sourcesContent":["import {SortBy} from \"./sortBy\";\nimport {Narrow, ServerNarrow} from \"./narrow\";\nimport { ServerProduct} from \"./product\";\nimport {ServerFacet} from \"./facets\";\nimport {ContextFilteringData, QueryUnderstanding} from \"./results\";\n\n\nexport type AncestorCategory = [string, string, string] // category_id, category_name, category_url\nexport interface RelatedCategory {\n id: string\n l: string\n t: string\n u: string\n}\nexport type CategoryAncestor = [string, string, string]\nexport interface Category {\n d: string\n id: string\n l: string\n p_id: string\n t: string\n u: string\n parent_name?: string\n}\nexport interface FastCategory {\n d: string\n id: string\n l: string\n p_id: string\n t: string\n u: string\n parent_name?: string\n}\nexport interface smartCollectionsProps {\n storeID: number\n uuid: string\n siteKey?:string\n cdn: number\n categoryID: string,\n userToken: string,\n sessionStart: number,\n page?: number\n productsPerPage?: number\n sortBy?: SortBy\n narrowBy?: ServerNarrow[]\n facetRequired?: FacetRequired\n withAttributes?: boolean\n recent?: string\n rec?: boolean\n searchWithinSearch?: string,\n segments?: string[],\n hasShopifyMarkets?: boolean,\n disable_turbolinks?:boolean\n disable_strategies?:boolean\n disable_merchandising?:boolean\n disable_semantics?:boolean\n disable_merchandising_rules?:boolean\n disable_antonyms?:boolean\n custom_sort_settings?:{personalization_rank: number, creation_date: number, popularity: number, inventory: number}\n with_product_analytics?:boolean\n market_context?: string | null // Region code for market-specific filtering (e.g., \"US\", \"CA\", \"UK\")\n variation_id?: string | null // A/B test variation ID for reasoning/experiment tracking\n ps?: 'new' | 'returning' | null // Personalization segment for user segment coefficient preview (new/returning user)\n spv?: string | null // Session Product Views JSON for personalization preview (e.g., '{\"pid1\":ts,\"pid2\":ts}')\n spc?: string | null // Session Product Cart-adds JSON for size personalization preview (e.g., '{\"pid::vid\":ts}'); collection-only\n personalization?: string | null // Comma-separated personalization types to enable (e.g., 'gender')\n force_and?: boolean\n session_token?: string // Session token override for AI Explainer (sent as st param)\n}\nexport type FacetRequired = 0 | 1 | 2\nexport type smartCollectionsCallback = ({}: {\n action: \"products\" | \"facets and products\"\n payload: smartCollectionsResults\n}) => void\nexport interface smartCollectionsResults {\n ancestors: CategoryAncestor[]\n categoryID: string\n name: string\n category_name: string\n products: ServerProduct[]\n facets?: ServerFacet[]\n totalResults: number\n sortBy?: SortBy,\n narrow?: Narrow[],\n isNoResults?: boolean\n page?: number\n pageCount?: number\n avoidPrefixList?: string[]\n antonyms?: Record<string, number[]>\n merch?: any\n bannerHTML?: string\n turbolink?:string\n hiddenProducts?:ServerProduct[]\n within_search_results_for?:string\n results_for?: string\n id_list?:number[]\n personalized_products?: number[] // Product IDs affected by RPI personalization\n context?: ContextFilteringData // Context-based filtering data (market contexts)\n analytics?: {\n badges?: {\n winners?: Record<string, string> // Product ID -> tooltip message\n overexposed?: Record<string, string> // Product ID -> tooltip message\n new_arrivals?: string[]\n }\n key_hidden_winners?: string\n key_overexposed?: string\n }\n matching_sets?: Record<string, string> // Product ID -> set name\n group_strategy?: Record<string, string> // Product ID -> group name\n variety_strategy?: number[] // Product IDs affected by variety strategy\n query_understanding?: QueryUnderstanding\n reformulation_source?: string\n request_url?: string // Full URL with all params that was executed (for debugging)\n rpi_methodology_assigned?: string | null\n rpi_methodology_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"]}
|
package/dist/@types/results.d.ts
CHANGED
|
@@ -151,11 +151,13 @@ export interface FullTextServerResponseAll extends fullTextSearchResponse {
|
|
|
151
151
|
reformulation_source?: string;
|
|
152
152
|
request_url?: string;
|
|
153
153
|
rpi_methodology_assigned?: string | null;
|
|
154
|
+
rpi_methodology_preview_requested?: boolean;
|
|
154
155
|
rpi_methodology_effective?: string | null;
|
|
155
156
|
rpi_methodology_fallback_reason?: string | null;
|
|
156
157
|
rpi_snapshot_computed_at?: string | null;
|
|
157
158
|
rpi_snapshot_covered_until?: string | null;
|
|
158
159
|
rpi_candidate_available?: boolean;
|
|
159
160
|
rpi_candidate_unavailable_reason?: string | null;
|
|
161
|
+
rpi_candidate_readiness_status?: string | null;
|
|
160
162
|
}
|
|
161
163
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"results.js","sourceRoot":"","sources":["../../src/@types/results.ts"],"names":[],"mappings":"","sourcesContent":["import type {Narrow, ServerNarrow} from \"./narrow\";\nimport type {SortBy} from \"./sortBy\";\n\nimport type { Facet} from \"./facets\";\nimport {AncestorCategory, RelatedCategory} from \"./categories\";\n\nimport {Product, ServerProduct} from \"./product\";\n\nexport interface PopularSearch {\n label: string\n type: \"p\"\n}\ninterface Base {\n narrow: Narrow,\n sortBy: SortBy,\n totalResults: number,\n page: number,\n totalPages: number,\n products: Product[],\n facets: Facet[],\n avoidTagPrefixes: string[],\n sort: SortBy,\n productIDS: string[],\n bannerHTML: string,\n bannerHTMLMobile: string,\n // ancestors: Ancestor[]\n}\n\nexport interface SearchResults extends Base {\n query: string,\n totalCMS: number,\n didYouMean?: string[],\n personalizedProductIds: number[],\n sessionProductIds: number[],\n resultsFor?: string,\n isRelatedResults?: boolean\n relatedSearch?: string[]\n}\n\nexport interface CategoryResults extends Base {\n categoryID: string,\n categoryName: string,\n personalizationRecencyLimit?: number,\n personalizedProductIds: number[],\n sessionProductIds: number[],\n relatedCategories: RelatedCategory[],\n}\n\nexport interface LandingPageResults extends Base {\n lpSlug: string,\n title: string,\n indexPage: number\n}\n\nexport type FacetRequired = 0 | 1 | 2\nexport type CategoryAncestor = [string, string, string]\n\nexport interface fullTextSearchProps {\n term: string\n storeID: number\n siteKey?:string\n uuid: string\n cdn?: number\n userToken: string,\n sessionStart: number,\n page?: number\n productsPerPage?: number\n sortBy?: SortBy\n narrowBy?: ServerNarrow[]\n facetRequired?: FacetRequired\n withAttributes?: boolean\n recent?: string\n searchWithinSearch?: string,\n segments?: string[]\n hasShopifyMarkets?: boolean\n disable_turbolinks?:boolean\n disable_strategies?:boolean\n disable_merchandising?:boolean\n disable_semantics?:boolean\n disable_merchandising_rules?:boolean\n disable_antonyms?:boolean\n custom_sort_settings?:{personalization_rank: number, creation_date: number, popularity: number, inventory: number}\n with_product_analytics?:boolean\n market_context?: string | null // Region code for market-specific filtering (e.g., \"US\", \"CA\", \"UK\")\n variation_id?: string | null // A/B test variation ID for reasoning/experiment tracking\n force_and?: boolean\n ps?: 'new' | 'returning' | null // Personalization segment for user segment coefficient preview (new/returning user)\n spv?: string | null // Session Product Views JSON for personalization preview (e.g., '{\"pid1\":ts,\"pid2\":ts}')\n personalization?: string | null // Comma-separated personalization types to enable (e.g., 'gender')\n session_token?: string // Session token override for AI Explainer (sent as st param)\n}\nexport interface ContextFilteringData {\n hidden: number[] // Product IDs hidden by context filtering\n unpublished: Record<number, string> // product_id -> region_code (e.g., \"US\", \"CA\")\n unsellable: Record<number, string> // product_id -> region_code (e.g., \"UK\", \"FR\")\n}\n\nexport interface fullTextSearchResponse {\n products: ServerProduct[]\n facets: Facet[]\n total_results: number\n facets_completed?: boolean\n sortBy?: SortBy,\n narrow: [string, string, string][]\n pop_products_no_results?: boolean\n page: number\n total_p: number\n personalized_products?: number[],\n ancestor_categories?: CategoryAncestor[]\n avoid_tag_prefixes?: string\n merch?: any\n}\nexport interface QueryUnderstanding {\n query: string\n has_ai_enrichment: boolean\n structured_attributes: Record<string, string[]>\n social_attributes: Record<string, string[]>\n intent_mapping: string[]\n}\n\nexport interface FullTextServerResponseAll extends fullTextSearchResponse{\n alternatives?: string[]\n term: string\n cms_number_found?: number\n within_search_results_for?: string\n banner_html: string\n banner_html_mobile: string\n turbolink?: string\n personalized_products?: number[]\n session_products?: number[]\n results_for?: string\n related_results?: boolean,\n ancestor_categories?: AncestorCategory[],\n related_search?: string[],\n hidden?:any,\n isNoResults?:any,\n totalResults?:any,\n hiddenProducts?:ServerProduct[],\n pageCount?:number,\n sort_by?: SortBy,\n id_list?:number[]\n antonyms?: Record<string, number[]>\n context?: ContextFilteringData // Context-based filtering data (market contexts)\n analytics?: {\n badges?: {\n winners?: Record<string, string> // Product ID -> tooltip message\n overexposed?: Record<string, string> // Product ID -> tooltip message\n new_arrivals?: string[]\n }\n key_hidden_winners?: string\n key_overexposed?: string\n }\n matching_sets?: Record<string, string> // Product ID -> set name\n group_strategy?: Record<string, string> // Product ID -> group name\n variety_strategy?: number[] // Product IDs affected by variety strategy\n query_understanding?: QueryUnderstanding\n reformulation_source?: string\n request_url?: string // Full URL with all params that was executed (for debugging)\n rpi_methodology_assigned?: string | null\n rpi_methodology_effective?: string | null\n rpi_methodology_fallback_reason?: string | null\n rpi_snapshot_computed_at?: string | null\n rpi_snapshot_covered_until?: string | null\n rpi_candidate_available?: boolean\n rpi_candidate_unavailable_reason?: string | null\n\n}\n"]}
|
|
1
|
+
{"version":3,"file":"results.js","sourceRoot":"","sources":["../../src/@types/results.ts"],"names":[],"mappings":"","sourcesContent":["import type {Narrow, ServerNarrow} from \"./narrow\";\nimport type {SortBy} from \"./sortBy\";\n\nimport type { Facet} from \"./facets\";\nimport {AncestorCategory, RelatedCategory} from \"./categories\";\n\nimport {Product, ServerProduct} from \"./product\";\n\nexport interface PopularSearch {\n label: string\n type: \"p\"\n}\ninterface Base {\n narrow: Narrow,\n sortBy: SortBy,\n totalResults: number,\n page: number,\n totalPages: number,\n products: Product[],\n facets: Facet[],\n avoidTagPrefixes: string[],\n sort: SortBy,\n productIDS: string[],\n bannerHTML: string,\n bannerHTMLMobile: string,\n // ancestors: Ancestor[]\n}\n\nexport interface SearchResults extends Base {\n query: string,\n totalCMS: number,\n didYouMean?: string[],\n personalizedProductIds: number[],\n sessionProductIds: number[],\n resultsFor?: string,\n isRelatedResults?: boolean\n relatedSearch?: string[]\n}\n\nexport interface CategoryResults extends Base {\n categoryID: string,\n categoryName: string,\n personalizationRecencyLimit?: number,\n personalizedProductIds: number[],\n sessionProductIds: number[],\n relatedCategories: RelatedCategory[],\n}\n\nexport interface LandingPageResults extends Base {\n lpSlug: string,\n title: string,\n indexPage: number\n}\n\nexport type FacetRequired = 0 | 1 | 2\nexport type CategoryAncestor = [string, string, string]\n\nexport interface fullTextSearchProps {\n term: string\n storeID: number\n siteKey?:string\n uuid: string\n cdn?: number\n userToken: string,\n sessionStart: number,\n page?: number\n productsPerPage?: number\n sortBy?: SortBy\n narrowBy?: ServerNarrow[]\n facetRequired?: FacetRequired\n withAttributes?: boolean\n recent?: string\n searchWithinSearch?: string,\n segments?: string[]\n hasShopifyMarkets?: boolean\n disable_turbolinks?:boolean\n disable_strategies?:boolean\n disable_merchandising?:boolean\n disable_semantics?:boolean\n disable_merchandising_rules?:boolean\n disable_antonyms?:boolean\n custom_sort_settings?:{personalization_rank: number, creation_date: number, popularity: number, inventory: number}\n with_product_analytics?:boolean\n market_context?: string | null // Region code for market-specific filtering (e.g., \"US\", \"CA\", \"UK\")\n variation_id?: string | null // A/B test variation ID for reasoning/experiment tracking\n force_and?: boolean\n ps?: 'new' | 'returning' | null // Personalization segment for user segment coefficient preview (new/returning user)\n spv?: string | null // Session Product Views JSON for personalization preview (e.g., '{\"pid1\":ts,\"pid2\":ts}')\n personalization?: string | null // Comma-separated personalization types to enable (e.g., 'gender')\n session_token?: string // Session token override for AI Explainer (sent as st param)\n}\nexport interface ContextFilteringData {\n hidden: number[] // Product IDs hidden by context filtering\n unpublished: Record<number, string> // product_id -> region_code (e.g., \"US\", \"CA\")\n unsellable: Record<number, string> // product_id -> region_code (e.g., \"UK\", \"FR\")\n}\n\nexport interface fullTextSearchResponse {\n products: ServerProduct[]\n facets: Facet[]\n total_results: number\n facets_completed?: boolean\n sortBy?: SortBy,\n narrow: [string, string, string][]\n pop_products_no_results?: boolean\n page: number\n total_p: number\n personalized_products?: number[],\n ancestor_categories?: CategoryAncestor[]\n avoid_tag_prefixes?: string\n merch?: any\n}\nexport interface QueryUnderstanding {\n query: string\n has_ai_enrichment: boolean\n structured_attributes: Record<string, string[]>\n social_attributes: Record<string, string[]>\n intent_mapping: string[]\n}\n\nexport interface FullTextServerResponseAll extends fullTextSearchResponse{\n alternatives?: string[]\n term: string\n cms_number_found?: number\n within_search_results_for?: string\n banner_html: string\n banner_html_mobile: string\n turbolink?: string\n personalized_products?: number[]\n session_products?: number[]\n results_for?: string\n related_results?: boolean,\n ancestor_categories?: AncestorCategory[],\n related_search?: string[],\n hidden?:any,\n isNoResults?:any,\n totalResults?:any,\n hiddenProducts?:ServerProduct[],\n pageCount?:number,\n sort_by?: SortBy,\n id_list?:number[]\n antonyms?: Record<string, number[]>\n context?: ContextFilteringData // Context-based filtering data (market contexts)\n analytics?: {\n badges?: {\n winners?: Record<string, string> // Product ID -> tooltip message\n overexposed?: Record<string, string> // Product ID -> tooltip message\n new_arrivals?: string[]\n }\n key_hidden_winners?: string\n key_overexposed?: string\n }\n matching_sets?: Record<string, string> // Product ID -> set name\n group_strategy?: Record<string, string> // Product ID -> group name\n variety_strategy?: number[] // Product IDs affected by variety strategy\n query_understanding?: QueryUnderstanding\n reformulation_source?: string\n request_url?: string // Full URL with all params that was executed (for debugging)\n rpi_methodology_assigned?: string | null\n rpi_methodology_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}\n"]}
|
|
@@ -2,6 +2,7 @@ import React from "react";
|
|
|
2
2
|
import { CustomSortSettings } from "./context";
|
|
3
3
|
import { SortBy } from "../../@types/sortBy";
|
|
4
4
|
import { FullTextServerResponseAll } from "../../@types/results";
|
|
5
|
+
export { analyticsMatchesRankingSnapshot } from "../../utils/rpiSnapshot";
|
|
5
6
|
import { smartCollectionsResults } from "../../@types/categories";
|
|
6
7
|
export type AppType = "SPA" | "MPA";
|
|
7
8
|
interface Props {
|
|
@@ -39,10 +40,6 @@ export interface MainTheme {
|
|
|
39
40
|
errorRed: string;
|
|
40
41
|
loadingYellow: string;
|
|
41
42
|
}
|
|
42
|
-
export declare function analyticsMatchesRankingSnapshot(analyticsPayload: {
|
|
43
|
-
responseRpiMethodologyEffective?: string | null;
|
|
44
|
-
responseRpiSnapshotComputedAt?: string | null;
|
|
45
|
-
}, rankingResponse: any): boolean;
|
|
46
43
|
/** Attach response-level reasoning maps before items are renamed to products. */
|
|
47
44
|
export declare function attachPersonalizationToItems(response: any): void;
|
|
48
45
|
declare const _default: React.NamedExoticComponent<Props>;
|
|
@@ -28,6 +28,8 @@ import { getShowSalesAnalyticsSetting } from "../../utils/getSalesAnalyticsSetti
|
|
|
28
28
|
import { getLSVectorSearchOn } from "../../utils/getLSVectorSearch";
|
|
29
29
|
import { getPersonalizationSegment } from "../../utils/userSegmentPreview";
|
|
30
30
|
import { buildPersonalizationParams } from "../../utils/personalizationPreview";
|
|
31
|
+
import { analyticsMatchesRankingSnapshot } from "../../utils/rpiSnapshot";
|
|
32
|
+
export { analyticsMatchesRankingSnapshot } from "../../utils/rpiSnapshot";
|
|
31
33
|
import { FullTextSearch } from "../../services/search";
|
|
32
34
|
import { SmartCollections } from "../../services/smartCollections";
|
|
33
35
|
import { Autocomplete } from "../../services/autocomplete";
|
|
@@ -55,21 +57,6 @@ function buildAnalyticsPayload(analyticsResponse, productAnalyticsMap) {
|
|
|
55
57
|
responseRpiSnapshotComputedAt: analyticsResponse.rpi_snapshot_computed_at,
|
|
56
58
|
};
|
|
57
59
|
}
|
|
58
|
-
const PRESENTATION_RPI_METHODOLOGY = 'presentation10_v2';
|
|
59
|
-
export function analyticsMatchesRankingSnapshot(analyticsPayload, rankingResponse) {
|
|
60
|
-
const analyticsIsCandidate = analyticsPayload.responseRpiMethodologyEffective
|
|
61
|
-
=== PRESENTATION_RPI_METHODOLOGY;
|
|
62
|
-
const rankingIsCandidate = (rankingResponse === null || rankingResponse === void 0 ? void 0 : rankingResponse.rpi_methodology_effective)
|
|
63
|
-
=== PRESENTATION_RPI_METHODOLOGY;
|
|
64
|
-
if (!analyticsIsCandidate && !rankingIsCandidate)
|
|
65
|
-
return true;
|
|
66
|
-
const analyticsSnapshot = analyticsPayload.responseRpiSnapshotComputedAt;
|
|
67
|
-
const rankingSnapshot = rankingResponse === null || rankingResponse === void 0 ? void 0 : rankingResponse.rpi_snapshot_computed_at;
|
|
68
|
-
return analyticsIsCandidate
|
|
69
|
-
&& rankingIsCandidate
|
|
70
|
-
&& Boolean(analyticsSnapshot)
|
|
71
|
-
&& analyticsSnapshot === rankingSnapshot;
|
|
72
|
-
}
|
|
73
60
|
/** Attach response-level reasoning maps before items are renamed to products. */
|
|
74
61
|
export function attachPersonalizationToItems(response) {
|
|
75
62
|
const coefficients = response === null || response === void 0 ? void 0 : response.personalization_coefficients;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FastSimonApi.js","sourceRoot":"","sources":["../../../src/components/FastSimonApi/FastSimonApi.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, {useEffect, useReducer, useRef, useState, useMemo, useCallback} from \"react\";\nimport {ComparisonData, ProductRankChange, CustomSortSettings, FastState, FastStateFunctions, IsLoading, SetStateProps} from \"./context\";\nimport {ThemeProvider} from \"react-jss\";\nimport {fastStateReducer} from \"./reducer\";\nimport {newObject} from \"../common\";\n\nimport {SortBy} from \"../../@types/sortBy\";\nimport {fullTextSearchProps, FullTextServerResponseAll} from \"../../@types/results\";\nimport {getShowSalesAnalyticsSetting} from \"../../utils/getSalesAnalyticsSettings\";\nimport {getLSVectorSearchOn} from \"../../utils/getLSVectorSearch\";\nimport {getPersonalizationSegment, UserSegmentPreview} from \"../../utils/userSegmentPreview\";\nimport {buildPersonalizationParams, PersonalizationPreviewSettings} from \"../../utils/personalizationPreview\";\n\nimport {PersonalizationStory, Product, ProductAnalytics} from \"../../@types/product\";\nimport {FastCategory, smartCollectionsProps, smartCollectionsResults} from \"../../@types/categories\";\nimport {Narrow, ServerNarrow} from \"../../@types/narrow\";\nimport {FullTextSearch} from \"../../services/search\";\nimport {SmartCollections} from \"../../services/smartCollections\";\nimport {autocompleteProps, AutocompleteReasoningResponse} from \"../../@types/autocomplete\";\nimport {Autocomplete} from \"../../services/autocomplete\";\n\nexport type AppType = \"SPA\" | \"MPA\";\n\ninterface Props {\n storeID: number;\n uuid: string;\n type?: AppType;\n onReady?: VoidFunction;\n cartToken?: string;\n defaultSort?: SortBy\n collectionID?: string\n withProductAttributes?: boolean\n promoTiles?: boolean\n getTitle?: ({}: { categoryID?: string, query?: string }) => string\n isInfiniteScroll?: boolean\n useFilters?: boolean\n noReport?: boolean\n customTitleChange?: (results?: FullTextServerResponseAll | smartCollectionsResults) => void\n theme?: Partial<MainTheme>\n children?: React.ReactNode;\n siteKey?:string\n isEnterpriseMerchandising?: boolean;\n subscription?: number;\n marketContext?: string | null; // Region code for market-specific product filtering (e.g., \"US\", \"CA\", \"UK\")\n forceProductAnalytics?: boolean; // When true, always pass with_product_analytics regardless of other conditions\n variationId?: string | null; // A/B test variation ID for reasoning/experiment tracking\n customSortSettingsTransform?: (settings: CustomSortSettings | undefined, isCollection: boolean) => CustomSortSettings | null | undefined;\n}\n\nexport interface MainTheme {\n primaryColor: string\n lighterPrimary: string\n successGreen: string\n errorRed: string\n loadingYellow: string,\n}\n\nconst mainTheme: MainTheme = {\n primaryColor: \"#1976d2\",\n lighterPrimary: \"rgba(25,118,210,0.71)\",\n successGreen: \"#4BB543\",\n errorRed: \"#ff0033\",\n loadingYellow: \"#f3b706\",\n}\n\n// Analytics-enabled responses (with_product_analytics=true) carry personalization_story with\n// momentum pillars populated. This helper centralises payload construction for both the\n// search and collection analytics callbacks.\nfunction buildAnalyticsPayload(\n analyticsResponse: any,\n productAnalyticsMap: Record<string, ProductAnalytics>\n): {\n analytics: any;\n matching_sets: any;\n group_strategy: any;\n variety_strategy: any;\n productAnalyticsMap: Record<string, ProductAnalytics>;\n personalizationStoryMap: Record<string, PersonalizationStory>;\n responseRpiMethodologyEffective?: string | null;\n responseRpiSnapshotComputedAt?: string | null;\n} {\n return {\n analytics: analyticsResponse.analytics,\n matching_sets: analyticsResponse.matching_sets,\n group_strategy: analyticsResponse.group_strategy,\n variety_strategy: analyticsResponse.variety_strategy,\n productAnalyticsMap,\n personalizationStoryMap: analyticsResponse.personalization_story || {},\n // Private race-guard fields: reducer ignores them. Ranking metadata and coefficients must\n // always stay those of the fast response that produced the displayed order.\n responseRpiMethodologyEffective: analyticsResponse.rpi_methodology_effective,\n responseRpiSnapshotComputedAt: analyticsResponse.rpi_snapshot_computed_at,\n };\n}\n\nconst PRESENTATION_RPI_METHODOLOGY = 'presentation10_v2';\n\nexport function analyticsMatchesRankingSnapshot(analyticsPayload: {\n responseRpiMethodologyEffective?: string | null;\n responseRpiSnapshotComputedAt?: string | null;\n}, rankingResponse: any): boolean {\n const analyticsIsCandidate = analyticsPayload.responseRpiMethodologyEffective\n === PRESENTATION_RPI_METHODOLOGY;\n const rankingIsCandidate = rankingResponse?.rpi_methodology_effective\n === PRESENTATION_RPI_METHODOLOGY;\n if (!analyticsIsCandidate && !rankingIsCandidate) return true;\n\n const analyticsSnapshot = analyticsPayload.responseRpiSnapshotComputedAt;\n const rankingSnapshot = rankingResponse?.rpi_snapshot_computed_at;\n return analyticsIsCandidate\n && rankingIsCandidate\n && Boolean(analyticsSnapshot)\n && analyticsSnapshot === rankingSnapshot;\n}\n\n/** Attach response-level reasoning maps before items are renamed to products. */\nexport function attachPersonalizationToItems(response: any): void {\n const coefficients = response?.personalization_coefficients;\n const stories = response?.personalization_story;\n if ((!coefficients && !stories) || !Array.isArray(response?.items)) return;\n for (const item of response.items) {\n if (!item || item.promotile) continue;\n const productId = String(item.id);\n if (coefficients?.[productId]) item.personalization_coefs = coefficients[productId];\n if (stories?.[productId]) item.personalization_story = stories[productId];\n }\n}\n\n\nconst FastSimonApi: React.FC<Props> = ({\n storeID, uuid,siteKey, children,\n defaultSort , promoTiles = false, theme,\n withProductAttributes = false, isInfiniteScroll = false, getTitle,\n useFilters, noReport = false, customTitleChange,\n isEnterpriseMerchandising = false, subscription = 0,\n marketContext = null,\n forceProductAnalytics = false,\n variationId = null,\n customSortSettingsTransform,\n ...props\n }) => {\n const [state, dispatch] = (useReducer as any)?.(fastStateReducer, {\n isReady: false,\n type: props.type ?? 'SPA',\n page: 1,\n query: '',\n sortBy: defaultSort,\n isLoading: {\n products: false,\n filters: false,\n },\n collectionID: props.collectionID,\n narrow: undefined,\n results: undefined,\n recommendations: {},\n singleProducts: {},\n searchWithinSearch: \"\",\n segments: undefined,\n flag:[],\n custom_sort_settings:undefined,\n isAutocomplete:false,\n variation_id: variationId, // Initialize from prop, then updated via setVariationId\n force_and: false,\n user_segment_preview: 'none' as UserSegmentPreview, // User segment preview mode for AI Explainer\n personalization_preview: null as PersonalizationPreviewSettings | null,\n session_token: undefined as string | undefined,\n // Compare Mode state\n comparisonData: null,\n isComparing: false\n });\n\n // Ref for user_segment_preview: enables synchronous reads across closures\n // so that any fetch triggered in the same handler (e.g. setCustomSort) reads the latest value\n const userSegmentPreviewRef = useRef<UserSegmentPreview>(state.user_segment_preview);\n userSegmentPreviewRef.current = state.user_segment_preview;\n\n // Ref for custom_sort_settings: ensures stale setQuery/setCollectionID/etc. closures\n // always read the latest value even when called from memoized components.\n const customSortSettingsRef = useRef<CustomSortSettings | null | undefined>(state.custom_sort_settings);\n customSortSettingsRef.current = state.custom_sort_settings;\n // Typed read for fetchParams — null is stripped to undefined here; fetchResults reads\n // the raw ref (.current) so it can still distinguish null (\"cleared\") from undefined (\"not set\").\n const currentCustomSort = (): CustomSortSettings | undefined => {\n const v = customSortSettingsRef.current;\n return v === null ? undefined : v;\n };\n\n // Ref for personalization_preview: enables synchronous reads across closures\n const personalizationPreviewRef = useRef<PersonalizationPreviewSettings | null>(state.personalization_preview);\n personalizationPreviewRef.current = state.personalization_preview;\n\n // Staleness counter for parallel analytics requests — incremented at start of each onSearch/onCollection\n // Analytics responses check this to discard stale data from superseded queries\n const searchRequestCounterRef = useRef(0);\n\n // Pending analytics payload — stores analytics if it arrives before the fast response (race condition handling)\n const pendingAnalyticsRef = useRef<{\n analytics?: FullTextServerResponseAll['analytics'];\n matching_sets?: Record<string, string>;\n group_strategy?: Record<string, string>;\n variety_strategy?: number[];\n productAnalyticsMap?: Record<string, ProductAnalytics>;\n personalizationStoryMap?: Record<string, PersonalizationStory>;\n responseRpiMethodologyEffective?: string | null;\n responseRpiSnapshotComputedAt?: string | null;\n } | null>(null);\n\n const [categories, setCategories] = useState<FastCategory[]>([]);\n const [analyticsFetched, setAnalyticsFetched] = useState(false);\n const [lastAnalyticsQuery, setLastAnalyticsQuery] = useState<string>('');\n const [lastAnalyticsCollection, setLastAnalyticsCollection] = useState<string>('');\n const [lastAnalyticsMode, setLastAnalyticsMode] = useState<'search' | 'collection' | ''>('');\n\n // Only enable analytics for enterprise merchants or subscription level 5\n const isAnalyticsEnabled = isEnterpriseMerchandising || subscription === 5;\n\n const {results, isLoading, query, sortBy, type, collectionID, page, narrow, recommendations, singleProducts, isReady, autocomplete, segments,isAutocomplete\n\n } = state;\n\n function setResults(results: FullTextServerResponseAll | smartCollectionsResults | AutocompleteReasoningResponse | undefined) {\n (dispatch as any)?.({type: 'setResults', payload: results});\n }\n\n function mergeResults(results: FullTextServerResponseAll | smartCollectionsResults | AutocompleteReasoningResponse, infiniteScroll: boolean) {\n (dispatch as any)?.({type: 'mergeResults', payload: {results, infiniteScroll}});\n }\n function mergeFacetsWithResults(facets:Narrow[]) {\n (dispatch as any)?.({type: 'mergeFacetsWithResults', payload: facets});\n }\n\n function mergeResultsKeepProduct(results: FullTextServerResponseAll | smartCollectionsResults) {\n (dispatch as any)?.({type: 'mergeResultsKeepProduct', payload: {results}});\n }\n\n function dispatchMergeAnalytics(payload: {\n analytics?: FullTextServerResponseAll['analytics'];\n matching_sets?: Record<string, string>;\n group_strategy?: Record<string, string>;\n variety_strategy?: number[];\n productAnalyticsMap?: Record<string, ProductAnalytics>;\n personalizationStoryMap?: Record<string, PersonalizationStory>;\n }) {\n (dispatch as any)?.({type: 'mergeAnalyticsData', payload});\n }\n\n function setIsLoading(isLoading: IsLoading) {\n (dispatch as any)?.({type: 'setIsLoading', payload: isLoading});\n }\n\n function setIsAutocomplete(isAutocomplete:boolean)\n {\n (dispatch as any)?.({type: 'setIsAutocomplete', payload: isAutocomplete});\n }\n\n function setVariationId(variationId: string | null) {\n (dispatch as any)?.({type: 'setVariationId', payload: variationId});\n }\n\n function setComparisonData(comparisonData: ComparisonData | null) {\n (dispatch as any)?.({type: 'setComparisonData', payload: comparisonData});\n }\n\n function setIsComparing(isComparing: boolean) {\n (dispatch as any)?.({type: 'setIsComparing', payload: isComparing});\n }\n\n function setForceAnd(forceAnd: boolean) {\n (dispatch as any)?.({type: 'setForceAnd', payload: forceAnd});\n }\n\n function updateSettingsAndRefetch(settings: Partial<Pick<typeof state, 'force_and' | 'custom_sort_settings' | 'flag' | 'user_segment_preview' | 'personalization_preview' | 'session_token'>>) {\n if ('custom_sort_settings' in settings) {\n customSortSettingsRef.current = settings.custom_sort_settings ?? undefined;\n }\n (dispatch as any)?.({type: 'updateSettingsAndRefetch', payload: settings});\n }\n\n function setUserSegmentPreview(preview: UserSegmentPreview) {\n userSegmentPreviewRef.current = preview;\n (dispatch as any)?.({type: 'setUserSegmentPreview', payload: preview});\n }\n\n function setPersonalizationPreview(preview: PersonalizationPreviewSettings | null) {\n personalizationPreviewRef.current = preview;\n (dispatch as any)?.({type: 'setPersonalizationPreview', payload: preview});\n }\n\n // Compute detailed comparison between Hybrid ON and Hybrid OFF using full ID lists\n function computeComparisonFromIds(hybridOnIds: string[], hybridOffIds: string[]): ComparisonData {\n // Create rank maps (1-based index)\n const onRankMap = new Map<string, number>();\n const offRankMap = new Map<string, number>();\n\n hybridOnIds.forEach((id, index) => onRankMap.set(id.toString(), index + 1));\n hybridOffIds.forEach((id, index) => offRankMap.set(id.toString(), index + 1));\n\n const productChanges = new Map<string, ProductRankChange>();\n let totalImproved = 0;\n let totalDeclined = 0;\n let totalNew = 0;\n let totalUnchanged = 0;\n\n // Analyze all products in hybrid ON results\n hybridOnIds.forEach((id) => {\n const idStr = id.toString();\n const rankWithHybrid = onRankMap.get(idStr) || -1;\n const rankWithoutHybrid = offRankMap.get(idStr) || -1;\n\n let status: ProductRankChange['status'];\n let rankDelta = 0;\n\n if (rankWithoutHybrid === -1) {\n // Product not in results without hybrid - it's new due to hybrid\n status = 'new';\n totalNew++;\n } else {\n rankDelta = rankWithoutHybrid - rankWithHybrid; // Positive = improved (moved up)\n\n if (rankDelta > 0) {\n status = 'improved';\n totalImproved++;\n } else if (rankDelta < 0) {\n status = 'declined';\n totalDeclined++;\n } else {\n status = 'unchanged';\n totalUnchanged++;\n }\n }\n\n productChanges.set(idStr, {\n productId: idStr,\n rankWithHybrid,\n rankWithoutHybrid,\n rankDelta,\n status\n });\n });\n\n return {\n hybridOnIds: hybridOnIds.map(id => id.toString()),\n hybridOffIds: hybridOffIds.map(id => id.toString()),\n productChanges,\n totalImproved,\n totalDeclined,\n totalNew,\n totalUnchanged\n };\n }\n\n function getDisableFlags(flags: string[]) {\n return {\n disable_merchandising: flags.find((f) => f == \"disable_merchandising\") ? 1 : 0,\n disable_semantics: flags.find((f) => f == \"disable_semantics\") ? 1 : 0,\n disable_turbolinks: flags.find((f) => f == \"disable_turbolinks\") ? 1 : 0,\n disable_strategies: flags.find((f) => f == \"disable_strategies\") ? 1 : 0,\n disable_merchandising_rules: flags.find((f) => f == \"disable_merchandising_rules\") ? 1 : 0,\n disable_antonyms: flags.find((f) => f == \"disable_antonyms\") ? 1 : 0,\n };\n }\n\n function setQuery(query: string , isAutocomplete?:boolean) {\n (dispatch as any)?.({type: 'setQuery', payload: query});\n (dispatch as any)?.({type: 'setIsAutocomplete', payload: isAutocomplete?isAutocomplete:false});\n\n // Create the object with the computed property\n let fetchParams = {\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n term: query,\n sortBy: defaultSort,\n segments: state.segments,\n withProductAttributes:withProductAttributes,\n custom_sort_settings:currentCustomSort(),\n ...getDisableFlags(state.flag),\n };\n\n fetchResults(fetchParams, isInfiniteScroll,isAutocomplete?isAutocomplete:false);\n }\n function setCustomSort(customSortSettings:CustomSortSettings) {\n customSortSettingsRef.current = customSortSettings;\n (dispatch as any)?.({type: 'setCustomSort', payload: customSortSettings});\n // Create the object with the computed property\n let fetchParams = {\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n term: state.query,\n narrowBy: state.narrow,\n sortBy: state.sortBy,\n categoryID: state.collectionID,\n segments: state.segments,\n withProductAttributes:state.withProductAttributes,\n searchWithinSearch:state.searchWithinSearch,\n custom_sort_settings:customSortSettings,\n ...getDisableFlags(state.flag),\n };\n\n fetchResults(fetchParams, isInfiniteScroll);\n\n }\n\n function setFlag(flags: string[]) {\n const flagsToData=flags.map((f)=>{return \"disable_\" + f;});\n (dispatch as any)?.({type: 'setFlag', payload: flagsToData });\n\n // Create the object with the computed property\n let fetchParams = {\n siteKey:siteKey,\n uuid: uuid,\n storeID: storeID,\n term: state.query,\n narrowBy: state.narrow,\n sortBy: state.defaultSort,\n segments: state.segments,\n categoryID: state.collectionID,\n withProductAttributes: withProductAttributes,\n searchWithinSearch:state.searchWithinSearch,\n custom_sort_settings:currentCustomSort(),\n };\n\n if(flags.length>0)\n {\n flags.forEach((f)=>{\n let flagProp = \"disable_\" + f;\n // Add the dynamic key to the object\n // @ts-ignore\n fetchParams[flagProp as any] = true;\n });\n }\n\n\n fetchResults(fetchParams, isInfiniteScroll,state.isAutocomplete);\n }\n\n function setSortBy(sortBy: SortBy) {\n (dispatch as any)?.({type: 'setSortBy', payload: sortBy});\n // Create the object with the computed property\n let fetchParams = {\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n term: state.query,\n narrowBy: state.narrow,\n sortBy: sortBy,\n categoryID: state.collectionID,\n segments: state.segments,\n withProductAttributes:withProductAttributes,\n searchWithinSearch:state.searchWithinSearch,\n custom_sort_settings:currentCustomSort(),\n ...getDisableFlags(state.flag),\n };\n\n fetchResults(fetchParams, isInfiniteScroll);\n\n }\n function setSegments(segments: string[]) {\n (dispatch as any)?.({type: 'setSegments', payload: segments});\n\n let fetchParams = {\n withProductAttributes:withProductAttributes,\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n term: state.query,\n narrowBy: state.narrow,\n sortBy: state.sortBy,\n categoryID: state.collectionID,\n segments: segments,\n searchWithinSearch:state.searchWithinSearch,\n custom_sort_settings:currentCustomSort(),\n ...getDisableFlags(state.flag),\n };\n\n fetchResults(fetchParams, isInfiniteScroll,state.isAutocomplete);\n\n }\n function setType(type: AppType) {\n (dispatch as any)?.({type: 'setType', payload: type});\n }\n\n function setCollectionID(collectionID: string) {\n (dispatch as any)?.({type: 'setCollectionID', payload: collectionID});\n (dispatch as any)?.({type: 'setIsAutocomplete', payload: false});\n\n // Create the object with the computed property\n let fetchParams = {\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n categoryID: collectionID,\n sortBy: defaultSort,\n segments: state.segments,\n custom_sort_settings:currentCustomSort(),\n ...getDisableFlags(state.flag),\n };\n\n fetchResults(fetchParams, isInfiniteScroll);\n\n }\n\n function setPage(page: number) {\n (dispatch as any)?.({type: 'setPage', payload: page});\n\n let fetchParams = {\n withProductAttributes:withProductAttributes,\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n term: state.query,\n narrowBy: state.narrow,\n sortBy: state.sortBy,\n categoryID: state.collectionID,\n page: page,\n segments: state.segments,\n searchWithinSearch:state.searchWithinSearch,\n custom_sort_settings:currentCustomSort(),\n ...getDisableFlags(state.flag),\n };\n\n fetchResults(fetchParams, isInfiniteScroll);\n\n }\n\n function setNarrow(narrow: ServerNarrow[] | undefined) {\n (dispatch as any)?.({type: 'setNarrow', payload: narrow});\n\n let fetchParams = {\n withProductAttributes:withProductAttributes,\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n term: state.query,\n narrowBy: narrow,\n sortBy: state.sortBy,\n categoryID: state.collectionID,\n segments: state.segments,\n searchWithinSearch:state.searchWithinSearch,\n custom_sort_settings:currentCustomSort(),\n ...getDisableFlags(state.flag),\n };\n\n fetchResults(fetchParams, isInfiniteScroll);\n\n }\n\n function setState({...newState}: SetStateProps) {\n (dispatch as any)?.({type: 'setState', payload: newState});\n\n fetchResults({\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n term: newState.query,\n narrowBy: newState.narrow?newState.narrow:undefined,\n sortBy: newState.sortBy ?? defaultSort,\n categoryID: newState.collectionID,\n page: newState.page,\n segments: newState.segments,\n }, Boolean(!results && isInfiniteScroll && newState.page && newState.page > 1));\n }\n\n\n function setSingleProducts(products: Product[]) {\n (dispatch as any)?.({type: \"setSingleProducts\", payload: products});\n }\n\n\n function setReady(isReady: boolean) {\n (dispatch as any)?.({type: \"setReady\", payload: isReady});\n }\n\n function setSearchWithinSearch(searchWithinSearch: string) {\n (dispatch as any)?.({type: \"setSearchWithinSearch\", payload: searchWithinSearch});\n\n let fetchParams = {\n withProductAttributes:withProductAttributes,\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n term: query,\n narrowBy: state.narrow,\n sortBy: state.sortBy,\n categoryID: state.collectionID,\n segments: state.segments,\n searchWithinSearch:searchWithinSearch,\n custom_sort_settings:currentCustomSort(),\n ...getDisableFlags(state.flag),\n };\n\n fetchResults(fetchParams, isInfiniteScroll);\n\n }\n\n function fetchResults(props:{\n uuid:string, storeID:number,siteKey?:string, term?: string, page?: number, narrowBy?: ServerNarrow[] | undefined,\n sortBy?: SortBy, categoryID?: string, searchWithinSearch?: string, segments?: string[] ,withProductAttributes?:boolean,\n disable_semantics?:number,disable_merchandising?:number,disable_strategies?:number,disable_turbolinks?:number,disable_personalization?:number,custom_sort_settings?:CustomSortSettings,\n variation_id?: string | null, force_and?: boolean\n },\n isInfiniteScroll: boolean,\n autocomplete:boolean=false) {\n\n // 1. Apply ref value first — ensures latest custom_sort_settings is used even from\n // stale closures or call sites (e.g. setState) that don't pass custom_sort_settings.\n // null means \"explicitly cleared\" → omit the param from the request.\n const refValue = customSortSettingsRef.current;\n if (refValue !== undefined) {\n const effectiveSort: CustomSortSettings | undefined = refValue === null ? undefined : refValue;\n props = { ...props, custom_sort_settings: effectiveSort };\n }\n\n // 2. Apply transform after ref — transform gets the correct base value and can\n // inject context-aware personalization_rank without stale closure issues.\n if (customSortSettingsTransform) {\n const isCollection = !!props.categoryID && !props.term;\n props = { ...props, custom_sort_settings: customSortSettingsTransform(props.custom_sort_settings, isCollection) as CustomSortSettings | undefined };\n }\n\n // on first request check if we need to fetch more then 1 product\n\n if (props.term && !autocomplete) {\n onSearch(newObject({\n ...props,\n page: props.page || 1,\n infiniteScrollPage: isInfiniteScroll,\n }) as Omit<fullTextSearchProps, \"callback\">, isInfiniteScroll);\n } else if(props.term && autocomplete){\n onAutocompleteSearch(newObject({\n ...props\n }) as Omit<autocompleteProps, \"callback\" | \"page\" | \"narrowBy\" | \"sortBy\" | \"categoryID\" | \"searchWithinSearch\" | \"custom_sort_settings\">);\n } else if (props.categoryID) {\n onCollection(newObject({\n ...props,\n page: props.page || 1,\n infiniteScrollPage: isInfiniteScroll,\n }) as Omit<smartCollectionsProps, \"callback\">, isInfiniteScroll);\n }\n\n return;\n\n }\n\n\n\n useEffect(() => {\n function handleSetQueryEvent(event: any) {\n // Support both string (legacy) and object with isAutocomplete flag\n if (typeof event.detail === 'string') {\n setQuery(event.detail);\n } else {\n setQuery(event.detail.query, event.detail.isAutocomplete);\n }\n }\n\n function handleSetFlagEvent(event: any){\n setFlag(event.details)\n\n }\n function handleSetCollectionEvent(event: any) {\n setCollectionID(typeof event.detail === 'string' ? event.detail : event.detail.collectionID);\n }\n\n function handleSetCollectionURLEvent(event: any) {\n getAllCategories().then(r => {\n const id = r.find(c => c.u === event.detail)?.id;\n\n if (id) {\n setCollectionID(id);\n return;\n }\n\n window.location.href = event.detail;\n })\n }\n\n function handleSetPageEvent(event: any) {\n setPage(event.detail);\n }\n\n function handleSetSortEvent(event: any) {\n setSortBy(event.detail);\n }\n\n function handleSetNarrowEvent(event: any) {\n setNarrow(event.detail);\n }\n\n function handleSetSegmentsEvent(event: any) {\n setSegments(event.detail);\n }\n function handleSetIsAutocomplete(event:any){\n setIsAutocomplete(event.detail)\n }\n window.addEventListener('fast-simon-update-query', handleSetQueryEvent);\n window.addEventListener('fast-simon-update-collection', handleSetCollectionEvent);\n window.addEventListener('fast-simon-update-collection-url', handleSetCollectionURLEvent);\n window.addEventListener('fast-simon-update-page', handleSetPageEvent);\n window.addEventListener('fast-simon-update-sort', handleSetSortEvent);\n window.addEventListener('fast-simon-update-narrow', handleSetNarrowEvent);\n window.addEventListener('fast-simon-update-segments', handleSetSegmentsEvent);\n window.addEventListener('fast-simon-update-flag', handleSetFlagEvent);\n window.addEventListener('fast-simon-update-is-autocomplete', handleSetIsAutocomplete);\n\n return () => {\n window.removeEventListener('fast-simon-update-query', handleSetQueryEvent);\n window.removeEventListener('fast-simon-update-collection', handleSetCollectionEvent);\n window.removeEventListener('fast-simon-update-collection-url', handleSetCollectionURLEvent);\n window.removeEventListener('fast-simon-update-page', handleSetPageEvent);\n window.removeEventListener('fast-simon-update-sort', handleSetSortEvent);\n window.removeEventListener('fast-simon-update-narrow', handleSetNarrowEvent);\n window.removeEventListener('fast-simon-update-segments', handleSetSegmentsEvent);\n window.removeEventListener('fast-simon-update-flag', handleSetFlagEvent);\n window.removeEventListener('fast-simon-update-is-autocomplete', handleSetIsAutocomplete);\n }\n\n }, []);\n\n // Settings modal refetch: triggered after state is updated (no race conditions)\n // All settings (force_and, flags, custom_sort, user_segment_preview, personalization_preview)\n // are batched via updateSettingsAndRefetch to avoid double-fetches and stale-state reads.\n useEffect(() => {\n if (!state.refetchTrigger) return;\n // Build fetchParams from the now-updated state\n const fetchParams = {\n siteKey: siteKey,\n uuid: uuid,\n storeID: storeID,\n term: state.query,\n narrowBy: state.narrow,\n sortBy: state.sortBy ?? defaultSort,\n categoryID: state.collectionID,\n segments: state.segments,\n withProductAttributes: withProductAttributes,\n searchWithinSearch: state.searchWithinSearch,\n custom_sort_settings: currentCustomSort(),\n ...getDisableFlags(state.flag ?? []),\n variation_id: state.variation_id,\n force_and: state.force_and,\n };\n fetchResults(fetchParams, isInfiniteScroll, state.isAutocomplete);\n }, [state.refetchTrigger]);\n\n const onSearch = (props: Omit<fullTextSearchProps, \"callback\">, isInfiniteScroll: boolean) => {\n setIsLoading({products: true, filters: true});\n\n // Clear previous comparison data when starting new search\n setComparisonData(null);\n\n const currentQuery = props.term || '';\n const currentForceAnalytics = forceProductAnalytics || getShowSalesAnalyticsSetting();\n const shouldFetchAnalytics = currentForceAnalytics || (isAnalyticsEnabled && (currentQuery !== lastAnalyticsQuery || lastAnalyticsMode !== 'search'));\n\n // Check if hybrid search is enabled - we'll need to make a comparison call\n const isHybridEnabled = getLSVectorSearchOn();\n\n const personalizationSegment = getPersonalizationSegment(userSegmentPreviewRef.current);\n const personalizationParams = buildPersonalizationParams(\n personalizationPreviewRef.current ?? {enabled: false, spvJson: '', types: ['gender']}\n );\n\n // Increment staleness counter and clear pending analytics\n const requestId = ++searchRequestCounterRef.current;\n pendingAnalyticsRef.current = null;\n let fastRankingResponse: any = null;\n\n const commonRequestParams = {\n ...props,\n withAttributes: promoTiles || withProductAttributes,\n market_context: marketContext,\n variation_id: state.variation_id,\n force_and: state.force_and,\n ps: personalizationSegment,\n spv: personalizationParams.spv,\n personalization: personalizationParams.personalization,\n session_token: state.session_token\n };\n\n // Fire analytics request in parallel (fire-and-forget) — only if analytics needed\n if (shouldFetchAnalytics) {\n FullTextSearch.getReasoningFullTextSearch({\n ...commonRequestParams,\n with_product_analytics: true,\n facetRequired: 0,\n }).then(analyticsResponse => {\n if (searchRequestCounterRef.current !== requestId) return; // stale\n\n if (analyticsResponse.analytics?.badges) {\n setAnalyticsFetched(true);\n setLastAnalyticsQuery(currentQuery);\n setLastAnalyticsMode('search');\n }\n\n const productAnalyticsMap: Record<string, ProductAnalytics> = {};\n const items = (analyticsResponse as any).items || analyticsResponse.products || [];\n for (const product of items) {\n if (product.analytics) {\n productAnalyticsMap[String(product.id)] = product.analytics;\n }\n }\n\n const payload = buildAnalyticsPayload(analyticsResponse, productAnalyticsMap);\n if (fastRankingResponse\n && !analyticsMatchesRankingSnapshot(payload, fastRankingResponse)) {\n pendingAnalyticsRef.current = null;\n console.warn('[Analytics] Discarded search analytics from a different RPI snapshot.');\n return;\n }\n pendingAnalyticsRef.current = payload;\n dispatchMergeAnalytics(payload);\n }).catch(err => {\n console.error(\"[Analytics] Failed to fetch search analytics:\", err);\n });\n }\n\n // Fire fast request WITHOUT analytics\n FullTextSearch.getReasoningFullTextSearch({\n ...commonRequestParams,\n with_product_analytics: false,\n }).then(async(response) => {\n fastRankingResponse = response;\n attachPersonalizationToItems(response);\n // Don't preserve stale analytics when fetching fresh ones\n const existingAnalytics = shouldFetchAnalytics ? undefined : (results as any)?.analytics;\n const existingMatchingSets = shouldFetchAnalytics ? undefined : (results as any)?.matching_sets;\n const existingGroupStrategy = shouldFetchAnalytics ? undefined : (results as any)?.group_strategy;\n const existingVarietyStrategy = shouldFetchAnalytics ? undefined : (results as any)?.variety_strategy;\n response=getFormatedData(response, existingAnalytics, existingMatchingSets, existingGroupStrategy, existingVarietyStrategy);\n\n // Handle turbolink responses - skip additional API calls to prevent errors\n if (response.turbolink && response.totalResults === 0) {\n mergeResults(response, isInfiniteScroll);\n\n if (!customTitleChange) {\n document.title = `Search Result for ${query}`;\n } else {\n customTitleChange(results);\n }\n\n setIsLoading({filters: false, products: false});\n return;\n }\n\n // Show products immediately\n mergeResults(response, isInfiniteScroll);\n setIsLoading({products: false, filters: true});\n\n // If analytics arrived before fast response, re-apply to new results\n if (pendingAnalyticsRef.current && searchRequestCounterRef.current === requestId) {\n if (analyticsMatchesRankingSnapshot(pendingAnalyticsRef.current, response)) {\n dispatchMergeAnalytics(pendingAnalyticsRef.current);\n } else {\n pendingAnalyticsRef.current = null;\n console.warn('[Analytics] Discarded search analytics from a different RPI snapshot.');\n }\n }\n\n // Fire IDs + facets in parallel (previously sequential)\n const listIdRequestProps = { ...props };\n listIdRequestProps.searchWithinSearch=undefined;\n listIdRequestProps.productsPerPage=1000000;\n listIdRequestProps.page=1;\n listIdRequestProps.market_context = marketContext;\n listIdRequestProps.variation_id = state.variation_id;\n listIdRequestProps.force_and = state.force_and;\n listIdRequestProps.ps = personalizationSegment;\n listIdRequestProps.spv = personalizationParams.spv;\n listIdRequestProps.personalization = personalizationParams.personalization;\n listIdRequestProps.session_token = state.session_token;\n\n const facetsRequestProps = { ...props };\n facetsRequestProps.facetRequired=2;\n facetsRequestProps.searchWithinSearch=props.searchWithinSearch;\n facetsRequestProps.productsPerPage=props.productsPerPage;\n facetsRequestProps.page=props.page;\n facetsRequestProps.market_context = marketContext;\n facetsRequestProps.variation_id = state.variation_id;\n facetsRequestProps.force_and = state.force_and;\n facetsRequestProps.ps = personalizationSegment;\n facetsRequestProps.spv = personalizationParams.spv;\n facetsRequestProps.personalization = personalizationParams.personalization;\n\n const [listIdRes, facetsRes] = await Promise.all([\n FullTextSearch.getReasoningFullTextSearchProductsIds(listIdRequestProps),\n FullTextSearch.getReasoningFullTextSearch(facetsRequestProps)\n ]);\n\n // Merge IDs and complete facets into existing results\n mergeResultsKeepProduct({id_list: listIdRes.id_list, facets: facetsRes.facets} as any);\n\n if (!customTitleChange) {\n document.title = `Search Result for ${query}`;\n } else {\n customTitleChange(results);\n }\n\n setIsLoading({filters: false, products: false});\n\n // Compare Mode: Make comparison call using IDs endpoint if hybrid search is enabled\n console.log(\"[Compare Mode] isHybridEnabled:\", isHybridEnabled, \"hasIdList:\", !!listIdRes.id_list);\n if (isHybridEnabled && listIdRes.id_list && listIdRes.id_list.length > 0) {\n setIsComparing(true);\n console.log(\"[Compare Mode] Making comparison IDs call...\");\n try {\n // Get all IDs WITHOUT hybrid_search_settings\n const comparisonResponse = await FullTextSearch.getComparisonProductIds({\n ...props,\n market_context: marketContext,\n variation_id: state.variation_id,\n force_and: state.force_and,\n ps: personalizationSegment,\n spv: personalizationParams.spv,\n personalization: personalizationParams.personalization\n });\n\n const hybridOffIds = (comparisonResponse.id_list || []).map(id => id.toString());\n const hybridOnIds = (listIdRes.id_list || []).map(id => id.toString());\n console.log(\"[Compare Mode] Hybrid ON IDs count:\", hybridOnIds.length);\n console.log(\"[Compare Mode] Hybrid OFF IDs count:\", hybridOffIds.length);\n\n if (hybridOffIds.length > 0) {\n const diff = computeComparisonFromIds(hybridOnIds, hybridOffIds);\n console.log(\"[Compare Mode] Diff computed - improved:\", diff.totalImproved, \"declined:\", diff.totalDeclined, \"new:\", diff.totalNew);\n setComparisonData(diff);\n }\n } catch (error) {\n console.error(\"[Compare Mode] Failed to fetch comparison IDs:\", error);\n setComparisonData(null);\n } finally {\n setIsComparing(false);\n }\n }\n });\n }\n const onAutocompleteSearch = (props: Omit<autocompleteProps, \"callback\">) => {\n setIsLoading({products: true, filters: true});\n const personalizationSegment = getPersonalizationSegment(userSegmentPreviewRef.current);\n const personalizationParams = buildPersonalizationParams(\n personalizationPreviewRef.current ?? {enabled: false, spvJson: '', types: ['gender']}\n );\n\n Autocomplete.getAutocompleteReasoning({\n ...props,\n withAttributes: promoTiles || withProductAttributes,\n market_context: marketContext,\n variation_id: state.variation_id,\n force_and: state.force_and,\n ps: personalizationSegment,\n spv: personalizationParams.spv,\n personalization: personalizationParams.personalization\n }).then(async(response) => {\n response=getFormatedData(response);\n\n mergeResults(response, false);\n\n if (!customTitleChange) {\n document.title = `Autocomplete Result for ${query}`;\n } else {\n customTitleChange(results);\n }\n\n if (!response) {\n setIsLoading({\n filters: true, products: false\n });\n } else {\n setIsLoading({\n filters: false, products: false\n });\n }\n });\n }\n\n const onCollection = (props: Omit<smartCollectionsProps, \"callback\">, isInfiniteScroll: boolean) => {\n setIsLoading({products: true, filters: true});\n\n const currentCollection = props.categoryID || '';\n const currentForceAnalytics = forceProductAnalytics || getShowSalesAnalyticsSetting();\n const shouldFetchAnalytics = currentForceAnalytics || (isAnalyticsEnabled && (currentCollection !== lastAnalyticsCollection || lastAnalyticsMode !== 'collection'));\n\n const personalizationSegment = getPersonalizationSegment(userSegmentPreviewRef.current);\n const personalizationParams = buildPersonalizationParams(\n personalizationPreviewRef.current ?? {enabled: false, spvJson: '', types: ['gender']}\n );\n\n // Increment staleness counter and clear pending analytics\n const requestId = ++searchRequestCounterRef.current;\n pendingAnalyticsRef.current = null;\n let fastRankingResponse: any = null;\n\n const commonRequestParams = {\n ...props,\n withAttributes: promoTiles || withProductAttributes,\n market_context: marketContext,\n variation_id: state.variation_id,\n ps: personalizationSegment,\n spv: personalizationParams.spv,\n\n spc: personalizationParams.spc,\n personalization: personalizationParams.personalization,\n force_and: state.force_and,\n session_token: state.session_token\n };\n\n // Fire analytics request in parallel (fire-and-forget) — only if analytics needed\n if (shouldFetchAnalytics) {\n SmartCollections.getSmartCollections({\n ...commonRequestParams,\n with_product_analytics: true,\n facetRequired: 0,\n }).then(analyticsResponse => {\n if (searchRequestCounterRef.current !== requestId) return; // stale\n\n if (analyticsResponse.analytics?.badges) {\n setAnalyticsFetched(true);\n setLastAnalyticsCollection(currentCollection);\n setLastAnalyticsMode('collection');\n }\n\n const productAnalyticsMap: Record<string, ProductAnalytics> = {};\n const items = (analyticsResponse as any).items || analyticsResponse.products || [];\n for (const product of items) {\n if (product.analytics) {\n productAnalyticsMap[String(product.id)] = product.analytics;\n }\n }\n\n const payload = buildAnalyticsPayload(analyticsResponse, productAnalyticsMap);\n if (fastRankingResponse\n && !analyticsMatchesRankingSnapshot(payload, fastRankingResponse)) {\n pendingAnalyticsRef.current = null;\n console.warn('[Analytics] Discarded collection analytics from a different RPI snapshot.');\n return;\n }\n pendingAnalyticsRef.current = payload;\n dispatchMergeAnalytics(payload);\n }).catch(err => {\n console.error(\"[Analytics] Failed to fetch collection analytics:\", err);\n });\n }\n\n // Fire fast request WITHOUT analytics\n SmartCollections.getSmartCollections({\n ...commonRequestParams,\n with_product_analytics: false,\n }).then(async (response) => {\n fastRankingResponse = response;\n attachPersonalizationToItems(response);\n\n // Don't preserve stale analytics when fetching fresh ones\n const existingAnalytics = shouldFetchAnalytics ? undefined : (results as any)?.analytics;\n const existingMatchingSets = shouldFetchAnalytics ? undefined : (results as any)?.matching_sets;\n const existingGroupStrategy = shouldFetchAnalytics ? undefined : (results as any)?.group_strategy;\n const existingVarietyStrategy = shouldFetchAnalytics ? undefined : (results as any)?.variety_strategy;\n response=getFormatedData(response, existingAnalytics, existingMatchingSets, existingGroupStrategy, existingVarietyStrategy);\n\n // Show products immediately\n mergeResults(response, isInfiniteScroll);\n setIsLoading({products: false, filters: true});\n\n // If analytics arrived before fast response, re-apply to new results\n if (pendingAnalyticsRef.current && searchRequestCounterRef.current === requestId) {\n if (analyticsMatchesRankingSnapshot(pendingAnalyticsRef.current, response)) {\n dispatchMergeAnalytics(pendingAnalyticsRef.current);\n } else {\n pendingAnalyticsRef.current = null;\n console.warn('[Analytics] Discarded collection analytics from a different RPI snapshot.');\n }\n }\n\n // Fire IDs + facets in parallel (previously sequential)\n const listIdRequestProps = { ...props };\n listIdRequestProps.searchWithinSearch=undefined;\n listIdRequestProps.productsPerPage=1000000;\n listIdRequestProps.page=1;\n listIdRequestProps.market_context = marketContext;\n listIdRequestProps.variation_id = state.variation_id;\n listIdRequestProps.force_and = state.force_and;\n listIdRequestProps.ps = personalizationSegment;\n listIdRequestProps.spv = personalizationParams.spv;\n listIdRequestProps.spc = personalizationParams.spc;\n listIdRequestProps.personalization = personalizationParams.personalization;\n listIdRequestProps.session_token = state.session_token;\n\n const facetsRequestProps = { ...props };\n facetsRequestProps.facetRequired=2;\n facetsRequestProps.searchWithinSearch=props.searchWithinSearch;\n facetsRequestProps.productsPerPage=props.productsPerPage;\n facetsRequestProps.page=props.page;\n facetsRequestProps.market_context = marketContext;\n facetsRequestProps.variation_id = state.variation_id;\n facetsRequestProps.force_and = state.force_and;\n facetsRequestProps.ps = personalizationSegment;\n facetsRequestProps.spv = personalizationParams.spv;\n facetsRequestProps.spc = personalizationParams.spc;\n facetsRequestProps.personalization = personalizationParams.personalization;\n\n const [listIdRes, facetsRes] = await Promise.all([\n SmartCollections.getSmartCollectionsProductsIds(listIdRequestProps),\n SmartCollections.getSmartCollections(facetsRequestProps)\n ]);\n\n // Merge IDs and complete facets into existing results\n mergeResultsKeepProduct({id_list: listIdRes.id_list, facets: facetsRes.facets} as any);\n\n setIsLoading({filters: false, products: false});\n\n getAllCategories().then(r => {\n if (!customTitleChange) {\n document.title = r.find(c => c.id === props.categoryID)?.l ?? \"Collection\";\n } else {\n customTitleChange(results);\n }\n });\n });\n }\n\n // Memoize to prevent unnecessary recreation\n const getAllCategories = useCallback(async () => {\n if (categories.length > 0) {\n return new Promise<FastCategory[]>(resolve => resolve(categories))\n }\n\n const data = categories || [];\n\n setCategories(data)\n\n return data;\n }, [categories]);\n\n const getFormatedData = (response: any, existingAnalytics?: any, existingMatchingSets?: any, existingGroupStrategy?: any, existingVarietyStrategy?: any) => {\n const results = response;\n\n results.products = response.items;\n delete results.items;\n results.totalResults = response.total_results;\n delete results.total_results;\n if (response.sort_by) {\n results.sortBy = response.sort_by;\n delete results.sort_by;\n }\n\n if (response.pop_products_no_results) {\n results.isNoResults = true;\n }\n\n if (response.total_p) {\n results.pageCount = response.total_p;\n delete results.total_p;\n }\n\n\n if (response.ancestor_categories) {\n results.ancestors = response.ancestor_categories;\n delete results.ancestor_categories;\n }\n\n if (response.avoid_tag_prefixes) {\n results.avoidPrefixList = response.avoid_tag_prefixes.split(\",\");\n }\n\n\n results.page = response.p || 1;\n delete results.p;\n\n // Preserve analytics field if present (contains winners/overexposed data)\n // If response has new analytics, use it; otherwise keep existing analytics\n if (response.analytics) {\n results.analytics = response.analytics;\n } else if (existingAnalytics) {\n results.analytics = existingAnalytics;\n }\n\n // Preserve matching_sets field if present (product ID -> set name)\n // If response has new matching_sets, use it; otherwise keep existing\n if (response.matching_sets) {\n results.matching_sets = response.matching_sets;\n } else if (existingMatchingSets) {\n results.matching_sets = existingMatchingSets;\n }\n\n if (response.group_strategy) {\n results.group_strategy = response.group_strategy;\n } else if (existingGroupStrategy) {\n results.group_strategy = existingGroupStrategy;\n }\n if (response.variety_strategy) {\n results.variety_strategy = response.variety_strategy;\n } else if (existingVarietyStrategy) {\n results.variety_strategy = existingVarietyStrategy;\n }\n\n if (results.personalized_products?.length) {\n const context = results.category_name\n ? `Collection: ${results.category_name}`\n : state.query\n ? `Search: \"${state.query}\"`\n : 'Unknown context';\n console.log(`[Personalized Products] ${context}`, results.personalized_products);\n }\n\n return results;\n };\n\n\n // Memoize state context to prevent unnecessary re-renders\n const stateContextValue = useMemo(() => ({\n narrow,\n results,\n page,\n query,\n sortBy,\n type,\n collectionID,\n isLoading,\n recommendations,\n singleProducts,\n isReady,\n autocomplete,\n isAutocomplete,\n variation_id: state.variation_id,\n force_and: state.force_and,\n flag: state.flag,\n comparisonData: state.comparisonData,\n isComparing: state.isComparing\n }), [narrow, results, page, query, sortBy, type, collectionID, isLoading, recommendations, singleProducts, isReady, autocomplete, isAutocomplete, state.variation_id, state.force_and, state.flag, state.comparisonData, state.isComparing]);\n\n // Memoize theme to prevent unnecessary object creation\n const mergedTheme = useMemo(() => ({...mainTheme, ...theme}), [theme]);\n\n // @ts-ignore\n return (\n <FastStateFunctions.Provider\n value={{\n setQuery,\n setSort: setSortBy,\n setNarrow,\n setPage,\n getAllCategories,\n setCollection: setCollectionID,\n setState,\n setSearchWithinSearch,\n setSegments,\n setFlag,\n setCustomSort,\n setIsAutocomplete,\n setVariationId,\n setForceAnd,\n setUserSegmentPreview,\n setPersonalizationPreview,\n updateSettingsAndRefetch\n }}>\n <FastState.Provider value={stateContextValue}>\n <ThemeProvider theme={mergedTheme}>\n {children}\n </ThemeProvider>\n </FastState.Provider>\n </FastStateFunctions.Provider>\n )\n};\n\n// Memoize component to prevent unnecessary re-renders when parent updates\nexport default React.memo(FastSimonApi);\n"]}
|
|
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\";\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 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 variationId = null,\n customSortSettingsTransform,\n ...props\n }) => {\n const [state, dispatch] = (useReducer as any)?.(fastStateReducer, {\n isReady: false,\n type: props.type ?? 'SPA',\n page: 1,\n query: '',\n sortBy: defaultSort,\n isLoading: {\n products: false,\n filters: false,\n },\n collectionID: props.collectionID,\n narrow: undefined,\n results: undefined,\n recommendations: {},\n singleProducts: {},\n searchWithinSearch: \"\",\n segments: undefined,\n flag:[],\n custom_sort_settings:undefined,\n isAutocomplete:false,\n variation_id: variationId, // Initialize from prop, then updated via setVariationId\n force_and: false,\n user_segment_preview: 'none' as UserSegmentPreview, // User segment preview mode for AI Explainer\n personalization_preview: null as PersonalizationPreviewSettings | null,\n session_token: undefined as string | undefined,\n // Compare Mode state\n comparisonData: null,\n isComparing: false\n });\n\n // Ref for user_segment_preview: enables synchronous reads across closures\n // so that any fetch triggered in the same handler (e.g. setCustomSort) reads the latest value\n const userSegmentPreviewRef = useRef<UserSegmentPreview>(state.user_segment_preview);\n userSegmentPreviewRef.current = state.user_segment_preview;\n\n // Ref for custom_sort_settings: ensures stale setQuery/setCollectionID/etc. closures\n // always read the latest value even when called from memoized components.\n const customSortSettingsRef = useRef<CustomSortSettings | null | undefined>(state.custom_sort_settings);\n customSortSettingsRef.current = state.custom_sort_settings;\n // Typed read for fetchParams — null is stripped to undefined here; fetchResults reads\n // the raw ref (.current) so it can still distinguish null (\"cleared\") from undefined (\"not set\").\n const currentCustomSort = (): CustomSortSettings | undefined => {\n const v = customSortSettingsRef.current;\n return v === null ? undefined : v;\n };\n\n // Ref for personalization_preview: enables synchronous reads across closures\n const personalizationPreviewRef = useRef<PersonalizationPreviewSettings | null>(state.personalization_preview);\n personalizationPreviewRef.current = state.personalization_preview;\n\n // Staleness counter for parallel analytics requests — incremented at start of each onSearch/onCollection\n // Analytics responses check this to discard stale data from superseded queries\n const searchRequestCounterRef = useRef(0);\n\n // Pending analytics payload — stores analytics if it arrives before the fast response (race condition handling)\n const pendingAnalyticsRef = useRef<{\n analytics?: FullTextServerResponseAll['analytics'];\n matching_sets?: Record<string, string>;\n group_strategy?: Record<string, string>;\n variety_strategy?: number[];\n productAnalyticsMap?: Record<string, ProductAnalytics>;\n personalizationStoryMap?: Record<string, PersonalizationStory>;\n responseRpiMethodologyEffective?: string | null;\n responseRpiSnapshotComputedAt?: string | null;\n } | null>(null);\n\n const [categories, setCategories] = useState<FastCategory[]>([]);\n const [analyticsFetched, setAnalyticsFetched] = useState(false);\n const [lastAnalyticsQuery, setLastAnalyticsQuery] = useState<string>('');\n const [lastAnalyticsCollection, setLastAnalyticsCollection] = useState<string>('');\n const [lastAnalyticsMode, setLastAnalyticsMode] = useState<'search' | 'collection' | ''>('');\n\n // Only enable analytics for enterprise merchants or subscription level 5\n const isAnalyticsEnabled = isEnterpriseMerchandising || subscription === 5;\n\n const {results, isLoading, query, sortBy, type, collectionID, page, narrow, recommendations, singleProducts, isReady, autocomplete, segments,isAutocomplete\n\n } = state;\n\n function setResults(results: FullTextServerResponseAll | smartCollectionsResults | AutocompleteReasoningResponse | undefined) {\n (dispatch as any)?.({type: 'setResults', payload: results});\n }\n\n function mergeResults(results: FullTextServerResponseAll | smartCollectionsResults | AutocompleteReasoningResponse, infiniteScroll: boolean) {\n (dispatch as any)?.({type: 'mergeResults', payload: {results, infiniteScroll}});\n }\n function mergeFacetsWithResults(facets:Narrow[]) {\n (dispatch as any)?.({type: 'mergeFacetsWithResults', payload: facets});\n }\n\n function mergeResultsKeepProduct(results: FullTextServerResponseAll | smartCollectionsResults) {\n (dispatch as any)?.({type: 'mergeResultsKeepProduct', payload: {results}});\n }\n\n function dispatchMergeAnalytics(payload: {\n analytics?: FullTextServerResponseAll['analytics'];\n matching_sets?: Record<string, string>;\n group_strategy?: Record<string, string>;\n variety_strategy?: number[];\n productAnalyticsMap?: Record<string, ProductAnalytics>;\n personalizationStoryMap?: Record<string, PersonalizationStory>;\n }) {\n (dispatch as any)?.({type: 'mergeAnalyticsData', payload});\n }\n\n function setIsLoading(isLoading: IsLoading) {\n (dispatch as any)?.({type: 'setIsLoading', payload: isLoading});\n }\n\n function setIsAutocomplete(isAutocomplete:boolean)\n {\n (dispatch as any)?.({type: 'setIsAutocomplete', payload: isAutocomplete});\n }\n\n function setVariationId(variationId: string | null) {\n (dispatch as any)?.({type: 'setVariationId', payload: variationId});\n }\n\n function setComparisonData(comparisonData: ComparisonData | null) {\n (dispatch as any)?.({type: 'setComparisonData', payload: comparisonData});\n }\n\n function setIsComparing(isComparing: boolean) {\n (dispatch as any)?.({type: 'setIsComparing', payload: isComparing});\n }\n\n function setForceAnd(forceAnd: boolean) {\n (dispatch as any)?.({type: 'setForceAnd', payload: forceAnd});\n }\n\n function updateSettingsAndRefetch(settings: Partial<Pick<typeof state, 'force_and' | 'custom_sort_settings' | 'flag' | 'user_segment_preview' | 'personalization_preview' | 'session_token'>>) {\n if ('custom_sort_settings' in settings) {\n customSortSettingsRef.current = settings.custom_sort_settings ?? undefined;\n }\n (dispatch as any)?.({type: 'updateSettingsAndRefetch', payload: settings});\n }\n\n function setUserSegmentPreview(preview: UserSegmentPreview) {\n userSegmentPreviewRef.current = preview;\n (dispatch as any)?.({type: 'setUserSegmentPreview', payload: preview});\n }\n\n function setPersonalizationPreview(preview: PersonalizationPreviewSettings | null) {\n personalizationPreviewRef.current = preview;\n (dispatch as any)?.({type: 'setPersonalizationPreview', payload: preview});\n }\n\n // Compute detailed comparison between Hybrid ON and Hybrid OFF using full ID lists\n function computeComparisonFromIds(hybridOnIds: string[], hybridOffIds: string[]): ComparisonData {\n // Create rank maps (1-based index)\n const onRankMap = new Map<string, number>();\n const offRankMap = new Map<string, number>();\n\n hybridOnIds.forEach((id, index) => onRankMap.set(id.toString(), index + 1));\n hybridOffIds.forEach((id, index) => offRankMap.set(id.toString(), index + 1));\n\n const productChanges = new Map<string, ProductRankChange>();\n let totalImproved = 0;\n let totalDeclined = 0;\n let totalNew = 0;\n let totalUnchanged = 0;\n\n // Analyze all products in hybrid ON results\n hybridOnIds.forEach((id) => {\n const idStr = id.toString();\n const rankWithHybrid = onRankMap.get(idStr) || -1;\n const rankWithoutHybrid = offRankMap.get(idStr) || -1;\n\n let status: ProductRankChange['status'];\n let rankDelta = 0;\n\n if (rankWithoutHybrid === -1) {\n // Product not in results without hybrid - it's new due to hybrid\n status = 'new';\n totalNew++;\n } else {\n rankDelta = rankWithoutHybrid - rankWithHybrid; // Positive = improved (moved up)\n\n if (rankDelta > 0) {\n status = 'improved';\n totalImproved++;\n } else if (rankDelta < 0) {\n status = 'declined';\n totalDeclined++;\n } else {\n status = 'unchanged';\n totalUnchanged++;\n }\n }\n\n productChanges.set(idStr, {\n productId: idStr,\n rankWithHybrid,\n rankWithoutHybrid,\n rankDelta,\n status\n });\n });\n\n return {\n hybridOnIds: hybridOnIds.map(id => id.toString()),\n hybridOffIds: hybridOffIds.map(id => id.toString()),\n productChanges,\n totalImproved,\n totalDeclined,\n totalNew,\n totalUnchanged\n };\n }\n\n function getDisableFlags(flags: string[]) {\n return {\n disable_merchandising: flags.find((f) => f == \"disable_merchandising\") ? 1 : 0,\n disable_semantics: flags.find((f) => f == \"disable_semantics\") ? 1 : 0,\n disable_turbolinks: flags.find((f) => f == \"disable_turbolinks\") ? 1 : 0,\n disable_strategies: flags.find((f) => f == \"disable_strategies\") ? 1 : 0,\n disable_merchandising_rules: flags.find((f) => f == \"disable_merchandising_rules\") ? 1 : 0,\n disable_antonyms: flags.find((f) => f == \"disable_antonyms\") ? 1 : 0,\n };\n }\n\n function setQuery(query: string , isAutocomplete?:boolean) {\n (dispatch as any)?.({type: 'setQuery', payload: query});\n (dispatch as any)?.({type: 'setIsAutocomplete', payload: isAutocomplete?isAutocomplete:false});\n\n // Create the object with the computed property\n let fetchParams = {\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n term: query,\n sortBy: defaultSort,\n segments: state.segments,\n withProductAttributes:withProductAttributes,\n custom_sort_settings:currentCustomSort(),\n ...getDisableFlags(state.flag),\n };\n\n fetchResults(fetchParams, isInfiniteScroll,isAutocomplete?isAutocomplete:false);\n }\n function setCustomSort(customSortSettings:CustomSortSettings) {\n customSortSettingsRef.current = customSortSettings;\n (dispatch as any)?.({type: 'setCustomSort', payload: customSortSettings});\n // Create the object with the computed property\n let fetchParams = {\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n term: state.query,\n narrowBy: state.narrow,\n sortBy: state.sortBy,\n categoryID: state.collectionID,\n segments: state.segments,\n withProductAttributes:state.withProductAttributes,\n searchWithinSearch:state.searchWithinSearch,\n custom_sort_settings:customSortSettings,\n ...getDisableFlags(state.flag),\n };\n\n fetchResults(fetchParams, isInfiniteScroll);\n\n }\n\n function setFlag(flags: string[]) {\n const flagsToData=flags.map((f)=>{return \"disable_\" + f;});\n (dispatch as any)?.({type: 'setFlag', payload: flagsToData });\n\n // Create the object with the computed property\n let fetchParams = {\n siteKey:siteKey,\n uuid: uuid,\n storeID: storeID,\n term: state.query,\n narrowBy: state.narrow,\n sortBy: state.defaultSort,\n segments: state.segments,\n categoryID: state.collectionID,\n withProductAttributes: withProductAttributes,\n searchWithinSearch:state.searchWithinSearch,\n custom_sort_settings:currentCustomSort(),\n };\n\n if(flags.length>0)\n {\n flags.forEach((f)=>{\n let flagProp = \"disable_\" + f;\n // Add the dynamic key to the object\n // @ts-ignore\n fetchParams[flagProp as any] = true;\n });\n }\n\n\n fetchResults(fetchParams, isInfiniteScroll,state.isAutocomplete);\n }\n\n function setSortBy(sortBy: SortBy) {\n (dispatch as any)?.({type: 'setSortBy', payload: sortBy});\n // Create the object with the computed property\n let fetchParams = {\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n term: state.query,\n narrowBy: state.narrow,\n sortBy: sortBy,\n categoryID: state.collectionID,\n segments: state.segments,\n withProductAttributes:withProductAttributes,\n searchWithinSearch:state.searchWithinSearch,\n custom_sort_settings:currentCustomSort(),\n ...getDisableFlags(state.flag),\n };\n\n fetchResults(fetchParams, isInfiniteScroll);\n\n }\n function setSegments(segments: string[]) {\n (dispatch as any)?.({type: 'setSegments', payload: segments});\n\n let fetchParams = {\n withProductAttributes:withProductAttributes,\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n term: state.query,\n narrowBy: state.narrow,\n sortBy: state.sortBy,\n categoryID: state.collectionID,\n segments: segments,\n searchWithinSearch:state.searchWithinSearch,\n custom_sort_settings:currentCustomSort(),\n ...getDisableFlags(state.flag),\n };\n\n fetchResults(fetchParams, isInfiniteScroll,state.isAutocomplete);\n\n }\n function setType(type: AppType) {\n (dispatch as any)?.({type: 'setType', payload: type});\n }\n\n function setCollectionID(collectionID: string) {\n (dispatch as any)?.({type: 'setCollectionID', payload: collectionID});\n (dispatch as any)?.({type: 'setIsAutocomplete', payload: false});\n\n // Create the object with the computed property\n let fetchParams = {\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n categoryID: collectionID,\n sortBy: defaultSort,\n segments: state.segments,\n custom_sort_settings:currentCustomSort(),\n ...getDisableFlags(state.flag),\n };\n\n fetchResults(fetchParams, isInfiniteScroll);\n\n }\n\n function setPage(page: number) {\n (dispatch as any)?.({type: 'setPage', payload: page});\n\n let fetchParams = {\n withProductAttributes:withProductAttributes,\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n term: state.query,\n narrowBy: state.narrow,\n sortBy: state.sortBy,\n categoryID: state.collectionID,\n page: page,\n segments: state.segments,\n searchWithinSearch:state.searchWithinSearch,\n custom_sort_settings:currentCustomSort(),\n ...getDisableFlags(state.flag),\n };\n\n fetchResults(fetchParams, isInfiniteScroll);\n\n }\n\n function setNarrow(narrow: ServerNarrow[] | undefined) {\n (dispatch as any)?.({type: 'setNarrow', payload: narrow});\n\n let fetchParams = {\n withProductAttributes:withProductAttributes,\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n term: state.query,\n narrowBy: narrow,\n sortBy: state.sortBy,\n categoryID: state.collectionID,\n segments: state.segments,\n searchWithinSearch:state.searchWithinSearch,\n custom_sort_settings:currentCustomSort(),\n ...getDisableFlags(state.flag),\n };\n\n fetchResults(fetchParams, isInfiniteScroll);\n\n }\n\n function setState({...newState}: SetStateProps) {\n (dispatch as any)?.({type: 'setState', payload: newState});\n\n fetchResults({\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n term: newState.query,\n narrowBy: newState.narrow?newState.narrow:undefined,\n sortBy: newState.sortBy ?? defaultSort,\n categoryID: newState.collectionID,\n page: newState.page,\n segments: newState.segments,\n }, Boolean(!results && isInfiniteScroll && newState.page && newState.page > 1));\n }\n\n\n function setSingleProducts(products: Product[]) {\n (dispatch as any)?.({type: \"setSingleProducts\", payload: products});\n }\n\n\n function setReady(isReady: boolean) {\n (dispatch as any)?.({type: \"setReady\", payload: isReady});\n }\n\n function setSearchWithinSearch(searchWithinSearch: string) {\n (dispatch as any)?.({type: \"setSearchWithinSearch\", payload: searchWithinSearch});\n\n let fetchParams = {\n withProductAttributes:withProductAttributes,\n siteKey:siteKey,\n uuid:uuid,\n storeID:storeID,\n term: query,\n narrowBy: state.narrow,\n sortBy: state.sortBy,\n categoryID: state.collectionID,\n segments: state.segments,\n searchWithinSearch:searchWithinSearch,\n custom_sort_settings:currentCustomSort(),\n ...getDisableFlags(state.flag),\n };\n\n fetchResults(fetchParams, isInfiniteScroll);\n\n }\n\n function fetchResults(props:{\n uuid:string, storeID:number,siteKey?:string, term?: string, page?: number, narrowBy?: ServerNarrow[] | undefined,\n sortBy?: SortBy, categoryID?: string, searchWithinSearch?: string, segments?: string[] ,withProductAttributes?:boolean,\n disable_semantics?:number,disable_merchandising?:number,disable_strategies?:number,disable_turbolinks?:number,disable_personalization?:number,custom_sort_settings?:CustomSortSettings,\n variation_id?: string | null, force_and?: boolean\n },\n isInfiniteScroll: boolean,\n autocomplete:boolean=false) {\n\n // 1. Apply ref value first — ensures latest custom_sort_settings is used even from\n // stale closures or call sites (e.g. setState) that don't pass custom_sort_settings.\n // null means \"explicitly cleared\" → omit the param from the request.\n const refValue = customSortSettingsRef.current;\n if (refValue !== undefined) {\n const effectiveSort: CustomSortSettings | undefined = refValue === null ? undefined : refValue;\n props = { ...props, custom_sort_settings: effectiveSort };\n }\n\n // 2. Apply transform after ref — transform gets the correct base value and can\n // inject context-aware personalization_rank without stale closure issues.\n if (customSortSettingsTransform) {\n const isCollection = !!props.categoryID && !props.term;\n props = { ...props, custom_sort_settings: customSortSettingsTransform(props.custom_sort_settings, isCollection) as CustomSortSettings | undefined };\n }\n\n // on first request check if we need to fetch more then 1 product\n\n if (props.term && !autocomplete) {\n onSearch(newObject({\n ...props,\n page: props.page || 1,\n infiniteScrollPage: isInfiniteScroll,\n }) as Omit<fullTextSearchProps, \"callback\">, isInfiniteScroll);\n } else if(props.term && autocomplete){\n onAutocompleteSearch(newObject({\n ...props\n }) as Omit<autocompleteProps, \"callback\" | \"page\" | \"narrowBy\" | \"sortBy\" | \"categoryID\" | \"searchWithinSearch\" | \"custom_sort_settings\">);\n } else if (props.categoryID) {\n onCollection(newObject({\n ...props,\n page: props.page || 1,\n infiniteScrollPage: isInfiniteScroll,\n }) as Omit<smartCollectionsProps, \"callback\">, isInfiniteScroll);\n }\n\n return;\n\n }\n\n\n\n useEffect(() => {\n function handleSetQueryEvent(event: any) {\n // Support both string (legacy) and object with isAutocomplete flag\n if (typeof event.detail === 'string') {\n setQuery(event.detail);\n } else {\n setQuery(event.detail.query, event.detail.isAutocomplete);\n }\n }\n\n function handleSetFlagEvent(event: any){\n setFlag(event.details)\n\n }\n function handleSetCollectionEvent(event: any) {\n setCollectionID(typeof event.detail === 'string' ? event.detail : event.detail.collectionID);\n }\n\n function handleSetCollectionURLEvent(event: any) {\n getAllCategories().then(r => {\n const id = r.find(c => c.u === event.detail)?.id;\n\n if (id) {\n setCollectionID(id);\n return;\n }\n\n window.location.href = event.detail;\n })\n }\n\n function handleSetPageEvent(event: any) {\n setPage(event.detail);\n }\n\n function handleSetSortEvent(event: any) {\n setSortBy(event.detail);\n }\n\n function handleSetNarrowEvent(event: any) {\n setNarrow(event.detail);\n }\n\n function handleSetSegmentsEvent(event: any) {\n setSegments(event.detail);\n }\n function handleSetIsAutocomplete(event:any){\n setIsAutocomplete(event.detail)\n }\n window.addEventListener('fast-simon-update-query', handleSetQueryEvent);\n window.addEventListener('fast-simon-update-collection', handleSetCollectionEvent);\n window.addEventListener('fast-simon-update-collection-url', handleSetCollectionURLEvent);\n window.addEventListener('fast-simon-update-page', handleSetPageEvent);\n window.addEventListener('fast-simon-update-sort', handleSetSortEvent);\n window.addEventListener('fast-simon-update-narrow', handleSetNarrowEvent);\n window.addEventListener('fast-simon-update-segments', handleSetSegmentsEvent);\n window.addEventListener('fast-simon-update-flag', handleSetFlagEvent);\n window.addEventListener('fast-simon-update-is-autocomplete', handleSetIsAutocomplete);\n\n return () => {\n window.removeEventListener('fast-simon-update-query', handleSetQueryEvent);\n window.removeEventListener('fast-simon-update-collection', handleSetCollectionEvent);\n window.removeEventListener('fast-simon-update-collection-url', handleSetCollectionURLEvent);\n window.removeEventListener('fast-simon-update-page', handleSetPageEvent);\n window.removeEventListener('fast-simon-update-sort', handleSetSortEvent);\n window.removeEventListener('fast-simon-update-narrow', handleSetNarrowEvent);\n window.removeEventListener('fast-simon-update-segments', handleSetSegmentsEvent);\n window.removeEventListener('fast-simon-update-flag', handleSetFlagEvent);\n window.removeEventListener('fast-simon-update-is-autocomplete', handleSetIsAutocomplete);\n }\n\n }, []);\n\n // Settings modal refetch: triggered after state is updated (no race conditions)\n // All settings (force_and, flags, custom_sort, user_segment_preview, personalization_preview)\n // are batched via updateSettingsAndRefetch to avoid double-fetches and stale-state reads.\n useEffect(() => {\n if (!state.refetchTrigger) return;\n // Build fetchParams from the now-updated state\n const fetchParams = {\n siteKey: siteKey,\n uuid: uuid,\n storeID: storeID,\n term: state.query,\n narrowBy: state.narrow,\n sortBy: state.sortBy ?? defaultSort,\n categoryID: state.collectionID,\n segments: state.segments,\n withProductAttributes: withProductAttributes,\n searchWithinSearch: state.searchWithinSearch,\n custom_sort_settings: currentCustomSort(),\n ...getDisableFlags(state.flag ?? []),\n variation_id: state.variation_id,\n force_and: state.force_and,\n };\n fetchResults(fetchParams, isInfiniteScroll, state.isAutocomplete);\n }, [state.refetchTrigger]);\n\n const onSearch = (props: Omit<fullTextSearchProps, \"callback\">, isInfiniteScroll: boolean) => {\n setIsLoading({products: true, filters: true});\n\n // Clear previous comparison data when starting new search\n setComparisonData(null);\n\n const currentQuery = props.term || '';\n const currentForceAnalytics = forceProductAnalytics || getShowSalesAnalyticsSetting();\n const shouldFetchAnalytics = currentForceAnalytics || (isAnalyticsEnabled && (currentQuery !== lastAnalyticsQuery || lastAnalyticsMode !== 'search'));\n\n // Check if hybrid search is enabled - we'll need to make a comparison call\n const isHybridEnabled = getLSVectorSearchOn();\n\n const personalizationSegment = getPersonalizationSegment(userSegmentPreviewRef.current);\n const personalizationParams = buildPersonalizationParams(\n personalizationPreviewRef.current ?? {enabled: false, spvJson: '', types: ['gender']}\n );\n\n // Increment staleness counter and clear pending analytics\n const requestId = ++searchRequestCounterRef.current;\n pendingAnalyticsRef.current = null;\n let fastRankingResponse: any = null;\n\n const commonRequestParams = {\n ...props,\n withAttributes: promoTiles || withProductAttributes,\n market_context: marketContext,\n variation_id: state.variation_id,\n force_and: state.force_and,\n ps: personalizationSegment,\n spv: personalizationParams.spv,\n personalization: personalizationParams.personalization,\n session_token: state.session_token\n };\n\n // Fire analytics request in parallel (fire-and-forget) — only if analytics needed\n if (shouldFetchAnalytics) {\n FullTextSearch.getReasoningFullTextSearch({\n ...commonRequestParams,\n with_product_analytics: true,\n facetRequired: 0,\n }).then(analyticsResponse => {\n if (searchRequestCounterRef.current !== requestId) return; // stale\n\n if (analyticsResponse.analytics?.badges) {\n setAnalyticsFetched(true);\n setLastAnalyticsQuery(currentQuery);\n setLastAnalyticsMode('search');\n }\n\n const productAnalyticsMap: Record<string, ProductAnalytics> = {};\n const items = (analyticsResponse as any).items || analyticsResponse.products || [];\n for (const product of items) {\n if (product.analytics) {\n productAnalyticsMap[String(product.id)] = product.analytics;\n }\n }\n\n const payload = buildAnalyticsPayload(analyticsResponse, productAnalyticsMap);\n if (fastRankingResponse\n && !analyticsMatchesRankingSnapshot(payload, fastRankingResponse)) {\n pendingAnalyticsRef.current = null;\n console.warn('[Analytics] Discarded search analytics from a different RPI snapshot.');\n return;\n }\n pendingAnalyticsRef.current = payload;\n dispatchMergeAnalytics(payload);\n }).catch(err => {\n console.error(\"[Analytics] Failed to fetch search analytics:\", err);\n });\n }\n\n // Fire fast request WITHOUT analytics\n FullTextSearch.getReasoningFullTextSearch({\n ...commonRequestParams,\n with_product_analytics: false,\n }).then(async(response) => {\n fastRankingResponse = response;\n attachPersonalizationToItems(response);\n // Don't preserve stale analytics when fetching fresh ones\n const existingAnalytics = shouldFetchAnalytics ? undefined : (results as any)?.analytics;\n const existingMatchingSets = shouldFetchAnalytics ? undefined : (results as any)?.matching_sets;\n const existingGroupStrategy = shouldFetchAnalytics ? undefined : (results as any)?.group_strategy;\n const existingVarietyStrategy = shouldFetchAnalytics ? undefined : (results as any)?.variety_strategy;\n response=getFormatedData(response, existingAnalytics, existingMatchingSets, existingGroupStrategy, existingVarietyStrategy);\n\n // Handle turbolink responses - skip additional API calls to prevent errors\n if (response.turbolink && response.totalResults === 0) {\n mergeResults(response, isInfiniteScroll);\n\n if (!customTitleChange) {\n document.title = `Search Result for ${query}`;\n } else {\n customTitleChange(results);\n }\n\n setIsLoading({filters: false, products: false});\n return;\n }\n\n // Show products immediately\n mergeResults(response, isInfiniteScroll);\n setIsLoading({products: false, filters: true});\n\n // If analytics arrived before fast response, re-apply to new results\n if (pendingAnalyticsRef.current && searchRequestCounterRef.current === requestId) {\n if (analyticsMatchesRankingSnapshot(pendingAnalyticsRef.current, response)) {\n dispatchMergeAnalytics(pendingAnalyticsRef.current);\n } else {\n pendingAnalyticsRef.current = null;\n console.warn('[Analytics] Discarded search analytics from a different RPI snapshot.');\n }\n }\n\n // Fire IDs + facets in parallel (previously sequential)\n const listIdRequestProps = { ...props };\n listIdRequestProps.searchWithinSearch=undefined;\n listIdRequestProps.productsPerPage=1000000;\n listIdRequestProps.page=1;\n listIdRequestProps.market_context = marketContext;\n listIdRequestProps.variation_id = state.variation_id;\n listIdRequestProps.force_and = state.force_and;\n listIdRequestProps.ps = personalizationSegment;\n listIdRequestProps.spv = personalizationParams.spv;\n listIdRequestProps.personalization = personalizationParams.personalization;\n listIdRequestProps.session_token = state.session_token;\n\n const facetsRequestProps = { ...props };\n facetsRequestProps.facetRequired=2;\n facetsRequestProps.searchWithinSearch=props.searchWithinSearch;\n facetsRequestProps.productsPerPage=props.productsPerPage;\n facetsRequestProps.page=props.page;\n facetsRequestProps.market_context = marketContext;\n facetsRequestProps.variation_id = state.variation_id;\n facetsRequestProps.force_and = state.force_and;\n facetsRequestProps.ps = personalizationSegment;\n facetsRequestProps.spv = personalizationParams.spv;\n facetsRequestProps.personalization = personalizationParams.personalization;\n\n const [listIdRes, facetsRes] = await Promise.all([\n FullTextSearch.getReasoningFullTextSearchProductsIds(listIdRequestProps),\n FullTextSearch.getReasoningFullTextSearch(facetsRequestProps)\n ]);\n\n // Merge IDs and complete facets into existing results\n mergeResultsKeepProduct({id_list: listIdRes.id_list, facets: facetsRes.facets} as any);\n\n if (!customTitleChange) {\n document.title = `Search Result for ${query}`;\n } else {\n customTitleChange(results);\n }\n\n setIsLoading({filters: false, products: false});\n\n // Compare Mode: Make comparison call using IDs endpoint if hybrid search is enabled\n console.log(\"[Compare Mode] isHybridEnabled:\", isHybridEnabled, \"hasIdList:\", !!listIdRes.id_list);\n if (isHybridEnabled && listIdRes.id_list && listIdRes.id_list.length > 0) {\n setIsComparing(true);\n console.log(\"[Compare Mode] Making comparison IDs call...\");\n try {\n // Get all IDs WITHOUT hybrid_search_settings\n const comparisonResponse = await FullTextSearch.getComparisonProductIds({\n ...props,\n market_context: marketContext,\n variation_id: state.variation_id,\n force_and: state.force_and,\n ps: personalizationSegment,\n spv: personalizationParams.spv,\n personalization: personalizationParams.personalization\n });\n\n const hybridOffIds = (comparisonResponse.id_list || []).map(id => id.toString());\n const hybridOnIds = (listIdRes.id_list || []).map(id => id.toString());\n console.log(\"[Compare Mode] Hybrid ON IDs count:\", hybridOnIds.length);\n console.log(\"[Compare Mode] Hybrid OFF IDs count:\", hybridOffIds.length);\n\n if (hybridOffIds.length > 0) {\n const diff = computeComparisonFromIds(hybridOnIds, hybridOffIds);\n console.log(\"[Compare Mode] Diff computed - improved:\", diff.totalImproved, \"declined:\", diff.totalDeclined, \"new:\", diff.totalNew);\n setComparisonData(diff);\n }\n } catch (error) {\n console.error(\"[Compare Mode] Failed to fetch comparison IDs:\", error);\n setComparisonData(null);\n } finally {\n setIsComparing(false);\n }\n }\n });\n }\n const onAutocompleteSearch = (props: Omit<autocompleteProps, \"callback\">) => {\n setIsLoading({products: true, filters: true});\n const personalizationSegment = getPersonalizationSegment(userSegmentPreviewRef.current);\n const personalizationParams = buildPersonalizationParams(\n personalizationPreviewRef.current ?? {enabled: false, spvJson: '', types: ['gender']}\n );\n\n Autocomplete.getAutocompleteReasoning({\n ...props,\n withAttributes: promoTiles || withProductAttributes,\n market_context: marketContext,\n variation_id: state.variation_id,\n force_and: state.force_and,\n ps: personalizationSegment,\n spv: personalizationParams.spv,\n personalization: personalizationParams.personalization\n }).then(async(response) => {\n response=getFormatedData(response);\n\n mergeResults(response, false);\n\n if (!customTitleChange) {\n document.title = `Autocomplete Result for ${query}`;\n } else {\n customTitleChange(results);\n }\n\n if (!response) {\n setIsLoading({\n filters: true, products: false\n });\n } else {\n setIsLoading({\n filters: false, products: false\n });\n }\n });\n }\n\n const onCollection = (props: Omit<smartCollectionsProps, \"callback\">, isInfiniteScroll: boolean) => {\n setIsLoading({products: true, filters: true});\n\n const currentCollection = props.categoryID || '';\n const currentForceAnalytics = forceProductAnalytics || getShowSalesAnalyticsSetting();\n const shouldFetchAnalytics = currentForceAnalytics || (isAnalyticsEnabled && (currentCollection !== lastAnalyticsCollection || lastAnalyticsMode !== 'collection'));\n\n const personalizationSegment = getPersonalizationSegment(userSegmentPreviewRef.current);\n const personalizationParams = buildPersonalizationParams(\n personalizationPreviewRef.current ?? {enabled: false, spvJson: '', types: ['gender']}\n );\n\n // Increment staleness counter and clear pending analytics\n const requestId = ++searchRequestCounterRef.current;\n pendingAnalyticsRef.current = null;\n let fastRankingResponse: any = null;\n\n const commonRequestParams = {\n ...props,\n withAttributes: promoTiles || withProductAttributes,\n market_context: marketContext,\n variation_id: state.variation_id,\n ps: personalizationSegment,\n spv: personalizationParams.spv,\n\n spc: personalizationParams.spc,\n personalization: personalizationParams.personalization,\n force_and: state.force_and,\n session_token: state.session_token\n };\n\n // Fire analytics request in parallel (fire-and-forget) — only if analytics needed\n if (shouldFetchAnalytics) {\n SmartCollections.getSmartCollections({\n ...commonRequestParams,\n with_product_analytics: true,\n facetRequired: 0,\n }).then(analyticsResponse => {\n if (searchRequestCounterRef.current !== requestId) return; // stale\n\n if (analyticsResponse.analytics?.badges) {\n setAnalyticsFetched(true);\n setLastAnalyticsCollection(currentCollection);\n setLastAnalyticsMode('collection');\n }\n\n const productAnalyticsMap: Record<string, ProductAnalytics> = {};\n const items = (analyticsResponse as any).items || analyticsResponse.products || [];\n for (const product of items) {\n if (product.analytics) {\n productAnalyticsMap[String(product.id)] = product.analytics;\n }\n }\n\n const payload = buildAnalyticsPayload(analyticsResponse, productAnalyticsMap);\n if (fastRankingResponse\n && !analyticsMatchesRankingSnapshot(payload, fastRankingResponse)) {\n pendingAnalyticsRef.current = null;\n console.warn('[Analytics] Discarded collection analytics from a different RPI snapshot.');\n return;\n }\n pendingAnalyticsRef.current = payload;\n dispatchMergeAnalytics(payload);\n }).catch(err => {\n console.error(\"[Analytics] Failed to fetch collection analytics:\", err);\n });\n }\n\n // Fire fast request WITHOUT analytics\n SmartCollections.getSmartCollections({\n ...commonRequestParams,\n with_product_analytics: false,\n }).then(async (response) => {\n fastRankingResponse = response;\n attachPersonalizationToItems(response);\n\n // Don't preserve stale analytics when fetching fresh ones\n const existingAnalytics = shouldFetchAnalytics ? undefined : (results as any)?.analytics;\n const existingMatchingSets = shouldFetchAnalytics ? undefined : (results as any)?.matching_sets;\n const existingGroupStrategy = shouldFetchAnalytics ? undefined : (results as any)?.group_strategy;\n const existingVarietyStrategy = shouldFetchAnalytics ? undefined : (results as any)?.variety_strategy;\n response=getFormatedData(response, existingAnalytics, existingMatchingSets, existingGroupStrategy, existingVarietyStrategy);\n\n // Show products immediately\n mergeResults(response, isInfiniteScroll);\n setIsLoading({products: false, filters: true});\n\n // If analytics arrived before fast response, re-apply to new results\n if (pendingAnalyticsRef.current && searchRequestCounterRef.current === requestId) {\n if (analyticsMatchesRankingSnapshot(pendingAnalyticsRef.current, response)) {\n dispatchMergeAnalytics(pendingAnalyticsRef.current);\n } else {\n pendingAnalyticsRef.current = null;\n console.warn('[Analytics] Discarded collection analytics from a different RPI snapshot.');\n }\n }\n\n // Fire IDs + facets in parallel (previously sequential)\n const listIdRequestProps = { ...props };\n listIdRequestProps.searchWithinSearch=undefined;\n listIdRequestProps.productsPerPage=1000000;\n listIdRequestProps.page=1;\n listIdRequestProps.market_context = marketContext;\n listIdRequestProps.variation_id = state.variation_id;\n listIdRequestProps.force_and = state.force_and;\n listIdRequestProps.ps = personalizationSegment;\n listIdRequestProps.spv = personalizationParams.spv;\n listIdRequestProps.spc = personalizationParams.spc;\n listIdRequestProps.personalization = personalizationParams.personalization;\n listIdRequestProps.session_token = state.session_token;\n\n const facetsRequestProps = { ...props };\n facetsRequestProps.facetRequired=2;\n facetsRequestProps.searchWithinSearch=props.searchWithinSearch;\n facetsRequestProps.productsPerPage=props.productsPerPage;\n facetsRequestProps.page=props.page;\n facetsRequestProps.market_context = marketContext;\n facetsRequestProps.variation_id = state.variation_id;\n facetsRequestProps.force_and = state.force_and;\n facetsRequestProps.ps = personalizationSegment;\n facetsRequestProps.spv = personalizationParams.spv;\n facetsRequestProps.spc = personalizationParams.spc;\n facetsRequestProps.personalization = personalizationParams.personalization;\n\n const [listIdRes, facetsRes] = await Promise.all([\n SmartCollections.getSmartCollectionsProductsIds(listIdRequestProps),\n SmartCollections.getSmartCollections(facetsRequestProps)\n ]);\n\n // Merge IDs and complete facets into existing results\n mergeResultsKeepProduct({id_list: listIdRes.id_list, facets: facetsRes.facets} as any);\n\n setIsLoading({filters: false, products: false});\n\n getAllCategories().then(r => {\n if (!customTitleChange) {\n document.title = r.find(c => c.id === props.categoryID)?.l ?? \"Collection\";\n } else {\n customTitleChange(results);\n }\n });\n });\n }\n\n // Memoize to prevent unnecessary recreation\n const getAllCategories = useCallback(async () => {\n if (categories.length > 0) {\n return new Promise<FastCategory[]>(resolve => resolve(categories))\n }\n\n const data = categories || [];\n\n setCategories(data)\n\n return data;\n }, [categories]);\n\n const getFormatedData = (response: any, existingAnalytics?: any, existingMatchingSets?: any, existingGroupStrategy?: any, existingVarietyStrategy?: any) => {\n const results = response;\n\n results.products = response.items;\n delete results.items;\n results.totalResults = response.total_results;\n delete results.total_results;\n if (response.sort_by) {\n results.sortBy = response.sort_by;\n delete results.sort_by;\n }\n\n if (response.pop_products_no_results) {\n results.isNoResults = true;\n }\n\n if (response.total_p) {\n results.pageCount = response.total_p;\n delete results.total_p;\n }\n\n\n if (response.ancestor_categories) {\n results.ancestors = response.ancestor_categories;\n delete results.ancestor_categories;\n }\n\n if (response.avoid_tag_prefixes) {\n results.avoidPrefixList = response.avoid_tag_prefixes.split(\",\");\n }\n\n\n results.page = response.p || 1;\n delete results.p;\n\n // Preserve analytics field if present (contains winners/overexposed data)\n // If response has new analytics, use it; otherwise keep existing analytics\n if (response.analytics) {\n results.analytics = response.analytics;\n } else if (existingAnalytics) {\n results.analytics = existingAnalytics;\n }\n\n // Preserve matching_sets field if present (product ID -> set name)\n // If response has new matching_sets, use it; otherwise keep existing\n if (response.matching_sets) {\n results.matching_sets = response.matching_sets;\n } else if (existingMatchingSets) {\n results.matching_sets = existingMatchingSets;\n }\n\n if (response.group_strategy) {\n results.group_strategy = response.group_strategy;\n } else if (existingGroupStrategy) {\n results.group_strategy = existingGroupStrategy;\n }\n if (response.variety_strategy) {\n results.variety_strategy = response.variety_strategy;\n } else if (existingVarietyStrategy) {\n results.variety_strategy = existingVarietyStrategy;\n }\n\n if (results.personalized_products?.length) {\n const context = results.category_name\n ? `Collection: ${results.category_name}`\n : state.query\n ? `Search: \"${state.query}\"`\n : 'Unknown context';\n console.log(`[Personalized Products] ${context}`, results.personalized_products);\n }\n\n return results;\n };\n\n\n // Memoize state context to prevent unnecessary re-renders\n const stateContextValue = useMemo(() => ({\n narrow,\n results,\n page,\n query,\n sortBy,\n type,\n collectionID,\n isLoading,\n recommendations,\n singleProducts,\n isReady,\n autocomplete,\n isAutocomplete,\n variation_id: state.variation_id,\n force_and: state.force_and,\n flag: state.flag,\n comparisonData: state.comparisonData,\n isComparing: state.isComparing\n }), [narrow, results, page, query, sortBy, type, collectionID, isLoading, recommendations, singleProducts, isReady, autocomplete, isAutocomplete, state.variation_id, state.force_and, state.flag, state.comparisonData, state.isComparing]);\n\n // Memoize theme to prevent unnecessary object creation\n const mergedTheme = useMemo(() => ({...mainTheme, ...theme}), [theme]);\n\n // @ts-ignore\n return (\n <FastStateFunctions.Provider\n value={{\n setQuery,\n setSort: setSortBy,\n setNarrow,\n setPage,\n getAllCategories,\n setCollection: setCollectionID,\n setState,\n setSearchWithinSearch,\n setSegments,\n setFlag,\n setCustomSort,\n setIsAutocomplete,\n setVariationId,\n setForceAnd,\n setUserSegmentPreview,\n setPersonalizationPreview,\n updateSettingsAndRefetch\n }}>\n <FastState.Provider value={stateContextValue}>\n <ThemeProvider theme={mergedTheme}>\n {children}\n </ThemeProvider>\n </FastState.Provider>\n </FastStateFunctions.Provider>\n )\n};\n\n// Memoize component to prevent unnecessary re-renders when parent updates\nexport default React.memo(FastSimonApi);\n"]}
|
|
@@ -152,12 +152,14 @@ export declare function fastStateReducer(state: FastStateProps, action: FastStat
|
|
|
152
152
|
reformulation_source?: string | undefined;
|
|
153
153
|
request_url?: string | undefined;
|
|
154
154
|
rpi_methodology_assigned?: string | null | undefined;
|
|
155
|
+
rpi_methodology_preview_requested?: boolean | undefined;
|
|
155
156
|
rpi_methodology_effective?: string | null | undefined;
|
|
156
157
|
rpi_methodology_fallback_reason?: string | null | undefined;
|
|
157
158
|
rpi_snapshot_computed_at?: string | null | undefined;
|
|
158
159
|
rpi_snapshot_covered_until?: string | null | undefined;
|
|
159
160
|
rpi_candidate_available?: boolean | undefined;
|
|
160
161
|
rpi_candidate_unavailable_reason?: string | null | undefined;
|
|
162
|
+
rpi_candidate_readiness_status?: string | null | undefined;
|
|
161
163
|
facets: import("../../@types/facets").Facet[];
|
|
162
164
|
total_results: number;
|
|
163
165
|
facets_completed?: boolean | undefined;
|
|
@@ -208,12 +210,14 @@ export declare function fastStateReducer(state: FastStateProps, action: FastStat
|
|
|
208
210
|
reformulation_source?: string | undefined;
|
|
209
211
|
request_url?: string | undefined;
|
|
210
212
|
rpi_methodology_assigned?: string | null | undefined;
|
|
213
|
+
rpi_methodology_preview_requested?: boolean | undefined;
|
|
211
214
|
rpi_methodology_effective?: string | null | undefined;
|
|
212
215
|
rpi_methodology_fallback_reason?: string | null | undefined;
|
|
213
216
|
rpi_snapshot_computed_at?: string | null | undefined;
|
|
214
217
|
rpi_snapshot_covered_until?: string | null | undefined;
|
|
215
218
|
rpi_candidate_available?: boolean | undefined;
|
|
216
219
|
rpi_candidate_unavailable_reason?: string | null | undefined;
|
|
220
|
+
rpi_candidate_readiness_status?: string | null | undefined;
|
|
217
221
|
} | {
|
|
218
222
|
products: import("../../@types/product").ServerProduct[];
|
|
219
223
|
alternatives?: string[] | undefined;
|
|
@@ -254,12 +258,14 @@ export declare function fastStateReducer(state: FastStateProps, action: FastStat
|
|
|
254
258
|
reformulation_source?: string | undefined;
|
|
255
259
|
request_url?: string | undefined;
|
|
256
260
|
rpi_methodology_assigned?: string | null | undefined;
|
|
261
|
+
rpi_methodology_preview_requested?: boolean | undefined;
|
|
257
262
|
rpi_methodology_effective?: string | null | undefined;
|
|
258
263
|
rpi_methodology_fallback_reason?: string | null | undefined;
|
|
259
264
|
rpi_snapshot_computed_at?: string | null | undefined;
|
|
260
265
|
rpi_snapshot_covered_until?: string | null | undefined;
|
|
261
266
|
rpi_candidate_available?: boolean | undefined;
|
|
262
267
|
rpi_candidate_unavailable_reason?: string | null | undefined;
|
|
268
|
+
rpi_candidate_readiness_status?: string | null | undefined;
|
|
263
269
|
facets: import("../../@types/facets").Facet[];
|
|
264
270
|
total_results: number;
|
|
265
271
|
facets_completed?: boolean | undefined;
|
|
@@ -310,12 +316,14 @@ export declare function fastStateReducer(state: FastStateProps, action: FastStat
|
|
|
310
316
|
reformulation_source?: string | undefined;
|
|
311
317
|
request_url?: string | undefined;
|
|
312
318
|
rpi_methodology_assigned?: string | null | undefined;
|
|
319
|
+
rpi_methodology_preview_requested?: boolean | undefined;
|
|
313
320
|
rpi_methodology_effective?: string | null | undefined;
|
|
314
321
|
rpi_methodology_fallback_reason?: string | null | undefined;
|
|
315
322
|
rpi_snapshot_computed_at?: string | null | undefined;
|
|
316
323
|
rpi_snapshot_covered_until?: string | null | undefined;
|
|
317
324
|
rpi_candidate_available?: boolean | undefined;
|
|
318
325
|
rpi_candidate_unavailable_reason?: string | null | undefined;
|
|
326
|
+
rpi_candidate_readiness_status?: string | null | undefined;
|
|
319
327
|
alternatives?: string[] | undefined;
|
|
320
328
|
term: string;
|
|
321
329
|
cms_number_found?: number | undefined;
|
|
@@ -372,12 +380,14 @@ export declare function fastStateReducer(state: FastStateProps, action: FastStat
|
|
|
372
380
|
reformulation_source?: string | undefined;
|
|
373
381
|
request_url?: string | undefined;
|
|
374
382
|
rpi_methodology_assigned?: string | null | undefined;
|
|
383
|
+
rpi_methodology_preview_requested?: boolean | undefined;
|
|
375
384
|
rpi_methodology_effective?: string | null | undefined;
|
|
376
385
|
rpi_methodology_fallback_reason?: string | null | undefined;
|
|
377
386
|
rpi_snapshot_computed_at?: string | null | undefined;
|
|
378
387
|
rpi_snapshot_covered_until?: string | null | undefined;
|
|
379
388
|
rpi_candidate_available?: boolean | undefined;
|
|
380
389
|
rpi_candidate_unavailable_reason?: string | null | undefined;
|
|
390
|
+
rpi_candidate_readiness_status?: string | null | undefined;
|
|
381
391
|
facets: import("../../@types/facets").Facet[];
|
|
382
392
|
total_results: number;
|
|
383
393
|
facets_completed?: boolean | undefined;
|
|
@@ -434,12 +444,14 @@ export declare function fastStateReducer(state: FastStateProps, action: FastStat
|
|
|
434
444
|
reformulation_source?: string | undefined;
|
|
435
445
|
request_url?: string | undefined;
|
|
436
446
|
rpi_methodology_assigned?: string | null | undefined;
|
|
447
|
+
rpi_methodology_preview_requested?: boolean | undefined;
|
|
437
448
|
rpi_methodology_effective?: string | null | undefined;
|
|
438
449
|
rpi_methodology_fallback_reason?: string | null | undefined;
|
|
439
450
|
rpi_snapshot_computed_at?: string | null | undefined;
|
|
440
451
|
rpi_snapshot_covered_until?: string | null | undefined;
|
|
441
452
|
rpi_candidate_available?: boolean | undefined;
|
|
442
453
|
rpi_candidate_unavailable_reason?: string | null | undefined;
|
|
454
|
+
rpi_candidate_readiness_status?: string | null | undefined;
|
|
443
455
|
} | {
|
|
444
456
|
products: import("../../@types/product").ServerProduct[];
|
|
445
457
|
alternatives?: string[] | undefined;
|
|
@@ -480,12 +492,14 @@ export declare function fastStateReducer(state: FastStateProps, action: FastStat
|
|
|
480
492
|
reformulation_source?: string | undefined;
|
|
481
493
|
request_url?: string | undefined;
|
|
482
494
|
rpi_methodology_assigned?: string | null | undefined;
|
|
495
|
+
rpi_methodology_preview_requested?: boolean | undefined;
|
|
483
496
|
rpi_methodology_effective?: string | null | undefined;
|
|
484
497
|
rpi_methodology_fallback_reason?: string | null | undefined;
|
|
485
498
|
rpi_snapshot_computed_at?: string | null | undefined;
|
|
486
499
|
rpi_snapshot_covered_until?: string | null | undefined;
|
|
487
500
|
rpi_candidate_available?: boolean | undefined;
|
|
488
501
|
rpi_candidate_unavailable_reason?: string | null | undefined;
|
|
502
|
+
rpi_candidate_readiness_status?: string | null | undefined;
|
|
489
503
|
facets: import("../../@types/facets").Facet[];
|
|
490
504
|
total_results: number;
|
|
491
505
|
facets_completed?: boolean | undefined;
|
|
@@ -539,12 +553,14 @@ export declare function fastStateReducer(state: FastStateProps, action: FastStat
|
|
|
539
553
|
reformulation_source?: string | undefined;
|
|
540
554
|
request_url?: string | undefined;
|
|
541
555
|
rpi_methodology_assigned?: string | null | undefined;
|
|
556
|
+
rpi_methodology_preview_requested?: boolean | undefined;
|
|
542
557
|
rpi_methodology_effective?: string | null | undefined;
|
|
543
558
|
rpi_methodology_fallback_reason?: string | null | undefined;
|
|
544
559
|
rpi_snapshot_computed_at?: string | null | undefined;
|
|
545
560
|
rpi_snapshot_covered_until?: string | null | undefined;
|
|
546
561
|
rpi_candidate_available?: boolean | undefined;
|
|
547
562
|
rpi_candidate_unavailable_reason?: string | null | undefined;
|
|
563
|
+
rpi_candidate_readiness_status?: string | null | undefined;
|
|
548
564
|
auto_facets?: boolean | undefined;
|
|
549
565
|
isp_quick_view_mode?: number | undefined;
|
|
550
566
|
term: string;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
interface AnalyticsRpiSnapshot {
|
|
2
|
+
responseRpiMethodologyEffective?: string | null;
|
|
3
|
+
responseRpiSnapshotComputedAt?: string | null;
|
|
4
|
+
}
|
|
5
|
+
interface RankingRpiSnapshot {
|
|
6
|
+
rpi_methodology_effective?: string | null;
|
|
7
|
+
rpi_snapshot_computed_at?: string | null;
|
|
8
|
+
}
|
|
9
|
+
/** Keep delayed analytics tied to the candidate snapshot that produced the visible ranking. */
|
|
10
|
+
export declare function analyticsMatchesRankingSnapshot(analyticsPayload: AnalyticsRpiSnapshot, rankingResponse?: RankingRpiSnapshot | null): boolean;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const PRESENTATION_RPI_METHODOLOGIES = new Set([
|
|
2
|
+
'presentation10_v2',
|
|
3
|
+
'presentation10_v3',
|
|
4
|
+
]);
|
|
5
|
+
function isPresentationRpiMethodology(methodology) {
|
|
6
|
+
return Boolean(methodology && PRESENTATION_RPI_METHODOLOGIES.has(methodology));
|
|
7
|
+
}
|
|
8
|
+
/** Keep delayed analytics tied to the candidate snapshot that produced the visible ranking. */
|
|
9
|
+
export function analyticsMatchesRankingSnapshot(analyticsPayload, rankingResponse) {
|
|
10
|
+
const analyticsIsCandidate = isPresentationRpiMethodology(analyticsPayload.responseRpiMethodologyEffective);
|
|
11
|
+
const rankingIsCandidate = isPresentationRpiMethodology(rankingResponse === null || rankingResponse === void 0 ? void 0 : rankingResponse.rpi_methodology_effective);
|
|
12
|
+
if (!analyticsIsCandidate && !rankingIsCandidate)
|
|
13
|
+
return true;
|
|
14
|
+
const analyticsSnapshot = analyticsPayload.responseRpiSnapshotComputedAt;
|
|
15
|
+
const rankingSnapshot = rankingResponse === null || rankingResponse === void 0 ? void 0 : rankingResponse.rpi_snapshot_computed_at;
|
|
16
|
+
return analyticsIsCandidate
|
|
17
|
+
&& rankingIsCandidate
|
|
18
|
+
&& Boolean(analyticsSnapshot)
|
|
19
|
+
&& analyticsSnapshot === rankingSnapshot;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=rpiSnapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpiSnapshot.js","sourceRoot":"","sources":["../../src/utils/rpiSnapshot.ts"],"names":[],"mappings":"AAAA,MAAM,8BAA8B,GAAG,IAAI,GAAG,CAAC;IAC3C,mBAAmB;IACnB,mBAAmB;CACtB,CAAC,CAAC;AAYH,SAAS,4BAA4B,CAAC,WAA2B;IAC7D,OAAO,OAAO,CAAC,WAAW,IAAI,8BAA8B,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;AACnF,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,+BAA+B,CAC3C,gBAAsC,EACtC,eAA2C;IAE3C,MAAM,oBAAoB,GAAG,4BAA4B,CACrD,gBAAgB,CAAC,+BAA+B,CACnD,CAAC;IACF,MAAM,kBAAkB,GAAG,4BAA4B,CACnD,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,yBAAyB,CAC7C,CAAC;IACF,IAAI,CAAC,oBAAoB,IAAI,CAAC,kBAAkB;QAAE,OAAO,IAAI,CAAC;IAE9D,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,6BAA6B,CAAC;IACzE,MAAM,eAAe,GAAG,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,wBAAwB,CAAC;IAClE,OAAO,oBAAoB;WACpB,kBAAkB;WAClB,OAAO,CAAC,iBAAiB,CAAC;WAC1B,iBAAiB,KAAK,eAAe,CAAC;AACjD,CAAC","sourcesContent":["const PRESENTATION_RPI_METHODOLOGIES = new Set([\n 'presentation10_v2',\n 'presentation10_v3',\n]);\n\ninterface AnalyticsRpiSnapshot {\n responseRpiMethodologyEffective?: string | null;\n responseRpiSnapshotComputedAt?: string | null;\n}\n\ninterface RankingRpiSnapshot {\n rpi_methodology_effective?: string | null;\n rpi_snapshot_computed_at?: string | null;\n}\n\nfunction isPresentationRpiMethodology(methodology?: string | null): boolean {\n return Boolean(methodology && PRESENTATION_RPI_METHODOLOGIES.has(methodology));\n}\n\n/** Keep delayed analytics tied to the candidate snapshot that produced the visible ranking. */\nexport function analyticsMatchesRankingSnapshot(\n analyticsPayload: AnalyticsRpiSnapshot,\n rankingResponse?: RankingRpiSnapshot | null,\n): boolean {\n const analyticsIsCandidate = isPresentationRpiMethodology(\n analyticsPayload.responseRpiMethodologyEffective,\n );\n const rankingIsCandidate = isPresentationRpiMethodology(\n rankingResponse?.rpi_methodology_effective,\n );\n if (!analyticsIsCandidate && !rankingIsCandidate) return true;\n\n const analyticsSnapshot = analyticsPayload.responseRpiSnapshotComputedAt;\n const rankingSnapshot = rankingResponse?.rpi_snapshot_computed_at;\n return analyticsIsCandidate\n && rankingIsCandidate\n && Boolean(analyticsSnapshot)\n && analyticsSnapshot === rankingSnapshot;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fast-simon/dashboard-utilities",
|
|
3
|
-
"version": "1.0.167
|
|
3
|
+
"version": "1.0.167",
|
|
4
4
|
"scripts": {
|
|
5
5
|
"dev": "vite",
|
|
6
6
|
"preview": "vite preview",
|
|
7
|
-
"build": "tsc -p tsconfig-build.json",
|
|
7
|
+
"build": "tsc -p tsconfig-build.json && npm test",
|
|
8
|
+
"test": "node --test tests/rpiSnapshot.test.cjs",
|
|
8
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"
|
|
9
10
|
},
|
|
10
11
|
"main": "dist/index.js",
|