GladysProject/Gladys

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

Summary

Maintainability
F
3 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 {
  componentWillMount() {
    this.getTuyaConfiguration();
  }

  async getTuyaConfiguration() {
    let tuyaEndpoint = '';
    let tuyaAccessKey = '';
    let tuyaSecretKey = '';
    let tuyaAppAccountId = '';

    this.setState({
      tuyaGetSettingsStatus: RequestStatus.Getting,
      tuyaEndpoint,
      tuyaAccessKey,
      tuyaSecretKey,
      tuyaAppAccountId
    });
    try {
      const { value: endpoint } = await this.props.httpClient.get('/api/v1/service/tuya/variable/TUYA_ENDPOINT');
      tuyaEndpoint = endpoint;

      const { value: accessKey } = await this.props.httpClient.get('/api/v1/service/tuya/variable/TUYA_ACCESS_KEY');
      tuyaAccessKey = accessKey;

      const { value: secretKey } = await this.props.httpClient.get('/api/v1/service/tuya/variable/TUYA_SECRET_KEY');
      tuyaSecretKey = secretKey;

      const { value: appAccountId } = await this.props.httpClient.get(
        '/api/v1/service/tuya/variable/TUYA_APP_ACCOUNT_UID'
      );
      tuyaAppAccountId = appAccountId;

      this.setState({
        tuyaGetSettingsStatus: RequestStatus.Success,
        tuyaEndpoint,
        tuyaAccessKey,
        tuyaSecretKey,
        tuyaAppAccountId
      });
    } catch (e) {
      this.setState({
        tuyaGetSettingsStatus: RequestStatus.Error
      });
    }
  }

  saveTuyaConfiguration = async e => {
    e.preventDefault();
    this.setState({
      tuyaSaveSettingsStatus: RequestStatus.Getting
    });
    try {
      await this.props.httpClient.post('/api/v1/service/tuya/variable/TUYA_ENDPOINT', {
        value: this.state.tuyaEndpoint
      });

      await this.props.httpClient.post('/api/v1/service/tuya/variable/TUYA_ACCESS_KEY', {
        value: this.state.tuyaAccessKey.trim()
      });

      await this.props.httpClient.post('/api/v1/service/tuya/variable/TUYA_SECRET_KEY', {
        value: this.state.tuyaSecretKey.trim()
      });

      await this.props.httpClient.post('/api/v1/service/tuya/variable/TUYA_APP_ACCOUNT_UID', {
        value: this.state.tuyaAppAccountId.trim()
      });

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

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

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

              <form>
                <div class="form-group">
                  <label for="tuyaEndpoint" class="form-label">
                    <Text id={`integration.tuya.setup.endpoint`} />
                  </label>
                  <select
                    className="form-control"
                    name="tuyaEndpoint"
                    value={state.tuyaEndpoint}
                    onChange={this.updateConfiguration}
                  >
                    <option value="china">
                      <Text id="integration.tuya.setup.endpoints.china" />
                    </option>
                    <option value="westernAmerica">
                      <Text id="integration.tuya.setup.endpoints.westernAmerica" />
                    </option>
                    <option value="easternAmerica">
                      <Text id="integration.tuya.setup.endpoints.easternAmerica" />
                    </option>
                    <option value="centralEurope">
                      <Text id="integration.tuya.setup.endpoints.centralEurope" />
                    </option>
                    <option value="westernEurope">
                      <Text id="integration.tuya.setup.endpoints.westernEurope" />
                    </option>
                    <option value="india">
                      <Text id="integration.tuya.setup.endpoints.india" />
                    </option>
                  </select>
                </div>

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

                <div class="form-group">
                  <label htmlFor="tuyaSecretKey" className="form-label">
                    <Text id={`integration.tuya.setup.secretKey`} />
                  </label>
                  <Localizer>
                    <input
                      name="tuyaSecretKey"
                      type="text"
                      placeholder={<Text id="integration.tuya.setup.secretKeyPlaceholder" />}
                      value={state.tuyaSecretKey}
                      className="form-control"
                      onInput={this.updateConfiguration}
                    />
                  </Localizer>
                </div>

                <div class="form-group">
                  <label htmlFor="tuyaAppAccountId" className="form-label">
                    <Text id={`integration.tuya.setup.appAccountId`} />
                  </label>
                  <Localizer>
                    <input
                      name="tuyaAppAccountId"
                      type="text"
                      placeholder={<Text id="integration.tuya.setup.appAccountIdPlaceholder" />}
                      value={state.tuyaAppAccountId}
                      className="form-control"
                      onInput={this.updateConfiguration}
                    />
                  </Localizer>
                </div>

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

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