@@ -3,11 +3,12 @@ import CrossIcon from 'react-icons/lib/md/clear';
33import RefreshIcon from 'react-icons/lib/md/refresh' ;
44import ArrowDropDown from 'react-icons/lib/md/keyboard-arrow-down' ;
55import ArrowDropUp from 'react-icons/lib/md/keyboard-arrow-up' ;
6+ import algoliasearch from 'algoliasearch' ;
67import Tooltip from '@codesandbox/common/lib/components/Tooltip' ;
78
89import { EntryContainer , IconArea , Icon } from '../../elements' ;
910import { Link } from '../elements' ;
10- import { Version , MoreData } from './elements' ;
11+ import { Version , MoreData , VersionSelect } from './elements' ;
1112
1213const 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