/** * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ import "./port-forward-dialog.scss"; import React, { Component } from "react"; import { observable, makeObservable } from "mobx"; import { observer } from "mobx-react"; import { Dialog, DialogProps } from "../components/dialog"; import { Wizard, WizardStep } from "../components/wizard"; import { Input } from "../components/input"; import { cssNames } from "../utils"; import type { PortForwardStore } from "./port-forward-store/port-forward-store"; import { openPortForward } from "./port-forward-utils"; import { aboutPortForwarding, notifyErrorPortForwarding } from "./port-forward-notify"; import { Checkbox } from "../components/checkbox"; import { withInjectables } from "@ogre-tools/injectable-react"; import type { PortForwardDialogModel } from "./port-forward-dialog-model/port-forward-dialog-model"; import portForwardDialogModelInjectable from "./port-forward-dialog-model/port-forward-dialog-model.injectable"; import logger from "../../common/logger"; import portForwardStoreInjectable from "./port-forward-store/port-forward-store.injectable"; interface Props extends Partial {} interface Dependencies { portForwardStore: PortForwardStore, model: PortForwardDialogModel } @observer class NonInjectedPortForwardDialog extends Component { @observable currentPort = 0; @observable desiredPort = 0; constructor(props: Props & Dependencies) { super(props); makeObservable(this); } get portForwardStore() { return this.props.portForwardStore; } onOpen = async () => { this.currentPort = +this.props.model.portForward.forwardPort; this.desiredPort = this.currentPort; }; changePort = (value: string) => { this.desiredPort = Number(value); }; startPortForward = async () => { let { portForward } = this.props.model; const { currentPort, desiredPort } = this; try { // determine how many port-forwards already exist const { length } = this.portForwardStore.getPortForwards(); portForward.protocol = this.props.model.useHttps ? "https" : "http"; if (currentPort) { const wasRunning = portForward.status === "Active"; portForward = await this.portForwardStore.modify(portForward, desiredPort); if (wasRunning && portForward.status === "Disabled") { notifyErrorPortForwarding(`Error occurred starting port-forward, the local port ${portForward.forwardPort} may not be available or the ${portForward.kind} ${portForward.name} may not be reachable`); } } else { portForward.forwardPort = desiredPort; portForward = await this.portForwardStore.add(portForward); if (portForward.status === "Disabled") { notifyErrorPortForwarding(`Error occurred starting port-forward, the local port ${portForward.forwardPort} may not be available or the ${portForward.kind} ${portForward.name} may not be reachable`); } else { // if this is the first port-forward show the about notification if (!length) { aboutPortForwarding(); } } } if (portForward.status === "Active" && this.props.model.openInBrowser) { openPortForward(portForward); } } catch (error) { logger.error(`[PORT-FORWARD-DIALOG]: ${error}`, portForward); } finally { this.props.model.close(); } }; renderContents() { return ( <>
Local port to forward from:
this.props.model.useHttps = value} /> this.props.model.openInBrowser = value} />
); } render() { const { className, portForwardStore, model, ...dialogProps } = this.props; const resourceName = this.props.model.portForward?.name ?? ""; const header = (
Port Forwarding for {resourceName}
); return ( {this.renderContents()} ); } } export const PortForwardDialog = withInjectables( NonInjectedPortForwardDialog, { getProps: (di, props) => ({ portForwardStore: di.inject(portForwardStoreInjectable), model: di.inject(portForwardDialogModelInjectable), ...props, }), }, );