@broxus/tvm-connect
Version:
TypeScript SDK for connecting to Nekoton-compatible wallets using a unified interface.
217 lines (216 loc) • 8.61 kB
JavaScript
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
import { AbstractStore } from '@broxus/js-core';
import { action, comparer, makeObservable, reaction, toJS } from 'mobx';
import * as React from 'react';
import * as ReactDOM from 'react-dom/client';
import { IntlProvider } from 'react-intl';
import { TvmConnectDialog } from '../components/TvmConnectDialog';
import { CONTAINER_ID } from '../constants';
import { SharedParamsContext, TvmConnectDialogStoreContext, TvmConnectServiceContext, } from '../context';
import { getPredefinedNetworks, getPredefinedProviderId, getPredefinedProviders } from '../misc';
import { TvmConnectService } from '../services';
import { TvmConnectDialogStore } from '../stores';
import { getRecentConnectionMeta } from '../utils';
export class TvmConnect extends AbstractStore {
params;
name = 'TvmConnect';
_root;
_dialog;
_service;
constructor(params) {
super();
this.params = params;
const { getProviderInfo, recentMetaStorageKey, onPreconnect, ...restParams } = { ...params };
const recentMeta = getRecentConnectionMeta(recentMetaStorageKey);
this._service = new TvmConnectService({
defaultNetworkId: recentMeta?.chainId ? Number(recentMeta.chainId) : undefined,
networks: getPredefinedNetworks(),
...restParams,
providerId: restParams.providerId || getPredefinedProviderId(recentMeta),
providers: restParams.providers || getPredefinedProviders({ getProviderInfo, onPreconnect }),
recentMetaStorageKey,
});
this._dialog = new TvmConnectDialogStore(this._service, {
popupType: params?.popupType,
qrEnabled: params?.qrEnabled,
recentMetaStorageKey,
});
makeObservable(this);
this._render();
}
getDialog() {
return this._dialog;
}
getService() {
return this._service;
}
async connect(params) {
return new Promise((resolve, reject) => {
this._dialog.connect({
...params,
onClose() {
reject(new Error('Connection cancelled. User closed the dialog.'));
},
onConnect(connector) {
resolve(connector);
},
});
});
}
async connectTo(providerConfig, params) {
return new Promise((resolve, reject) => {
this._dialog.connectTo(providerConfig, {
...params,
onClose() {
reject(new Error('Connection cancelled. User closed the dialog.'));
},
onConnect(connector) {
resolve(connector);
},
});
});
}
async disconnect(options) {
await this._service.disconnect(options);
}
async addAsset(address, type = 'tip3_token') {
return this._service.connector?.addAsset(address, type);
}
async changeAccount() {
if (!this._service.provider) {
throw new Error('Provider is not defined');
}
await this._service.provider.changeAccount();
}
async addNetwork(network, switchNetwork) {
if (!this._service.connector) {
throw new Error('Provider is not defined');
}
return this._service.connector.addNetwork(network, switchNetwork);
}
async switchNetwork(networkIdOParams) {
if (!this._service.connector) {
throw new Error('Provider is not defined');
}
return this._service.connector.switchNetwork(networkIdOParams);
}
watch(callback) {
this._watchDisposer = reaction(() => ({
account: toJS(this._service.account),
address: this._service.address,
balance: this._service.balance,
chainId: this._service.chainId,
network: this._service.network,
}), callback, { delay: 10, equals: comparer.shallow });
return this;
}
unwatch() {
this._watchDisposer?.();
return this;
}
_render() {
let container = document.getElementById(CONTAINER_ID);
if (!container) {
container = document.createElement('div');
container.id = CONTAINER_ID;
document.body.appendChild(container);
}
if (!this._root) {
this._root = ReactDOM.createRoot(container, {
identifierPrefix: 'tvm-connect',
});
}
const sharedParams = {
agreementsNote: this.params?.agreementsNote,
popupType: this.params?.popupType,
qrEnabled: this.params?.qrEnabled ?? true,
recentMetaStorageKey: this.params?.recentMetaStorageKey,
};
this._root.render(React.createElement(IntlProvider, { locale: this.params?.locale || 'en' }, React.createElement(TvmConnectServiceContext.Provider, { value: this._service }, React.createElement(SharedParamsContext.Provider, { value: sharedParams }, React.createElement(TvmConnectDialogStoreContext.Provider, { value: this._dialog }, React.createElement(TvmConnectDialog, {
agreementsNote: sharedParams.agreementsNote,
popupType: sharedParams.popupType,
onClose: this._dialog.close,
}))))));
}
_watchDisposer;
}
__decorate([
action.bound,
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", TvmConnectDialogStore)
], TvmConnect.prototype, "getDialog", null);
__decorate([
action.bound,
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", TvmConnectService)
], TvmConnect.prototype, "getService", null);
__decorate([
action.bound,
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", Promise)
], TvmConnect.prototype, "connect", null);
__decorate([
action.bound,
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", Promise)
], TvmConnect.prototype, "connectTo", null);
__decorate([
action.bound,
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", Promise)
], TvmConnect.prototype, "disconnect", null);
__decorate([
action.bound,
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, String]),
__metadata("design:returntype", Promise)
], TvmConnect.prototype, "addAsset", null);
__decorate([
action.bound,
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", Promise)
], TvmConnect.prototype, "changeAccount", null);
__decorate([
action.bound,
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Boolean]),
__metadata("design:returntype", Promise)
], TvmConnect.prototype, "addNetwork", null);
__decorate([
action.bound,
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", Promise)
], TvmConnect.prototype, "switchNetwork", null);
__decorate([
action.bound,
__metadata("design:type", Function),
__metadata("design:paramtypes", [Function]),
__metadata("design:returntype", Object)
], TvmConnect.prototype, "watch", null);
__decorate([
action.bound,
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", Object)
], TvmConnect.prototype, "unwatch", null);
__decorate([
action.bound,
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], TvmConnect.prototype, "_render", null);