Skip to content

Commit a11878f

Browse files
SaraVieiraCompuIves
authored andcommitted
allow to change version in the dep name (codesandbox#1734)
1 parent de960a6 commit a11878f

File tree

2 files changed

+51
-9
lines changed
  • packages/app/src/app/pages/Sandbox/Editor/Workspace/Dependencies/VersionEntry

2 files changed

+51
-9
lines changed

packages/app/src/app/pages/Sandbox/Editor/Workspace/Dependencies/VersionEntry/elements.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import styled from 'styled-components';
2+
import Select from '@codesandbox/common/lib/components/Select';
23
import { EntryContainer } from '../../elements';
34

45
export const Version = styled.div`
@@ -25,3 +26,11 @@ export const MoreData = styled(EntryContainer)`
2526
}
2627
}
2728
`;
29+
30+
export const VersionSelect = styled(Select)`
31+
width: 60px;
32+
position: absolute;
33+
right: ${props => (props.hovering ? (props.withSize ? 5 : 3.5) : 1)}rem;
34+
color: ${props => props.theme.background.lighten(2)};
35+
margin-top: -4px;
36+
`;

packages/app/src/app/pages/Sandbox/Editor/Workspace/Dependencies/VersionEntry/index.js

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@ import CrossIcon from 'react-icons/lib/md/clear';
33
import RefreshIcon from 'react-icons/lib/md/refresh';
44
import ArrowDropDown from 'react-icons/lib/md/keyboard-arrow-down';
55
import ArrowDropUp from 'react-icons/lib/md/keyboard-arrow-up';
6+
import algoliasearch from 'algoliasearch';
67
import Tooltip from '@codesandbox/common/lib/components/Tooltip';
78

89
import { EntryContainer, IconArea, Icon } from '../../elements';
910
import { Link } from '../elements';
10-
import { Version, MoreData } from './elements';
11+
import { Version, MoreData, VersionSelect } from './elements';
1112

1213
const formatSize = value => {
1314
let unit;
@@ -32,6 +33,7 @@ export default class VersionEntry extends React.PureComponent {
3233
version: null,
3334
open: false,
3435
size: {},
36+
versions: [],
3537
};
3638

3739
setVersionsForLatestPkg(pkg) {
@@ -68,15 +70,27 @@ export default class VersionEntry extends React.PureComponent {
6870
}
6971

7072
componentWillMount() {
73+
const { dependencies, dependency } = this.props;
74+
const client = algoliasearch(
75+
'OFCNCOG2CU',
76+
'00383ecd8441ead30b1b0ff981c426f5'
77+
);
78+
const index = client.initIndex('npm-search');
79+
index.search({ query: dependency, hitsPerPage: 1 }, (err, { hits }) => {
80+
this.setState({
81+
versions: hits[0].versions,
82+
});
83+
});
84+
7185
try {
7286
const versionRegex = /^\d{1,3}\.\d{1,3}.\d{1,3}$/;
73-
const version = this.props.dependencies[this.props.dependency];
87+
const version = dependencies[dependency];
7488
const cleanVersion = version.split('^');
7589
this.getSizeForPKG(
76-
`${this.props.dependency}@${cleanVersion[cleanVersion.length - 1]}`
90+
`${dependency}@${cleanVersion[cleanVersion.length - 1]}`
7791
);
7892
if (!versionRegex.test(version)) {
79-
this.setVersionsForLatestPkg(`${this.props.dependency}@${version}`);
93+
this.setVersionsForLatestPkg(`${dependency}@${version}`);
8094
}
8195
} catch (e) {
8296
console.error(e);
@@ -104,7 +118,7 @@ export default class VersionEntry extends React.PureComponent {
104118
render() {
105119
const { dependencies, dependency } = this.props;
106120

107-
const { hovering, version, size, open } = this.state;
121+
const { hovering, version, size, open, versions } = this.state;
108122
return (
109123
<Fragment>
110124
<EntryContainer
@@ -114,10 +128,29 @@ export default class VersionEntry extends React.PureComponent {
114128
<Link href={`https://www.npmjs.com/package/${dependency}`}>
115129
{dependency}
116130
</Link>
117-
<Version withSize={!!size.size} hovering={hovering}>
118-
{dependencies[dependency]}{' '}
119-
{hovering && version && <span>({version})</span>}
120-
</Version>
131+
{hovering ? (
132+
<VersionSelect
133+
withSize={!!size.size}
134+
hovering={hovering}
135+
onChange={e => {
136+
this.props.onRefresh(dependency, e.target.value);
137+
this.setState({ hovering: false });
138+
}}
139+
>
140+
{Object.keys(versions)
141+
.filter(v => v < dependencies[dependency])
142+
.map(a => <option>{a}</option>)}
143+
<option selected>{dependencies[dependency]}</option>
144+
{Object.keys(versions)
145+
.filter(v => v > dependencies[dependency])
146+
.map(a => <option>{a}</option>)}
147+
</VersionSelect>
148+
) : (
149+
<Version withSize={!!size.size} hovering={hovering}>
150+
{dependencies[dependency]}{' '}
151+
{hovering && version && <span>({version})</span>}
152+
</Version>
153+
)}
121154

122155
{hovering && (
123156
<IconArea>

0 commit comments

Comments
 (0)