Remember last account selection for authorization (#1133)
* remember last selection * nit for readability
This commit is contained in:
parent
85a3c58986
commit
8324ae0868
1
.gitignore
vendored
1
.gitignore
vendored
@ -26,3 +26,4 @@ package-lock.json
|
|||||||
_book
|
_book
|
||||||
docs/html
|
docs/html
|
||||||
.idea
|
.idea
|
||||||
|
.vscode
|
||||||
@ -34,14 +34,6 @@ function getSuri (seed: string, type?: KeypairType): string {
|
|||||||
: seed;
|
: 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 {
|
function isJsonPayload (value: SignerPayloadJSON | SignerPayloadRaw): value is SignerPayloadJSON {
|
||||||
return (value as SignerPayloadJSON).genesisHash !== undefined;
|
return (value as SignerPayloadJSON).genesisHash !== undefined;
|
||||||
}
|
}
|
||||||
@ -56,6 +48,15 @@ export default class Extension {
|
|||||||
this.#state = state;
|
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 {
|
private accountsCreateExternal ({ address, genesisHash, name }: RequestAccountCreateExternal): boolean {
|
||||||
keyring.addExternal(address, { genesisHash, name });
|
keyring.addExternal(address, { genesisHash, name });
|
||||||
|
|
||||||
@ -127,6 +128,12 @@ export default class Extension {
|
|||||||
});
|
});
|
||||||
|
|
||||||
this.#state.updateAuthorizedAccounts(authorizedAccountsDiff);
|
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);
|
keyring.forgetAccount(address);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -181,7 +188,7 @@ export default class Extension {
|
|||||||
private accountsSubscribe (id: string, port: chrome.runtime.Port): boolean {
|
private accountsSubscribe (id: string, port: chrome.runtime.Port): boolean {
|
||||||
const cb = createSubscription<'pri(accounts.subscribe)'>(id, port);
|
const cb = createSubscription<'pri(accounts.subscribe)'>(id, port);
|
||||||
const subscription = accountsObservable.subject.subscribe((accounts: SubjectInfo): void =>
|
const subscription = accountsObservable.subject.subscribe((accounts: SubjectInfo): void =>
|
||||||
cb(transformAccounts(accounts))
|
cb(this.transformAccounts(accounts))
|
||||||
);
|
);
|
||||||
|
|
||||||
port.onDisconnect.addListener((): void => {
|
port.onDisconnect.addListener((): void => {
|
||||||
|
|||||||
@ -16,7 +16,7 @@ import { assert } from '@polkadot/util';
|
|||||||
import { MetadataStore } from '../../stores';
|
import { MetadataStore } from '../../stores';
|
||||||
import { withErrorLog } from './helpers';
|
import { withErrorLog } from './helpers';
|
||||||
|
|
||||||
interface Resolver <T> {
|
interface Resolver<T> {
|
||||||
reject: (error: Error) => void;
|
reject: (error: Error) => void;
|
||||||
resolve: (result: T) => void;
|
resolve: (result: T) => void;
|
||||||
}
|
}
|
||||||
@ -94,6 +94,7 @@ export enum NotificationOptions {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const AUTH_URLS_KEY = 'authUrls';
|
const AUTH_URLS_KEY = 'authUrls';
|
||||||
|
const DEFAULT_AUTH_ACCOUNTS = 'defaultAuthAccounts';
|
||||||
|
|
||||||
function extractMetadata (store: MetadataStore): void {
|
function extractMetadata (store: MetadataStore): void {
|
||||||
store.allMap((map): void => {
|
store.allMap((map): void => {
|
||||||
@ -158,6 +159,8 @@ export default class State {
|
|||||||
|
|
||||||
public readonly signSubject: BehaviorSubject<SigningRequest[]> = new BehaviorSubject<SigningRequest[]>([]);
|
public readonly signSubject: BehaviorSubject<SigningRequest[]> = new BehaviorSubject<SigningRequest[]>([]);
|
||||||
|
|
||||||
|
public defaultAuthAccountSelection: string[] = [];
|
||||||
|
|
||||||
constructor (providers: Providers = {}) {
|
constructor (providers: Providers = {}) {
|
||||||
this.#providers = providers;
|
this.#providers = providers;
|
||||||
|
|
||||||
@ -168,6 +171,12 @@ export default class State {
|
|||||||
const previousAuth = JSON.parse(authString) as AuthUrls;
|
const previousAuth = JSON.parse(authString) as AuthUrls;
|
||||||
|
|
||||||
this.#authUrls = previousAuth;
|
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[] {
|
public get knownMetadata (): MetadataDef[] {
|
||||||
@ -241,6 +250,7 @@ export default class State {
|
|||||||
};
|
};
|
||||||
|
|
||||||
this.saveCurrentAuthList();
|
this.saveCurrentAuthList();
|
||||||
|
this.updateDefaultAuthAccounts(authorizedAccounts);
|
||||||
delete this.#authRequests[id];
|
delete this.#authRequests[id];
|
||||||
this.updateIconAuth(true);
|
this.updateIconAuth(true);
|
||||||
};
|
};
|
||||||
@ -266,6 +276,15 @@ export default class State {
|
|||||||
localStorage.setItem(AUTH_URLS_KEY, JSON.stringify(this.#authUrls));
|
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> => {
|
private metaComplete = (id: string, resolve: (result: boolean) => void, reject: (error: Error) => void): Resolver<boolean> => {
|
||||||
const complete = (): void => {
|
const complete = (): void => {
|
||||||
delete this.#metaRequests[id];
|
delete this.#metaRequests[id];
|
||||||
|
|||||||
@ -36,6 +36,7 @@ export interface AccountJson extends KeyringPair$Meta {
|
|||||||
isExternal?: boolean;
|
isExternal?: boolean;
|
||||||
isHardware?: boolean;
|
isHardware?: boolean;
|
||||||
isHidden?: boolean;
|
isHidden?: boolean;
|
||||||
|
isDefaultAuthSelected?: boolean
|
||||||
name?: string;
|
name?: string;
|
||||||
parentAddress?: string;
|
parentAddress?: string;
|
||||||
suri?: string;
|
suri?: string;
|
||||||
|
|||||||
@ -27,8 +27,12 @@ function Request ({ authId, className, isFirst, request: { origin }, url }: Prop
|
|||||||
const onAction = useContext(ActionContext);
|
const onAction = useContext(ActionContext);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setSelectedAccounts && setSelectedAccounts([]);
|
const defaultAccountSelection = accounts
|
||||||
}, [setSelectedAccounts]);
|
.filter(({ isDefaultAuthSelected }) => !!isDefaultAuthSelected)
|
||||||
|
.map(({ address }) => address);
|
||||||
|
|
||||||
|
setSelectedAccounts && setSelectedAccounts(defaultAccountSelection);
|
||||||
|
}, [accounts, setSelectedAccounts]);
|
||||||
|
|
||||||
const _onApprove = useCallback(
|
const _onApprove = useCallback(
|
||||||
(): void => {
|
(): void => {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user