Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 16 additions & 29 deletions app/lib/frontend/handlers/account.dart
Original file line number Diff line number Diff line change
Expand Up @@ -332,43 +332,30 @@ Future<shelf.Response> accountMyLikedPackagesPageHandler(
return redirectResponse(request.requestedUri.path);
}

if (requestContext.experimentalFlags.useMyLikedSearch) {
// redirect to the search page when any search or pagination is present
final searchForm = SearchForm.parse(request.requestedUri.queryParameters);
if (searchForm.isNotEmpty) {
final redirectForm = searchForm.addRequiredTagIfAbsent(
AccountTag.isLikedByMe,
);
return redirectResponse(
redirectForm.toSearchLink(page: searchForm.currentPage),
);
}

final appliedSearchForm = SearchForm().toggleRequiredTag(
// redirect to the search page when any search or pagination is present
final searchForm = SearchForm.parse(request.requestedUri.queryParameters);
if (searchForm.isNotEmpty) {
final redirectForm = searchForm.addRequiredTagIfAbsent(
AccountTag.isLikedByMe,
);
final searchResult = await searchAdapter.search(
appliedSearchForm,
// Do not apply rate limit here.
rateLimitKey: null,
return redirectResponse(
redirectForm.toSearchLink(page: searchForm.currentPage),
);
final html = renderMyLikedPackagesPage(
user: user,
userSessionData: requestContext.sessionData!,
likes: null,
searchForm: appliedSearchForm,
searchResult: searchResult,
);
return htmlResponse(html);
}

final likes = await likeBackend.listPackageLikes(user.userId);
final appliedSearchForm = SearchForm().toggleRequiredTag(
AccountTag.isLikedByMe,
);
final searchResult = await searchAdapter.search(
appliedSearchForm,
// Do not apply rate limit here.
rateLimitKey: null,
);
final html = renderMyLikedPackagesPage(
user: user,
userSessionData: requestContext.sessionData!,
likes: likes,
searchForm: null,
searchResult: null,
searchForm: appliedSearchForm,
searchResult: searchResult,
);
return htmlResponse(html);
}
Expand Down
6 changes: 0 additions & 6 deletions app/lib/frontend/handlers/experimental.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,6 @@ typedef PublicFlag = ({String name, String description});

const _publicFlags = <PublicFlag>{
(name: 'example', description: 'Short description'),
(
name: 'my-liked-search',
description: 'New "My liked packages" page and search.',
),
};

final _allFlags = <String>{
Expand Down Expand Up @@ -92,8 +88,6 @@ class ExperimentalFlags {

bool get isDarkModeDefault => isEnabled('dark-as-default');

bool get useMyLikedSearch => true;

String encodedAsCookie() => _enabled.join(':');

@override
Expand Down
50 changes: 18 additions & 32 deletions app/lib/frontend/templates/admin.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import 'package:_pub_shared/search/search_form.dart';
import 'package:pub_dev/frontend/templates/listing.dart';
import 'package:pub_dev/package/search_adapter.dart';

import '../../account/models.dart' show LikeData, User, SessionData;
import '../../account/models.dart' show User, SessionData;
import '../../audit/models.dart';
import '../../frontend/templates/views/account/activity_log_table.dart';
import '../../package/models.dart';
Expand All @@ -19,7 +19,6 @@ import '_consts.dart';
import 'detail_page.dart';
import 'layout.dart';
import 'views/account/authorized.dart';
import 'views/pkg/liked_package_list.dart';
import 'views/pkg/package_list.dart';
import 'views/publisher/publisher_list.dart';

Expand Down Expand Up @@ -100,37 +99,24 @@ String renderAccountPackagesPage({
String renderMyLikedPackagesPage({
required User user,
required SessionData userSessionData,
required List<LikeData>? likes,
required SearchForm? searchForm,
required SearchResultPage? searchResult,
required SearchForm searchForm,
required SearchResultPage searchResult,
}) {
late d.Node tabContent;
if (likes != null) {
final resultCount = likes.isNotEmpty
? d.p(
text:
'You like ${likes.length} ${likes.length == 1 ? 'package' : 'packages'}.',
)
: d.p(text: 'You have not liked any packages yet.');

tabContent = d.fragment([resultCount, likedPackageListNode(likes)]);
} else {
final infoNode = listingInfo(
searchForm: searchForm!,
totalCount: searchResult!.totalCount,
title: 'My liked packages',
messageFromBackend: searchResult.errorMessage,
);
final listNode = packageList(searchResult);
final pagination = searchResult.hasHit
? paginationNode(PageLinks(searchForm, searchResult.totalCount))
: null;
tabContent = d.fragment([
infoNode,
listNode,
if (pagination != null) pagination,
]);
}
final infoNode = listingInfo(
searchForm: searchForm,
totalCount: searchResult.totalCount,
title: 'My liked packages',
messageFromBackend: searchResult.errorMessage,
);
final listNode = packageList(searchResult);
final pagination = searchResult.hasHit
? paginationNode(PageLinks(searchForm, searchResult.totalCount))
: null;
final tabContent = d.fragment([
infoNode,
listNode,
if (pagination != null) pagination,
]);

final content = renderDetailPage(
headerNode: _accountDetailHeader(user, userSessionData),
Expand Down
61 changes: 0 additions & 61 deletions app/lib/frontend/templates/views/pkg/liked_package_list.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,71 +4,10 @@

import 'package:_pub_shared/format/number_format.dart';

import '../../../../account/models.dart';
import '../../../../shared/urls.dart' as urls;

import '../../../dom/dom.dart' as d;
import '../../../dom/material.dart' as material;
import '../../../static_files.dart' show staticUrls;

/// Renders the package list of /my-liked-packages page.
d.Node likedPackageListNode(List<LikeData> likes) {
final thumbUpOutlinedUrl = staticUrls.getAssetUrl(
'/static/img/thumb-up-24px.svg',
);
final thumbUpFilledUrl = staticUrls.getAssetUrl(
'/static/img/thumb-up-filled-24px.svg',
);
return d.div(
classes: ['packages', '-compact'],
children: likes.map(
(like) => d.div(
classes: ['packages-item'],
children: [
d.div(
classes: ['packages-header'],
children: [
d.h3(
classes: ['packages-title'],
child: d.a(
href: urls.pkgPageUrl(like.package!),
text: like.package,
),
),
d.div(
classes: ['packages-icons'],
child: material.button(
unelevated: true,
customTypeClass: '-pub-like-button',
attributes: {
'data-package': like.package!,
'data-thumb_up_outlined': thumbUpOutlinedUrl,
'data-thumb_up_filled': thumbUpFilledUrl,
},
icon: d.Image(
src: thumbUpFilledUrl,
alt: 'thumb up',
width: 24,
height: 24,
),
label: 'Unlike',
),
),
],
),
d.p(
classes: ['packages-metadata'],
children: [
d.text(' Liked '),
d.xAgoTimestamp(like.created!, datePrefix: 'on'),
],
),
],
),
),
);
}

d.Node renderLikeButtonAndLabel({
required String package,
required int likeCount,
Expand Down
10 changes: 4 additions & 6 deletions app/lib/frontend/templates/views/pkg/package_list.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import 'package:_pub_shared/format/x_ago_format.dart';
import 'package:_pub_shared/search/search_form.dart';
import 'package:_pub_shared/search/tags.dart';
import 'package:clock/clock.dart';
import 'package:pub_dev/frontend/request_context.dart';
import 'package:pub_dev/frontend/templates/views/pkg/liked_package_list.dart';

import '../../../../package/models.dart';
Expand Down Expand Up @@ -35,11 +34,10 @@ d.Node listOfPackagesNode({
? null
: nameMatches.first;
final listingPackagesLikedByMe =
requestContext.experimentalFlags.useMyLikedSearch &&
(searchForm?.parsedQuery.tagsPredicate.isRequiredTag(
AccountTag.isLikedByMe,
) ??
false);
searchForm?.parsedQuery.tagsPredicate.isRequiredTag(
AccountTag.isLikedByMe,
) ??
false;
return d.div(
classes: ['packages'],
children: [
Expand Down
6 changes: 2 additions & 4 deletions app/lib/search/search_client.dart
Original file line number Diff line number Diff line change
Expand Up @@ -75,11 +75,9 @@ class SearchClient {
if (hasLikedByMeTag) {
skipCache = true;
}
final useLikedByMe =
hasLikedByMeTag && requestContext.experimentalFlags.useMyLikedSearch;

List<String>? packages;
if (userId != null && useLikedByMe) {
if (userId != null && hasLikedByMeTag) {
final likedPackages = await likeBackend.listPackageLikes(userId);
packages = likedPackages.map((l) => l.package!).toList();
}
Expand All @@ -93,7 +91,7 @@ class SearchClient {
return await withRetryHttpClient(
(client) async {
var data = query.toSearchRequestData();
if (userId != null && useLikedByMe) {
if (userId != null && hasLikedByMeTag) {
final newQuery = data.query
?.replaceAll(AccountTag.isLikedByMe, ' ')
.trim();
Expand Down
Loading