@@ -285,7 +285,14 @@ function npmQueryOptions({
285285 }
286286
287287 return queryOptions ( {
288- queryKey : [ 'npm-stats' , packageGroups , range ] ,
288+ queryKey : [
289+ 'npm-stats' ,
290+ packageGroups . map ( ( pg ) => ( {
291+ packages : pg . packages . map ( ( p ) => ( { name : p . name } ) ) ,
292+ baseline : pg . baseline ,
293+ } ) ) ,
294+ range ,
295+ ] ,
289296 queryFn : async ( ) : Promise < NpmQueryData > => {
290297 // For all-time range, get the earliest creation date
291298 if ( range === 'all-time' ) {
@@ -548,12 +555,18 @@ function NpmStatsChart({
548555
549556 startDate = binOption . bin . floor ( startDate )
550557
551- const combinedPackageGroups = queryData . map ( ( packageGroup ) => {
558+ const combinedPackageGroups = queryData . map ( ( packageGroup , index ) => {
559+ // Get the corresponding package group from the packages prop to get the hidden state
560+ const packageGroupWithHidden = packages [ index ]
561+
552562 // Filter out any sub packages that are hidden before
553563 // summing them into a unified downloads count
554- const visiblePackages = packageGroup . packages . filter (
555- ( p , i ) => ! i || ! p . hidden ,
556- )
564+ const visiblePackages = packageGroup . packages . filter ( ( p , i ) => {
565+ const hiddenState = packageGroupWithHidden ?. packages . find (
566+ ( pg ) => pg . name === p . name ,
567+ ) ?. hidden
568+ return ! i || ! hiddenState
569+ } )
557570
558571 const downloadsByDate : Map < number , number > = new Map ( )
559572
@@ -645,9 +658,11 @@ function NpmStatsChart({
645658 } )
646659
647660 // Filter out any top-level hidden packages
648- const filteredPackageData = correctedPackageData . filter (
649- ( pkg ) => ! pkg . baseline && ! pkg . packages [ 0 ] . hidden ,
650- )
661+ const filteredPackageData = correctedPackageData . filter ( ( pkg , index ) => {
662+ const packageGroupWithHidden = packages [ index ]
663+ const isHidden = packageGroupWithHidden ?. packages [ 0 ] ?. hidden
664+ return ! pkg . baseline && ! isHidden
665+ } )
651666
652667 const plotData = filteredPackageData . flatMap ( ( d ) => d . downloads )
653668
@@ -1816,7 +1831,7 @@ function RouteComponent() {
18161831 < div className = "" >
18171832 < div className = "space-y-2 sm:space-y-4" >
18181833 < div className = "relative" >
1819- { npmQuery . isFetching ? (
1834+ { npmQuery . isFetching && npmQuery . data ? (
18201835 < div className = "absolute inset-0 flex items-center justify-center bg-white/30 dark:bg-black/30 backdrop-blur-sm z-10 rounded-lg" >
18211836 < div className = "flex flex-col items-center gap-4" >
18221837 < FaSpinner className = "w-8 h-8 animate-spin text-blue-500" />
@@ -1827,16 +1842,30 @@ function RouteComponent() {
18271842 </ div >
18281843 ) : null }
18291844 < Resizable height = { height } onHeightChange = { onHeightChange } >
1830- < NpmStatsChart
1831- range = { range }
1832- queryData = { npmQuery . data }
1833- transform = { transform }
1834- binType = { binType }
1835- packages = { packageGroups }
1836- facetX = { facetX }
1837- facetY = { facetY }
1838- showDataMode = { showDataModeParam }
1839- />
1845+ { npmQuery . isLoading ? (
1846+ < div
1847+ className = "flex items-center justify-center"
1848+ style = { { height } }
1849+ >
1850+ < div className = "flex flex-col items-center gap-4" >
1851+ < FaSpinner className = "w-8 h-8 animate-spin text-blue-500" />
1852+ < div className = "text-sm text-gray-600 dark:text-gray-400" >
1853+ Loading download statistics...
1854+ </ div >
1855+ </ div >
1856+ </ div >
1857+ ) : (
1858+ < NpmStatsChart
1859+ range = { range }
1860+ queryData = { npmQuery . data }
1861+ transform = { transform }
1862+ binType = { binType }
1863+ packages = { packageGroups }
1864+ facetX = { facetX }
1865+ facetY = { facetY }
1866+ showDataMode = { showDataModeParam }
1867+ />
1868+ ) }
18401869 </ Resizable >
18411870 </ div >
18421871 < div className = "overflow-x-auto rounded-xl" >
0 commit comments