@@ -9,6 +9,7 @@ import { PluginCard } from './PluginCard';
9
9
import { Switch } from '@mui/material' ;
10
10
import { FormControlLabel } from '@mui/material' ;
11
11
import { isEqual } from 'lodash' ;
12
+ import semver from 'semver' ;
12
13
13
14
const PAGE_SIZE = 60 ; // Maximum allowed by the API
14
15
const ARTIFACTHUB_HEADLAMP_PLUGIN_KIND = '21' ;
@@ -49,6 +50,7 @@ export interface PluginPackage {
49
50
organization_name : string ;
50
51
} ;
51
52
isInstalled : boolean ;
53
+ isUpdateAvailable : boolean ;
52
54
}
53
55
54
56
async function fetchPlugins ( offset : number , org ?: string ) {
@@ -126,7 +128,15 @@ async function processPlugins() {
126
128
} catch ( err ) {
127
129
console . log ( 'plugin-catalog: Failed to list plugins' , err ) ;
128
130
}
129
- const installedPlugins = pluginData . map ( ( plugin : any ) => plugin . folderName ) ;
131
+ const installedVersions : Record < string , string > = pluginData . reduce (
132
+ ( acc , plugin : any ) => {
133
+ if ( plugin . folderName && plugin . artifacthubVersion ) {
134
+ acc [ plugin . folderName ] = plugin . artifacthubVersion ;
135
+ }
136
+ return acc ;
137
+ } ,
138
+ { }
139
+ ) ;
130
140
131
141
// Merge all plugins and org-specific plugins, removing duplicates
132
142
const mergedPlugins = [ ...allPlugins , ...orgPlugins ] ;
@@ -135,10 +145,24 @@ async function processPlugins() {
135
145
) ;
136
146
137
147
const pluginsWithInstallStatus = uniquePlugins
138
- . map ( ( pkg : PluginPackage ) => ( {
139
- ...pkg ,
140
- isInstalled : installedPlugins . includes ( pkg . name ) ,
141
- } ) )
148
+ . map ( ( pkg : PluginPackage ) => {
149
+ const installedVersion = installedVersions [ pkg . name ] ;
150
+ let isInstalled = false ;
151
+ let isUpdateAvailable = false ;
152
+
153
+ if ( installedVersion ) {
154
+ isInstalled = true ;
155
+ if ( semver . valid ( pkg . version ) && semver . valid ( installedVersion ) ) {
156
+ isUpdateAvailable = semver . gt ( pkg . version , installedVersion ) ;
157
+ }
158
+ }
159
+
160
+ return {
161
+ ...pkg ,
162
+ isInstalled,
163
+ isUpdateAvailable,
164
+ } ;
165
+ } )
142
166
// Reorder so plugins with logos show first.
143
167
. sort ( ( a , b ) => ( ! ! b . logo_image_id ? 1 : 0 ) - ( ! ! a . logo_image_id ? 1 : 0 ) ) ;
144
168
0 commit comments