Extension {displayName} successfully uninstalled!
+ ); + }); + + removedUninstalling.forEach(({ id }) => { + this.extensionState.delete(id); + }); + }) + ); + } + @computed get extensions() { const searchText = this.search.toLowerCase(); return Array.from(extensionLoader.userExtensions.values()).filter(ext => { const { name, description } = ext.manifest; return [ name.toLowerCase().includes(searchText), - description.toLowerCase().includes(searchText), - ].some(v => v); + description?.toLowerCase().includes(searchText), + ].some(value => value); }); } @@ -278,14 +315,21 @@ export class Extensions extends React.Component { } async uninstallExtension(extension: InstalledExtension) { - const extensionName = extensionDisplayName(extension.manifest.name, extension.manifest.version); + const displayName = extensionDisplayName(extension.manifest.name, extension.manifest.version); try { + this.extensionState.set(extension.id, { + state: "uninstalling", + displayName + }); + await extensionDiscovery.uninstallExtension(extension.absolutePath); } catch (error) { Notifications.error( -Uninstalling extension {extensionName} has failed: {error?.message ?? ""}
+Uninstalling extension {displayName} has failed: {error?.message ?? ""}
); + // Remove uninstall state on uninstall failure + this.extensionState.delete(extension.id); } } @@ -305,11 +349,12 @@ export class Extensions extends React.Component { } return extensions.map(ext => { - const { manifestPath: extId, isEnabled, manifest } = ext; + const { id, isEnabled, manifest } = ext; const { name, description } = manifest; + const isUninstalling = this.extensionState.get(id)?.state === "uninstalling"; return ( -{name}
@@ -320,12 +365,12 @@ export class Extensions extends React.Component {