import * as React from "bloatless-react"; import ConnectionModel from "../Model/connectionModel"; export default class ConnectionViewModel { connectionModel: ConnectionModel; // state serverAddressInput: React.State = new React.State(""); isConnected: React.State = new React.State(false); isShowingConnectionModal: React.State = new React.State(false); previousAddresses: React.ListState = new React.ListState(); // guards cannotConnect: React.State = React.createProxyState( [this.serverAddressInput, this.isConnected], () => (this.isConnected.value == true && this.serverAddressInput.value == this.connectionModel.address) || this.serverAddressInput.value == "" ); cannotDisonnect: React.State = React.createProxyState( [this.isConnected], () => this.isConnected.value == false ); hasNoPreviousConnections: React.State = React.createProxyState( [this.previousAddresses], () => this.previousAddresses.value.size == 0 ); // handlers connectionChangeHandler = (): void => { this.isConnected.value = this.connectionModel.isConnected; if (this.connectionModel.isConnected == false) return; if (this.connectionModel.address == undefined) return; this.serverAddressInput.value = this.connectionModel.address; if (!this.previousAddresses.value.has(this.connectionModel.address)) { this.previousAddresses.add(this.connectionModel.address); } }; // methods connect = (): void => { this.connectToAddress(this.serverAddressInput.value); }; connectToAddress = (address: string): void => { this.connectionModel.connect(address); }; disconnect = (): void => { this.connectionModel.disconnect(); }; removePreviousAddress = (address: string): void => { this.connectionModel.removeAddress(address); this.updatePreviousAddresses(); }; // view methods showConnectionModal = (): void => { this.isShowingConnectionModal.value = true; }; hideConnectionModal = (): void => { this.isShowingConnectionModal.value = false; }; updatePreviousAddresses = (): void => { this.previousAddresses.clear(); this.previousAddresses.add(...this.connectionModel.addresses); }; // init constructor(connectionModel: ConnectionModel) { this.connectionModel = connectionModel; this.updatePreviousAddresses(); connectionModel.setConnectionChangeHandler(this.connectionChangeHandler); } }