11import React from 'react' ;
22import { ReactEditorComponent } from '@opensumi/ide-editor/lib/browser' ;
33import { Icon , getKaitianIcon , Button , Tabs } from '@opensumi/ide-components' ;
4- import { localize } from '@opensumi/ide-core-common' ;
4+ import { localize , replaceLocalizePlaceholder } from '@opensumi/ide-core-common' ;
55import { Markdown } from '@opensumi/ide-markdown' ;
6+ import { ProgressBar } from '@opensumi/ide-core-browser/lib/components/progressbar' ;
7+ import { useInjectable } from '@opensumi/ide-core-browser/lib/react-hooks/injectable-hooks' ;
68
79import { VSXExtensionRaw } from '../../common/vsx-registry-types' ;
810import * as styles from './overview.module.less' ;
9- import { InstallState , VSXExtension } from '../../common' ;
10- import { ProgressBar } from '@opensumi/ide-core-browser/lib/components/progressbar' ;
11+ import { InstallState , IVSXExtensionService , VSXExtension , VSXExtensionServiceToken } from '../../common' ;
1112
1213enum TabActiveKey {
1314 details = 'Details' ,
1415 changelog = 'ChangeLog' ,
1516 deps = 'Dependencies' ,
1617}
1718
18- const tabMap = [
19- TabActiveKey . details ,
20- TabActiveKey . changelog ,
21- TabActiveKey . deps ,
22- ] ;
19+ const tabMap = [ TabActiveKey . details , TabActiveKey . changelog , TabActiveKey . deps ] ;
2320
2421interface IExtensionMetadata {
2522 readme ?: string ;
2623 changelog ?: string ;
24+ icon ?: string ;
25+ downloadCount ?: number ;
2726 installed ?: boolean ;
2827}
2928
30- export const ExtensionOverview : ReactEditorComponent < VSXExtensionRaw & VSXExtension & { state : string } > = ( { resource } ) => {
31- const files = React . useMemo ( ( ) => resource . metadata ?. files , [ resource ] ) ;
29+ export const ExtensionOverview : ReactEditorComponent <
30+ VSXExtensionRaw & VSXExtension & { state : string ; extensionId : string }
31+ > = ( { resource } ) => {
32+ const vsxExtensionService = useInjectable < IVSXExtensionService > ( VSXExtensionServiceToken ) ;
3233 const [ loading , setLoading ] = React . useState ( true ) ;
3334 const [ activateKey , setActivateKey ] = React . useState ( TabActiveKey . details ) ;
3435 const [ metadata , setMetadata ] = React . useState < IExtensionMetadata > ( { } ) ;
3536
36- const tabs : TabActiveKey [ ] = React . useMemo ( ( ) => {
37- const res : TabActiveKey [ ] = [ ] ;
38- if ( resource . metadata ?. files . readme ) {
39- res . push ( TabActiveKey . details ) ;
40- }
41- if ( resource . metadata ?. files . changelog ) {
42- res . push ( TabActiveKey . changelog ) ;
43- }
44- return res ;
45- } , [ resource ] ) ;
46-
4737 const onDidTabChange = React . useCallback ( ( index : number ) => {
4838 const activeKey = tabMap [ index ] ;
4939 if ( activeKey ) {
5040 setActivateKey ( activeKey ) ;
5141 }
5242 } , [ ] ) ;
5343
44+ const getExtensonMetadata = React . useCallback (
45+ ( { readme, changelog } : { [ prop : string ] : string | undefined } ) =>
46+ [
47+ readme && fetch ( readme ) . then ( ( res ) => res . text ( ) ) ,
48+ changelog && fetch ( changelog ) . then ( ( res ) => res . text ( ) ) ,
49+ ] . filter ( Boolean ) ,
50+ [ ] ,
51+ ) ;
52+
5453 const initExtensionMetadata = React . useCallback ( async ( ) => {
55- const tasks = [
56- files ?. readme && fetch ( files . readme ) . then ( ( res ) => res . text ( ) ) ,
57- files ?. changelog && fetch ( files . changelog ) . then ( ( res ) => res . text ( ) ) ,
58- ] ;
59- const [ readme , changelog ] = await Promise . all ( tasks ) ;
60- setMetadata ( { readme , changelog } ) ;
54+ const extension = await vsxExtensionService . getRemoteRawExtension ( resource . metadata ! . extensionId ) ;
55+ if ( extension ) {
56+ const tasks = getExtensonMetadata ( { readme : extension . files . readme , changelog : extension . files . changelog } ) ;
57+ const [ readme , changelog ] = await Promise . all ( tasks ) ;
58+ setMetadata ( { readme, changelog, downloadCount : extension . downloadCount } ) ;
59+ }
6160 setLoading ( false ) ;
62- } , [ files ] ) ;
61+ } , [ resource ] ) ;
6362
6463 React . useEffect ( ( ) => {
6564 initExtensionMetadata ( ) ;
66- } , [ files ] ) ;
65+ } , [ resource ] ) ;
6766
6867 return (
6968 < div className = { styles . extension_overview_container } >
7069 < ProgressBar loading = { loading } />
7170 < div className = { styles . extension_overview_header } >
72- < img src = { resource . metadata ?. files . icon || 'https://open-vsx.org/default-icon.png' } alt = { resource . metadata ?. displayName } />
71+ < img
72+ src = { resource . metadata ?. iconUrl || 'https://open-vsx.org/default-icon.png' }
73+ alt = { replaceLocalizePlaceholder ( resource . metadata ?. displayName , resource . metadata ?. extensionId ) }
74+ />
7375 < div className = { styles . extension_detail } >
7476 < div className = { styles . extension_name } >
7577 < h1 >
@@ -78,7 +80,8 @@ export const ExtensionOverview: ReactEditorComponent<VSXExtensionRaw & VSXExtens
7880 target = '_blank'
7981 rel = 'noopener noreferrer'
8082 >
81- { resource . metadata ?. displayName || resource . metadata ?. name }
83+ { replaceLocalizePlaceholder ( resource . metadata ?. displayName , resource . metadata ?. extensionId ) ||
84+ resource . metadata ?. name }
8285 </ a >
8386 </ h1 >
8487 < span className = { styles . extension_id } >
@@ -93,7 +96,7 @@ export const ExtensionOverview: ReactEditorComponent<VSXExtensionRaw & VSXExtens
9396 </ span >
9497 < span >
9598 < Icon iconClass = { getKaitianIcon ( 'download' ) } />
96- { resource . metadata ?. downloadCount }
99+ { resource . metadata ?. downloadCount || metadata . downloadCount }
97100 </ span >
98101 { resource . metadata ?. averageRating && < span > { resource . metadata ?. averageRating } </ span > }
99102 { resource . metadata ?. repository && (
@@ -112,23 +115,27 @@ export const ExtensionOverview: ReactEditorComponent<VSXExtensionRaw & VSXExtens
112115 ) }
113116 < span > v{ resource . metadata ?. version } </ span >
114117 </ div >
115- < div className = { styles . description } > { resource . metadata ?. description } </ div >
116- { resource . metadata ?. state === InstallState . NOT_INSTALLED && < div >
117- < Button size = 'small' onClick = { ( ) => { } } >
118- { localize ( 'marketplace.extension.install' ) }
119- </ Button >
120- </ div > }
118+ < div className = { styles . description } >
119+ { replaceLocalizePlaceholder ( resource . metadata ?. description , resource . metadata ?. extensionId ) }
120+ </ div >
121+ { resource . metadata ?. state === InstallState . NOT_INSTALLED && (
122+ < div >
123+ < Button size = 'small' onClick = { ( ) => { } } >
124+ { localize ( 'marketplace.extension.install' ) }
125+ </ Button >
126+ </ div >
127+ ) }
121128 </ div >
122129 </ div >
123130 < div className = { styles . extension_overview_body } >
124131 < Tabs
125132 className = { styles . tabs }
126133 value = { activateKey }
127134 onChange = { onDidTabChange }
128- tabs = { tabs }
135+ tabs = { [ TabActiveKey . details , TabActiveKey . changelog ] }
129136 />
130- { activateKey === TabActiveKey . details && metadata . readme && ( < Markdown content = { metadata . readme } /> ) }
131- { activateKey === TabActiveKey . changelog && metadata . changelog && ( < Markdown content = { metadata . changelog } /> ) }
137+ { activateKey === TabActiveKey . details && metadata . readme && < Markdown content = { metadata . readme } /> }
138+ { activateKey === TabActiveKey . changelog && metadata . changelog && < Markdown content = { metadata . changelog } /> }
132139 </ div >
133140 </ div >
134141 ) ;
0 commit comments