Skip to content

Commit b981933

Browse files
Replace Featured shelves with Recommended shelves (#8091)
1 parent aa7c2de commit b981933

File tree

9 files changed

+220
-148
lines changed

9 files changed

+220
-148
lines changed

src/amo/constants.js

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,7 @@ export type FlagReviewReasonType =
1414
| typeof REVIEW_FLAG_REASON_BUG_SUPPORT
1515
| typeof REVIEW_FLAG_REASON_OTHER;
1616

17-
// Number of total featured add-ons to load.
18-
export const FEATURED_ADDONS_TO_LOAD = 25;
19-
20-
// Number of add-ons in the featured, trending, and highest rated landing page
17+
// Number of add-ons in the recommended, trending, and highest rated landing page
2118
// sections.
2219
export const LANDING_PAGE_EXTENSION_COUNT = 4;
2320
export const LANDING_PAGE_THEME_COUNT = 3;

src/amo/pages/LandingPage/index.js

Lines changed: 41 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919
INSTALL_SOURCE_FEATURED,
2020
INSTALL_SOURCE_TOP_RATED,
2121
INSTALL_SOURCE_TRENDING,
22+
SEARCH_SORT_RANDOM,
2223
SEARCH_SORT_TRENDING,
2324
SEARCH_SORT_TOP_RATED,
2425
} from 'core/constants';
@@ -45,7 +46,7 @@ export class LandingPageBase extends React.Component {
4546
context: PropTypes.string.isRequired,
4647
dispatch: PropTypes.func.isRequired,
4748
errorHandler: PropTypes.object.isRequired,
48-
featuredAddons: PropTypes.array.isRequired,
49+
recommendedAddons: PropTypes.array.isRequired,
4950
highlyRatedAddons: PropTypes.array.isRequired,
5051
loading: PropTypes.bool.isRequired,
5152
trendingAddons: PropTypes.array.isRequired,
@@ -125,28 +126,38 @@ export class LandingPageBase extends React.Component {
125126
}
126127

127128
contentForType = (visibleAddonType) => {
128-
const { i18n } = this.props;
129+
const { _config, i18n } = this.props;
129130
const addonType = apiAddonType(visibleAddonType);
130-
const themeFilter = getAddonTypeFilter(ADDON_TYPE_THEME, {
131-
_config: this.props._config,
132-
});
131+
const themeFilter = getAddonTypeFilter(ADDON_TYPE_THEME, { _config });
132+
const enableFeatureRecommendedBadges = _config.get(
133+
'enableFeatureRecommendedBadges',
134+
);
133135

134136
const contentForTypes = {
135137
[ADDON_TYPE_EXTENSION]: {
136-
featuredHeader: i18n.gettext('Featured extensions'),
137-
featuredFooterLink: {
138+
recommendedHeader: enableFeatureRecommendedBadges
139+
? i18n.gettext('Recommended extensions')
140+
: i18n.gettext('Featured extensions'),
141+
recommendedFooterLink: {
138142
pathname: '/search/',
139143
query: {
140144
addonType: ADDON_TYPE_EXTENSION,
141-
featured: true,
145+
featured: enableFeatureRecommendedBadges ? undefined : true,
146+
recommended: enableFeatureRecommendedBadges ? true : undefined,
147+
sort: enableFeatureRecommendedBadges
148+
? SEARCH_SORT_RANDOM
149+
: undefined,
142150
},
143151
},
144-
featuredFooterText: i18n.gettext('See more featured extensions'),
152+
recommendedFooterText: enableFeatureRecommendedBadges
153+
? i18n.gettext('See more recommended extensions')
154+
: i18n.gettext('See more featured extensions'),
145155
trendingHeader: i18n.gettext('Trending extensions'),
146156
trendingFooterLink: {
147157
pathname: '/search/',
148158
query: {
149159
addonType: ADDON_TYPE_EXTENSION,
160+
recommended: enableFeatureRecommendedBadges ? true : undefined,
150161
sort: SEARCH_SORT_TRENDING,
151162
},
152163
},
@@ -156,21 +167,30 @@ export class LandingPageBase extends React.Component {
156167
pathname: '/search/',
157168
query: {
158169
addonType: ADDON_TYPE_EXTENSION,
170+
recommended: enableFeatureRecommendedBadges ? true : undefined,
159171
sort: SEARCH_SORT_TOP_RATED,
160172
},
161173
},
162174
highlyRatedFooterText: i18n.gettext('See more top rated extensions'),
163175
},
164176
[ADDON_TYPE_THEME]: {
165-
featuredHeader: i18n.gettext('Featured themes'),
166-
featuredFooterLink: {
177+
recommendedHeader: enableFeatureRecommendedBadges
178+
? i18n.gettext('Recommended themes')
179+
: i18n.gettext('Featured themes'),
180+
recommendedFooterLink: {
167181
pathname: '/search/',
168182
query: {
169183
addonType: themeFilter,
170-
featured: true,
184+
featured: enableFeatureRecommendedBadges ? undefined : true,
185+
recommended: enableFeatureRecommendedBadges ? true : undefined,
186+
sort: enableFeatureRecommendedBadges
187+
? SEARCH_SORT_RANDOM
188+
: undefined,
171189
},
172190
},
173-
featuredFooterText: i18n.gettext('See more featured themes'),
191+
recommendedFooterText: enableFeatureRecommendedBadges
192+
? i18n.gettext('See more recommended themes')
193+
: i18n.gettext('See more featured themes'),
174194
trendingHeader: i18n.gettext('Trending themes'),
175195
trendingFooterLink: {
176196
pathname: '/search/',
@@ -219,7 +239,7 @@ export class LandingPageBase extends React.Component {
219239
render() {
220240
const {
221241
errorHandler,
222-
featuredAddons,
242+
recommendedAddons,
223243
highlyRatedAddons,
224244
i18n,
225245
loading,
@@ -278,14 +298,14 @@ export class LandingPageBase extends React.Component {
278298
</Button>
279299

280300
{this.renderIfNotEmpty(
281-
featuredAddons,
301+
recommendedAddons,
282302
<LandingAddonsCard
283303
addonInstallSource={INSTALL_SOURCE_FEATURED}
284-
addons={featuredAddons}
285-
className="FeaturedAddons"
286-
footerText={html.featuredFooterText}
287-
footerLink={html.featuredFooterLink}
288-
header={html.featuredHeader}
304+
addons={recommendedAddons}
305+
className="RecommendedAddons"
306+
footerText={html.recommendedFooterText}
307+
footerLink={html.recommendedFooterLink}
308+
header={html.recommendedHeader}
289309
isTheme={isAddonTheme}
290310
loading={loading}
291311
/>,
@@ -327,7 +347,7 @@ export function mapStateToProps(state) {
327347
return {
328348
addonTypeOfResults: landing.addonType,
329349
context: viewContext.context,
330-
featuredAddons: landing.featured.results,
350+
recommendedAddons: landing.recommended.results,
331351
highlyRatedAddons: landing.highlyRated.results,
332352
loading: landing.loading,
333353
trendingAddons: landing.trending.results,

src/amo/reducers/landing.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ type ExternalResultSet = {|
2121
export type LandingState = {|
2222
addonType: string | null,
2323
category: string | null,
24-
featured: ResultSet,
24+
recommended: ResultSet,
2525
highlyRated: ResultSet,
2626
loading: boolean,
2727
resultsLoaded: boolean,
@@ -31,7 +31,7 @@ export type LandingState = {|
3131
export const initialState: LandingState = {
3232
addonType: null,
3333
category: null,
34-
featured: { count: 0, results: [] },
34+
recommended: { count: 0, results: [] },
3535
highlyRated: { count: 0, results: [] },
3636
loading: false,
3737
trending: { count: 0, results: [] },
@@ -72,7 +72,7 @@ export function getLanding({
7272

7373
type LoadLandingParams = {|
7474
addonType: string,
75-
featured: ExternalResultSet,
75+
recommended: ExternalResultSet,
7676
highlyRated: ExternalResultSet,
7777
trending: ExternalResultSet,
7878
|};
@@ -84,18 +84,18 @@ type LoadLandingAction = {|
8484

8585
export function loadLanding({
8686
addonType,
87-
featured,
87+
recommended,
8888
highlyRated,
8989
trending,
9090
}: LoadLandingParams): LoadLandingAction {
9191
invariant(addonType, 'addonType is required');
92-
invariant(featured, 'featured is required');
92+
invariant(recommended, 'recommended is required');
9393
invariant(highlyRated, 'highlyRated is required');
9494
invariant(trending, 'trending is required');
9595

9696
return {
9797
type: LOAD_LANDING,
98-
payload: { addonType, featured, highlyRated, trending },
98+
payload: { addonType, recommended, highlyRated, trending },
9999
};
100100
}
101101

@@ -122,7 +122,7 @@ export default function reducer(
122122

123123
const newState = { ...state, loading: false, resultsLoaded: true };
124124

125-
['featured', 'highlyRated', 'trending'].forEach((key) => {
125+
['recommended', 'highlyRated', 'trending'].forEach((key) => {
126126
if (payload[key]) {
127127
newState[key] = {
128128
count: payload[key].count,

src/amo/sagas/landing.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,12 @@ export function* fetchLandingAddons({
4848
filters = { ...filters, category };
4949
}
5050

51-
const featuredParams: SearchParams = {
51+
const recommendedParams: SearchParams = {
5252
api,
5353
filters: {
5454
...filters,
55-
featured: true,
55+
featured: enableFeatureRecommendedBadges ? undefined : true,
56+
recommended: enableFeatureRecommendedBadges ? true : undefined,
5657
sort: SEARCH_SORT_RANDOM,
5758
page: '1',
5859
},
@@ -74,16 +75,16 @@ export function* fetchLandingAddons({
7475
},
7576
};
7677

77-
const [featured, highlyRated, trending] = yield all([
78-
call(searchApi, featuredParams),
78+
const [recommended, highlyRated, trending] = yield all([
79+
call(searchApi, recommendedParams),
7980
call(searchApi, highlyRatedParams),
8081
call(searchApi, trendingParams),
8182
]);
8283

8384
yield put(
8485
loadLanding({
8586
addonType,
86-
featured,
87+
recommended,
8788
highlyRated,
8889
trending,
8990
}),

src/core/reducers/versions.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -520,10 +520,10 @@ const reducer = (
520520
}
521521

522522
case LOAD_LANDING: {
523-
const { featured, highlyRated, trending } = action.payload;
523+
const { recommended, highlyRated, trending } = action.payload;
524524

525525
const newVersions = {};
526-
for (const apiResponse of [featured, highlyRated, trending]) {
526+
for (const apiResponse of [recommended, highlyRated, trending]) {
527527
for (const addon of apiResponse.results) {
528528
if (addon.current_version) {
529529
const version = createInternalVersion(addon.current_version);

0 commit comments

Comments
 (0)