/** * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ import styles from "./helm-charts.module.scss"; import React from "react"; import { observable, makeObservable, computed } from "mobx"; import type { HelmRepo } from "../../../main/helm/helm-repo-manager"; import { HelmRepoManager } from "../../../main/helm/helm-repo-manager"; import { Button } from "../button"; import { Icon } from "../icon"; import { Notifications } from "../notifications"; import type { SelectOption } from "../select"; import { Select } from "../select"; import { AddHelmRepoDialog } from "./add-helm-repo-dialog"; import { observer } from "mobx-react"; import { RemovableItem } from "./removable-item"; import { Notice } from "../+extensions/notice"; import { Spinner } from "../spinner"; import { noop } from "../../utils"; import type { SingleValue } from "react-select"; @observer export class HelmCharts extends React.Component { @observable loadingRepos = false; @observable loadingAvailableRepos = false; @observable repos: HelmRepo[] = []; @observable addedRepos = observable.map(); constructor(props: {}) { super(props); makeObservable(this); } @computed get repoOptions() { return this.repos.map(repo => ({ value: repo, label: repo.name, isSelected: this.addedRepos.has(repo.name), })); } componentDidMount() { this.loadAvailableRepos().catch(noop); this.loadRepos().catch(noop); } async loadAvailableRepos() { this.loadingAvailableRepos = true; try { if (!this.repos.length) { this.repos = await HelmRepoManager.getInstance().loadAvailableRepos(); } } catch (err) { Notifications.error(String(err)); } this.loadingAvailableRepos = false; } async loadRepos() { this.loadingRepos = true; try { const repos = await HelmRepoManager.getInstance().repositories(); // via helm-cli this.addedRepos.replace(repos.map(repo => [repo.name, repo])); } catch (err) { Notifications.error(String(err)); } this.loadingRepos = false; } async addRepo(repo: HelmRepo) { try { await HelmRepoManager.getInstance().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 HelmRepoManager.getInstance().removeRepo(repo); this.addedRepos.delete(repo.name); } catch (err) { Notifications.error( <> {"Removing helm branch "} {repo.name} {" has failed: "} {String(err)} , ); } } onRepoSelect = async (option: SingleValue<{ value: HelmRepo }>): Promise => { if (!option) { return; } if (this.addedRepos.has(option.value.name)) { return void Notifications.ok(( <> {"Helm repo "} {option.value.name} {" already in use."} )); } await this.addRepo(option.value); }; formatOptionLabel = ({ value, isSelected }: SelectOption) => (
{value.name} {isSelected && ( )}
); renderRepositories() { const repos = Array.from(this.addedRepos); if (this.loadingRepos) { return
; } if (!repos.length) { return (
The repositories have not been added yet
); } return repos.map(([name, repo]) => { return ( this.removeRepo(repo)} className="mt-3" >
{name}
{repo.url}
); }); } render() { return (