Skip to content

Commit

Permalink
Fix issue with event bus state manager (#58)
Browse files Browse the repository at this point in the history
* Fix issue with event bus state manager

* Update changelog

* Prettify files
  • Loading branch information
mgavrila authored Jan 9, 2025
1 parent a5a14db commit 0d62a9f
Show file tree
Hide file tree
Showing 11 changed files with 58 additions and 80 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

- [Fix issue with state manager](https://github.com/multiversx/mx-sdk-dapp-core/pull/58)

## [[0.0.0-alpha.10](https://github.com/multiversx/mx-sdk-dapp-core/pull/56)] - 2024-12-23

- [Added transactions interpretation helpers](https://github.com/multiversx/mx-sdk-dapp-core/pull/55)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,6 @@ export class LedgerConnectStateManager<
T extends
IEventBus<ILedgerConnectModalData> = IEventBus<ILedgerConnectModalData>
> {
private static instance: LedgerConnectStateManager<
IEventBus<ILedgerConnectModalData>
> | null = null;
public readonly addressesPerPage = 10;

private eventBus: T = {
Expand Down Expand Up @@ -61,25 +58,11 @@ export class LedgerConnectStateManager<

private data: ILedgerConnectModalData = { ...this.initialData };

private constructor(eventBus: T) {
constructor(eventBus: T) {
this.eventBus = eventBus;
this.resetData();
}

public static getInstance<U extends IEventBus<ILedgerConnectModalData>>(
eventBus?: U
): LedgerConnectStateManager<U> | null {
if (!eventBus) {
return null;
}
if (!LedgerConnectStateManager.instance) {
LedgerConnectStateManager.instance = new LedgerConnectStateManager(
eventBus
);
}
return LedgerConnectStateManager.instance as LedgerConnectStateManager<U>;
}

public updateAllAccounts(accounts: ILedgerAccount[]): void {
this.allAccounts = accounts;
this.accountScreenData.accounts = accounts;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,6 @@ export class PendingTransactionsStateManager<
T extends
IEventBus<IPendingTransactionsModalData> = IEventBus<IPendingTransactionsModalData>
> {
private static instance: PendingTransactionsStateManager<
IEventBus<IPendingTransactionsModalData>
> | null = null;
private eventBus: T;

private initialData: IPendingTransactionsModalData = {
Expand All @@ -22,20 +19,10 @@ export class PendingTransactionsStateManager<

private data: IPendingTransactionsModalData = { ...this.initialData };

private constructor(eventBus: T) {
constructor(eventBus: T) {
this.eventBus = eventBus;
}

public static getInstance<U extends IEventBus<IPendingTransactionsModalData>>(
eventBus: U
): PendingTransactionsStateManager<U> {
if (!PendingTransactionsStateManager.instance) {
PendingTransactionsStateManager.instance =
new PendingTransactionsStateManager(eventBus);
}
return PendingTransactionsStateManager.instance as PendingTransactionsStateManager<U>;
}

public closeAndReset(): void {
this.data.shouldClose = true;
this.notifyDataUpdate();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,6 @@ export class SignTransactionsStateManager<
T extends
IEventBus<ISignTransactionsModalData> = IEventBus<ISignTransactionsModalData>
> {
private static instance: SignTransactionsStateManager<
IEventBus<ISignTransactionsModalData>
> | null = null;
public readonly addressesPerPage = 10;

private eventBus: T = {
Expand All @@ -34,25 +31,11 @@ export class SignTransactionsStateManager<

private data: ISignTransactionsModalData = { ...this.initialData };

private constructor(eventBus: T) {
constructor(eventBus: T) {
this.eventBus = eventBus;
this.resetData();
}

public static getInstance<U extends IEventBus<ISignTransactionsModalData>>(
eventBus?: U
): SignTransactionsStateManager<U> | null {
if (!eventBus) {
return null;
}
if (!SignTransactionsStateManager.instance) {
SignTransactionsStateManager.instance = new SignTransactionsStateManager(
eventBus
);
}
return SignTransactionsStateManager.instance as SignTransactionsStateManager<U>;
}

public updateCommonData(
members: Partial<ISignTransactionsModalData['commonData']>
): void {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,6 @@ export class WalletConnectStateManager<
T extends
IEventBus<IWalletConnectModalData> = IEventBus<IWalletConnectModalData>
> {
private static instance: WalletConnectStateManager<
IEventBus<IWalletConnectModalData>
> | null = null;
private eventBus: T;

private initialData: IWalletConnectModalData = {
Expand All @@ -20,21 +17,10 @@ export class WalletConnectStateManager<

private data: IWalletConnectModalData = { ...this.initialData };

private constructor(eventBus: T) {
constructor(eventBus: T) {
this.eventBus = eventBus;
}

public static getInstance<U extends IEventBus<IWalletConnectModalData>>(
eventBus: U
): WalletConnectStateManager<U> {
if (!WalletConnectStateManager.instance) {
WalletConnectStateManager.instance = new WalletConnectStateManager(
eventBus
);
}
return WalletConnectStateManager.instance as WalletConnectStateManager<U>;
}

public closeAndReset(): void {
this.data.shouldClose = true;
this.notifyDataUpdate();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,7 @@ export class CrossWindowProviderStrategy {
throw new Error(ProviderErrorsEnum.eventBusError);
}

const manager = PendingTransactionsStateManager.getInstance(eventBus);
const manager = new PendingTransactionsStateManager(eventBus);

const onClose = (cancelAction = true) => {
if (!this.provider) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,24 @@
import { Transaction, Message } from '@multiversx/sdk-core/out';
import { IDAppProviderOptions } from '@multiversx/sdk-dapp-utils/out';
import { Message, Transaction } from '@multiversx/sdk-core/out';
import { ExtensionProvider } from '@multiversx/sdk-extension-provider/out/extensionProvider';
import {
PendingTransactionsStateManager,
PendingTransactionsEventsEnum
} from 'core/managers';
import { getAccount } from 'core/methods/account/getAccount';
import { getAddress } from 'core/methods/account/getAddress';
import { IProvider } from 'core/providers/types/providerFactory.types';
import {
IProvider,
ProviderTypeEnum
} from 'core/providers/types/providerFactory.types';
import { PendingTransactionsModal } from 'lib/sdkDappCoreUi';
import { Nullable, ProviderErrorsEnum } from 'types';
import { ProviderErrorsEnum } from 'types';
import { createModalElement } from 'utils/createModalElement';

export class ExtensionProviderStrategy {
private address: string = '';
private provider: ExtensionProvider | null = null;
private _signTransactions:
| ((transactions: Transaction[]) => Promise<Transaction[]>)
| null = null;
private _signMessage: ((message: Message) => Promise<Message>) | null = null;

constructor(address?: string) {
Expand All @@ -29,22 +33,22 @@ export class ExtensionProviderStrategy {
await this.provider.init();
}

this._signTransactions = this.provider.signTransactions.bind(this.provider);
this._signMessage = this.provider.signMessage.bind(this.provider);

return this.buildProvider();
};

private buildProvider = () => {
const { address } = getAccount();

if (!this.provider) {
throw new Error(ProviderErrorsEnum.notInitialized);
}

const provider = this.provider as unknown as IProvider;
provider.signTransactions = this.signTransactions;
provider.signMessage = this.signMessage;
provider.setAccount({ address: this.address });

provider.setAccount({ address: this.address || address });
return provider;
};

Expand All @@ -62,6 +66,35 @@ export class ExtensionProviderStrategy {
this.address = address;
};

private signTransactions = async (transactions: Transaction[]) => {
if (!this.provider || !this._signTransactions) {
throw new Error(ProviderErrorsEnum.notInitialized);
}

const modalElement = await createModalElement<PendingTransactionsModal>(
'pending-transactions-modal'
);
const { eventBus, manager, onClose } =
await this.getModalHandlers(modalElement);

eventBus.subscribe(PendingTransactionsEventsEnum.CLOSE, onClose);

manager.updateData({
isPending: true,
title: 'Confirm on MultiversX DeFi Wallet',
subtitle: 'Check your MultiversX Wallet Extension to sign the transaction'
});
try {
const signedTransactions: Transaction[] =
(await this._signTransactions(transactions)) ?? [];

return signedTransactions;
} finally {
onClose();
eventBus.unsubscribe(PendingTransactionsEventsEnum.CLOSE, onClose);
}
};

private signMessage = async (message: Message) => {
if (!this.provider || !this._signMessage) {
throw new Error(ProviderErrorsEnum.notInitialized);
Expand Down Expand Up @@ -102,7 +135,7 @@ export class ExtensionProviderStrategy {
throw new Error(ProviderErrorsEnum.eventBusError);
}

const manager = PendingTransactionsStateManager.getInstance(eventBus);
const manager = new PendingTransactionsStateManager(eventBus);

const onClose = (cancelAction = true) => {
if (!this.provider) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ export class IFrameProviderStrategy {
throw new Error(ProviderErrorsEnum.eventBusError);
}

const manager = PendingTransactionsStateManager.getInstance(eventBus);
const manager = new PendingTransactionsStateManager(eventBus);

const onClose = (cancelAction = true) => {
if (!this.provider) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,11 @@ export class LedgerProviderStrategy {

const eventBus = await this.createEventBus();

const manager = LedgerConnectStateManager.getInstance(eventBus);
if (!eventBus) {
throw new Error(ProviderErrorsEnum.eventBusError);
}

const manager = new LedgerConnectStateManager(eventBus);
this.manager = manager;

if (!this.provider) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ export class WalletConnectProviderStrategy {
const eventBus = await this.createEventBus();

if (eventBus) {
const manager = WalletConnectStateManager.getInstance(eventBus);
const manager = new WalletConnectStateManager(eventBus);
this.manager = manager;
}

Expand Down Expand Up @@ -401,7 +401,7 @@ export class WalletConnectProviderStrategy {
throw new Error(ProviderErrorsEnum.eventBusError);
}

const manager = PendingTransactionsStateManager.getInstance(eventBus);
const manager = new PendingTransactionsStateManager(eventBus);

const onClose = async (cancelAction = true) => {
if (!this.provider) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ export async function signTransactions({
throw new Error('Event bus not provided for Ledger provider');
}

const manager = SignTransactionsStateManager.getInstance(eventBus);
const manager = new SignTransactionsStateManager(eventBus);
if (!manager) {
throw new Error('Unable to establish connection with sign screens');
}
Expand Down

0 comments on commit 0d62a9f

Please sign in to comment.