GladysProject/Gladys

View on GitHub
front/src/routes/integration/all/melcloud/setup-page/SetupTab.jsx

Summary

Maintainability
D
2 days
Test Coverage
import { Text, Localizer, MarkupText } from 'preact-i18n';
import cx from 'classnames';

import { RequestStatus } from '../../../../../utils/consts';
import { Component } from 'preact';
import { connect } from 'unistore/preact';

class SetupTab extends Component {
  showPasswordTimer = null;

  componentWillMount() {
    this.getConfiguration();
  }

  async getConfiguration() {
    let melCloudUsername = '';
    let melCloudPassword = '';

    this.setState({
      melcloudGetSettingsStatus: RequestStatus.Getting,
      melCloudUsername,
      melCloudPassword
    });
    try {
      const { value: username } = await this.props.httpClient.get(
        '/api/v1/service/melcloud/variable/MELCLOUD_USERNAME'
      );
      melCloudUsername = username;

      const { value: password } = await this.props.httpClient.get(
        '/api/v1/service/melcloud/variable/MELCLOUD_PASSWORD'
      );
      melCloudPassword = password;

      this.setState({
        melcloudGetSettingsStatus: RequestStatus.Success,
        melCloudUsername,
        melCloudPassword
      });
    } catch (e) {
      this.setState({
        melcloudGetSettingsStatus: RequestStatus.Error
      });
    }
  }

  saveConfiguration = async e => {
    e.preventDefault();
    this.setState({
      melcloudSaveSettingsStatus: RequestStatus.Getting
    });
    try {
      await this.props.httpClient.post('/api/v1/service/melcloud/variable/MELCLOUD_USERNAME', {
        value: this.state.melCloudUsername.trim()
      });

      await this.props.httpClient.post('/api/v1/service/melcloud/variable/MELCLOUD_PASSWORD', {
        value: this.state.melCloudPassword.trim()
      });

      // start service
      await this.props.httpClient.post('/api/v1/service/melcloud/start');
      this.setState({
        melcloudSaveSettingsStatus: RequestStatus.Success
      });
    } catch (e) {
      this.setState({
        melcloudSaveSettingsStatus: RequestStatus.Error
      });
    }
  };

  updateConfiguration = e => {
    this.setState({
      [e.target.name]: e.target.value
    });
  };

  togglePassword = () => {
    const { showPassword } = this.state;

    if (this.showPasswordTimer) {
      clearTimeout(this.showPasswordTimer);
      this.showPasswordTimer = null;
    }

    this.setState({ showPassword: !showPassword });

    if (!showPassword) {
      this.showPasswordTimer = setTimeout(() => this.setState({ showPassword: false }), 5000);
    }
  };

  render(props, state) {
    return (
      <div class="card">
        <div class="card-header">
          <h1 class="card-title">
            <Text id="integration.melcloud.setup.title" />
          </h1>
        </div>
        <div class="card-body">
          <div
            class={cx('dimmer', {
              active: state.melcloudSaveSettingsStatus === RequestStatus.Getting
            })}
          >
            <div class="loader" />
            <div class="dimmer-content">
              <p>
                <MarkupText id="integration.melcloud.setup.description" />
              </p>

              <form>
                <div class="form-group">
                  <label for="melCloudUsername" class="form-label">
                    <Text id={`integration.melcloud.setup.username`} />
                  </label>
                  <Localizer>
                    <input
                      name="melCloudUsername"
                      type="text"
                      placeholder={<Text id="integration.melcloud.setup.usernamePlaceholder" />}
                      value={state.melCloudUsername}
                      class="form-control"
                      onInput={this.updateConfiguration}
                    />
                  </Localizer>
                </div>

                <div class="form-group">
                  <label htmlFor="melCloudPassword" className="form-label">
                    <Text id={`integration.melcloud.setup.password`} />
                  </label>
                  <div class="input-icon mb-3">
                    <Localizer>
                      <input
                        name="melCloudPassword"
                        type={state.showPassword ? 'text' : 'password'}
                        placeholder={<Text id="integration.melcloud.setup.passwordPlaceholder" />}
                        value={state.melCloudPassword}
                        className="form-control"
                        onInput={this.updateConfiguration}
                      />
                    </Localizer>
                    <span class="input-icon-addon cursor-pointer" onClick={this.togglePassword}>
                      <i
                        class={cx('fe', {
                          'fe-eye': !state.showPassword,
                          'fe-eye-off': state.showPassword
                        })}
                      />
                    </span>
                  </div>
                </div>

                <div class="row mt-5">
                  <div class="col">
                    <button type="submit" class="btn btn-success" onClick={this.saveConfiguration}>
                      <Text id="integration.melcloud.setup.saveLabel" />
                    </button>
                  </div>
                </div>
              </form>
            </div>
          </div>
        </div>
      </div>
    );
  }
}

export default connect('httpClient', {})(SetupTab);