Skip to content

Commit 38ecc6f

Browse files
authored
Allow switching between different versions (loic-sharma#210)
1 parent 2e0f7f9 commit 38ecc6f

File tree

4 files changed

+50
-29
lines changed

4 files changed

+50
-29
lines changed

src/BaGet.UI/src/DisplayPackage/Dependencies.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ interface IDependenciesProps {
66
}
77

88
interface IPackageDependenciesProps {
9-
dependencies: Registration.IDependency[];
9+
dependencies: Registration.IDependency[] | undefined;
1010
}
1111

1212
class Dependencies extends React.Component<IDependenciesProps> {
@@ -58,7 +58,7 @@ class PackageDependencies extends React.Component<IPackageDependenciesProps> {
5858
}
5959

6060
public render() {
61-
if (this.props.dependencies.length === 0) {
61+
if (!this.props.dependencies || this.props.dependencies.length === 0) {
6262
return <div>No dependencies.</div>
6363
}
6464

src/BaGet.UI/src/DisplayPackage/DisplayPackage.tsx

+46-25
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { HtmlRenderer, Parser } from 'commonmark';
22
import { Icon } from 'office-ui-fabric-react/lib/Icon';
33
import * as React from 'react';
4+
import { Link } from 'react-router-dom';
45
import timeago from 'timeago.js';
56
import Dependencies from './Dependencies';
67
import InstallationInfo from './InstallationInfo';
@@ -14,6 +15,7 @@ interface IDisplayPackageProps {
1415
match: {
1516
params: {
1617
id: string;
18+
version?: string;
1719
}
1820
}
1921
}
@@ -30,9 +32,10 @@ interface IPackage {
3032
repositoryUrl: string;
3133
repositoryType: string;
3234
totalDownloads: number;
33-
latestDownloads: number;
35+
downloads: number;
3436
authors: string;
3537
tags: string[];
38+
version: string;
3639
versions: IPackageVersion[];
3740
dependencyGroups: Registration.IDependencyGroup[];
3841
}
@@ -50,6 +53,7 @@ interface IDisplayPackageState {
5053
class DisplayPackage extends React.Component<IDisplayPackageProps, IDisplayPackageState> {
5154

5255
private id: string;
56+
private version?: string;
5357
private parser: Parser;
5458
private htmlRenderer: HtmlRenderer;
5559

@@ -61,10 +65,12 @@ class DisplayPackage extends React.Component<IDisplayPackageProps, IDisplayPacka
6165

6266
this.parser = new Parser();
6367
this.htmlRenderer = new HtmlRenderer();
68+
6469
this.registrationController = new AbortController();
6570
this.readmeController = new AbortController();
6671

6772
this.id = props.match.params.id;
73+
this.version = props.match.params.version;
6874
this.state = {package: undefined};
6975
}
7076

@@ -73,6 +79,23 @@ class DisplayPackage extends React.Component<IDisplayPackageProps, IDisplayPacka
7379
this.readmeController.abort();
7480
}
7581

82+
public componentDidUpdate(previous: IDisplayPackageProps) {
83+
// This is used to switch between versions of the same package.
84+
if (previous.match.params.id !== this.props.match.params.id ||
85+
previous.match.params.version !== this.props.match.params.version) {
86+
this.registrationController.abort();
87+
this.readmeController.abort();
88+
89+
this.registrationController = new AbortController();
90+
this.readmeController = new AbortController();
91+
92+
this.id = this.props.match.params.id;
93+
this.version = this.props.match.params.version;
94+
this.setState({package: undefined});
95+
this.componentDidMount();
96+
}
97+
}
98+
7699
public componentDidMount() {
77100
const url = `/v3/registration/${this.id}/index.json`;
78101

@@ -82,7 +105,8 @@ class DisplayPackage extends React.Component<IDisplayPackageProps, IDisplayPacka
82105
const results = json as Registration.IRegistrationIndex;
83106

84107
const latestVersion = results.items[0].upper;
85-
let latestItem: Registration.IRegistrationPageItem | undefined;
108+
let currentItem: Registration.IRegistrationPageItem | undefined;
109+
let lastUpdate: Date | undefined;
86110

87111
const versions: IPackageVersion[] = [];
88112

@@ -93,40 +117,37 @@ class DisplayPackage extends React.Component<IDisplayPackageProps, IDisplayPacka
93117
version: entry.catalogEntry.version,
94118
});
95119

96-
if (entry.catalogEntry.version === latestVersion) {
97-
latestItem = entry;
120+
if ((!currentItem && entry.catalogEntry.version === latestVersion) ||
121+
(this.version && entry.catalogEntry.version === this.version)) {
122+
currentItem = entry;
123+
}
124+
125+
const published = new Date(entry.catalogEntry.published);
126+
if (!lastUpdate || lastUpdate < published) {
127+
lastUpdate = published;
98128
}
99129
}
100130

101-
if (latestItem) {
131+
if (currentItem && lastUpdate) {
102132
let readme = "";
103-
if (!latestItem.catalogEntry.hasReadme) {
104-
readme = latestItem.catalogEntry.description;
133+
if (!currentItem.catalogEntry.hasReadme) {
134+
readme = currentItem.catalogEntry.description;
105135
}
106136

107137
this.setState({
108138
package: {
109-
authors: latestItem.catalogEntry.authors,
110-
dependencyGroups: latestItem.catalogEntry.dependencyGroups,
111-
downloadUrl: latestItem.packageContent,
112-
iconUrl: latestItem.catalogEntry.iconUrl,
113-
id: latestItem.catalogEntry.id,
114-
lastUpdate: new Date(latestItem.catalogEntry.published),
115-
latestDownloads: latestItem.catalogEntry.downloads,
139+
...currentItem.catalogEntry,
140+
downloadUrl: currentItem.packageContent,
141+
lastUpdate,
116142
latestVersion,
117-
licenseUrl: latestItem.catalogEntry.licenseUrl,
118-
projectUrl: latestItem.catalogEntry.projectUrl,
119143
readme,
120-
repositoryType: latestItem.catalogEntry.repositoryType,
121-
repositoryUrl: latestItem.catalogEntry.repositoryUrl,
122-
tags: latestItem.catalogEntry.tags,
123144
totalDownloads: results.totalDownloads,
124145
versions
125146
}
126147
});
127148

128-
if (latestItem.catalogEntry.hasReadme) {
129-
const readmeUrl = `/v3/package/${this.id}/${latestVersion}/readme`;
149+
if (currentItem.catalogEntry.hasReadme) {
150+
const readmeUrl = `/v3/package/${this.id}/${currentItem.catalogEntry.version}/readme`;
130151

131152
fetch(readmeUrl, {signal: this.readmeController.signal}).then(response => {
132153
return response.text();
@@ -161,12 +182,12 @@ class DisplayPackage extends React.Component<IDisplayPackageProps, IDisplayPacka
161182
<div className="package-title">
162183
<h1>
163184
{this.state.package.id}
164-
<small className="text-nowrap">{this.state.package.latestVersion}</small>
185+
<small className="text-nowrap">{this.state.package.version}</small>
165186
</h1>
166187

167188
</div>
168189

169-
<InstallationInfo id={this.state.package.id} version={this.state.package.latestVersion} />
190+
<InstallationInfo id={this.state.package.id} version={this.state.package.version} />
170191

171192
{/* TODO: Fix this */}
172193
<div dangerouslySetInnerHTML={{ __html: this.state.package.readme }} />
@@ -207,7 +228,7 @@ class DisplayPackage extends React.Component<IDisplayPackageProps, IDisplayPacka
207228
</li>
208229
<li>
209230
<Icon iconName="GiftBox" className="ms-Icon" />
210-
{this.state.package.latestDownloads.toLocaleString()} downloads of latest version
231+
{this.state.package.downloads.toLocaleString()} downloads of latest version
211232
</li>
212233
</ul>
213234
</div>
@@ -217,7 +238,7 @@ class DisplayPackage extends React.Component<IDisplayPackageProps, IDisplayPacka
217238

218239
{this.state.package.versions.map(value => (
219240
<div key={value.version}>
220-
<span>v{value.version}: </span>
241+
<span><Link to={`/packages/${this.state.package!.id}/${value.version}`}>{value.version}</Link>: </span>
221242
<span>{this.dateToString(value.date)}</span>
222243
</div>
223244
))}

src/BaGet.UI/src/DisplayPackage/Registration.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export interface ICatalogEntry {
3434

3535
export interface IDependencyGroup {
3636
targetFramework: string;
37-
dependencies: IDependency[];
37+
dependencies: IDependency[] | undefined;
3838
}
3939

4040
export interface IDependency {

src/BaGet.UI/src/index.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ initializeIcons();
1818
ReactDOM.render(
1919
<Router>
2020
<App>
21-
<Route path="/packages/:id" component={DisplayPackage} />
21+
<Route path="/packages/:id/:version?" component={DisplayPackage} />
2222

2323
<Route path="/upload" component={Upload} />
2424
</App>

0 commit comments

Comments
 (0)