forked from rust-lang/crates.io
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathversions.js
109 lines (91 loc) · 2.64 KB
/
versions.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import Controller from '@ember/controller';
import { service } from '@ember/service';
import { tracked } from '@glimmer/tracking';
import { didCancel, dropTask } from 'ember-concurrency';
import { alias } from 'macro-decorators';
import { AjaxError } from '../../utils/ajax';
function defaultVersionsContext() {
return { data: [], next_page: undefined };
}
export default class SearchController extends Controller {
@service releaseTracks;
@service sentry;
@service store;
queryParams = ['per_page', 'sort'];
@tracked sort;
@tracked per_page = 100;
@tracked byDate;
@tracked bySemver;
/** @type {import("../../models/crate").default} */
@tracked crate;
@alias('versionsContext.data') data;
@alias('versionsContext.next_page') next_page;
constructor() {
super(...arguments);
this.reset();
}
get currentSortBy() {
return this.sort === 'semver' ? 'SemVer' : 'Date';
}
get versionsContext() {
return this.sort === 'semver' ? this.bySemver : this.byDate;
}
get sortedVersions() {
let { loadedVersionsById: versions } = this.crate;
return this.data.map(id => versions.get(id));
}
loadMoreTask = dropTask(async () => {
let { crate, data, next_page, per_page, sort, versionsContext } = this;
let query;
if (next_page) {
let params = new URLSearchParams(next_page);
params.set('name', crate.name);
params.delete('include');
query = Object.fromEntries(params.entries());
} else {
if (sort !== 'semver') {
sort = 'date';
}
query = {
name: crate.name,
sort,
per_page,
};
}
if (crate.release_tracks == null) {
query.include = 'release_tracks';
}
try {
let versions = await this.store.query('version', query);
let meta = versions.meta;
let ids = versions.map(it => it.id);
if (sort === 'semver') {
this.bySemver = {
...versionsContext,
data: data.concat(ids),
next_page: meta.next_page,
};
} else {
this.byDate = {
...versionsContext,
data: data.concat(ids),
next_page: meta.next_page,
};
}
if (meta.release_tracks) {
this.releaseTracks.updatePayload(crate.id, meta.release_tracks);
}
return versions;
} catch (error) {
// report unexpected errors to Sentry and ignore `ajax()` errors
if (!didCancel(error) && !(error instanceof AjaxError)) {
this.sentry.captureException(error);
}
}
});
reset() {
this.crate = undefined;
this.byDate = defaultVersionsContext();
this.bySemver = defaultVersionsContext();
}
}