diff --git a/src/renderer/components/+preferences/install.module.scss b/src/renderer/components/+preferences/extension-card.module.scss similarity index 97% rename from src/renderer/components/+preferences/install.module.scss rename to src/renderer/components/+preferences/extension-card.module.scss index 239828e061..8bb92db3b7 100644 --- a/src/renderer/components/+preferences/install.module.scss +++ b/src/renderer/components/+preferences/extension-card.module.scss @@ -3,10 +3,6 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ - .hr { - padding: 80px 0; - } - .extensionCard { margin-bottom: 16px; border-radius: 4px; diff --git a/src/renderer/components/+preferences/extension-card.tsx b/src/renderer/components/+preferences/extension-card.tsx new file mode 100644 index 0000000000..f89b1f0320 --- /dev/null +++ b/src/renderer/components/+preferences/extension-card.tsx @@ -0,0 +1,83 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import styles from "./extension-card.module.scss"; +import { withInjectables } from "@ogre-tools/injectable-react"; +import { observer } from "mobx-react"; +import React from "react"; + +import installFromInputInjectable from "../+extensions/install-from-input/install-from-input.injectable"; +import { Button } from "../button"; +import { Icon } from "../icon"; +import type { Extension } from "./extension-list"; +import type { ExtensionInstallationStateStore } from "../../../extensions/extension-installation-state-store/extension-installation-state-store"; +import extensionInstallationStateStoreInjectable from "../../../extensions/extension-installation-state-store/extension-installation-state-store.injectable"; + +interface Dependencies { + installFromInput: (input: string) => Promise; + extensionInstallationStateStore: ExtensionInstallationStateStore; +} + +interface Props { + extension: Extension +} + +function NonInjectedExtensionCard({ extension, extensionInstallationStateStore, installFromInput }: Props & Dependencies) { + const { name, version, totalNumberOfInstallations, shortDescription, publisher, githubRepositoryUrl, appIconUrl } = extension; + + function onInstall() { + installFromInput(extension.binaryUrl); + } + + return ( +
+
+
+
+
+
{name}
+
{version}
+
+ +
+ {totalNumberOfInstallations} +
+
+ +
+ {shortDescription} +
+ +
+ +
+ +
+
+
+
+ ); +} + +export const ExtensionCard = withInjectables( + observer(NonInjectedExtensionCard), + { + getProps: (di, props) => ({ + installFromInput: di.inject(installFromInputInjectable), + extensionInstallationStateStore: di.inject(extensionInstallationStateStoreInjectable), + + ...props, + }), + }, +); diff --git a/src/renderer/components/+preferences/install.tsx b/src/renderer/components/+preferences/install.tsx index 11708a4038..95966e7483 100644 --- a/src/renderer/components/+preferences/install.tsx +++ b/src/renderer/components/+preferences/install.tsx @@ -3,19 +3,12 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import styles from "./install.module.scss"; - import React, { useEffect, useState } from "react"; -import { Button } from "../button"; import { Icon } from "../icon"; import { SearchInput } from "../input"; import { Spinner } from "../spinner"; +import { ExtensionCard } from "./extension-card"; import { Extension, getExtensions } from "./extension-list"; -import { withInjectables } from "@ogre-tools/injectable-react"; -import type { ExtensionInstallationStateStore } from "../../../extensions/extension-installation-state-store/extension-installation-state-store"; -import installFromInputInjectable from "../+extensions/install-from-input/install-from-input.injectable"; -import extensionInstallationStateStoreInjectable from "../../../extensions/extension-installation-state-store/extension-installation-state-store.injectable"; -import { observer } from "mobx-react"; export function Install() { const [extensions, setExtensions] = useState([]); @@ -65,73 +58,3 @@ function ExtensionList({ extensions }: { extensions: Extension[] }) { ); } - - - -interface Dependencies { - installFromInput: (input: string) => Promise; - extensionInstallationStateStore: ExtensionInstallationStateStore; -} - -interface CardProps { - extension: Extension -} - -function NonInjectedExtensionCard({ extension, extensionInstallationStateStore, installFromInput }: CardProps & Dependencies) { - const { name, version, totalNumberOfInstallations, shortDescription, publisher, githubRepositoryUrl, appIconUrl } = extension; - - function onInstall() { - installFromInput(extension.binaryUrl); - } - - return ( -
-
-
-
-
-
{name}
-
{version}
-
- -
- {totalNumberOfInstallations} -
-
- -
- {shortDescription} -
- -
- -
- -
-
-
-
- ); -} - -export const ExtensionCard = withInjectables( - observer(NonInjectedExtensionCard), - { - getProps: (di, props) => ({ - installFromInput: di.inject(installFromInputInjectable), - extensionInstallationStateStore: di.inject(extensionInstallationStateStoreInjectable), - - ...props, - }), - }, -);