import React, { useCallback, useState } from 'react'; import { Button, Icon, getIcon } from '@opensumi/ide-components'; import { useDesignStyles } from '@opensumi/ide-core-browser'; import { localize, replaceLocalizePlaceholder } from '@opensumi/ide-core-common'; import { InstallState, VSXExtension } from '../../common'; import styles from './extension.module.less'; export enum ExtensionViewType { MARKETPLACE, INSTALLED, } interface IExtensionViewProps { extension: VSXExtension; onInstall(extension: VSXExtension): Promise; onClick(extension: VSXExtension, state: InstallState): void; type: ExtensionViewType; installedExtensions?: VSXExtension[]; openVSXRegistry: string; } export const Extension = React.memo( ({ extension: extension, onInstall, onClick, type, installedExtensions, openVSXRegistry }: IExtensionViewProps) => { const styles_extension_item = useDesignStyles(styles.extension_item, 'extension_item'); const [installing, setInstalling] = useState(); const installedExtension = installedExtensions?.find( (installed) => installed.namespace === extension.namespace && installed.name === extension.name, ); const isInstalled = Boolean(type === ExtensionViewType.INSTALLED || installedExtension); const shouldUpdate = isInstalled && type === ExtensionViewType.MARKETPLACE && installedExtension?.version !== extension.version; const [installedState, setInstalled] = useState(isInstalled); const onInstallCallback = useCallback( (e: React.MouseEvent) => { e.stopPropagation(); setInstalling(true); onInstall(extension).then(() => { setInstalling(false); setInstalled(true); }); }, [extension], ); const onClickCallback = useCallback(() => { onClick( extension, installedState ? shouldUpdate ? InstallState.SHOULD_UPDATE : InstallState.INSTALLED : InstallState.NOT_INSTALLED, ); }, [extension]); return (
{extension.iconUrl ? ( {replaceLocalizePlaceholder(extension.displayName, ) : (
)}
{replaceLocalizePlaceholder(extension.displayName, `${extension.publisher}.${extension.name}`) || extension.name} {extension.version} {!installedState && ( {extension.downloadCount} )}
{replaceLocalizePlaceholder(extension.description, `${extension.publisher}.${extension.name}`)}
{extension.namespace} {type === ExtensionViewType.MARKETPLACE && (isInstalled ? ( shouldUpdate ? ( ) : ( {localize('marketplace.extension.installed')} ) ) : ( ))} {type === ExtensionViewType.INSTALLED && ( )}
); }, );