Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Generic login + ExtensionProvider login #12

Merged
merged 15 commits into from
Jul 25, 2024
Merged
Prev Previous commit
Next Next commit
refactoring around provider type and login methods
CiprianDraghici committed Jul 25, 2024
commit 0c0b7c5f3f5e839f4ef879434941e1d2f218950d
45 changes: 19 additions & 26 deletions src/core/ProviderFactory.ts
Original file line number Diff line number Diff line change
@@ -1,47 +1,42 @@
import { CrossWindowProvider } from 'lib/sdkWebWalletCrossWindowProvider';
import { ExtensionProvider } from '@multiversx/sdk-extension-provider';
import type { IDAppProviderBase } from '@multiversx/sdk-dapp-utils';
import { LoginMethodsType, LoginMethodsEnum } from '../types';

export interface IProvider extends IDAppProviderBase {
init: () => Promise<boolean>;
// TODO change return type to { address: string, signature: string } and also change the return type in IDAppProviderBase.
login: (options?: { token?: string }) => Promise<string | boolean>;
relogin?: () => Promise<void>;
logout: () => Promise<boolean>;
setAddress: (address: string) => IProvider;
setShouldShowConsentPopup?: (shouldShow: boolean) => void;
getAddress(): string | undefined;
getSignature(): string | undefined;
getTokenLoginSignature(): string | undefined;
}

export interface IProviderConfig {
network: {
walletAddress: string;
};
}

export type ProviderType = LoginMethodsType;

export interface IProviderFactory {
type: ProviderTypeEnum;
type: ProviderType;
config: IProviderConfig;
address?: string;
customProvider?: IProvider;
}

export interface IProviderRecreateFactory extends IProviderFactory {
address: string;
}

export enum ProviderTypeEnum {
iframe = 'iframe',
crossWindow = 'crossWindow',
extension = 'extension',
walletConnect = 'walletConnect',
hardware = 'hardware',
opera = 'opera',
metamask = 'metamask',
wallet = 'wallet',
}
export const ProviderTypeEnum = {
...LoginMethodsEnum
} as const;

export class ProviderFactory {
public async create({
type,
config,
customProvider
}: IProviderFactory): Promise<IProvider | undefined> {
let createdProvider: IProvider | undefined = undefined;

@@ -62,7 +57,7 @@ export class ProviderFactory {
return provider.account.address;
}

createdProvider.getSignature = () => {
createdProvider.getTokenLoginSignature = () => {
return provider.account.signature;
}

@@ -80,20 +75,18 @@ export class ProviderFactory {
break;
}

case ProviderTypeEnum.custom: {
createdProvider = customProvider;
break;
}

default:
break;
}

return createdProvider;
}

public static async reCreate(
config: IProviderRecreateFactory
): Promise<IProvider | undefined> {
const factory = new ProviderFactory();
return await factory.create(config);
}

private async getCrossWindowProvider({
walletAddress
}: Partial<IProviderConfig['network']>) {
25 changes: 0 additions & 25 deletions src/core/methods/login/helpers/resolveLoginMethod.ts

This file was deleted.

5 changes: 2 additions & 3 deletions src/core/methods/login/login.ts
Original file line number Diff line number Diff line change
@@ -3,7 +3,6 @@ import { NativeAuthConfigType } from 'types/nativeAuth.types';
import { nativeAuth } from 'services/nativeAuth';
import { setAddress } from 'store/actions/account';
import { setLoginMethod, setTokenLogin } from 'store/actions/loginInfo/loginInfoActions';
import { resolveLoginMethod } from './helpers/resolveLoginMethod';
import { setAccountProvider } from 'core/providers/accountProvider';

export const login = async ({
@@ -30,7 +29,7 @@ export const login = async ({
await provider.login({ token: loginToken });

const address = provider.getAddress?.();
const signature = provider.getSignature?.();
const signature = provider.getTokenLoginSignature?.();

if(!address) {
throw new Error('Address not found');
@@ -54,7 +53,7 @@ export const login = async ({
nativeAuthToken,
nativeAuthConfig
});
setLoginMethod(resolveLoginMethod(providerConfig.type))
setLoginMethod(providerConfig.type);

return {
address,
6 changes: 0 additions & 6 deletions src/core/methods/logout/logout.ts
Original file line number Diff line number Diff line change
@@ -4,7 +4,6 @@ import { LoginMethodsEnum } from 'types';
import { getAddress } from '../account/getAddress';
import { CrossWindowProvider } from 'lib/sdkWebWalletCrossWindowProvider';
import { logoutAction } from 'store/actions/sharedActions/sharedActions';
import { getWebviewToken } from '../account/getWebviewToken';
import { getAccountProvider } from 'core/providers/accountProvider';
import { getProviderType } from 'core/providers/helpers/utils';

@@ -35,7 +34,6 @@ export type LogoutPropsType = {
};

export async function logout(
shouldAttemptReLogin = Boolean(getWebviewToken()),
options = {
shouldBroadcastLogoutAcrossTabs: true,
hasConsentPopup: false
@@ -45,10 +43,6 @@ export async function logout(
const provider = getAccountProvider();
const providerType = getProviderType(provider);

if (shouldAttemptReLogin && provider?.relogin != null) {
return provider.relogin();
}

if (options.shouldBroadcastLogoutAcrossTabs) {
broadcastLogoutAcrossTabs(address);
}
2 changes: 1 addition & 1 deletion src/core/providers/helpers/emptyProvider.ts
Original file line number Diff line number Diff line change
@@ -110,7 +110,7 @@ export class EmptyProvider implements IProvider {
throw new Error(notInitializedError('getAddress'));
}

getSignature(): string | undefined {
getTokenLoginSignature(): string | undefined {
throw new Error(notInitializedError(`getSignature`));
}
}
13 changes: 6 additions & 7 deletions src/core/providers/helpers/utils.ts
Original file line number Diff line number Diff line change
@@ -3,21 +3,21 @@ import { HWProvider } from '@multiversx/sdk-hw-provider';
import { MetamaskProvider } from '@multiversx/sdk-metamask-provider/out/metamaskProvider';
import { OperaProvider } from '@multiversx/sdk-opera-provider';
import { WalletProvider } from '@multiversx/sdk-web-wallet-provider';
import { LoginMethodsEnum } from 'types/enums.types';
import { LoginMethodsType, LoginMethodsEnum } from 'types/enums.types';
import { WalletConnectV2Provider } from 'utils/walletconnect/__sdkWalletconnectProvider';
import { EmptyProvider } from './emptyProvider';
import { CrossWindowProvider } from 'lib/sdkWebWalletCrossWindowProvider';

export const getProviderType = <TProvider extends object>(
provider?: TProvider | null
): LoginMethodsEnum => {
): LoginMethodsType => {
switch (provider?.constructor) {
case WalletProvider:
return LoginMethodsEnum.wallet;
return LoginMethodsEnum.webhook;
case WalletConnectV2Provider:
return LoginMethodsEnum.walletconnectv2;
return LoginMethodsEnum.walletConnect;
case HWProvider:
return LoginMethodsEnum.ledger;
return LoginMethodsEnum.hardware;
case ExtensionProvider:
return LoginMethodsEnum.extension;
case MetamaskProvider:
@@ -27,8 +27,7 @@ export const getProviderType = <TProvider extends object>(
case CrossWindowProvider:
return LoginMethodsEnum.crossWindow;
case EmptyProvider:
return LoginMethodsEnum.none;
default:
return LoginMethodsEnum.extra;
return LoginMethodsEnum.none;
}
};
4 changes: 2 additions & 2 deletions src/store/actions/loginInfo/loginInfoActions.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { LoginMethodsEnum } from 'types/enums.types';
import { LoginMethodsType } from 'types/enums.types';
import { TokenLoginType } from 'types/login.types';
import {
LedgerLoginType,
@@ -7,7 +7,7 @@ import {
} from 'store/slices/loginInfo/loginInfo.types';
import { getStore } from 'store/store';

export const setLoginMethod = (loginMethod: LoginMethodsEnum) =>
export const setLoginMethod = (loginMethod: LoginMethodsType) =>
getStore().setState(({ loginInfo: state }) => {
state.loginMethod = loginMethod;
});
4 changes: 2 additions & 2 deletions src/store/actions/sharedActions/sharedActions.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { Address } from '@multiversx/sdk-core/out';
import { getStore } from '../../store';
import { LoginMethodsEnum } from 'types/enums.types';
import { LoginMethodsType } from 'types/enums.types';
import { resetStore } from 'store/middleware/logoutMiddleware';

export const logoutAction = () => getStore().setState(resetStore);
export interface LoginActionPayloadType {
address: string;
loginMethod: LoginMethodsEnum;
loginMethod: LoginMethodsType;
}

export const loginAction = ({ address, loginMethod }: LoginActionPayloadType) =>
4 changes: 2 additions & 2 deletions src/store/slices/loginInfo/loginInfo.types.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { LoginMethodsEnum } from 'types/enums.types';
import { LoginMethodsEnum, LoginMethodsType } from 'types/enums.types';
import { TokenLoginType } from 'types/login.types';

export interface WalletConnectLoginType {
@@ -18,7 +18,7 @@ export interface LoginInfoType {
}

export interface LoginInfoSliceType {
loginMethod: LoginMethodsEnum;
loginMethod: LoginMethodsType;
walletConnectLogin: WalletConnectLoginType | null;
ledgerLogin: LedgerLoginType | null;
tokenLogin: TokenLoginType | null;
26 changes: 14 additions & 12 deletions src/types/enums.types.ts
Original file line number Diff line number Diff line change
@@ -4,18 +4,20 @@ export enum EnvironmentsEnum {
mainnet = 'mainnet'
}

export enum LoginMethodsEnum {
ledger = 'ledger',
walletconnect = 'walletconnect',
walletconnectv2 = 'walletconnectv2',
wallet = 'wallet',
crossWindow = 'crossWindow',
extension = 'extension',
metamask = 'metamask',
opera = 'opera',
extra = 'extra',
none = ''
}
export const LoginMethodsEnum = {
iframe: 'iframe',
crossWindow: 'crossWindow',
extension: 'extension',
walletConnect: 'walletConnect',
hardware: 'hardware',
opera: 'opera',
metamask: 'metamask',
webhook: 'webhook',
custom: "custom",
none: ''
} as const

export type LoginMethodsType = typeof LoginMethodsEnum[keyof typeof LoginMethodsEnum];

export enum TypesOfSmartContractCallsEnum {
MultiESDTNFTTransfer = 'MultiESDTNFTTransfer',