diff --git a/src/renderer/components/+preferences/helm-charts.scss b/src/renderer/components/+preferences/helm-charts.scss new file mode 100644 index 0000000000..69d952d186 --- /dev/null +++ b/src/renderer/components/+preferences/helm-charts.scss @@ -0,0 +1,11 @@ +.HelmCharts { + .repos { + margin-top: var(--margin); + + .Badge { + display: flex; + margin-bottom: 1px!important; + padding: 6px 8px; + } + } +} \ No newline at end of file diff --git a/src/renderer/components/+preferences/helm-charts.tsx b/src/renderer/components/+preferences/helm-charts.tsx new file mode 100644 index 0000000000..9bcdd5f755 --- /dev/null +++ b/src/renderer/components/+preferences/helm-charts.tsx @@ -0,0 +1,139 @@ +import "./helm-charts.scss"; + +import React from "react"; +import { action, computed, observable } from "mobx"; + +import { HelmRepo, repoManager } from "../../../main/helm/helm-repo-manager"; +import { Badge } from "../badge"; +import { Button } from "../button"; +import { Icon } from "../icon"; +import { Notifications } from "../notifications"; +import { Select, SelectOption } from "../select"; +import { Tooltip } from "../tooltip"; +import { AddHelmRepoDialog } from "./add-helm-repo-dialog"; +import { observer } from "mobx-react"; + +@observer +export class HelmCharts extends React.Component { + @observable loading = false; + @observable repos: HelmRepo[] = []; + @observable addedRepos = observable.map(); + + @computed get options(): SelectOption[] { + return this.repos.map(repo => ({ + label: repo.name, + value: repo, + })); + } + + async componentDidMount() { + await this.loadRepos(); + } + + @action + async loadRepos() { + this.loading = true; + + try { + if (!this.repos.length) { + this.repos = await repoManager.loadAvailableRepos(); // via https://helm.sh + } + const repos = await repoManager.repositories(); // via helm-cli + + this.addedRepos.clear(); + repos.forEach(repo => this.addedRepos.set(repo.name, repo)); + } catch (err) { + Notifications.error(String(err)); + } + + this.loading = false; + } + + async addRepo(repo: HelmRepo) { + try { + await repoManager.addRepo(repo); + this.addedRepos.set(repo.name, repo); + } catch (err) { + Notifications.error(<>Adding helm branch {repo.name} has failed: {String(err)}); + } + } + + async removeRepo(repo: HelmRepo) { + try { + await repoManager.removeRepo(repo); + this.addedRepos.delete(repo.name); + } catch (err) { + Notifications.error( + <>Removing helm branch {repo.name} has failed: {String(err)} + ); + } + } + + onRepoSelect = async ({ value: repo }: SelectOption) => { + const isAdded = this.addedRepos.has(repo.name); + + if (isAdded) { + Notifications.ok(<>Helm branch {repo.name} already in use); + + return; + } + this.loading = true; + await this.addRepo(repo); + this.loading = false; + }; + + formatOptionLabel = ({ value: repo }: SelectOption) => { + const isAdded = this.addedRepos.has(repo.name); + + return ( +
+ {repo.name} + {isAdded && } +
+ ); + }; + + render() { + return ( +
+
+