Skip to content

Commit cc38c17

Browse files
Remove the parsePage helper function (#4503)
We do not need the functionality of parsePage on the frontend because it is fine to pass `undefined` for `page` into API calls, and in fact we want to do that so the API will produce a 404 for us.
1 parent b5c242e commit cc38c17

12 files changed

Lines changed: 30 additions & 75 deletions

File tree

src/amo/components/AddonReviewList/index.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import { fetchAddon, getAddonBySlug } from 'core/reducers/addons';
1616
import Paginate from 'core/components/Paginate';
1717
import { withFixedErrorHandler } from 'core/errorHandler';
1818
import translate from 'core/i18n/translate';
19-
import { parsePage, sanitizeHTML } from 'core/utils';
19+
import { sanitizeHTML } from 'core/utils';
2020
import { getAddonIconUrl } from 'core/imageUtils';
2121
import log from 'core/logger';
2222
import Link from 'amo/components/Link';
@@ -117,8 +117,7 @@ export class AddonReviewListBase extends React.Component<Props> {
117117
}
118118

119119
getCurrentPage() {
120-
const { location } = this.props;
121-
return parsePage(location.query.page);
120+
return this.props.location.query.page || 1;
122121
}
123122

124123
onReviewSubmitted = () => {
@@ -320,7 +319,7 @@ export function mapStateToProps(state: AppState, ownProps: Props) {
320319
export const extractId = (ownProps: Props) => {
321320
const { location, params } = ownProps.router;
322321

323-
return `${params.addonSlug}-${parsePage(location.query.page)}`;
322+
return `${params.addonSlug}-${location.query.page || ''}`;
324323
};
325324

326325
export default compose(

src/amo/components/Collection/index.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import { openFormOverlay } from 'core/reducers/formOverlay';
2525
import log from 'core/logger';
2626
import { hasPermission } from 'amo/reducers/users';
2727
import translate from 'core/i18n/translate';
28-
import { parsePage, sanitizeHTML } from 'core/utils';
28+
import { sanitizeHTML } from 'core/utils';
2929
import Card from 'ui/components/Card';
3030
import LoadingText from 'ui/components/LoadingText';
3131
import MetadataCard from 'ui/components/MetadataCard';
@@ -112,7 +112,7 @@ export class CollectionBase extends React.Component<Props> {
112112
if (!collection || collectionChanged) {
113113
this.props.dispatch(fetchCurrentCollection({
114114
errorHandlerId: errorHandler.id,
115-
page: parsePage(location.query.page),
115+
page: location.query.page,
116116
slug: params.slug,
117117
user: params.user,
118118
}));
@@ -123,7 +123,7 @@ export class CollectionBase extends React.Component<Props> {
123123
if (collection && addonsPageChanged) {
124124
this.props.dispatch(fetchCurrentCollectionPage({
125125
errorHandlerId: errorHandler.id,
126-
page: parsePage(location.query.page),
126+
page: location.query.page,
127127
slug: params.slug,
128128
user: params.user,
129129
}));
@@ -218,7 +218,7 @@ export class CollectionBase extends React.Component<Props> {
218218
<Paginate
219219
LinkComponent={Link}
220220
count={collection.numberOfAddons}
221-
currentPage={parsePage(location.query.page)}
221+
currentPage={location.query.page}
222222
pathname={this.url()}
223223
/>
224224
)}
@@ -284,7 +284,7 @@ export const extractId = (ownProps: Props) => {
284284
return [
285285
ownProps.params.user,
286286
ownProps.params.slug,
287-
parsePage(ownProps.location.query.page),
287+
ownProps.location.query.page,
288288
].join('/');
289289
};
290290

src/amo/components/Search/index.js

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import {
2929
convertFiltersToQueryParams,
3030
hasSearchFilters,
3131
} from 'core/searchUtils';
32-
import { parsePage } from 'core/utils';
3332

3433
import './styles.scss';
3534

@@ -191,8 +190,6 @@ export class SearchBase extends React.Component {
191190
}
192191
}
193192

194-
const page = parsePage(filters.page);
195-
196193
// We allow specific paginationQueryParams instead of always using
197194
// convertFiltersToQueryParams(filters) so certain search filters
198195
// aren't repeated if they are elsewhere in the URL. This is useful
@@ -209,7 +206,7 @@ export class SearchBase extends React.Component {
209206
<Paginate
210207
LinkComponent={LinkComponent}
211208
count={count}
212-
currentPage={page}
209+
currentPage={filters.page}
213210
pathname={pathname}
214211
queryParams={queryParams}
215212
/>
@@ -254,7 +251,7 @@ export function mapStateToProps(state) {
254251
// This ID does not need to differentiate between component instances because
255252
// the error handler gets cleared every time the search filters change.
256253
export const extractId = (ownProps) => {
257-
return parsePage(ownProps.filters.page);
254+
return ownProps.filters.page;
258255
};
259256

260257
export default compose(

src/core/utils/index.js

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -288,11 +288,6 @@ export function getCategoryColor(category) {
288288
return category.id;
289289
}
290290

291-
export function parsePage(page) {
292-
const parsed = parseInt(page, 10);
293-
return Number.isNaN(parsed) || parsed < 1 ? 1 : parsed;
294-
}
295-
296291
export function addonHasVersionHistory(addon) {
297292
if (!addon) {
298293
throw new Error('addon is required');

tests/unit/amo/api/test_collections.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import {
88
listCollections,
99
updateCollection,
1010
} from 'amo/api/collections';
11-
import { parsePage } from 'core/utils';
1211
import { apiResponsePage, createApiResponse } from 'tests/unit/helpers';
1312
import {
1413
createFakeCollectionAddons,
@@ -94,7 +93,7 @@ describe(__filename, () => {
9493
});
9594

9695
it('calls the collection add-ons list API', async () => {
97-
const queryParams = { page: parsePage(1) };
96+
const queryParams = { page: 1 };
9897
const params = getParams({ ...queryParams });
9998

10099
mockApi

tests/unit/amo/components/TestAddonReviewList.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -668,7 +668,7 @@ describe(__filename, () => {
668668
location: fakeRouterLocation(),
669669
});
670670

671-
expect(extractId(ownProps)).toEqual(`foobar-1`);
671+
expect(extractId(ownProps)).toEqual(`foobar-`);
672672
});
673673
});
674674
});

tests/unit/amo/components/TestCollection.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ describe(__filename, () => {
121121
sinon.assert.callCount(fakeDispatch, 1);
122122
sinon.assert.calledWith(fakeDispatch, fetchCurrentCollection({
123123
errorHandlerId: errorHandler.id,
124-
page: 1,
124+
page: undefined,
125125
slug,
126126
user,
127127
}));
@@ -351,7 +351,7 @@ describe(__filename, () => {
351351
sinon.assert.callCount(fakeDispatch, 1);
352352
sinon.assert.calledWith(fakeDispatch, fetchCurrentCollection({
353353
errorHandlerId: errorHandler.id,
354-
page: 1,
354+
page: undefined,
355355
...newParams,
356356
}));
357357
});
@@ -402,7 +402,7 @@ describe(__filename, () => {
402402
sinon.assert.callCount(fakeDispatch, 1);
403403
sinon.assert.calledWith(fakeDispatch, fetchCurrentCollection({
404404
errorHandlerId: errorHandler.id,
405-
page: 1,
405+
page: undefined,
406406
...newParams,
407407
}));
408408
});
@@ -619,7 +619,7 @@ describe(__filename, () => {
619619
location: fakeRouterLocation(),
620620
});
621621

622-
expect(extractId(props)).toEqual('foo/collection-bar/1');
622+
expect(extractId(props)).toEqual('foo/collection-bar/');
623623
});
624624

625625
it('adds the page as part of unique ID', () => {

tests/unit/amo/components/TestSearch.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,7 @@ describe(__filename, () => {
360360
},
361361
};
362362

363-
expect(extractId(ownProps)).toEqual(1);
363+
expect(extractId(ownProps)).toEqual(undefined);
364364
});
365365
});
366366
});

tests/unit/amo/reducers/test_collections.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import reducer, {
2020
loadUserCollections,
2121
updateCollection,
2222
} from 'amo/reducers/collections';
23-
import { parsePage } from 'core/utils';
2423
import { createStubErrorHandler } from 'tests/unit/helpers';
2524
import {
2625
createFakeCollectionAddons,
@@ -31,6 +30,8 @@ import {
3130

3231
describe(__filename, () => {
3332
describe('reducer', () => {
33+
const pageToFetch = 2;
34+
3435
it('initializes properly', () => {
3536
const state = reducer(undefined, {});
3637
expect(state).toEqual(initialState);
@@ -55,7 +56,7 @@ describe(__filename, () => {
5556
it('sets a loading flag when fetching a collection page', () => {
5657
const state = reducer(undefined, fetchCurrentCollectionPage({
5758
errorHandlerId: createStubErrorHandler().id,
58-
page: parsePage(2),
59+
page: pageToFetch,
5960
slug: 'some-collection-slug',
6061
user: 'some-user-id-or-name',
6162
}));
@@ -74,7 +75,7 @@ describe(__filename, () => {
7475

7576
state = reducer(state, fetchCurrentCollectionPage({
7677
errorHandlerId: createStubErrorHandler().id,
77-
page: parsePage(2),
78+
page: pageToFetch,
7879
slug: collectionDetail.slug,
7980
user: 'some-user-id-or-name',
8081
}));
@@ -135,7 +136,7 @@ describe(__filename, () => {
135136
// 2. User clicks the "next" pagination link.
136137
state = reducer(state, fetchCurrentCollectionPage({
137138
errorHandlerId: createStubErrorHandler().id,
138-
page: parsePage(2),
139+
page: pageToFetch,
139140
slug: 'some-collection-slug',
140141
user: 'some-user-id-or-name',
141142
}));

tests/unit/amo/sagas/test_collections.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import apiReducer from 'core/reducers/api';
2222
import {
2323
beginFormOverlaySubmit, closeFormOverlay, finishFormOverlaySubmit,
2424
} from 'core/reducers/formOverlay';
25-
import { parsePage } from 'core/utils';
2625
import { createStubErrorHandler } from 'tests/unit/helpers';
2726
import {
2827
createFakeCollectionAddons,
@@ -34,6 +33,7 @@ import {
3433
describe(__filename, () => {
3534
const user = 'user-id-or-name';
3635
const slug = 'collection-slug';
36+
const page = 1;
3737

3838
let clientData;
3939
let errorHandler;
@@ -82,14 +82,14 @@ describe(__filename, () => {
8282
.expects('getCollectionAddons')
8383
.withArgs({
8484
api: state.api,
85-
page: parsePage(1),
85+
page,
8686
slug,
8787
user,
8888
})
8989
.once()
9090
.returns(Promise.resolve(collectionAddons));
9191

92-
_fetchCurrentCollection({ page: parsePage(1), slug, user });
92+
_fetchCurrentCollection({ page, slug, user });
9393

9494
const expectedLoadAction = loadCurrentCollection({
9595
addons: collectionAddons,
@@ -143,14 +143,14 @@ describe(__filename, () => {
143143
.expects('getCollectionAddons')
144144
.withArgs({
145145
api: state.api,
146-
page: parsePage(1),
146+
page,
147147
slug,
148148
user,
149149
})
150150
.once()
151151
.returns(Promise.resolve(collectionAddons));
152152

153-
_fetchCurrentCollectionPage({ page: parsePage(1), slug, user });
153+
_fetchCurrentCollectionPage({ page, slug, user });
154154

155155
const expectedLoadAction = loadCurrentCollectionPage({
156156
addons: collectionAddons,
@@ -162,7 +162,7 @@ describe(__filename, () => {
162162
});
163163

164164
it('clears the error handler', async () => {
165-
_fetchCurrentCollectionPage({ page: parsePage(1), slug, user });
165+
_fetchCurrentCollectionPage({ page, slug, user });
166166

167167
const expectedAction = errorHandler.createClearingAction();
168168

@@ -178,7 +178,7 @@ describe(__filename, () => {
178178
.once()
179179
.returns(Promise.reject(error));
180180

181-
_fetchCurrentCollectionPage({ page: parsePage(1), slug, user });
181+
_fetchCurrentCollectionPage({ page, slug, user });
182182

183183
const expectedAction = errorHandler.createErrorAction(error);
184184
const action = await sagaTester.waitFor(expectedAction.type);

0 commit comments

Comments
 (0)