Remember last account selection for authorization (#1133)

* remember last selection

* nit for readability
This commit is contained in:
Thibaut Sardan
2022-09-01 06:59:23 +01:00
committed by GitHub
parent 85a3c58986
commit 8324ae0868
5 changed files with 44 additions and 12 deletions

1
.gitignore vendored
View File

@@ -26,3 +26,4 @@ package-lock.json
_book
docs/html
.idea
.vscode

View File

@@ -34,14 +34,6 @@ function getSuri (seed: string, type?: KeypairType): string {
: seed;
}
function transformAccounts (accounts: SubjectInfo): AccountJson[] {
return Object.values(accounts).map(({ json: { address, meta }, type }): AccountJson => ({
address,
...meta,
type
}));
}
function isJsonPayload (value: SignerPayloadJSON | SignerPayloadRaw): value is SignerPayloadJSON {
return (value as SignerPayloadJSON).genesisHash !== undefined;
}
@@ -56,6 +48,15 @@ export default class Extension {
this.#state = state;
}
private transformAccounts (accounts: SubjectInfo): AccountJson[] {
return Object.values(accounts).map(({ json: { address, meta }, type }): AccountJson => ({
address,
isDefaultAuthSelected: this.#state.defaultAuthAccountSelection.includes(address),
...meta,
type
}));
}
private accountsCreateExternal ({ address, genesisHash, name }: RequestAccountCreateExternal): boolean {
keyring.addExternal(address, { genesisHash, name });
@@ -127,6 +128,12 @@ export default class Extension {
});
this.#state.updateAuthorizedAccounts(authorizedAccountsDiff);
// cycle through default account selection for auth and remove any occurence of the account
const newDefaultAuthAccounts = this.#state.defaultAuthAccountSelection.filter((defaultSelectionAddress) => defaultSelectionAddress !== address);
this.#state.updateDefaultAuthAccounts(newDefaultAuthAccounts);
keyring.forgetAccount(address);
return true;
@@ -181,7 +188,7 @@ export default class Extension {
private accountsSubscribe (id: string, port: chrome.runtime.Port): boolean {
const cb = createSubscription<'pri(accounts.subscribe)'>(id, port);
const subscription = accountsObservable.subject.subscribe((accounts: SubjectInfo): void =>
cb(transformAccounts(accounts))
cb(this.transformAccounts(accounts))
);
port.onDisconnect.addListener((): void => {

View File

@@ -16,7 +16,7 @@ import { assert } from '@polkadot/util';
import { MetadataStore } from '../../stores';
import { withErrorLog } from './helpers';
interface Resolver <T> {
interface Resolver<T> {
reject: (error: Error) => void;
resolve: (result: T) => void;
}
@@ -94,6 +94,7 @@ export enum NotificationOptions {
}
const AUTH_URLS_KEY = 'authUrls';
const DEFAULT_AUTH_ACCOUNTS = 'defaultAuthAccounts';
function extractMetadata (store: MetadataStore): void {
store.allMap((map): void => {
@@ -158,6 +159,8 @@ export default class State {
public readonly signSubject: BehaviorSubject<SigningRequest[]> = new BehaviorSubject<SigningRequest[]>([]);
public defaultAuthAccountSelection: string[] = [];
constructor (providers: Providers = {}) {
this.#providers = providers;
@@ -168,6 +171,12 @@ export default class State {
const previousAuth = JSON.parse(authString) as AuthUrls;
this.#authUrls = previousAuth;
// retrieve previously set default auth accounts
const defaultAuthString = localStorage.getItem(DEFAULT_AUTH_ACCOUNTS) || '[]';
const previousDefaultAuth = JSON.parse(defaultAuthString) as string[];
this.defaultAuthAccountSelection = previousDefaultAuth;
}
public get knownMetadata (): MetadataDef[] {
@@ -241,6 +250,7 @@ export default class State {
};
this.saveCurrentAuthList();
this.updateDefaultAuthAccounts(authorizedAccounts);
delete this.#authRequests[id];
this.updateIconAuth(true);
};
@@ -266,6 +276,15 @@ export default class State {
localStorage.setItem(AUTH_URLS_KEY, JSON.stringify(this.#authUrls));
}
private saveDefaultAuthAccounts () {
localStorage.setItem(DEFAULT_AUTH_ACCOUNTS, JSON.stringify(this.defaultAuthAccountSelection));
}
public updateDefaultAuthAccounts (newList: string[]) {
this.defaultAuthAccountSelection = newList;
this.saveDefaultAuthAccounts();
}
private metaComplete = (id: string, resolve: (result: boolean) => void, reject: (error: Error) => void): Resolver<boolean> => {
const complete = (): void => {
delete this.#metaRequests[id];

View File

@@ -36,6 +36,7 @@ export interface AccountJson extends KeyringPair$Meta {
isExternal?: boolean;
isHardware?: boolean;
isHidden?: boolean;
isDefaultAuthSelected?: boolean
name?: string;
parentAddress?: string;
suri?: string;

View File

@@ -27,8 +27,12 @@ function Request ({ authId, className, isFirst, request: { origin }, url }: Prop
const onAction = useContext(ActionContext);
useEffect(() => {
setSelectedAccounts && setSelectedAccounts([]);
}, [setSelectedAccounts]);
const defaultAccountSelection = accounts
.filter(({ isDefaultAuthSelected }) => !!isDefaultAuthSelected)
.map(({ address }) => address);
setSelectedAccounts && setSelectedAccounts(defaultAccountSelection);
}, [accounts, setSelectedAccounts]);
const _onApprove = useCallback(
(): void => {