@fast-simon/dashboard-utilities 1.0.149-beta.3 → 1.0.149-beta.5
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/categories.d.ts +1 -0
- package/dist/@types/categories.js.map +1 -1
- package/dist/components/FastSimonApi/FastSimonApi.js +13 -3
- package/dist/components/FastSimonApi/FastSimonApi.js.map +1 -1
- package/dist/components/FastSimonApi/reducer.d.ts +5 -2
- package/dist/components/FastSimonApi/reducer.js +3 -0
- package/dist/components/FastSimonApi/reducer.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/liveSessionPreview.d.ts +66 -0
- package/dist/utils/liveSessionPreview.js +208 -0
- package/dist/utils/liveSessionPreview.js.map +1 -0
- package/package.json +1 -1
|
@@ -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 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 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 context?: ContextFilteringData // Context-based filtering data (market contexts)\n analytics?: {\n badges?: {\n winners?: Record<string, string> // Product ID -> tooltip message\n overexposed?: Record<string, string> // Product ID -> tooltip message\n new_arrivals?: string[]\n }\n key_hidden_winners?: string\n key_overexposed?: string\n }\n matching_sets?: Record<string, string> // Product ID -> set name\n group_strategy?: Record<string, string> // Product ID -> group name\n variety_strategy?: number[] // Product IDs affected by variety strategy\n query_understanding?: QueryUnderstanding\n reformulation_source?: string\n request_url?: string // Full URL with all params that was executed (for debugging)\n\n}\nexport type inventoryCallback = ({}: {\n action: \"products inventory\"\n payload: {productsInventory: productsInventoryResults[]}\n}) => void\nexport interface productsInventoryResults {\n id: string;\n totalInventory: number;\n}"]}
|
|
1
|
+
{"version":3,"file":"categories.js","sourceRoot":"","sources":["../../src/@types/categories.ts"],"names":[],"mappings":"","sourcesContent":["import {SortBy} from \"./sortBy\";\nimport {Narrow, ServerNarrow} from \"./narrow\";\nimport { ServerProduct} from \"./product\";\nimport {ServerFacet} from \"./facets\";\nimport {ContextFilteringData, QueryUnderstanding} from \"./results\";\n\n\nexport type AncestorCategory = [string, string, string] // category_id, category_name, category_url\nexport interface RelatedCategory {\n id: string\n l: string\n t: string\n u: string\n}\nexport type CategoryAncestor = [string, string, string]\nexport interface Category {\n d: string\n id: string\n l: string\n p_id: string\n t: string\n u: string\n parent_name?: string\n}\nexport interface FastCategory {\n d: string\n id: string\n l: string\n p_id: string\n t: string\n u: string\n parent_name?: string\n}\nexport interface smartCollectionsProps {\n storeID: number\n uuid: string\n siteKey?:string\n cdn: number\n categoryID: string,\n userToken: string,\n sessionStart: number,\n page?: number\n productsPerPage?: number\n sortBy?: SortBy\n narrowBy?: ServerNarrow[]\n facetRequired?: FacetRequired\n withAttributes?: boolean\n recent?: string\n rec?: boolean\n searchWithinSearch?: string,\n segments?: string[],\n hasShopifyMarkets?: boolean,\n disable_turbolinks?:boolean\n disable_strategies?:boolean\n disable_merchandising?:boolean\n disable_semantics?:boolean\n disable_merchandising_rules?:boolean\n disable_antonyms?:boolean\n custom_sort_settings?:{personalization_rank: number, creation_date: number, popularity: number, inventory: number}\n with_product_analytics?:boolean\n market_context?: string | null // Region code for market-specific filtering (e.g., \"US\", \"CA\", \"UK\")\n variation_id?: string | null // A/B test variation ID for reasoning/experiment tracking\n ps?: 'new' | 'returning' | null // Personalization segment for user segment coefficient preview (new/returning user)\n spv?: string | null // Session Product Views JSON for personalization preview (e.g., '{\"pid1\":ts,\"pid2\":ts}')\n 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 merch?: any\n bannerHTML?: string\n turbolink?:string\n hiddenProducts?:ServerProduct[]\n within_search_results_for?:string\n results_for?: string\n id_list?:number[]\n personalized_products?: number[] // Product IDs affected by RPI personalization\n context?: ContextFilteringData // Context-based filtering data (market contexts)\n analytics?: {\n badges?: {\n winners?: Record<string, string> // Product ID -> tooltip message\n overexposed?: Record<string, string> // Product ID -> tooltip message\n new_arrivals?: string[]\n }\n key_hidden_winners?: string\n key_overexposed?: string\n }\n matching_sets?: Record<string, string> // Product ID -> set name\n group_strategy?: Record<string, string> // Product ID -> group name\n variety_strategy?: number[] // Product IDs affected by variety strategy\n query_understanding?: QueryUnderstanding\n reformulation_source?: string\n request_url?: string // Full URL with all params that was executed (for debugging)\n\n}\nexport type inventoryCallback = ({}: {\n action: \"products inventory\"\n payload: {productsInventory: productsInventoryResults[]}\n}) => void\nexport interface productsInventoryResults {\n id: string;\n totalInventory: number;\n}"]}
|
|
@@ -425,6 +425,7 @@ const FastSimonApi = (_a) => {
|
|
|
425
425
|
matching_sets: analyticsResponse.matching_sets,
|
|
426
426
|
group_strategy: analyticsResponse.group_strategy,
|
|
427
427
|
variety_strategy: analyticsResponse.variety_strategy,
|
|
428
|
+
personalized_products: analyticsResponse.personalized_products,
|
|
428
429
|
productAnalyticsMap
|
|
429
430
|
};
|
|
430
431
|
pendingAnalyticsRef.current = payload;
|
|
@@ -440,7 +441,8 @@ const FastSimonApi = (_a) => {
|
|
|
440
441
|
const existingMatchingSets = shouldFetchAnalytics ? undefined : results === null || results === void 0 ? void 0 : results.matching_sets;
|
|
441
442
|
const existingGroupStrategy = shouldFetchAnalytics ? undefined : results === null || results === void 0 ? void 0 : results.group_strategy;
|
|
442
443
|
const existingVarietyStrategy = shouldFetchAnalytics ? undefined : results === null || results === void 0 ? void 0 : results.variety_strategy;
|
|
443
|
-
|
|
444
|
+
const existingPersonalizedProducts = shouldFetchAnalytics ? undefined : results === null || results === void 0 ? void 0 : results.personalized_products;
|
|
445
|
+
response = getFormatedData(response, existingAnalytics, existingMatchingSets, existingGroupStrategy, existingVarietyStrategy, existingPersonalizedProducts);
|
|
444
446
|
// Handle turbolink responses - skip additional API calls to prevent errors
|
|
445
447
|
if (response.turbolink && response.totalResults === 0) {
|
|
446
448
|
mergeResults(response, isInfiniteScroll);
|
|
@@ -584,6 +586,7 @@ const FastSimonApi = (_a) => {
|
|
|
584
586
|
matching_sets: analyticsResponse.matching_sets,
|
|
585
587
|
group_strategy: analyticsResponse.group_strategy,
|
|
586
588
|
variety_strategy: analyticsResponse.variety_strategy,
|
|
589
|
+
personalized_products: analyticsResponse.personalized_products,
|
|
587
590
|
productAnalyticsMap
|
|
588
591
|
};
|
|
589
592
|
pendingAnalyticsRef.current = payload;
|
|
@@ -599,7 +602,8 @@ const FastSimonApi = (_a) => {
|
|
|
599
602
|
const existingMatchingSets = shouldFetchAnalytics ? undefined : results === null || results === void 0 ? void 0 : results.matching_sets;
|
|
600
603
|
const existingGroupStrategy = shouldFetchAnalytics ? undefined : results === null || results === void 0 ? void 0 : results.group_strategy;
|
|
601
604
|
const existingVarietyStrategy = shouldFetchAnalytics ? undefined : results === null || results === void 0 ? void 0 : results.variety_strategy;
|
|
602
|
-
|
|
605
|
+
const existingPersonalizedProducts = shouldFetchAnalytics ? undefined : results === null || results === void 0 ? void 0 : results.personalized_products;
|
|
606
|
+
response = getFormatedData(response, existingAnalytics, existingMatchingSets, existingGroupStrategy, existingVarietyStrategy, existingPersonalizedProducts);
|
|
603
607
|
// Show products immediately
|
|
604
608
|
mergeResults(response, isInfiniteScroll);
|
|
605
609
|
setIsLoading({ products: false, filters: true });
|
|
@@ -656,7 +660,7 @@ const FastSimonApi = (_a) => {
|
|
|
656
660
|
setCategories(data);
|
|
657
661
|
return data;
|
|
658
662
|
}), [categories]);
|
|
659
|
-
const getFormatedData = (response, existingAnalytics, existingMatchingSets, existingGroupStrategy, existingVarietyStrategy) => {
|
|
663
|
+
const getFormatedData = (response, existingAnalytics, existingMatchingSets, existingGroupStrategy, existingVarietyStrategy, existingPersonalizedProducts) => {
|
|
660
664
|
const results = response;
|
|
661
665
|
results.products = response.items;
|
|
662
666
|
delete results.items;
|
|
@@ -710,6 +714,12 @@ const FastSimonApi = (_a) => {
|
|
|
710
714
|
else if (existingVarietyStrategy) {
|
|
711
715
|
results.variety_strategy = existingVarietyStrategy;
|
|
712
716
|
}
|
|
717
|
+
if (response.personalized_products) {
|
|
718
|
+
results.personalized_products = response.personalized_products;
|
|
719
|
+
}
|
|
720
|
+
else if (existingPersonalizedProducts) {
|
|
721
|
+
results.personalized_products = existingPersonalizedProducts;
|
|
722
|
+
}
|
|
713
723
|
return results;
|
|
714
724
|
};
|
|
715
725
|
// Memoize state context to prevent unnecessary re-renders
|
|
@@ -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 {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}\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\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 ...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 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 } | 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 }) {\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 (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:state.custom_sort_settings,\n ...getDisableFlags(state.flag),\n };\n\n fetchResults(fetchParams, isInfiniteScroll,isAutocomplete?isAutocomplete:false);\n }\n function setCustomSort(customSortSettings: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:state.custom_sort_settings,\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:state.custom_sort_settings,\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:state.custom_sort_settings,\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:state.custom_sort_settings,\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:state.custom_sort_settings,\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:state.custom_sort_settings,\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:state.custom_sort_settings,\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 // 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: state.custom_sort_settings,\n ...getDisableFlags(state.flag ?? []),\n variation_id: state.variation_id,\n force_and: state.force_and,\n };\n fetchResults(fetchParams, isInfiniteScroll, state.isAutocomplete);\n }, [state.refetchTrigger]);\n\n const onSearch = (props: Omit<fullTextSearchProps, \"callback\">, isInfiniteScroll: boolean) => {\n setIsLoading({products: true, filters: true});\n\n // Clear previous comparison data when starting new search\n setComparisonData(null);\n\n const currentQuery = props.term || '';\n const currentForceAnalytics = forceProductAnalytics || getShowSalesAnalyticsSetting();\n const shouldFetchAnalytics = currentForceAnalytics || (isAnalyticsEnabled && (currentQuery !== lastAnalyticsQuery || lastAnalyticsMode !== 'search'));\n\n // Check if hybrid search is enabled - we'll need to make a comparison call\n const isHybridEnabled = getLSVectorSearchOn();\n\n const personalizationSegment = getPersonalizationSegment(userSegmentPreviewRef.current);\n const personalizationParams = buildPersonalizationParams(\n personalizationPreviewRef.current ?? {enabled: false, spvJson: '', types: ['gender']}\n );\n\n // Increment staleness counter and clear pending analytics\n const requestId = ++searchRequestCounterRef.current;\n pendingAnalyticsRef.current = null;\n\n const commonRequestParams = {\n ...props,\n withAttributes: promoTiles || withProductAttributes,\n market_context: marketContext,\n variation_id: state.variation_id,\n force_and: state.force_and,\n ps: personalizationSegment,\n spv: personalizationParams.spv,\n personalization: personalizationParams.personalization,\n session_token: state.session_token\n };\n\n // Fire analytics request in parallel (fire-and-forget) — only if analytics needed\n if (shouldFetchAnalytics) {\n FullTextSearch.getReasoningFullTextSearch({\n ...commonRequestParams,\n with_product_analytics: true,\n facetRequired: 0,\n }).then(analyticsResponse => {\n if (searchRequestCounterRef.current !== requestId) return; // stale\n\n if (analyticsResponse.analytics?.badges) {\n setAnalyticsFetched(true);\n setLastAnalyticsQuery(currentQuery);\n setLastAnalyticsMode('search');\n }\n\n const productAnalyticsMap: Record<string, ProductAnalytics> = {};\n const items = (analyticsResponse as any).items || analyticsResponse.products || [];\n for (const product of items) {\n if (product.analytics) {\n productAnalyticsMap[String(product.id)] = product.analytics;\n }\n }\n\n const payload = {\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 };\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 // Don't preserve stale analytics when fetching fresh ones\n const existingAnalytics = shouldFetchAnalytics ? undefined : (results as any)?.analytics;\n const existingMatchingSets = shouldFetchAnalytics ? undefined : (results as any)?.matching_sets;\n const existingGroupStrategy = shouldFetchAnalytics ? undefined : (results as any)?.group_strategy;\n const existingVarietyStrategy = shouldFetchAnalytics ? undefined : (results as any)?.variety_strategy;\n response=getFormatedData(response, existingAnalytics, existingMatchingSets, existingGroupStrategy, existingVarietyStrategy);\n\n // Handle turbolink responses - skip additional API calls to prevent errors\n if (response.turbolink && response.totalResults === 0) {\n mergeResults(response, isInfiniteScroll);\n\n if (!customTitleChange) {\n document.title = `Search Result for ${query}`;\n } else {\n customTitleChange(results);\n }\n\n setIsLoading({filters: false, products: false});\n return;\n }\n\n // Show products immediately\n mergeResults(response, isInfiniteScroll);\n setIsLoading({products: false, filters: true});\n\n // If analytics arrived before fast response, re-apply to new results\n if (pendingAnalyticsRef.current && searchRequestCounterRef.current === requestId) {\n dispatchMergeAnalytics(pendingAnalyticsRef.current);\n }\n\n // Fire IDs + facets in parallel (previously sequential)\n const listIdRequestProps = { ...props };\n listIdRequestProps.searchWithinSearch=undefined;\n listIdRequestProps.productsPerPage=1000000;\n listIdRequestProps.page=1;\n listIdRequestProps.market_context = marketContext;\n listIdRequestProps.variation_id = state.variation_id;\n listIdRequestProps.force_and = state.force_and;\n listIdRequestProps.ps = personalizationSegment;\n listIdRequestProps.spv = personalizationParams.spv;\n listIdRequestProps.personalization = personalizationParams.personalization;\n\n const facetsRequestProps = { ...props };\n facetsRequestProps.facetRequired=2;\n facetsRequestProps.searchWithinSearch=props.searchWithinSearch;\n facetsRequestProps.productsPerPage=props.productsPerPage;\n facetsRequestProps.page=props.page;\n facetsRequestProps.market_context = marketContext;\n facetsRequestProps.variation_id = state.variation_id;\n facetsRequestProps.force_and = state.force_and;\n facetsRequestProps.ps = personalizationSegment;\n facetsRequestProps.spv = personalizationParams.spv;\n facetsRequestProps.personalization = personalizationParams.personalization;\n\n const [listIdRes, facetsRes] = await Promise.all([\n FullTextSearch.getReasoningFullTextSearchProductsIds(listIdRequestProps),\n FullTextSearch.getReasoningFullTextSearch(facetsRequestProps)\n ]);\n\n // Merge IDs and complete facets into existing results\n mergeResultsKeepProduct({id_list: listIdRes.id_list, facets: facetsRes.facets} as any);\n\n if (!customTitleChange) {\n document.title = `Search Result for ${query}`;\n } else {\n customTitleChange(results);\n }\n\n setIsLoading({filters: false, products: false});\n\n // Compare Mode: Make comparison call using IDs endpoint if hybrid search is enabled\n console.log(\"[Compare Mode] isHybridEnabled:\", isHybridEnabled, \"hasIdList:\", !!listIdRes.id_list);\n if (isHybridEnabled && listIdRes.id_list && listIdRes.id_list.length > 0) {\n setIsComparing(true);\n console.log(\"[Compare Mode] Making comparison IDs call...\");\n try {\n // Get all IDs WITHOUT hybrid_search_settings\n const comparisonResponse = await FullTextSearch.getComparisonProductIds({\n ...props,\n market_context: marketContext,\n variation_id: state.variation_id,\n force_and: state.force_and,\n ps: personalizationSegment,\n spv: personalizationParams.spv,\n personalization: personalizationParams.personalization\n });\n\n const hybridOffIds = (comparisonResponse.id_list || []).map(id => id.toString());\n const hybridOnIds = (listIdRes.id_list || []).map(id => id.toString());\n console.log(\"[Compare Mode] Hybrid ON IDs count:\", hybridOnIds.length);\n console.log(\"[Compare Mode] Hybrid OFF IDs count:\", hybridOffIds.length);\n\n if (hybridOffIds.length > 0) {\n const diff = computeComparisonFromIds(hybridOnIds, hybridOffIds);\n console.log(\"[Compare Mode] Diff computed - improved:\", diff.totalImproved, \"declined:\", diff.totalDeclined, \"new:\", diff.totalNew);\n setComparisonData(diff);\n }\n } catch (error) {\n console.error(\"[Compare Mode] Failed to fetch comparison IDs:\", error);\n setComparisonData(null);\n } finally {\n setIsComparing(false);\n }\n }\n });\n }\n const onAutocompleteSearch = (props: Omit<autocompleteProps, \"callback\">) => {\n setIsLoading({products: true, filters: true});\n const personalizationSegment = getPersonalizationSegment(userSegmentPreviewRef.current);\n const personalizationParams = buildPersonalizationParams(\n personalizationPreviewRef.current ?? {enabled: false, spvJson: '', types: ['gender']}\n );\n\n Autocomplete.getAutocompleteReasoning({\n ...props,\n withAttributes: promoTiles || withProductAttributes,\n market_context: marketContext,\n variation_id: state.variation_id,\n force_and: state.force_and,\n ps: personalizationSegment,\n spv: personalizationParams.spv,\n personalization: personalizationParams.personalization\n }).then(async(response) => {\n response=getFormatedData(response);\n\n mergeResults(response, false);\n\n if (!customTitleChange) {\n document.title = `Autocomplete Result for ${query}`;\n } else {\n customTitleChange(results);\n }\n\n if (!response) {\n setIsLoading({\n filters: true, products: false\n });\n } else {\n setIsLoading({\n filters: false, products: false\n });\n }\n });\n }\n\n const onCollection = (props: Omit<smartCollectionsProps, \"callback\">, isInfiniteScroll: boolean) => {\n setIsLoading({products: true, filters: true});\n\n const currentCollection = props.categoryID || '';\n const currentForceAnalytics = forceProductAnalytics || getShowSalesAnalyticsSetting();\n const shouldFetchAnalytics = currentForceAnalytics || (isAnalyticsEnabled && (currentCollection !== lastAnalyticsCollection || lastAnalyticsMode !== 'collection'));\n\n const personalizationSegment = getPersonalizationSegment(userSegmentPreviewRef.current);\n const personalizationParams = buildPersonalizationParams(\n personalizationPreviewRef.current ?? {enabled: false, spvJson: '', types: ['gender']}\n );\n\n // Increment staleness counter and clear pending analytics\n const requestId = ++searchRequestCounterRef.current;\n pendingAnalyticsRef.current = null;\n\n const commonRequestParams = {\n ...props,\n withAttributes: promoTiles || withProductAttributes,\n market_context: marketContext,\n variation_id: state.variation_id,\n ps: personalizationSegment,\n spv: personalizationParams.spv,\n 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 = {\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 };\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 // Don't preserve stale analytics when fetching fresh ones\n const existingAnalytics = shouldFetchAnalytics ? undefined : (results as any)?.analytics;\n const existingMatchingSets = shouldFetchAnalytics ? undefined : (results as any)?.matching_sets;\n const existingGroupStrategy = shouldFetchAnalytics ? undefined : (results as any)?.group_strategy;\n const existingVarietyStrategy = shouldFetchAnalytics ? undefined : (results as any)?.variety_strategy;\n response=getFormatedData(response, existingAnalytics, existingMatchingSets, existingGroupStrategy, existingVarietyStrategy);\n\n // Show products immediately\n mergeResults(response, isInfiniteScroll);\n setIsLoading({products: false, filters: true});\n\n // If analytics arrived before fast response, re-apply to new results\n if (pendingAnalyticsRef.current && searchRequestCounterRef.current === requestId) {\n dispatchMergeAnalytics(pendingAnalyticsRef.current);\n }\n\n // Fire IDs + facets in parallel (previously sequential)\n const listIdRequestProps = { ...props };\n listIdRequestProps.searchWithinSearch=undefined;\n listIdRequestProps.productsPerPage=1000000;\n listIdRequestProps.page=1;\n listIdRequestProps.market_context = marketContext;\n listIdRequestProps.variation_id = state.variation_id;\n listIdRequestProps.force_and = state.force_and;\n listIdRequestProps.ps = personalizationSegment;\n listIdRequestProps.spv = personalizationParams.spv;\n listIdRequestProps.personalization = personalizationParams.personalization;\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 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 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 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.comparisonData, state.isComparing]);\n\n // Memoize theme to prevent unnecessary object creation\n const mergedTheme = useMemo(() => ({...mainTheme, ...theme}), [theme]);\n\n // @ts-ignore\n return (\n <FastStateFunctions.Provider\n value={{\n setQuery,\n setSort: setSortBy,\n setNarrow,\n setPage,\n getAllCategories,\n setCollection: setCollectionID,\n setState,\n setSearchWithinSearch,\n setSegments,\n setFlag,\n setCustomSort,\n setIsAutocomplete,\n setVariationId,\n setForceAnd,\n setUserSegmentPreview,\n setPersonalizationPreview,\n updateSettingsAndRefetch\n }}>\n <FastState.Provider value={stateContextValue}>\n <ThemeProvider theme={mergedTheme}>\n {children}\n </ThemeProvider>\n </FastState.Provider>\n </FastStateFunctions.Provider>\n )\n};\n\n// Memoize component to prevent unnecessary re-renders when parent updates\nexport default React.memo(FastSimonApi);"]}
|
|
1
|
+
{"version":3,"file":"FastSimonApi.js","sourceRoot":"","sources":["../../../src/components/FastSimonApi/FastSimonApi.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, {useEffect, useReducer, useRef, useState, useMemo, useCallback} from \"react\";\nimport {ComparisonData, ProductRankChange, CustomSortSettings, FastState, FastStateFunctions, IsLoading, SetStateProps} from \"./context\";\nimport {ThemeProvider} from \"react-jss\";\nimport {fastStateReducer} from \"./reducer\";\nimport {newObject} from \"../common\";\n\nimport {SortBy} from \"../../@types/sortBy\";\nimport {fullTextSearchProps, FullTextServerResponseAll} from \"../../@types/results\";\nimport {getShowSalesAnalyticsSetting} from \"../../utils/getSalesAnalyticsSettings\";\nimport {getLSVectorSearchOn} from \"../../utils/getLSVectorSearch\";\nimport {getPersonalizationSegment, UserSegmentPreview} from \"../../utils/userSegmentPreview\";\nimport {buildPersonalizationParams, PersonalizationPreviewSettings} from \"../../utils/personalizationPreview\";\n\nimport {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}\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\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 ...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 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 } | 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 personalized_products?: number[];\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 (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:state.custom_sort_settings,\n ...getDisableFlags(state.flag),\n };\n\n fetchResults(fetchParams, isInfiniteScroll,isAutocomplete?isAutocomplete:false);\n }\n function setCustomSort(customSortSettings: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:state.custom_sort_settings,\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:state.custom_sort_settings,\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:state.custom_sort_settings,\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:state.custom_sort_settings,\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:state.custom_sort_settings,\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:state.custom_sort_settings,\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:state.custom_sort_settings,\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 // 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: state.custom_sort_settings,\n ...getDisableFlags(state.flag ?? []),\n variation_id: state.variation_id,\n force_and: state.force_and,\n };\n fetchResults(fetchParams, isInfiniteScroll, state.isAutocomplete);\n }, [state.refetchTrigger]);\n\n const onSearch = (props: Omit<fullTextSearchProps, \"callback\">, isInfiniteScroll: boolean) => {\n setIsLoading({products: true, filters: true});\n\n // Clear previous comparison data when starting new search\n setComparisonData(null);\n\n const currentQuery = props.term || '';\n const currentForceAnalytics = forceProductAnalytics || getShowSalesAnalyticsSetting();\n const shouldFetchAnalytics = currentForceAnalytics || (isAnalyticsEnabled && (currentQuery !== lastAnalyticsQuery || lastAnalyticsMode !== 'search'));\n\n // Check if hybrid search is enabled - we'll need to make a comparison call\n const isHybridEnabled = getLSVectorSearchOn();\n\n const personalizationSegment = getPersonalizationSegment(userSegmentPreviewRef.current);\n const personalizationParams = buildPersonalizationParams(\n personalizationPreviewRef.current ?? {enabled: false, spvJson: '', types: ['gender']}\n );\n\n // Increment staleness counter and clear pending analytics\n const requestId = ++searchRequestCounterRef.current;\n pendingAnalyticsRef.current = null;\n\n const commonRequestParams = {\n ...props,\n withAttributes: promoTiles || withProductAttributes,\n market_context: marketContext,\n variation_id: state.variation_id,\n force_and: state.force_and,\n ps: personalizationSegment,\n spv: personalizationParams.spv,\n personalization: personalizationParams.personalization,\n session_token: state.session_token\n };\n\n // Fire analytics request in parallel (fire-and-forget) — only if analytics needed\n if (shouldFetchAnalytics) {\n FullTextSearch.getReasoningFullTextSearch({\n ...commonRequestParams,\n with_product_analytics: true,\n facetRequired: 0,\n }).then(analyticsResponse => {\n if (searchRequestCounterRef.current !== requestId) return; // stale\n\n if (analyticsResponse.analytics?.badges) {\n setAnalyticsFetched(true);\n setLastAnalyticsQuery(currentQuery);\n setLastAnalyticsMode('search');\n }\n\n const productAnalyticsMap: Record<string, ProductAnalytics> = {};\n const items = (analyticsResponse as any).items || analyticsResponse.products || [];\n for (const product of items) {\n if (product.analytics) {\n productAnalyticsMap[String(product.id)] = product.analytics;\n }\n }\n\n const payload = {\n analytics: analyticsResponse.analytics,\n matching_sets: analyticsResponse.matching_sets,\n group_strategy: analyticsResponse.group_strategy,\n variety_strategy: analyticsResponse.variety_strategy,\n personalized_products: (analyticsResponse as any).personalized_products,\n productAnalyticsMap\n };\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 // 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 const existingPersonalizedProducts = shouldFetchAnalytics ? undefined : (results as any)?.personalized_products;\n response=getFormatedData(response, existingAnalytics, existingMatchingSets, existingGroupStrategy, existingVarietyStrategy, existingPersonalizedProducts);\n\n // Handle turbolink responses - skip additional API calls to prevent errors\n if (response.turbolink && response.totalResults === 0) {\n mergeResults(response, isInfiniteScroll);\n\n if (!customTitleChange) {\n document.title = `Search Result for ${query}`;\n } else {\n customTitleChange(results);\n }\n\n setIsLoading({filters: false, products: false});\n return;\n }\n\n // Show products immediately\n mergeResults(response, isInfiniteScroll);\n setIsLoading({products: false, filters: true});\n\n // If analytics arrived before fast response, re-apply to new results\n if (pendingAnalyticsRef.current && searchRequestCounterRef.current === requestId) {\n dispatchMergeAnalytics(pendingAnalyticsRef.current);\n }\n\n // Fire IDs + facets in parallel (previously sequential)\n const listIdRequestProps = { ...props };\n listIdRequestProps.searchWithinSearch=undefined;\n listIdRequestProps.productsPerPage=1000000;\n listIdRequestProps.page=1;\n listIdRequestProps.market_context = marketContext;\n listIdRequestProps.variation_id = state.variation_id;\n listIdRequestProps.force_and = state.force_and;\n listIdRequestProps.ps = personalizationSegment;\n listIdRequestProps.spv = personalizationParams.spv;\n listIdRequestProps.personalization = personalizationParams.personalization;\n\n const facetsRequestProps = { ...props };\n facetsRequestProps.facetRequired=2;\n facetsRequestProps.searchWithinSearch=props.searchWithinSearch;\n facetsRequestProps.productsPerPage=props.productsPerPage;\n facetsRequestProps.page=props.page;\n facetsRequestProps.market_context = marketContext;\n facetsRequestProps.variation_id = state.variation_id;\n facetsRequestProps.force_and = state.force_and;\n facetsRequestProps.ps = personalizationSegment;\n facetsRequestProps.spv = personalizationParams.spv;\n facetsRequestProps.personalization = personalizationParams.personalization;\n\n const [listIdRes, facetsRes] = await Promise.all([\n FullTextSearch.getReasoningFullTextSearchProductsIds(listIdRequestProps),\n FullTextSearch.getReasoningFullTextSearch(facetsRequestProps)\n ]);\n\n // Merge IDs and complete facets into existing results\n mergeResultsKeepProduct({id_list: listIdRes.id_list, facets: facetsRes.facets} as any);\n\n if (!customTitleChange) {\n document.title = `Search Result for ${query}`;\n } else {\n customTitleChange(results);\n }\n\n setIsLoading({filters: false, products: false});\n\n // Compare Mode: Make comparison call using IDs endpoint if hybrid search is enabled\n console.log(\"[Compare Mode] isHybridEnabled:\", isHybridEnabled, \"hasIdList:\", !!listIdRes.id_list);\n if (isHybridEnabled && listIdRes.id_list && listIdRes.id_list.length > 0) {\n setIsComparing(true);\n console.log(\"[Compare Mode] Making comparison IDs call...\");\n try {\n // Get all IDs WITHOUT hybrid_search_settings\n const comparisonResponse = await FullTextSearch.getComparisonProductIds({\n ...props,\n market_context: marketContext,\n variation_id: state.variation_id,\n force_and: state.force_and,\n ps: personalizationSegment,\n spv: personalizationParams.spv,\n personalization: personalizationParams.personalization\n });\n\n const hybridOffIds = (comparisonResponse.id_list || []).map(id => id.toString());\n const hybridOnIds = (listIdRes.id_list || []).map(id => id.toString());\n console.log(\"[Compare Mode] Hybrid ON IDs count:\", hybridOnIds.length);\n console.log(\"[Compare Mode] Hybrid OFF IDs count:\", hybridOffIds.length);\n\n if (hybridOffIds.length > 0) {\n const diff = computeComparisonFromIds(hybridOnIds, hybridOffIds);\n console.log(\"[Compare Mode] Diff computed - improved:\", diff.totalImproved, \"declined:\", diff.totalDeclined, \"new:\", diff.totalNew);\n setComparisonData(diff);\n }\n } catch (error) {\n console.error(\"[Compare Mode] Failed to fetch comparison IDs:\", error);\n setComparisonData(null);\n } finally {\n setIsComparing(false);\n }\n }\n });\n }\n const onAutocompleteSearch = (props: Omit<autocompleteProps, \"callback\">) => {\n setIsLoading({products: true, filters: true});\n const personalizationSegment = getPersonalizationSegment(userSegmentPreviewRef.current);\n const personalizationParams = buildPersonalizationParams(\n personalizationPreviewRef.current ?? {enabled: false, spvJson: '', types: ['gender']}\n );\n\n Autocomplete.getAutocompleteReasoning({\n ...props,\n withAttributes: promoTiles || withProductAttributes,\n market_context: marketContext,\n variation_id: state.variation_id,\n force_and: state.force_and,\n ps: personalizationSegment,\n spv: personalizationParams.spv,\n personalization: personalizationParams.personalization\n }).then(async(response) => {\n response=getFormatedData(response);\n\n mergeResults(response, false);\n\n if (!customTitleChange) {\n document.title = `Autocomplete Result for ${query}`;\n } else {\n customTitleChange(results);\n }\n\n if (!response) {\n setIsLoading({\n filters: true, products: false\n });\n } else {\n setIsLoading({\n filters: false, products: false\n });\n }\n });\n }\n\n const onCollection = (props: Omit<smartCollectionsProps, \"callback\">, isInfiniteScroll: boolean) => {\n setIsLoading({products: true, filters: true});\n\n const currentCollection = props.categoryID || '';\n const currentForceAnalytics = forceProductAnalytics || getShowSalesAnalyticsSetting();\n const shouldFetchAnalytics = currentForceAnalytics || (isAnalyticsEnabled && (currentCollection !== lastAnalyticsCollection || lastAnalyticsMode !== 'collection'));\n\n const personalizationSegment = getPersonalizationSegment(userSegmentPreviewRef.current);\n const personalizationParams = buildPersonalizationParams(\n personalizationPreviewRef.current ?? {enabled: false, spvJson: '', types: ['gender']}\n );\n\n // Increment staleness counter and clear pending analytics\n const requestId = ++searchRequestCounterRef.current;\n pendingAnalyticsRef.current = null;\n\n const commonRequestParams = {\n ...props,\n withAttributes: promoTiles || withProductAttributes,\n market_context: marketContext,\n variation_id: state.variation_id,\n ps: personalizationSegment,\n spv: personalizationParams.spv,\n 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 = {\n analytics: analyticsResponse.analytics,\n matching_sets: analyticsResponse.matching_sets,\n group_strategy: analyticsResponse.group_strategy,\n variety_strategy: analyticsResponse.variety_strategy,\n personalized_products: (analyticsResponse as any).personalized_products,\n productAnalyticsMap\n };\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 // 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 const existingPersonalizedProducts = shouldFetchAnalytics ? undefined : (results as any)?.personalized_products;\n response=getFormatedData(response, existingAnalytics, existingMatchingSets, existingGroupStrategy, existingVarietyStrategy, existingPersonalizedProducts);\n\n // Show products immediately\n mergeResults(response, isInfiniteScroll);\n setIsLoading({products: false, filters: true});\n\n // If analytics arrived before fast response, re-apply to new results\n if (pendingAnalyticsRef.current && searchRequestCounterRef.current === requestId) {\n dispatchMergeAnalytics(pendingAnalyticsRef.current);\n }\n\n // Fire IDs + facets in parallel (previously sequential)\n const listIdRequestProps = { ...props };\n listIdRequestProps.searchWithinSearch=undefined;\n listIdRequestProps.productsPerPage=1000000;\n listIdRequestProps.page=1;\n listIdRequestProps.market_context = marketContext;\n listIdRequestProps.variation_id = state.variation_id;\n listIdRequestProps.force_and = state.force_and;\n listIdRequestProps.ps = personalizationSegment;\n listIdRequestProps.spv = personalizationParams.spv;\n listIdRequestProps.personalization = personalizationParams.personalization;\n\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 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, existingPersonalizedProducts?: 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 if (response.personalized_products) {\n results.personalized_products = response.personalized_products;\n } else if (existingPersonalizedProducts) {\n results.personalized_products = existingPersonalizedProducts;\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 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.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);"]}
|
|
@@ -105,6 +105,7 @@ type FastStateAction = {
|
|
|
105
105
|
group_strategy?: Record<string, string>;
|
|
106
106
|
variety_strategy?: number[];
|
|
107
107
|
productAnalyticsMap?: Record<string, ProductAnalytics>;
|
|
108
|
+
personalized_products?: number[];
|
|
108
109
|
};
|
|
109
110
|
} | {
|
|
110
111
|
type: 'updateSettingsAndRefetch';
|
|
@@ -180,6 +181,7 @@ export declare function fastStateReducer(state: FastStateProps, action: FastStat
|
|
|
180
181
|
within_search_results_for?: string | undefined;
|
|
181
182
|
results_for?: string | undefined;
|
|
182
183
|
id_list?: number[] | undefined;
|
|
184
|
+
personalized_products?: number[] | undefined;
|
|
183
185
|
context?: import("../../@types/results").ContextFilteringData | undefined;
|
|
184
186
|
analytics?: {
|
|
185
187
|
badges?: {
|
|
@@ -265,6 +267,7 @@ export declare function fastStateReducer(state: FastStateProps, action: FastStat
|
|
|
265
267
|
within_search_results_for?: string | undefined;
|
|
266
268
|
results_for?: string | undefined;
|
|
267
269
|
id_list?: number[] | undefined;
|
|
270
|
+
personalized_products?: number[] | undefined;
|
|
268
271
|
context?: import("../../@types/results").ContextFilteringData | undefined;
|
|
269
272
|
analytics?: {
|
|
270
273
|
badges?: {
|
|
@@ -286,7 +289,6 @@ export declare function fastStateReducer(state: FastStateProps, action: FastStat
|
|
|
286
289
|
cms_number_found?: number | undefined;
|
|
287
290
|
banner_html: string;
|
|
288
291
|
banner_html_mobile: string;
|
|
289
|
-
personalized_products?: number[] | undefined;
|
|
290
292
|
session_products?: number[] | undefined;
|
|
291
293
|
related_results?: boolean | undefined;
|
|
292
294
|
ancestor_categories?: import("../../@types/categories").AncestorCategory[] | undefined;
|
|
@@ -373,6 +375,7 @@ export declare function fastStateReducer(state: FastStateProps, action: FastStat
|
|
|
373
375
|
within_search_results_for?: string | undefined;
|
|
374
376
|
results_for?: string | undefined;
|
|
375
377
|
id_list?: number[] | undefined;
|
|
378
|
+
personalized_products?: number[] | undefined;
|
|
376
379
|
context?: import("../../@types/results").ContextFilteringData | undefined;
|
|
377
380
|
analytics?: {
|
|
378
381
|
badges?: {
|
|
@@ -461,6 +464,7 @@ export declare function fastStateReducer(state: FastStateProps, action: FastStat
|
|
|
461
464
|
within_search_results_for?: string | undefined;
|
|
462
465
|
results_for?: string | undefined;
|
|
463
466
|
id_list?: number[] | undefined;
|
|
467
|
+
personalized_products: any[];
|
|
464
468
|
context?: import("../../@types/results").ContextFilteringData | undefined;
|
|
465
469
|
analytics?: {
|
|
466
470
|
badges?: {
|
|
@@ -479,7 +483,6 @@ export declare function fastStateReducer(state: FastStateProps, action: FastStat
|
|
|
479
483
|
request_url?: string | undefined;
|
|
480
484
|
auto_facets?: boolean | undefined;
|
|
481
485
|
isp_quick_view_mode?: number | undefined;
|
|
482
|
-
personalized_products: any[];
|
|
483
486
|
term: string;
|
|
484
487
|
uuid: string;
|
|
485
488
|
};
|
|
@@ -102,6 +102,9 @@ export function fastStateReducer(state, action) {
|
|
|
102
102
|
if (action.payload.variety_strategy) {
|
|
103
103
|
updatedResults.variety_strategy = action.payload.variety_strategy;
|
|
104
104
|
}
|
|
105
|
+
if (action.payload.personalized_products) {
|
|
106
|
+
updatedResults.personalized_products = action.payload.personalized_products;
|
|
107
|
+
}
|
|
105
108
|
if (action.payload.productAnalyticsMap) {
|
|
106
109
|
updatedResults.products = updatedResults.products.map(product => {
|
|
107
110
|
var _a;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reducer.js","sourceRoot":"","sources":["../../../src/components/FastSimonApi/reducer.ts"],"names":[],"mappings":"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","sourcesContent":["import {ComparisonData, CustomSortSettings, FastStateProps, IsLoading} from \"./context\";\nimport {PersonalizationPreviewSettings} from \"../../utils/personalizationPreview\";\nimport {AppType} from \"./FastSimonApi\";\nimport {SortBy} from \"../../@types/sortBy\";\nimport {FullTextServerResponseAll} from \"../../@types/results\";\nimport {smartCollectionsResults} from \"../../@types/categories\";\nimport {Narrow, ServerNarrow} from \"../../@types/narrow\";\nimport {Product, ProductAnalytics} from \"../../@types/product\";\n\nimport {Widget} from \"../../@types/widget\";\nimport {AutocompleteReasoningResponse, AutocompleteResults} from \"../../@types/autocomplete\";\n\ntype FastStateAction =\n | { type: 'setReady', payload: boolean }\n | { type: 'setType', payload: AppType }\n | { type: 'setPage', payload: number }\n | { type: 'setQuery', payload: string }\n | { type: 'setSortBy', payload: SortBy }\n | { type: 'setIsLoading', payload: IsLoading }\n | { type: 'setCollectionID', payload: string }\n | { type: 'setNarrow', payload: ServerNarrow[] | undefined }\n | { type: 'setResults', payload: FullTextServerResponseAll | smartCollectionsResults | AutocompleteReasoningResponse | undefined }\n | { type: 'mergeResults', payload: { results: FullTextServerResponseAll | smartCollectionsResults | AutocompleteReasoningResponse, infiniteScroll: boolean } }\n | { type: 'mergeFacetsWithResults', payload:Narrow[] }\n | { type: 'mergeResultsKeepProduct', payload: { results: FullTextServerResponseAll | smartCollectionsResults } }\n | { type: 'setState', payload: Partial<FastStateProps> }\n | { type: 'setRecommendations', payload: { id: string, widget: Widget } }\n | { type: 'setSingleProducts', payload: Product[] }\n | { type: 'setIsAutocomplete', payload: boolean }\n | { type: 'setAutocomplete', payload: AutocompleteResults }\n | { type: 'setSearchWithinSearch', payload: string }\n | { type: 'setSegments', payload: string[] }\n | { type: 'setFlag', payload: string[] }\n | { type: 'setCustomSort',payload:CustomSortSettings}\n | { type: 'setVariationId', payload: string | null }\n | { type: 'setForceAnd', payload: boolean }\n | { type: 'setUserSegmentPreview', payload: 'none' | 'new' | 'returning' }\n | { type: 'setComparisonData', payload: ComparisonData | null }\n | { type: 'setIsComparing', payload: boolean }\n | { type: 'setPersonalizationPreview', payload: PersonalizationPreviewSettings | null }\n | { type: 'mergeAnalyticsData', payload: {\n analytics?: FullTextServerResponseAll['analytics'],\n matching_sets?: Record<string, string>,\n group_strategy?: Record<string, string>,\n variety_strategy?: number[],\n productAnalyticsMap?: Record<string, ProductAnalytics>\n }}\n | { type: 'updateSettingsAndRefetch', payload: Partial<Pick<FastStateProps, 'force_and' | 'custom_sort_settings' | 'flag' | 'user_segment_preview' | 'personalization_preview' | 'session_token'>> }\n\n\n\nexport function fastStateReducer(state: FastStateProps, action: FastStateAction) {\n switch (action.type) {\n case \"setReady\":\n return {...state, isReady: action.payload}\n\n case 'setType':\n return {...state, type: action.payload};\n\n case 'setPage':\n return {...state, page: action.payload};\n\n case 'setQuery':\n return {...state, query: action.payload, collectionID: undefined, page: 1, narrow: undefined, searchWithinSearch: undefined, sortBy:undefined};\n\n case 'setSortBy':\n return {...state, sortBy: action.payload, page: 1};\n\n case 'setSegments':\n return {...state, segments: action.payload, page: 1};\n\n case 'setIsLoading':\n return {...state, isLoading: action.payload};\n\n case 'setCollectionID':\n return {...state, collectionID: action.payload, query: \"\", page: 1, narrow: undefined, searchWithinSearch: undefined , sortBy:undefined};\n\n case 'setNarrow':\n return {...state, narrow: action.payload, page: 1};\n\n case 'setResults':\n return {...state, results: {isNoResults: false, ...action.payload}} as FastStateProps;\n\n case 'mergeResultsKeepProduct': {\n return {...state, results: {...state.results, ...action.payload.results, products: state.results?.products || []}};\n }\n\n case 'mergeFacetsWithResults':{\n return {...state, narrow: action.payload};\n }\n\n case 'mergeResults': {\n const sortBy = action.payload.results?.sortBy ?? state.sortBy\n\n if (!action.payload.infiniteScroll) {\n return {...state,sortBy, results: { ...action.payload.results}} as FastStateProps;\n }\n\n const products = state.results?.products ?? [];\n const newProducts = action.payload.results.products ?? [];\n\n // Optimize: Use Set for O(1) lookup instead of O(n) find() - prevents O(n²)\n const existingIds = new Set(products.map(p => p.id));\n const uniqueNewProducts = newProducts.filter(p => !existingIds.has(p.id));\n\n // Only merge if there are actually new products\n if (uniqueNewProducts.length > 0) {\n return {\n ...state,\n results: {...state.results, isNoResults: false, ...action.payload.results, products: [...products, ...uniqueNewProducts]}\n } as FastStateProps;\n }\n\n return {\n ...state,\n results: {...state.results, isNoResults: false, ...action.payload.results, products: products}\n } as FastStateProps;\n\n }\n\n case 'setState': {\n if (action.payload.query) {\n return {...state, ...action.payload, collectionID: undefined, searchWithinSearch: undefined, segments: undefined}\n } else {\n return {...state, ...action.payload, query: \"\", searchWithinSearch: undefined, segments: undefined};\n }\n }\n\n case \"setRecommendations\": {\n return {\n ...state,\n recommendations: {\n ...state.recommendations,\n [action.payload.id]: action.payload.widget\n }\n }\n }\n\n case \"setSingleProducts\": {\n const products: { [id: string]: Product } = {...state.singleProducts};\n\n for (const product of action.payload) {\n products[product.id] = product;\n }\n\n return {...state, singleProducts: products}\n }\n case \"setIsAutocomplete\":{\n return {...state, isAutocomplete: action.payload}\n }\n\n case \"setAutocomplete\": {\n return {...state, autocomplete: action.payload}\n }\n\n case \"setSearchWithinSearch\": {\n return {...state, searchWithinSearch: action.payload}\n }\n case 'setFlag':\n return {...state, flag: action.payload};\n\n case 'setCustomSort':\n return {...state, custom_sort_settings: action.payload};\n\n case 'setVariationId':\n return {...state, variation_id: action.payload};\n\n case 'setForceAnd':\n return {...state, force_and: action.payload};\n\n case 'setUserSegmentPreview':\n return {...state, user_segment_preview: action.payload};\n\n case 'setComparisonData':\n return {...state, comparisonData: action.payload};\n\n case 'setIsComparing':\n return {...state, isComparing: action.payload};\n\n case 'setPersonalizationPreview':\n return {...state, personalization_preview: action.payload};\n\n case 'mergeAnalyticsData': {\n if (!state.results || !state.results.products) return state;\n\n const updatedResults = { ...state.results };\n\n if (action.payload.analytics) {\n (updatedResults as any).analytics = action.payload.analytics;\n }\n\n if (action.payload.matching_sets) {\n (updatedResults as any).matching_sets = action.payload.matching_sets;\n }\n\n if (action.payload.group_strategy) {\n (updatedResults as any).group_strategy = action.payload.group_strategy;\n }\n\n if (action.payload.variety_strategy) {\n (updatedResults as any).variety_strategy = action.payload.variety_strategy;\n }\n\n if (action.payload.productAnalyticsMap) {\n updatedResults.products = updatedResults.products.map(product => {\n const productAnalytics = action.payload.productAnalyticsMap?.[String(product.id)];\n if (productAnalytics) {\n return { ...product, analytics: productAnalytics };\n }\n return product;\n });\n }\n\n return { ...state, results: updatedResults } as FastStateProps;\n }\n\n case 'updateSettingsAndRefetch':\n return {...state, ...action.payload, refetchTrigger: (state.refetchTrigger ?? 0) + 1};\n\n }\n}\n\n"]}
|
|
1
|
+
{"version":3,"file":"reducer.js","sourceRoot":"","sources":["../../../src/components/FastSimonApi/reducer.ts"],"names":[],"mappings":"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","sourcesContent":["import {ComparisonData, CustomSortSettings, FastStateProps, IsLoading} from \"./context\";\nimport {PersonalizationPreviewSettings} from \"../../utils/personalizationPreview\";\nimport {AppType} from \"./FastSimonApi\";\nimport {SortBy} from \"../../@types/sortBy\";\nimport {FullTextServerResponseAll} from \"../../@types/results\";\nimport {smartCollectionsResults} from \"../../@types/categories\";\nimport {Narrow, ServerNarrow} from \"../../@types/narrow\";\nimport {Product, ProductAnalytics} from \"../../@types/product\";\n\nimport {Widget} from \"../../@types/widget\";\nimport {AutocompleteReasoningResponse, AutocompleteResults} from \"../../@types/autocomplete\";\n\ntype FastStateAction =\n | { type: 'setReady', payload: boolean }\n | { type: 'setType', payload: AppType }\n | { type: 'setPage', payload: number }\n | { type: 'setQuery', payload: string }\n | { type: 'setSortBy', payload: SortBy }\n | { type: 'setIsLoading', payload: IsLoading }\n | { type: 'setCollectionID', payload: string }\n | { type: 'setNarrow', payload: ServerNarrow[] | undefined }\n | { type: 'setResults', payload: FullTextServerResponseAll | smartCollectionsResults | AutocompleteReasoningResponse | undefined }\n | { type: 'mergeResults', payload: { results: FullTextServerResponseAll | smartCollectionsResults | AutocompleteReasoningResponse, infiniteScroll: boolean } }\n | { type: 'mergeFacetsWithResults', payload:Narrow[] }\n | { type: 'mergeResultsKeepProduct', payload: { results: FullTextServerResponseAll | smartCollectionsResults } }\n | { type: 'setState', payload: Partial<FastStateProps> }\n | { type: 'setRecommendations', payload: { id: string, widget: Widget } }\n | { type: 'setSingleProducts', payload: Product[] }\n | { type: 'setIsAutocomplete', payload: boolean }\n | { type: 'setAutocomplete', payload: AutocompleteResults }\n | { type: 'setSearchWithinSearch', payload: string }\n | { type: 'setSegments', payload: string[] }\n | { type: 'setFlag', payload: string[] }\n | { type: 'setCustomSort',payload:CustomSortSettings}\n | { type: 'setVariationId', payload: string | null }\n | { type: 'setForceAnd', payload: boolean }\n | { type: 'setUserSegmentPreview', payload: 'none' | 'new' | 'returning' }\n | { type: 'setComparisonData', payload: ComparisonData | null }\n | { type: 'setIsComparing', payload: boolean }\n | { type: 'setPersonalizationPreview', payload: PersonalizationPreviewSettings | null }\n | { type: 'mergeAnalyticsData', payload: {\n analytics?: FullTextServerResponseAll['analytics'],\n matching_sets?: Record<string, string>,\n group_strategy?: Record<string, string>,\n variety_strategy?: number[],\n productAnalyticsMap?: Record<string, ProductAnalytics>,\n personalized_products?: number[]\n }}\n | { type: 'updateSettingsAndRefetch', payload: Partial<Pick<FastStateProps, 'force_and' | 'custom_sort_settings' | 'flag' | 'user_segment_preview' | 'personalization_preview' | 'session_token'>> }\n\n\n\nexport function fastStateReducer(state: FastStateProps, action: FastStateAction) {\n switch (action.type) {\n case \"setReady\":\n return {...state, isReady: action.payload}\n\n case 'setType':\n return {...state, type: action.payload};\n\n case 'setPage':\n return {...state, page: action.payload};\n\n case 'setQuery':\n return {...state, query: action.payload, collectionID: undefined, page: 1, narrow: undefined, searchWithinSearch: undefined, sortBy:undefined};\n\n case 'setSortBy':\n return {...state, sortBy: action.payload, page: 1};\n\n case 'setSegments':\n return {...state, segments: action.payload, page: 1};\n\n case 'setIsLoading':\n return {...state, isLoading: action.payload};\n\n case 'setCollectionID':\n return {...state, collectionID: action.payload, query: \"\", page: 1, narrow: undefined, searchWithinSearch: undefined , sortBy:undefined};\n\n case 'setNarrow':\n return {...state, narrow: action.payload, page: 1};\n\n case 'setResults':\n return {...state, results: {isNoResults: false, ...action.payload}} as FastStateProps;\n\n case 'mergeResultsKeepProduct': {\n return {...state, results: {...state.results, ...action.payload.results, products: state.results?.products || []}};\n }\n\n case 'mergeFacetsWithResults':{\n return {...state, narrow: action.payload};\n }\n\n case 'mergeResults': {\n const sortBy = action.payload.results?.sortBy ?? state.sortBy\n\n if (!action.payload.infiniteScroll) {\n return {...state,sortBy, results: { ...action.payload.results}} as FastStateProps;\n }\n\n const products = state.results?.products ?? [];\n const newProducts = action.payload.results.products ?? [];\n\n // Optimize: Use Set for O(1) lookup instead of O(n) find() - prevents O(n²)\n const existingIds = new Set(products.map(p => p.id));\n const uniqueNewProducts = newProducts.filter(p => !existingIds.has(p.id));\n\n // Only merge if there are actually new products\n if (uniqueNewProducts.length > 0) {\n return {\n ...state,\n results: {...state.results, isNoResults: false, ...action.payload.results, products: [...products, ...uniqueNewProducts]}\n } as FastStateProps;\n }\n\n return {\n ...state,\n results: {...state.results, isNoResults: false, ...action.payload.results, products: products}\n } as FastStateProps;\n\n }\n\n case 'setState': {\n if (action.payload.query) {\n return {...state, ...action.payload, collectionID: undefined, searchWithinSearch: undefined, segments: undefined}\n } else {\n return {...state, ...action.payload, query: \"\", searchWithinSearch: undefined, segments: undefined};\n }\n }\n\n case \"setRecommendations\": {\n return {\n ...state,\n recommendations: {\n ...state.recommendations,\n [action.payload.id]: action.payload.widget\n }\n }\n }\n\n case \"setSingleProducts\": {\n const products: { [id: string]: Product } = {...state.singleProducts};\n\n for (const product of action.payload) {\n products[product.id] = product;\n }\n\n return {...state, singleProducts: products}\n }\n case \"setIsAutocomplete\":{\n return {...state, isAutocomplete: action.payload}\n }\n\n case \"setAutocomplete\": {\n return {...state, autocomplete: action.payload}\n }\n\n case \"setSearchWithinSearch\": {\n return {...state, searchWithinSearch: action.payload}\n }\n case 'setFlag':\n return {...state, flag: action.payload};\n\n case 'setCustomSort':\n return {...state, custom_sort_settings: action.payload};\n\n case 'setVariationId':\n return {...state, variation_id: action.payload};\n\n case 'setForceAnd':\n return {...state, force_and: action.payload};\n\n case 'setUserSegmentPreview':\n return {...state, user_segment_preview: action.payload};\n\n case 'setComparisonData':\n return {...state, comparisonData: action.payload};\n\n case 'setIsComparing':\n return {...state, isComparing: action.payload};\n\n case 'setPersonalizationPreview':\n return {...state, personalization_preview: action.payload};\n\n case 'mergeAnalyticsData': {\n if (!state.results || !state.results.products) return state;\n\n const updatedResults = { ...state.results };\n\n if (action.payload.analytics) {\n (updatedResults as any).analytics = action.payload.analytics;\n }\n\n if (action.payload.matching_sets) {\n (updatedResults as any).matching_sets = action.payload.matching_sets;\n }\n\n if (action.payload.group_strategy) {\n (updatedResults as any).group_strategy = action.payload.group_strategy;\n }\n\n if (action.payload.variety_strategy) {\n (updatedResults as any).variety_strategy = action.payload.variety_strategy;\n }\n\n if (action.payload.personalized_products) {\n (updatedResults as any).personalized_products = action.payload.personalized_products;\n }\n\n if (action.payload.productAnalyticsMap) {\n updatedResults.products = updatedResults.products.map(product => {\n const productAnalytics = action.payload.productAnalyticsMap?.[String(product.id)];\n if (productAnalytics) {\n return { ...product, analytics: productAnalytics };\n }\n return product;\n });\n }\n\n return { ...state, results: updatedResults } as FastStateProps;\n }\n\n case 'updateSettingsAndRefetch':\n return {...state, ...action.payload, refetchTrigger: (state.refetchTrigger ?? 0) + 1};\n\n }\n}\n\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -42,5 +42,6 @@ import { getShowRequestUrlSetting, setShowRequestUrlSetting } from "./utils/getR
|
|
|
42
42
|
import { getPersonalizationSegment, getUserSegmentPreviewSettings, setUserSegmentPreviewSettings, UserSegmentPreview, UserSegmentPreviewSettings } from "./utils/userSegmentPreview";
|
|
43
43
|
import { getPersonalizationPreviewSettings, setPersonalizationPreviewSettings, buildPersonalizationParams, PersonalizationPreviewSettings, PersonalizationType } from "./utils/personalizationPreview";
|
|
44
44
|
import { getSessionTokenPreviewSettings, setSessionTokenPreviewSettings, SessionTokenPreviewSettings } from "./utils/sessionTokenPreview";
|
|
45
|
-
|
|
46
|
-
export {
|
|
45
|
+
import { LiveSessionData, RequestType, generateSessionToken, getLiveSessionData, setLiveSessionData, addProductView, addProductToCart, buildLiveSessionParams, resetLiveSession, startLiveSession, stopLiveSession, setSessionSegment, formatTokenAge, getUserSegmentFromToken } from "./utils/liveSessionPreview";
|
|
46
|
+
export type { MenuItemName, CustomClasses, SideMenuType, SideMenuItem, ProductLabelType, Banner, EditorProduct, IconProps, ServerProduct, ProductAnalytics, FullTextServerResponseAll, QueryUnderstanding, smartCollectionsResults, AutocompleteReasoningResponse, FeaturedRanking, ComparisonData, UserSegmentPreview, UserSegmentPreviewSettings, PersonalizationPreviewSettings, PersonalizationType, SessionTokenPreviewSettings, LiveSessionData, RequestType };
|
|
47
|
+
export { BackOfficeFiltersMenu, InStoreFiltersMenu, Droppable, DndContextWrapper, SortableItem, ProductGrid, RenderIfVisible, useDragToSelect, LandingPage, FullTextSearch, BackOfficeFiltersIcon, BannersIcon, HelpIcon, InStoreFiltersIcon, PromoteIcon, RestoreIcon, RemoveIcon, GeneralIcon, videoFormats, isEditorProduct, useFastState, useFastStateFunctions, FastSimonApi, MainTheme, Products, getFormatProducts, useProductsPerRow, ProductLabel, CustomTagsFilters, SelectCard, getLSVectorSearchOn, getLSVectorSearchDict, getUseCacheSetting, setUseCacheSetting, getShowSalesAnalyticsSetting, setShowSalesAnalyticsSetting, getShowRequestUrlSetting, setShowRequestUrlSetting, getPersonalizationSegment, getUserSegmentPreviewSettings, setUserSegmentPreviewSettings, getPersonalizationPreviewSettings, setPersonalizationPreviewSettings, buildPersonalizationParams, getSessionTokenPreviewSettings, setSessionTokenPreviewSettings, generateSessionToken, getLiveSessionData, setLiveSessionData, addProductView, addProductToCart, buildLiveSessionParams, resetLiveSession, startLiveSession, stopLiveSession, setSessionSegment, formatTokenAge, getUserSegmentFromToken };
|
package/dist/index.js
CHANGED
|
@@ -34,5 +34,6 @@ import { getShowRequestUrlSetting, setShowRequestUrlSetting } from "./utils/getR
|
|
|
34
34
|
import { getPersonalizationSegment, getUserSegmentPreviewSettings, setUserSegmentPreviewSettings } from "./utils/userSegmentPreview";
|
|
35
35
|
import { getPersonalizationPreviewSettings, setPersonalizationPreviewSettings, buildPersonalizationParams } from "./utils/personalizationPreview";
|
|
36
36
|
import { getSessionTokenPreviewSettings, setSessionTokenPreviewSettings } from "./utils/sessionTokenPreview";
|
|
37
|
-
|
|
37
|
+
import { generateSessionToken, getLiveSessionData, setLiveSessionData, addProductView, addProductToCart, buildLiveSessionParams, resetLiveSession, startLiveSession, stopLiveSession, setSessionSegment, formatTokenAge, getUserSegmentFromToken } from "./utils/liveSessionPreview";
|
|
38
|
+
export { BackOfficeFiltersMenu, InStoreFiltersMenu, Droppable, DndContextWrapper, SortableItem, ProductGrid, RenderIfVisible, useDragToSelect, LandingPage, FullTextSearch, BackOfficeFiltersIcon, BannersIcon, HelpIcon, InStoreFiltersIcon, PromoteIcon, RestoreIcon, RemoveIcon, GeneralIcon, videoFormats, isEditorProduct, useFastState, useFastStateFunctions, FastSimonApi, MainTheme, Products, getFormatProducts, useProductsPerRow, ProductLabel, CustomTagsFilters, SelectCard, getLSVectorSearchOn, getLSVectorSearchDict, getUseCacheSetting, setUseCacheSetting, getShowSalesAnalyticsSetting, setShowSalesAnalyticsSetting, getShowRequestUrlSetting, setShowRequestUrlSetting, getPersonalizationSegment, getUserSegmentPreviewSettings, setUserSegmentPreviewSettings, getPersonalizationPreviewSettings, setPersonalizationPreviewSettings, buildPersonalizationParams, getSessionTokenPreviewSettings, setSessionTokenPreviewSettings, generateSessionToken, getLiveSessionData, setLiveSessionData, addProductView, addProductToCart, buildLiveSessionParams, resetLiveSession, startLiveSession, stopLiveSession, setSessionSegment, formatTokenAge, getUserSegmentFromToken };
|
|
38
39
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,YAAY,EAAS,MAAM,iBAAiB,CAAA;AACpD,OAAO,EAAgB,eAAe,EAAC,MAAM,wBAAwB,CAAA;AAGrE,OAAO,EAAC,qBAAqB,EAAC,MAAM,+BAA+B,CAAA;AACnE,OAAO,EAAC,WAAW,EAAC,MAAM,qBAAqB,CAAA;AAC/C,OAAO,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAC,kBAAkB,EAAC,MAAM,4BAA4B,CAAA;AAC7D,OAAO,EAAC,WAAW,EAAC,MAAM,qBAAqB,CAAA;AAC/C,OAAO,EAAC,UAAU,EAAC,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAC,WAAW,EAAC,MAAM,qBAAqB,CAAA;AAC/C,OAAO,EAAC,WAAW,EAAC,MAAM,qBAAqB,CAAA;AAC/C,OAAO,qBAAqB,MAAM,oCAAoC,CAAA;AACtE,OAAO,kBAAkB,MAAM,iCAAiC,CAAA;AAChE,OAAO,iBAAiB,MAAM,4CAA4C,CAAA;AAC1E,OAAO,SAAS,MAAM,oCAAoC,CAAA;AAC1D,OAAO,YAAY,MAAM,wCAAwC,CAAA;AACjE,OAAO,EAAC,YAAY,EAAC,MAAM,uCAAuC,CAAA;AAClE,OAAO,WAAW,MAAM,sCAAsC,CAAC;AAC/D,OAAO,UAAU,MAAM,oCAAoC,CAAC;AAC5D,OAAO,eAAe,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAC,eAAe,EAAC,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAC,YAAY,EAAE,qBAAqB,EAAiB,MAAM,2BAA2B,CAAA;AAI7F,OAAO,YAAY,MAAM,wCAAwC,CAAA;AACjE,OAAO,SAAS,MAAM,2BAA2B,CAAA;AAEjD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAC,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAErF,OAAO,EAAC,kBAAkB,EAAE,kBAAkB,EAAC,MAAM,0BAA0B,CAAA;AAC/E,OAAO,EAAC,4BAA4B,EAAE,4BAA4B,EAAC,MAAM,mCAAmC,CAAA;AAC5G,OAAO,EAAC,wBAAwB,EAAE,wBAAwB,EAAC,MAAM,+BAA+B,CAAA;AAChG,OAAO,EAAC,yBAAyB,EAAE,6BAA6B,EAAE,6BAA6B,EAAiD,MAAM,4BAA4B,CAAA;AAClL,OAAO,EAAC,iCAAiC,EAAE,iCAAiC,EAAE,0BAA0B,EAAsD,MAAM,gCAAgC,CAAA;AACpM,OAAO,EAAC,8BAA8B,EAAE,8BAA8B,EAA8B,MAAM,6BAA6B,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {CustomClasses, SideMenuType, SideMenuItem, MenuItemName} from \"./@types/sideMenu\"\nimport {ProductLabelType} from \"./@types/productLabel\"\nimport {videoFormats, Banner} from \"./@types/banner\"\nimport {EditorProduct, isEditorProduct} from \"./@types/editorProduct\"\nimport {IconProps} from \"./@types/iconProps\"\n\nimport {BackOfficeFiltersIcon} from \"./icons/BackOfficeFiltersIcon\"\nimport {BannersIcon} from \"./icons/BannersIcon\"\nimport {HelpIcon} from \"./icons/HelpIcon\"\nimport {InStoreFiltersIcon} from \"./icons/InStoreFiltersIcon\"\nimport {PromoteIcon} from \"./icons/PromoteIcon\"\nimport {RemoveIcon} from \"./icons/RemoveIcon\"\nimport {RestoreIcon} from \"./icons/RestoreIcon\"\nimport {GeneralIcon} from \"./icons/GeneralIcon\"\nimport BackOfficeFiltersMenu from './components/BackOfficeFiltersMenu'\nimport InStoreFiltersMenu from './components/InStoreFiltersMenu'\nimport DndContextWrapper from './components/DragAndDrop/DndContextWrapper'\nimport Droppable from './components/DragAndDrop/Droppable'\nimport ProductLabel from './components/ProductLabel/ProductLabel'\nimport {SortableItem} from './components/DragAndDrop/SortableItem'\nimport ProductGrid from \"./components/productGrid/ProductGrid\";\nimport SelectCard from \"./components/SelectCard/SelectCard\";\nimport RenderIfVisible from \"./components/RenderIfVisible\";\nimport {useDragToSelect} from \"./utils/useDragToSelect\";\nimport {CustomTagsFilters} from \"./utils/customTagsFilters\";\nimport {useProductsPerRow} from \"./utils/useProductsPerRow\";\nimport { LandingPage } from \"./services/landingPage\";\nimport { FullTextSearch } from \"./services/search\";\nimport { getFormatProducts } from \"./services/getFormatProducts\";\nimport {useFastState, useFastStateFunctions, ComparisonData} from \"./components/FastSimonApi\"\nimport { ServerProduct, ProductAnalytics } from \"./@types/product\"\nimport { FullTextServerResponseAll, QueryUnderstanding } from \"./@types/results\"\nimport { smartCollectionsResults } from \"./@types/categories\"\nimport FastSimonApi from \"./components/FastSimonApi/FastSimonApi\"\nimport MainTheme from \"./components/FastSimonApi\"\nimport { FeaturedRanking } from \"@fast-simon/utilities/lib/@types/product\"\nimport { Products } from \"./services/products\"\nimport {getLSVectorSearchDict, getLSVectorSearchOn } from \"./utils/getLSVectorSearch\"\nimport { AutocompleteReasoningResponse } from \"./@types/autocomplete\"\nimport {getUseCacheSetting, setUseCacheSetting} from \"./utils/getCacheSettings\"\nimport {getShowSalesAnalyticsSetting, setShowSalesAnalyticsSetting} from \"./utils/getSalesAnalyticsSettings\"\nimport {getShowRequestUrlSetting, setShowRequestUrlSetting} from \"./utils/getRequestUrlSettings\"\nimport {getPersonalizationSegment, getUserSegmentPreviewSettings, setUserSegmentPreviewSettings, UserSegmentPreview, UserSegmentPreviewSettings} from \"./utils/userSegmentPreview\"\nimport {getPersonalizationPreviewSettings, setPersonalizationPreviewSettings, buildPersonalizationParams, PersonalizationPreviewSettings, PersonalizationType} from \"./utils/personalizationPreview\"\nimport {getSessionTokenPreviewSettings, setSessionTokenPreviewSettings, SessionTokenPreviewSettings} from \"./utils/sessionTokenPreview\"\nimport {LiveSessionData, RequestType, generateSessionToken, getLiveSessionData, setLiveSessionData, addProductView, addProductToCart, buildLiveSessionParams, resetLiveSession, startLiveSession, stopLiveSession, setSessionSegment, formatTokenAge, getUserSegmentFromToken} from \"./utils/liveSessionPreview\"\n// export * from './components';\n\nexport type {\n MenuItemName,\n CustomClasses,\n SideMenuType,\n SideMenuItem,\n ProductLabelType,\n Banner,\n EditorProduct,\n IconProps,\n ServerProduct,\n ProductAnalytics,\n FullTextServerResponseAll,\n QueryUnderstanding,\n smartCollectionsResults,\n AutocompleteReasoningResponse,\n FeaturedRanking,\n ComparisonData,\n UserSegmentPreview,\n UserSegmentPreviewSettings,\n PersonalizationPreviewSettings,\n PersonalizationType,\n SessionTokenPreviewSettings,\n LiveSessionData,\n RequestType\n};\n\nexport {\n BackOfficeFiltersMenu, InStoreFiltersMenu, Droppable, DndContextWrapper, SortableItem, ProductGrid, RenderIfVisible,\n useDragToSelect, LandingPage, FullTextSearch, BackOfficeFiltersIcon, BannersIcon, HelpIcon, InStoreFiltersIcon, PromoteIcon,\n RestoreIcon, RemoveIcon, GeneralIcon, videoFormats, isEditorProduct,useFastState, useFastStateFunctions,FastSimonApi,MainTheme,\n Products, getFormatProducts, useProductsPerRow, ProductLabel, CustomTagsFilters, SelectCard ,getLSVectorSearchOn,getLSVectorSearchDict,\n getUseCacheSetting, setUseCacheSetting, getShowSalesAnalyticsSetting, setShowSalesAnalyticsSetting,\n getShowRequestUrlSetting, setShowRequestUrlSetting,\n getPersonalizationSegment, getUserSegmentPreviewSettings, setUserSegmentPreviewSettings,\n getPersonalizationPreviewSettings, setPersonalizationPreviewSettings, buildPersonalizationParams,\n getSessionTokenPreviewSettings, setSessionTokenPreviewSettings,\n generateSessionToken, getLiveSessionData, setLiveSessionData, addProductView, addProductToCart,\n buildLiveSessionParams, resetLiveSession, startLiveSession, stopLiveSession, setSessionSegment, formatTokenAge, getUserSegmentFromToken\n};"]}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
export interface LiveSessionData {
|
|
2
|
+
enabled: boolean;
|
|
3
|
+
sessionToken: string;
|
|
4
|
+
spv: Record<string, number>;
|
|
5
|
+
spc: Record<string, number>;
|
|
6
|
+
createdAt: number;
|
|
7
|
+
lastActive: number;
|
|
8
|
+
}
|
|
9
|
+
export type RequestType = 'collection' | 'search';
|
|
10
|
+
/**
|
|
11
|
+
* Generate a ULID-based session token matching production format: 'g' + 26-char ULID.
|
|
12
|
+
* @param timestampMs - Optional timestamp in ms to encode (defaults to Date.now()).
|
|
13
|
+
* Use a past timestamp to simulate a "returning" user (e.g., Date.now() - 2 * 86400000).
|
|
14
|
+
*/
|
|
15
|
+
export declare function generateSessionToken(timestampMs?: number): string;
|
|
16
|
+
export declare function getLiveSessionData(): LiveSessionData;
|
|
17
|
+
export declare function setLiveSessionData(data: LiveSessionData): void;
|
|
18
|
+
/**
|
|
19
|
+
* Add a product view to SPV. Touches session. Persists to localStorage.
|
|
20
|
+
*/
|
|
21
|
+
export declare function addProductView(productId: string): LiveSessionData;
|
|
22
|
+
/**
|
|
23
|
+
* Add a variant to SPC (cart). Touches session. Persists to localStorage.
|
|
24
|
+
*/
|
|
25
|
+
export declare function addProductToCart(variantId: string): LiveSessionData;
|
|
26
|
+
/**
|
|
27
|
+
* Convert LiveSessionData into the params format that updateSettingsAndRefetch expects.
|
|
28
|
+
* Also touches the session (updates lastActive).
|
|
29
|
+
*/
|
|
30
|
+
export declare function buildLiveSessionParams(data: LiveSessionData, requestType?: RequestType): {
|
|
31
|
+
personalization_preview: {
|
|
32
|
+
enabled: boolean;
|
|
33
|
+
spvJson: string;
|
|
34
|
+
types: string[];
|
|
35
|
+
} | null;
|
|
36
|
+
session_token: string | undefined;
|
|
37
|
+
user_segment_preview: 'none' | 'new' | 'returning';
|
|
38
|
+
spc: string | undefined;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Regenerate session token with a specific age for new/returning segment testing.
|
|
42
|
+
* "new" → token created now (age < 1 day). "returning" → token created 2 days ago.
|
|
43
|
+
* Preserves SPV/SPC — only the token changes.
|
|
44
|
+
*/
|
|
45
|
+
export declare function setSessionSegment(segment: 'new' | 'returning'): LiveSessionData;
|
|
46
|
+
/**
|
|
47
|
+
* Reset live session: fresh token, clear SPV + SPC.
|
|
48
|
+
*/
|
|
49
|
+
export declare function resetLiveSession(): LiveSessionData;
|
|
50
|
+
/**
|
|
51
|
+
* Start a live session. Resumes if existing and not expired.
|
|
52
|
+
* If expired (30+ min inactive), resets to a fresh session (matching storefront behavior).
|
|
53
|
+
*/
|
|
54
|
+
export declare function startLiveSession(): LiveSessionData;
|
|
55
|
+
/**
|
|
56
|
+
* Stop live session (pause). Token, SPV and SPC remain for potential resume.
|
|
57
|
+
*/
|
|
58
|
+
export declare function stopLiveSession(): LiveSessionData;
|
|
59
|
+
/**
|
|
60
|
+
* Format token age as human-readable string.
|
|
61
|
+
*/
|
|
62
|
+
export declare function formatTokenAge(createdAt: number): string;
|
|
63
|
+
/**
|
|
64
|
+
* Get user segment derived from token age.
|
|
65
|
+
*/
|
|
66
|
+
export declare function getUserSegmentFromToken(createdAt: number): 'new' | 'returning';
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
const SPV_LIMITS = {
|
|
2
|
+
collection: { min: 1, max: 10, expiryDays: 365 },
|
|
3
|
+
search: { min: 3, max: 50, expiryDays: 5 },
|
|
4
|
+
};
|
|
5
|
+
const LIVE_SESSION_KEY = 'ai_explainer_live_session';
|
|
6
|
+
const SESSION_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes — matches storefront SESSION_TOKEN_LIFE
|
|
7
|
+
// Crockford Base32 alphabet for ULID encoding
|
|
8
|
+
const CROCKFORD = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';
|
|
9
|
+
/**
|
|
10
|
+
* Generate a ULID-based session token matching production format: 'g' + 26-char ULID.
|
|
11
|
+
* @param timestampMs - Optional timestamp in ms to encode (defaults to Date.now()).
|
|
12
|
+
* Use a past timestamp to simulate a "returning" user (e.g., Date.now() - 2 * 86400000).
|
|
13
|
+
*/
|
|
14
|
+
export function generateSessionToken(timestampMs) {
|
|
15
|
+
const now = timestampMs !== null && timestampMs !== void 0 ? timestampMs : Date.now();
|
|
16
|
+
let ts = now;
|
|
17
|
+
const timePart = new Array(10);
|
|
18
|
+
for (let i = 9; i >= 0; i--) {
|
|
19
|
+
timePart[i] = CROCKFORD[ts & 0x1f];
|
|
20
|
+
ts = Math.floor(ts / 32);
|
|
21
|
+
}
|
|
22
|
+
const randPart = new Array(16);
|
|
23
|
+
for (let i = 0; i < 16; i++) {
|
|
24
|
+
randPart[i] = CROCKFORD[Math.floor(Math.random() * 32)];
|
|
25
|
+
}
|
|
26
|
+
return 'g' + timePart.join('') + randPart.join('');
|
|
27
|
+
}
|
|
28
|
+
const defaultData = {
|
|
29
|
+
enabled: false,
|
|
30
|
+
sessionToken: '',
|
|
31
|
+
spv: {},
|
|
32
|
+
spc: {},
|
|
33
|
+
createdAt: 0,
|
|
34
|
+
lastActive: 0,
|
|
35
|
+
};
|
|
36
|
+
export function getLiveSessionData() {
|
|
37
|
+
try {
|
|
38
|
+
const stored = localStorage.getItem(LIVE_SESSION_KEY);
|
|
39
|
+
if (stored) {
|
|
40
|
+
const parsed = JSON.parse(stored);
|
|
41
|
+
if (!parsed.spc)
|
|
42
|
+
parsed.spc = {};
|
|
43
|
+
if (!parsed.lastActive)
|
|
44
|
+
parsed.lastActive = parsed.createdAt || 0;
|
|
45
|
+
return parsed;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
// Ignore parsing errors
|
|
50
|
+
}
|
|
51
|
+
return Object.assign({}, defaultData);
|
|
52
|
+
}
|
|
53
|
+
export function setLiveSessionData(data) {
|
|
54
|
+
localStorage.setItem(LIVE_SESSION_KEY, JSON.stringify(data));
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Check if the session has timed out (30+ min of inactivity).
|
|
58
|
+
*/
|
|
59
|
+
function isSessionExpired(data) {
|
|
60
|
+
if (!data.lastActive)
|
|
61
|
+
return false;
|
|
62
|
+
return (Date.now() - data.lastActive) >= SESSION_TIMEOUT_MS;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Touch the session (update lastActive). Called on every meaningful action.
|
|
66
|
+
*/
|
|
67
|
+
function touchSession(data) {
|
|
68
|
+
data.lastActive = Date.now();
|
|
69
|
+
return data;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Filter and cap an accumulator (SPV or SPC) for a specific request type.
|
|
73
|
+
*/
|
|
74
|
+
function filterAccumulator(acc, limits) {
|
|
75
|
+
const cutoff = Math.floor(Date.now() / 1000) - limits.expiryDays * 86400;
|
|
76
|
+
const entries = Object.entries(acc);
|
|
77
|
+
// Fast path: skip filtering if empty
|
|
78
|
+
if (entries.length === 0)
|
|
79
|
+
return undefined;
|
|
80
|
+
const recent = entries
|
|
81
|
+
.filter(([_, ts]) => ts >= cutoff)
|
|
82
|
+
.sort((a, b) => b[1] - a[1])
|
|
83
|
+
.slice(0, limits.max);
|
|
84
|
+
if (recent.length < limits.min)
|
|
85
|
+
return undefined;
|
|
86
|
+
return Object.fromEntries(recent);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Add a product view to SPV. Touches session. Persists to localStorage.
|
|
90
|
+
*/
|
|
91
|
+
export function addProductView(productId) {
|
|
92
|
+
const data = touchSession(getLiveSessionData());
|
|
93
|
+
data.spv[productId] = Math.floor(Date.now() / 1000);
|
|
94
|
+
setLiveSessionData(data);
|
|
95
|
+
return data;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Add a variant to SPC (cart). Touches session. Persists to localStorage.
|
|
99
|
+
*/
|
|
100
|
+
export function addProductToCart(variantId) {
|
|
101
|
+
const data = touchSession(getLiveSessionData());
|
|
102
|
+
data.spc[variantId] = Math.floor(Date.now() / 1000);
|
|
103
|
+
setLiveSessionData(data);
|
|
104
|
+
return data;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Convert LiveSessionData into the params format that updateSettingsAndRefetch expects.
|
|
108
|
+
* Also touches the session (updates lastActive).
|
|
109
|
+
*/
|
|
110
|
+
export function buildLiveSessionParams(data, requestType = 'collection') {
|
|
111
|
+
if (!data.enabled) {
|
|
112
|
+
return { personalization_preview: null, session_token: undefined, user_segment_preview: 'none', spc: undefined };
|
|
113
|
+
}
|
|
114
|
+
const limits = SPV_LIMITS[requestType];
|
|
115
|
+
const filteredSpv = filterAccumulator(data.spv, limits);
|
|
116
|
+
// SPC only sent with collections (not supported in search serving)
|
|
117
|
+
const filteredSpc = requestType === 'collection' ? filterAccumulator(data.spc, limits) : undefined;
|
|
118
|
+
return {
|
|
119
|
+
personalization_preview: filteredSpv ? {
|
|
120
|
+
enabled: true,
|
|
121
|
+
spvJson: JSON.stringify(filteredSpv),
|
|
122
|
+
types: ['gender', 'size', 'type'],
|
|
123
|
+
} : null,
|
|
124
|
+
session_token: data.sessionToken || undefined,
|
|
125
|
+
user_segment_preview: getUserSegmentFromToken(data.createdAt),
|
|
126
|
+
spc: filteredSpc ? JSON.stringify(filteredSpc) : undefined,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Regenerate session token with a specific age for new/returning segment testing.
|
|
131
|
+
* "new" → token created now (age < 1 day). "returning" → token created 2 days ago.
|
|
132
|
+
* Preserves SPV/SPC — only the token changes.
|
|
133
|
+
*/
|
|
134
|
+
export function setSessionSegment(segment) {
|
|
135
|
+
const data = touchSession(getLiveSessionData());
|
|
136
|
+
const tokenTimestamp = segment === 'returning'
|
|
137
|
+
? Date.now() - 2 * 24 * 60 * 60 * 1000 // 2 days ago
|
|
138
|
+
: Date.now();
|
|
139
|
+
data.sessionToken = generateSessionToken(tokenTimestamp);
|
|
140
|
+
data.createdAt = tokenTimestamp;
|
|
141
|
+
setLiveSessionData(data);
|
|
142
|
+
return data;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Reset live session: fresh token, clear SPV + SPC.
|
|
146
|
+
*/
|
|
147
|
+
export function resetLiveSession() {
|
|
148
|
+
const now = Date.now();
|
|
149
|
+
const data = {
|
|
150
|
+
enabled: true,
|
|
151
|
+
sessionToken: generateSessionToken(),
|
|
152
|
+
spv: {},
|
|
153
|
+
spc: {},
|
|
154
|
+
createdAt: now,
|
|
155
|
+
lastActive: now,
|
|
156
|
+
};
|
|
157
|
+
setLiveSessionData(data);
|
|
158
|
+
return data;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Start a live session. Resumes if existing and not expired.
|
|
162
|
+
* If expired (30+ min inactive), resets to a fresh session (matching storefront behavior).
|
|
163
|
+
*/
|
|
164
|
+
export function startLiveSession() {
|
|
165
|
+
const existing = getLiveSessionData();
|
|
166
|
+
if (existing.sessionToken && !isSessionExpired(existing)) {
|
|
167
|
+
existing.enabled = true;
|
|
168
|
+
existing.lastActive = Date.now();
|
|
169
|
+
setLiveSessionData(existing);
|
|
170
|
+
return existing;
|
|
171
|
+
}
|
|
172
|
+
// No session or expired — create fresh
|
|
173
|
+
return resetLiveSession();
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Stop live session (pause). Token, SPV and SPC remain for potential resume.
|
|
177
|
+
*/
|
|
178
|
+
export function stopLiveSession() {
|
|
179
|
+
const data = getLiveSessionData();
|
|
180
|
+
data.enabled = false;
|
|
181
|
+
setLiveSessionData(data);
|
|
182
|
+
return data;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Format token age as human-readable string.
|
|
186
|
+
*/
|
|
187
|
+
export function formatTokenAge(createdAt) {
|
|
188
|
+
if (!createdAt)
|
|
189
|
+
return 'N/A';
|
|
190
|
+
const totalMinutes = Math.floor((Date.now() - createdAt) / 60000);
|
|
191
|
+
const days = Math.floor(totalMinutes / 1440);
|
|
192
|
+
const hours = Math.floor((totalMinutes % 1440) / 60);
|
|
193
|
+
const minutes = totalMinutes % 60;
|
|
194
|
+
if (days > 0)
|
|
195
|
+
return `${days}d ${hours}h`;
|
|
196
|
+
if (hours > 0)
|
|
197
|
+
return `${hours}h ${minutes}m`;
|
|
198
|
+
return `${minutes}m`;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Get user segment derived from token age.
|
|
202
|
+
*/
|
|
203
|
+
export function getUserSegmentFromToken(createdAt) {
|
|
204
|
+
if (!createdAt)
|
|
205
|
+
return 'new';
|
|
206
|
+
return (Date.now() - createdAt) >= 24 * 60 * 60 * 1000 ? 'returning' : 'new';
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=liveSessionPreview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"liveSessionPreview.js","sourceRoot":"","sources":["../../src/utils/liveSessionPreview.ts"],"names":[],"mappings":"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","sourcesContent":["export interface LiveSessionData {\n enabled: boolean;\n sessionToken: string;\n spv: Record<string, number>; // {product_id: unix_timestamp}\n spc: Record<string, number>; // {variant_id: unix_timestamp} — cart actions\n createdAt: number; // unix timestamp ms when token was created\n lastActive: number; // unix timestamp ms of last activity (matches storefront 30-min timeout)\n}\n\nexport type RequestType = 'collection' | 'search';\n\ninterface SpvLimits {\n min: number;\n max: number;\n expiryDays: number;\n}\n\nconst SPV_LIMITS: Record<RequestType, SpvLimits> = {\n collection: { min: 1, max: 10, expiryDays: 365 },\n search: { min: 3, max: 50, expiryDays: 5 },\n};\n\nconst LIVE_SESSION_KEY = 'ai_explainer_live_session';\nconst SESSION_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes — matches storefront SESSION_TOKEN_LIFE\n\n// Crockford Base32 alphabet for ULID encoding\nconst CROCKFORD = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';\n\n/**\n * Generate a ULID-based session token matching production format: 'g' + 26-char ULID.\n * @param timestampMs - Optional timestamp in ms to encode (defaults to Date.now()).\n * Use a past timestamp to simulate a \"returning\" user (e.g., Date.now() - 2 * 86400000).\n */\nexport function generateSessionToken(timestampMs?: number): string {\n const now = timestampMs ?? Date.now();\n let ts = now;\n const timePart = new Array(10);\n for (let i = 9; i >= 0; i--) {\n timePart[i] = CROCKFORD[ts & 0x1f];\n ts = Math.floor(ts / 32);\n }\n const randPart = new Array(16);\n for (let i = 0; i < 16; i++) {\n randPart[i] = CROCKFORD[Math.floor(Math.random() * 32)];\n }\n return 'g' + timePart.join('') + randPart.join('');\n}\n\nconst defaultData: LiveSessionData = {\n enabled: false,\n sessionToken: '',\n spv: {},\n spc: {},\n createdAt: 0,\n lastActive: 0,\n};\n\nexport function getLiveSessionData(): LiveSessionData {\n try {\n const stored = localStorage.getItem(LIVE_SESSION_KEY);\n if (stored) {\n const parsed = JSON.parse(stored);\n if (!parsed.spc) parsed.spc = {};\n if (!parsed.lastActive) parsed.lastActive = parsed.createdAt || 0;\n return parsed;\n }\n } catch (e) {\n // Ignore parsing errors\n }\n return { ...defaultData };\n}\n\nexport function setLiveSessionData(data: LiveSessionData): void {\n localStorage.setItem(LIVE_SESSION_KEY, JSON.stringify(data));\n}\n\n/**\n * Check if the session has timed out (30+ min of inactivity).\n */\nfunction isSessionExpired(data: LiveSessionData): boolean {\n if (!data.lastActive) return false;\n return (Date.now() - data.lastActive) >= SESSION_TIMEOUT_MS;\n}\n\n/**\n * Touch the session (update lastActive). Called on every meaningful action.\n */\nfunction touchSession(data: LiveSessionData): LiveSessionData {\n data.lastActive = Date.now();\n return data;\n}\n\n/**\n * Filter and cap an accumulator (SPV or SPC) for a specific request type.\n */\nfunction filterAccumulator(\n acc: Record<string, number>,\n limits: SpvLimits\n): Record<string, number> | undefined {\n const cutoff = Math.floor(Date.now() / 1000) - limits.expiryDays * 86400;\n const entries = Object.entries(acc);\n // Fast path: skip filtering if empty\n if (entries.length === 0) return undefined;\n\n const recent = entries\n .filter(([_, ts]) => ts >= cutoff)\n .sort((a, b) => b[1] - a[1])\n .slice(0, limits.max);\n\n if (recent.length < limits.min) return undefined;\n return Object.fromEntries(recent);\n}\n\n/**\n * Add a product view to SPV. Touches session. Persists to localStorage.\n */\nexport function addProductView(productId: string): LiveSessionData {\n const data = touchSession(getLiveSessionData());\n data.spv[productId] = Math.floor(Date.now() / 1000);\n setLiveSessionData(data);\n return data;\n}\n\n/**\n * Add a variant to SPC (cart). Touches session. Persists to localStorage.\n */\nexport function addProductToCart(variantId: string): LiveSessionData {\n const data = touchSession(getLiveSessionData());\n data.spc[variantId] = Math.floor(Date.now() / 1000);\n setLiveSessionData(data);\n return data;\n}\n\n/**\n * Convert LiveSessionData into the params format that updateSettingsAndRefetch expects.\n * Also touches the session (updates lastActive).\n */\nexport function buildLiveSessionParams(data: LiveSessionData, requestType: RequestType = 'collection'): {\n personalization_preview: { enabled: boolean; spvJson: string; types: string[] } | null;\n session_token: string | undefined;\n user_segment_preview: 'none' | 'new' | 'returning';\n spc: string | undefined;\n} {\n if (!data.enabled) {\n return { personalization_preview: null, session_token: undefined, user_segment_preview: 'none', spc: undefined };\n }\n\n const limits = SPV_LIMITS[requestType];\n const filteredSpv = filterAccumulator(data.spv, limits);\n // SPC only sent with collections (not supported in search serving)\n const filteredSpc = requestType === 'collection' ? filterAccumulator(data.spc, limits) : undefined;\n\n return {\n personalization_preview: filteredSpv ? {\n enabled: true,\n spvJson: JSON.stringify(filteredSpv),\n types: ['gender', 'size', 'type'],\n } : null,\n session_token: data.sessionToken || undefined,\n user_segment_preview: getUserSegmentFromToken(data.createdAt),\n spc: filteredSpc ? JSON.stringify(filteredSpc) : undefined,\n };\n}\n\n/**\n * Regenerate session token with a specific age for new/returning segment testing.\n * \"new\" → token created now (age < 1 day). \"returning\" → token created 2 days ago.\n * Preserves SPV/SPC — only the token changes.\n */\nexport function setSessionSegment(segment: 'new' | 'returning'): LiveSessionData {\n const data = touchSession(getLiveSessionData());\n const tokenTimestamp = segment === 'returning'\n ? Date.now() - 2 * 24 * 60 * 60 * 1000 // 2 days ago\n : Date.now();\n data.sessionToken = generateSessionToken(tokenTimestamp);\n data.createdAt = tokenTimestamp;\n setLiveSessionData(data);\n return data;\n}\n\n/**\n * Reset live session: fresh token, clear SPV + SPC.\n */\nexport function resetLiveSession(): LiveSessionData {\n const now = Date.now();\n const data: LiveSessionData = {\n enabled: true,\n sessionToken: generateSessionToken(),\n spv: {},\n spc: {},\n createdAt: now,\n lastActive: now,\n };\n setLiveSessionData(data);\n return data;\n}\n\n/**\n * Start a live session. Resumes if existing and not expired.\n * If expired (30+ min inactive), resets to a fresh session (matching storefront behavior).\n */\nexport function startLiveSession(): LiveSessionData {\n const existing = getLiveSessionData();\n if (existing.sessionToken && !isSessionExpired(existing)) {\n existing.enabled = true;\n existing.lastActive = Date.now();\n setLiveSessionData(existing);\n return existing;\n }\n // No session or expired — create fresh\n return resetLiveSession();\n}\n\n/**\n * Stop live session (pause). Token, SPV and SPC remain for potential resume.\n */\nexport function stopLiveSession(): LiveSessionData {\n const data = getLiveSessionData();\n data.enabled = false;\n setLiveSessionData(data);\n return data;\n}\n\n/**\n * Format token age as human-readable string.\n */\nexport function formatTokenAge(createdAt: number): string {\n if (!createdAt) return 'N/A';\n const totalMinutes = Math.floor((Date.now() - createdAt) / 60000);\n const days = Math.floor(totalMinutes / 1440);\n const hours = Math.floor((totalMinutes % 1440) / 60);\n const minutes = totalMinutes % 60;\n if (days > 0) return `${days}d ${hours}h`;\n if (hours > 0) return `${hours}h ${minutes}m`;\n return `${minutes}m`;\n}\n\n/**\n * Get user segment derived from token age.\n */\nexport function getUserSegmentFromToken(createdAt: number): 'new' | 'returning' {\n if (!createdAt) return 'new';\n return (Date.now() - createdAt) >= 24 * 60 * 60 * 1000 ? 'returning' : 'new';\n}\n"]}
|