Remember last account selection for authorization (#1133)
* remember last selection * nit for readability
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -26,3 +26,4 @@ package-lock.json
|
||||
_book
|
||||
docs/html
|
||||
.idea
|
||||
.vscode
|
||||
@@ -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 => {
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -36,6 +36,7 @@ export interface AccountJson extends KeyringPair$Meta {
|
||||
isExternal?: boolean;
|
||||
isHardware?: boolean;
|
||||
isHidden?: boolean;
|
||||
isDefaultAuthSelected?: boolean
|
||||
name?: string;
|
||||
parentAddress?: string;
|
||||
suri?: string;
|
||||
|
||||
@@ -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 => {
|
||||
|
||||
Reference in New Issue
Block a user