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
19 changes: 11 additions & 8 deletions app/lib/frontend/handlers/experimental.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,18 @@ import 'package:meta/meta.dart';

import '../../shared/cookie_utils.dart';

const _publicFlags = <String>{
'dark',
'download-counts',
'search-completion',
'search-topics',
typedef PublicFlag = ({String name, String description});

const _publicFlags = <PublicFlag>{
(name: 'dark', description: 'Dark mode'),
(name: 'download-counts', description: 'Download count metrics'),
(name: 'search-completion', description: 'Completions for the search bar'),
(name: 'search-topics', description: 'Show matching topics when searching'),
};

const _allFlags = <String>{
final _allFlags = <String>{
'dark-as-default',
..._publicFlags,
..._publicFlags.map((x) => x.name),
};

/// The name of the experimental cookie.
Expand All @@ -33,7 +35,8 @@ class ExperimentalFlags {
ExperimentalFlags(Set<String> enabled)
: _enabled = enabled.intersection(_allFlags);

static final List<String> publicFlags = _publicFlags.toList()..sort();
static final List<PublicFlag> publicFlags = _publicFlags.toList()
..sort((a, b) => a.name.compareTo(b.name));
static final ExperimentalFlags empty = ExperimentalFlags(const {});

factory ExperimentalFlags.parseFromCookie(String? value) {
Expand Down
45 changes: 32 additions & 13 deletions app/lib/frontend/handlers/misc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -204,29 +204,48 @@ Future<shelf.Response> experimentalHandler(shelf.Request request) async {

final clearUri = Uri(
path: '/experimental', queryParameters: flags.urlParametersForToggle());
final clearLink = flags.isEmpty ? '' : '(<a href="$clearUri">clear</a>).';
final publicBlock = ExperimentalFlags.publicFlags.map((f) {
final change = flags.isEnabled(f) ? '0' : '1';
final uri = Uri(path: '/experimental', queryParameters: {f: change});
return '<a href="$uri">toggle: <b>$f</b></a><br />';
}).join();
final clearLink = flags.isEmpty ? '' : '(<a href="$clearUri">clear all</a>).';
final publicBlock = '''
<ul>
${ExperimentalFlags.publicFlags.map((f) {
final change = flags.isEnabled(f.name) ? '0' : '1';
final uri = Uri(path: '/experimental', queryParameters: {f.name: change});
return '<li><b>${f.description}</b> <a href="$uri">(toggle)</a>';
}).join()}
</ul>
''';
return htmlResponse('''
<!doctype html>
<html>
<head>
<meta http-equiv="refresh" content="15; url=/">
<meta name="robots" content="noindex" />
</head>
<body>
<center>
<h1>Experiments</h1>
<p>
Experiments are not an official part of the pub.dev site.
<p>
They showcase features we are working on, that are not yet ready for
deployment, and might still not:
<ul>
<li> work fully or as expected,
<li> be well documented,
<li> have good accesibility,
<li> have the final polished styling.
</ul>
<p>
Enable experiments at your own discresion.
<p>
An experiment is no promise of an actual later launch of that given feature.
<p>
Still, feel free to provide feedback on the
<a href="https://github.com/dart-lang/pub-dev/issues">issue tracker</a>.
Be sure to mention what experiments were enabled.
<p>
Experiments enabled: <b>$flags</b><br>$clearLink
</p>
<p>$publicBlock</p>
<p>$publicBlock
<p>
(redirecting to <a href="/">pub.dev</a> in 15 seconds).
</p>
</center>
After enabling experiments go back to <a href="/">pub.dev</a>.
</body>
</html>''', headers: {
HttpHeaders.setCookieHeader: buildSetCookieValue(
Expand Down
Loading