diff --git a/App.tsx b/App.tsx index 5d89790..f7fb492 100644 --- a/App.tsx +++ b/App.tsx @@ -532,11 +532,14 @@ const App: React.FC = () => { console.log('[App] Metadata ready'); + console.time('filteredData'); const filteredData = useMemo(() => filterData(rawData, deferredFilters, stockMap, vendorStockMap, top50Mode), [rawData, deferredFilters, stockMap, vendorStockMap, top50Mode]); + console.timeEnd('filteredData'); + + console.time('filteredAdsData'); const filteredAdsData = useMemo(() => filterAdsData(adsData, deferredFilters, globalAsinMetadata, stockMap, vendorStockMap, top50Mode), [adsData, deferredFilters, globalAsinMetadata, stockMap, vendorStockMap, top50Mode]); + console.timeEnd('filteredAdsData'); - // MKT tab: ads without PAN_EU default restriction — includes all countries unless - // the user explicitly selects a marketplace filter const mktAdsData = useMemo(() => adsData.filter(ad => { const countryMatch = deferredFilters.customer.length === 0 ? true @@ -545,56 +548,19 @@ const App: React.FC = () => { const weekMatch = deferredFilters.week.length === 0 || deferredFilters.week.includes(`W${ad.week}`); return countryMatch && yearMatch && weekMatch; }), [adsData, deferredFilters.customer, deferredFilters.year, deferredFilters.week]); + + console.time('aggregatedData'); const aggregatedData = useMemo(() => aggregateData(filteredData), [filteredData]); + console.timeEnd('aggregatedData'); - // Calculate country-aware Top 50 Best Sellers for 2025 - const top50Ranking2025 = useMemo(() => { - // Filter only 2025 data - const data2025 = rawData.filter(r => r.year === 2025); - - const calculateTop50 = (entries: SalesRecord[]) => { - const asinTotals = new Map(); - entries.forEach(r => { - const asin = r.asin.trim().toUpperCase(); - asinTotals.set(asin, (asinTotals.get(asin) || 0) + r.sellOut); - }); - - const sorted = Array.from(asinTotals.entries()) - .sort((a, b) => b[1] - a[1]) - .slice(0, 50); - - const rankMap = new Map(); - sorted.forEach(([asin], index) => { - rankMap.set(asin, index + 1); - }); - return rankMap; - }; - - const euData = data2025.filter(r => !r.customer.toLowerCase().includes('uk')); - const ukData = data2025.filter(r => r.customer.toLowerCase().includes('uk')); - - return { - eu: calculateTop50(euData), - uk: calculateTop50(ukData) - }; - }, [rawData]); - - // Determine which dataset to use for velocity calculation based on top50Mode - - // Derived Data for Vendor (BSR) - const filteredBsrData = useMemo(() => { - return filterBsrData(bsrData, deferredFilters, globalAsinMetadata, stockMap, vendorStockMap, top50Mode); - }, [bsrData, deferredFilters, globalAsinMetadata, stockMap, vendorStockMap, top50Mode]); - - // Combine Sales & Ads Data dynamically based on current filters + console.time('combinedAdsData'); const combinedAdsData = useMemo(() => { return mergeSalesAndAdsData(filteredData, filteredAdsData, globalAsinMetadata, trafficData, velocityMap, filteredBsrData); }, [filteredData, filteredAdsData, globalAsinMetadata, trafficData, velocityMap, filteredBsrData]); + console.timeEnd('combinedAdsData'); - // Unfiltered combined data for Experiment calculations (so they aren't affected by UI filters) - const unfilteredCombinedData = useMemo(() => { - return mergeSalesAndAdsData(rawData, adsData, globalAsinMetadata, trafficData, velocityMap, bsrData); - }, [rawData, adsData, globalAsinMetadata, trafficData, velocityMap, bsrData]); + // Defer or remove unfilteredCombinedData to save memory on initialization + const unfilteredCombinedData = null; // Derived Data for Grid (YTD Filtered - Isolated) // 1. Identify "Current Year" max week diff --git a/index.tsx b/index.tsx index 0001c9a..a28080f 100644 --- a/index.tsx +++ b/index.tsx @@ -10,9 +10,7 @@ if (!rootElement) { const root = ReactDOM.createRoot(rootElement); root.render( - - - - - + + + ); \ No newline at end of file