diff --git a/app/lib/frontend/handlers/landing.dart b/app/lib/frontend/handlers/landing.dart index e484f1152b..4b0da1e9d5 100644 --- a/app/lib/frontend/handlers/landing.dart +++ b/app/lib/frontend/handlers/landing.dart @@ -43,6 +43,7 @@ Future indexLandingHandler(shelf.Request request) async { mostPopularPackages: topPackages.mostPopular(), topFlutterPackages: topPackages.topFlutter(), topDartPackages: topPackages.topDart(), + trendingPackages: topPackages.trending(), topPoWVideos: youtubeBackend.getTopPackageOfWeekVideos(count: 4), ); } diff --git a/app/lib/frontend/templates/landing.dart b/app/lib/frontend/templates/landing.dart index d57007ce93..1e616679f7 100644 --- a/app/lib/frontend/templates/landing.dart +++ b/app/lib/frontend/templates/landing.dart @@ -14,6 +14,7 @@ String renderLandingPage({ List? mostPopularPackages, List? topFlutterPackages, List? topDartPackages, + List? trendingPackages, List? topPoWVideos, }) { final content = landingPageNode( @@ -21,6 +22,7 @@ String renderLandingPage({ mostPopularPackages: mostPopularPackages, topFlutterPackages: topFlutterPackages, topDartPackages: topDartPackages, + trendingPackages: trendingPackages, topPoWVideos: topPoWVideos, ); return renderLayoutPage( diff --git a/app/lib/frontend/templates/views/landing/page.dart b/app/lib/frontend/templates/views/landing/page.dart index 5d9e798c7f..8784aaf858 100644 --- a/app/lib/frontend/templates/views/landing/page.dart +++ b/app/lib/frontend/templates/views/landing/page.dart @@ -4,6 +4,7 @@ import 'package:_pub_shared/search/search_form.dart'; import 'package:_pub_shared/search/tags.dart'; +import 'package:pub_dev/frontend/request_context.dart'; import '../../../../package/models.dart'; import '../../../../service/youtube/backend.dart'; @@ -20,6 +21,7 @@ d.Node landingPageNode({ List? mostPopularPackages, List? topFlutterPackages, List? topDartPackages, + List? trendingPackages, List? topPoWVideos, }) { return d.fragment([ @@ -34,7 +36,23 @@ d.Node landingPageNode({ viewAllEvent: 'landing-flutter-favorites-view-all', viewAllTitle: 'Search Flutter Favorites packages', ), - if (_isNotEmptyList(mostPopularPackages)) + if (requestContext.experimentalFlags.showTrending && + _isNotEmptyList(trendingPackages)) + _block( + shortId: 'mp', + image: d.Image.decorative( + src: staticUrls.getAssetUrl('/static/img/landing-01.webp'), + width: 351, + height: 240, + ), + title: 'Trending packages', + info: d.text('Some of the packages trending in the last 30 days'), + content: miniListNode('most-trending', trendingPackages!), + viewAllUrl: urls.listingByTrending(), + viewAllEvent: 'landing-trending-view-all', + viewAllTitle: 'Search trending packages', + ) + else if (_isNotEmptyList(mostPopularPackages)) _block( shortId: 'mp', image: d.Image.decorative( diff --git a/app/lib/search/top_packages.dart b/app/lib/search/top_packages.dart index 284fb88068..4c47ac4f8c 100644 --- a/app/lib/search/top_packages.dart +++ b/app/lib/search/top_packages.dart @@ -30,6 +30,8 @@ class TopPackages { ); final _mostPopular = _cachedValue('top-packages-most-popular', order: SearchOrder.downloads); + final _trending = + _cachedValue('top-packages-trending', order: SearchOrder.trending); final _topDart = _cachedValue('top-packages-top-dart', query: SdkTag.sdkDart); final _topFlutter = _cachedValue('top-packages-top-flutter', query: SdkTag.sdkFlutter); @@ -89,6 +91,10 @@ class TopPackages { return _randomSelection(_topFlutter, 6); } + List trending() { + return _randomSelection(_trending, 6); + } + List _randomSelection( CachedValue> cachedValue, int count) { if (!cachedValue.isAvailable) { diff --git a/app/lib/shared/urls.dart b/app/lib/shared/urls.dart index 1ae139c52e..5e32994361 100644 --- a/app/lib/shared/urls.dart +++ b/app/lib/shared/urls.dart @@ -206,6 +206,9 @@ String searchUrl({ String listingByDownloadCounts() => SearchForm(order: SearchOrder.downloads).toSearchLink(); +String listingByTrending() => + SearchForm(order: SearchOrder.trending).toSearchLink(); + String dartSdkMainUrl(String version) { final isDev = version.contains('dev'); final channel = isDev ? 'dev' : 'stable';