"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.Web3Auth = void 0;

var _ethers = require("ethers");

var _verifyChainId = _interopRequireDefault(require("../utils/verifyChainId"));

var _AbstractWeb3Connector = _interopRequireDefault(require("./AbstractWeb3Connector"));

function _interopRequireDefault(obj) {
  return obj && obj.__esModule ? obj : {
    default: obj
  };
}

function _defineProperty(obj, key, value) {
  if (key in obj) {
    Object.defineProperty(obj, key, {
      value: value,
      enumerable: true,
      configurable: true,
      writable: true
    });
  } else {
    obj[key] = value;
  }

  return obj;
}

class Web3Auth extends _AbstractWeb3Connector.default {
  constructor(...args) {
    super(...args);

    _defineProperty(this, "type", 'web3Auth');

    _defineProperty(this, "activate", async ({
      chainId = '0x1',
      clientId,
      theme,
      appLogo,
      loginMethodsOrder
    } = {}) => {
      // Checking that all params are given
      if (!clientId) {
        throw new Error('"clientId" not provided, please provide clientId');
      } // Initalizing Web3Auth and getting constants


      let Web3Auth;

      try {
        var _require;

        Web3Auth = (_require = require('@web3auth/web3auth')) === null || _require === void 0 ? void 0 : _require.Web3Auth;
      } catch (_unused) {// Do Nothing Individual Checks are done below
      } // Check if user is using CDN to import


      if (!Web3Auth) {
        var _window, _window$Web3auth;

        Web3Auth = (_window = window) === null || _window === void 0 ? void 0 : (_window$Web3auth = _window.Web3auth) === null || _window$Web3auth === void 0 ? void 0 : _window$Web3auth.Web3Auth;
      } // Error checking for if library is not installed


      if (!Web3Auth) {
        throw new Error('"@web3auth/web3auth" not installed, please install');
      } // Build config


      const ethChainConfig = {
        chainNamespace: 'eip155',
        chainId: (0, _verifyChainId.default)(chainId)
      }; // Build Web3Auth

      let web3auth;

      try {
        web3auth = new Web3Auth({
          chainConfig: ethChainConfig,
          uiConfig: {
            theme: theme !== null && theme !== void 0 ? theme : 'dark',
            appLogo: appLogo !== null && appLogo !== void 0 ? appLogo : 'https://moralis.io/wp-content/uploads/2021/05/moralisWhiteLogo.svg',
            loginMethodsOrder
          },
          clientId: clientId
        });
      } catch (_unused2) {// Do Nothing error checked below
      }

      if (!web3auth) {
        throw new Error('Could not connect via Web3Auth, error during initializing Web3Auth');
      } // Authenticate


      await web3auth.initModal();
      let provider = null;

      try {
        provider = await web3auth.connect();
      } catch (_unused3) {// Do nothing, check next line down
      }

      if (!provider) {
        throw new Error('Could not connect via Web3Auth, error in connecting to provider');
      } // Gather User data


      try {
        var _web3auth, _web3auth2, _web3auth3;

        const isSocialLogin = (_web3auth = web3auth) !== null && _web3auth !== void 0 && _web3auth.provider ? false : true;
        const ether = new _ethers.ethers.providers.Web3Provider((_web3auth2 = web3auth) !== null && _web3auth2 !== void 0 && _web3auth2.provider ? web3auth.provider : web3auth);
        const signer = ether.getSigner();
        const values = await Promise.all([ether.getNetwork(), signer.getAddress()]);
        const providerChainId = values[0].chainId;
        this.account = values[1].toLocaleLowerCase();
        this.chainId = `0x${providerChainId.toString(16)}`;
        this.provider = isSocialLogin ? ether : (_web3auth3 = web3auth) === null || _web3auth3 === void 0 ? void 0 : _web3auth3.provider;
        this.web3Instance = web3auth;
        this.subscribeToEvents(this.provider);
        return {
          chainId: this.chainId,
          account: this.account,
          provider: this.provider
        };
      } catch (_unused4) {
        throw new Error('Could not connect via Web3Auth, error while authenticating');
      }
    });

    _defineProperty(this, "deactivate", async () => {
      this.unsubscribeToEvents(this.provider);

      if (this.web3Instance) {
        await this.web3Instance.logout();
      }

      this.account = null;
      this.chainId = null;
      this.provider = null;
    });
  }

}

exports.Web3Auth = Web3Auth;