8000 Typed Local Storage by aaronmgdr · Pull Request #243 · celo-org/react-celo · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content
This repository was archived by the owner on Dec 11, 2024. It is now read-only.

Typed Local Storage #243

Merged
merged 6 commits into from
Jun 3, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 14 additions & 14 deletions packages/react-celo/__tests__/connectors/ledger.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ import { CeloContract } from '@celo/contractkit';

import { Alfajores, localStorageKeys, WalletTypes } from '../../src';
import { LedgerConnector } from '../../src/connectors';
import {
getLastUsedWalletArgs,
getTypedStorageKey,
} from '../../src/utils/localStorage';

describe('LedgerConnector', () => {
let connector: LedgerConnector;
Expand All @@ -10,36 +14,32 @@ describe('LedgerConnector', () => {
});

it('remembers info in localStorage', () => {
expect(localStorage.getItem(localStorageKeys.lastUsedFeeCurrency)).toEqual(
expect(getTypedStorageKey(localStorageKeys.lastUsedFeeCurrency)).toEqual(
null
);

expect(localStorage.getItem(localStorageKeys.lastUsedWalletType)).toEqual(
expect(getTypedStorageKey(localStorageKeys.lastUsedWalletType)).toEqual(
WalletTypes.Ledger
);

expect(
localStorage.getItem(localStorageKeys.lastUsedWalletArguments)
).toEqual('[0]');

expect(localStorage.getItem(localStorageKeys.lastUsedNetwork)).toEqual(
expect(getTypedStorageKey(localStorageKeys.lastUsedNetwork)).toEqual(
'Alfajores'
);

expect(getLastUsedWalletArgs()).toEqual([0]);
});

describe('close()', () => {
it('clears out localStorage', () => {
connector.close();

expect(
localStorage.getItem(localStorageKeys.lastUsedFeeCurrency)
).toEqual(null);
expect(getTypedStorageKey(localStorageKeys.lastUsedFeeCurrency)).toEqual(
null
);

expect(
localStorage.getItem(localStorageKeys.lastUsedWalletArguments)
).toEqual(null);
expect(getLastUsedWalletArgs()).toEqual(null);

expect(localStorage.getItem(localStorageKeys.lastUsedNetwork)).toEqual(
expect(getTypedStorageKey(localStorageKeys.lastUsedNetwork)).toEqual(
null
);
});
Expand Down
7 changes: 4 additions & 3 deletions packages/react-celo/__tests__/connectors/metamask.test.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import { CeloContract } from '@celo/contractkit/lib/base';
import { generateTestingUtils } from 'eth-testing';

import { localStorageKeys } from '../../src';
import { MetaMaskConnector } from '../../src/connectors';
import { Alfajores, Baklava, localStorageKeys } from '../../src/constants';
import localStorage from '../../src/utils/localStorage';
import { Alfajores, Baklava } from '../../src/constants';
import { getTypedStorageKey } from '../../src/utils/localStorage';

const ACCOUNT = '0xf61B443A155b07D2b2cAeA2d99715dC84E839EEf';

Expand Down Expand Up @@ -42,7 +43,7 @@ describe('MetaMaskConnector', () => {
it('sets network in local storage and in connection', async () => {
await connector.updateKitWithNetwork(Baklava);

expect(localStorage.getItem(localStorageKeys.lastUsedNetwork)).toEqual(
expect(getTypedStorageKey(localStorageKeys.lastUsedNetwork)).toEqual(
Baklava.name
);
});
Expand Down
20 changes: 11 additions & 9 deletions packages/react-celo/__tests__/connectors/private-key.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ import { CeloContract } from '@celo/contractkit';

import { Alfajores, localStorageKeys } from '../../src';
import { PrivateKeyConnector } from '../../src/connectors';
import {
getLastUsedWalletArgs,
getTypedStorageKey,
} from '../../src/utils/localStorage';

const TEST_KEY =
'1234567890abcdef1234567890abcdef1234567890abcdef1234567890abbdef';
Expand Down Expand Up @@ -31,13 +35,11 @@ describe('PrivateKeyConnector', () => {
});

it('sets the private key in locale storage', () => {
expect(
localStorage.getItem(localStorageKeys.lastUsedWalletArguments)
).toEqual(JSON.stringify([TEST_KEY]));
expect(getLastUsedWalletArgs()).toEqual([TEST_KEY]);
});

it('sets the last network in local storage', () => {
expect(localStorage.getItem(localStorageKeys.lastUsedNetwork)).toEqual(
expect(getTypedStorageKey(localStorageKeys.lastUsedNetwork)).toEqual(
Alfajores.name
);
});
Expand All @@ -54,15 +56,15 @@ describe('PrivateKeyConnector', () => {

connector.close();

expect(
localStorage.getItem(localStorageKeys.lastUsedFeeCurrency)
).toEqual(null);
expect(getTypedStorageKey(localStorageKeys.lastUsedFeeCurrency)).toEqual(
null
);

expect(
localStorage.getItem(localStorageKeys.lastUsedWalletArguments)
getTypedStorageKey(localStorageKeys.lastUsedWalletArguments)
).toEqual(null);

expect(localStorage.getItem(localStorageKeys.lastUsedNetwork)).toEqual(
expect(getTypedStorageKey(localStorageKeys.lastUsedNetwork)).toEqual(
null
);
});
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import { CeloContract } from '@celo/contractkit';

import { localStorageKeys } from '../../src';
import { UnauthenticatedConnector } from '../../src/connectors';
import { Alfajores, Baklava, localStorageKeys } from '../../src/constants';
import { Alfajores, Baklava } from '../../src/constants';
import { celoReactReducer, ReducerState } from '../../src/react-celo-reducer';
import { getTypedStorageKey } from '../../src/utils/localStorage';

const initialState: ReducerState = {
connector: new UnauthenticatedConnector(Alfajores),
Expand Down Expand Up @@ -34,7 +36,7 @@ describe('setAddress', () => {
expect(newState).toEqual({ ...initialState, address: 'test-address' });
});
it('saves the address in localStorage', () => {
expect(localStorage.getItem(localStorageKeys.lastUsedAddress)).toEqual(
expect(getTypedStorageKey(localStorageKeys.lastUsedAddress)).toEqual(
'test-address'
);
});
Expand Down
43 changes: 18 additions & 25 deletions packages/react-celo/src/connectors/connectors.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { ReadOnlyWallet } from '@celo/connect/lib';
import { CeloContract, CeloTokenContract } from '@celo/contractkit/lib/base';
import {
MiniContractKit,
Expand All @@ -20,8 +19,13 @@ import { BigNumber } from 'bignumber.js';
import { localStorageKeys, WalletTypes } from '../constants';
import { Connector, Maybe, Network } from '../types';
import { getEthereum, getInjectedEthereum } from '../utils/ethereum';
import { clearPreviousConfig } from '../utils/helpers';
import localStorage from '../utils/localStorage';
import {
clearPreviousConfig,
forgetConnection,
setLastUsedWalletArgs,
setTypedStorageKey,
WalletArgs,
} from '../utils/localStorage';
import { switchToCeloNetwork } from '../utils/metamask';

type Web3Type = Parameters<typeof newKitFromWeb3>[0];
Expand All @@ -43,9 +47,7 @@ export class UnauthenticatedConnector implements Connector {
}

persist() {
localStorage.removeItem(localStorageKeys.lastUsedWalletType);
localStorage.removeItem(localStorageKeys.lastUsedWalletArguments);
localStorage.removeItem(localStorageKeys.lastUsedNetwork);
forgetConnection();
}

initialise(): this {
Expand Down Expand Up @@ -123,15 +125,9 @@ export class LedgerConnector implements Connector {
private index: number,
public feeCurrency: CeloTokenContract
) {
localStorage.setItem(
localStorageKeys.lastUsedWalletType,
WalletTypes.Ledger
);
localStorage.setItem(
localStorageKeys.lastUsedWalletArguments,
JSON.stringify([index])
);
localStorage.setItem(localStorageKeys.lastUsedNetwork, network.name);
setLastUsedWalletArgs([index]);
setTypedStorageKey(localStorageKeys.lastUsedWalletType, WalletTypes.Ledger);
setTypedStorageKey(localStorageKeys.lastUsedNetwork, network.name);
this.kit = newKit(network.rpcUrl);
}

Expand Down Expand Up @@ -260,7 +256,7 @@ export class InjectedConnector implements Connector {
}

async updateKitWithNetwork(network: Network): Promise<void> {
localStorage.setItem(localStorageKeys.lastUsedNetwork, network.name);
setTypedStorageKey(localStorageKeys.lastUsedNetwork, network.name);
this.network = network;
await this.initialise();
}
Expand Down Expand Up @@ -387,7 +383,7 @@ export class WalletConnectConnector implements Connector {
// version == 1
// ? new WalletConnectWalletV1(options as WalletConnectWalletOptionsV1)
// : new WalletConnectWallet(options as WalletConnectWalletOptions);
this.kit = newKit(network.rpcUrl, wallet as ReadOnlyWallet);
this.kit = newKit(network.rpcUrl, wallet);
this.version = version;
}

Expand Down Expand Up @@ -514,20 +510,17 @@ function persist({
}: {
walletType?: WalletTypes;
walletId?: string;
options?: unknown[];
options?: WalletArgs;
network?: Network;
}): void {
if (walletType) {
localStorage.setItem(localStorageKeys.lastUsedWalletType, walletType);
setTypedStorageKey(localStorageKeys.lastUsedWalletType, walletType);
}
if (walletId) {
localStorage.setItem(localStorageKeys.lastUsedWalletId, walletId);
setTypedStorageKey(localStorageKeys.lastUsedWalletId, walletId);
}
if (network) {
localStorage.setItem(localStorageKeys.lastUsedNetwork, network.name);
setTypedStorageKey(localStorageKeys.lastUsedNetwork, network.name);
}
localStorage.setItem(
localStorageKeys.lastUsedWalletArguments,
JSON.stringify(options)
);
setLastUsedWalletArgs(options);
}
16 changes: 8 additions & 8 deletions packages/react-celo/src/constants.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,14 @@ import {
WALLETCONNECT,
} from './walletIcons';

export const localStorageKeys = {
lastUsedAddress: 'react-celo/last-used-address',
lastUsedNetwork: 'react-celo/last-used-network',
lastUsedWalletType: 'react-celo/last-used-wallet',
lastUsedWalletId: 'react-celo/last-used-wallet-id',
lastUsedWalletArguments: 'react-celo/last-used-wallet-arguments',
lastUsedFeeCurrency: 'react-celo/last-used-fee-currency',
};
export enum localStorageKeys {
lastUsedAddress = 'react-celo/last-used-address',
lastUsedNetwork = 'react-celo/last-used-network',
lastUsedWalletType = 'react-celo/last-used-wallet',
lastUsedWalletId = 'react-celo/last-used-wallet-id',
lastUsedWalletArguments = 'react-celo/last-used-wallet-arguments',
lastUsedFeeCurrency = 'react-celo/last-used-fee-currency',
}

export enum SupportedProviders {
CeloExtensionWallet = 'Celo Extension Wallet',
Expand Down
27 changes: 12 additions & 15 deletions packages/react-celo/src/react-celo-reducer.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
import { CeloTokenContract } from '@celo/contractkit/lib/base';

import { UnauthenticatedConnector } from './connectors';
import { localStorageKeys } from './constants';
import { localStorageKeys as lsKeys } from './constants';
import { Connector, Dapp, Maybe, Network, Theme } from './types';
import { clearPreviousConfig } from './utils/helpers';
import localStorage from './utils/localStorage';
import {
clearPreviousConfig,
removeLastUsedAddress,
setTypedStorageKey,
} from './utils/localStorage';

export function celoReactReducer(
state: ReducerState,
Expand All @@ -22,9 +25,9 @@ export function celoReactReducer(
return state;
}
if (action.payload) {
localStorage.setItem(localStorageKeys.lastUsedAddress, action.payload);
setTypedStorageKey(lsKeys.lastUsedAddress, action.payload);
} else {
localStorage.removeItem(localStorageKeys.lastUsedAddress);
removeLastUsedAddress();
}
return {
...state,
Expand All @@ -34,17 +37,14 @@ export function celoReactReducer(
if (action.payload === state.network) {
return state;
}
localStorage.setItem(
localStorageKeys.lastUsedNetwork,
action.payload.name
);
setTypedStorageKey(lsKeys.lastUsedNetwork, action.payload.name);
return {
...state,
network: action.payload,
};

case 'setConnector':
localStorage.removeItem(localStorageKeys.lastUsedAddress);
removeLastUsedAddress();
return {
...state,
connector: action.payload,
Expand All @@ -55,16 +55,13 @@ export function celoReactReducer(
if (action.payload === state.feeCurrency) {
return state;
}
localStorage.setItem(
localStorageKeys.lastUsedFeeCurrency,
action.payload
);
setTypedStorageKey(lsKeys.lastUsedFeeCurrency, action.payload);
return { ...state, feeCurrency: action.payload };
case 'initialisedConnector': {
const newConnector = action.payload;
const address = newConnector.kit.connection.defaultAccount ?? null;
if (address) {
localStorage.setItem(localStorageKeys.lastUsedAddress, address);
setTypedStorageKey(lsKeys.lastUsedAddress, address);
}
return {
...state,
Expand Down
11 changes: 3 additions & 8 deletions packages/react-celo/src/use-celo-methods.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,15 @@ import { useCallback } from 'react';
import { isMobile } from 'react-device-detect';

import { CONNECTOR_TYPES } from './connectors';
import {
localStorageKeys,
STATIC_NETWORK_WALLETS,
WalletTypes,
} from './constants';
import { STATIC_NETWORK_WALLETS, WalletTypes } from './constants';
import {
ContractCacheBuilder,
useContractsCache,
} from './ContractCacheBuilder';
import { Dispatcher } from './react-celo-provider';
import { Connector, Network, Theme } from './types';
import { contrastCheck, fixTheme } from './utils/colors';
import { getLastUsedWalletArgs } from './utils/localStorage';

export function useCeloMethods(
{
Expand Down Expand Up @@ -122,9 +119,7 @@ export function useCeloMethods(
}
if (network === newNetwork) return;
if (connector.initialised) {
const connectorArgs = JSON.parse(
localStorage.getItem(localStorageKeys.lastUsedWalletArguments) || '[]'
) as unknown[];
const connectorArgs = getLastUsedWalletArgs() || [];
await connector.close();
const ConnectorConstructor = CONNECTOR_TYPES[connector.type];
const newConnector = new ConnectorConstructor(
Expand Down
Loading
0