Skip to content
This repository has been archived by the owner on Nov 6, 2020. It is now read-only.

Commit

Permalink
Default Account selector in Signer overlay (#4375)
Browse files Browse the repository at this point in the history
  • Loading branch information
jacogr committed Feb 3, 2017
1 parent cb3568b commit dbb45f8
Show file tree
Hide file tree
Showing 6 changed files with 1,082 additions and 102 deletions.
101 changes: 101 additions & 0 deletions js/src/views/ParityBar/accountStore.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
// Copyright 2015-2017 Parity Technologies (UK) Ltd.
// This file is part of Parity.

// Parity is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// Parity is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with Parity. If not, see <http://www.gnu.org/licenses/>.

import { action, observable, transaction } from 'mobx';

export default class AccountStore {
@observable accounts = [];
@observable defaultAccount = null;
@observable isLoading = false;

constructor (api) {
this._api = api;

this.loadAccounts();
this.subscribeDefaultAccount();
}

@action setAccounts = (accounts) => {
this.accounts = accounts;
}

@action setDefaultAccount = (defaultAccount) => {
this.defaultAccount = defaultAccount;
}

@action setLoading = (isLoading) => {
this.isLoading = isLoading;
}

makeDefaultAccount = (address) => {
const accounts = [address].concat(
this.accounts
.filter((account) => account.address !== address)
.map((account) => account.address)
);

return this._api.parity
.setNewDappsWhitelist(accounts)
.catch((error) => {
console.warn('makeDefaultAccount', error);
});
}

loadAccounts () {
this.setLoading(true);

return Promise
.all([
this._api.parity.getNewDappsWhitelist(),
this._api.parity.allAccountsInfo()
])
.then(([whitelist, accounts]) => {
transaction(() => {
this.setLoading(false);
this.setAccounts(
Object
.keys(accounts)
.filter((address) => {
const isAccount = accounts[address].uuid;
const isWhitelisted = !whitelist || whitelist.includes(address);

return isAccount && isWhitelisted;
})
.map((address) => {
const account = accounts[address];

account.address = address;
account.default = address === this.defaultAccount;

return account;
})
);
});
})
.catch((error) => {
this.setLoading(false);
console.warn('loadAccounts', error);
});
}

subscribeDefaultAccount () {
return this._api.subscribe('parity_defaultAccount', (error, defaultAccount) => {
if (!error) {
this.setDefaultAccount(defaultAccount);
}
});
}
}
104 changes: 104 additions & 0 deletions js/src/views/ParityBar/accountStore.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
// Copyright 2015-2017 Parity Technologies (UK) Ltd.
// This file is part of Parity.

// Parity is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// Parity is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with Parity. If not, see <http://www.gnu.org/licenses/>.

import sinon from 'sinon';

import AccountStore from './accountStore';

import { ACCOUNT_DEFAULT, ACCOUNT_FIRST, ACCOUNT_NEW, createApi } from './parityBar.test.js';

let api;
let store;

function create () {
api = createApi();
store = new AccountStore(api);

return store;
}

describe('views/ParityBar/AccountStore', () => {
beforeEach(() => {
create();
});

describe('constructor', () => {
it('subscribes to defaultAccount', () => {
expect(api.subscribe).to.have.been.calledWith('parity_defaultAccount');
});
});

describe('@action', () => {
describe('setAccounts', () => {
it('sets the accounts', () => {
store.setAccounts('testing');
expect(store.accounts).to.equal('testing');
});
});

describe('setDefaultAccount', () => {
it('sets the default account', () => {
store.setDefaultAccount('testing');
expect(store.defaultAccount).to.equal('testing');
});
});

describe('setLoading', () => {
it('sets the loading status', () => {
store.setLoading('testing');
expect(store.isLoading).to.equal('testing');
});
});
});

describe('operations', () => {
describe('loadAccounts', () => {
beforeEach(() => {
sinon.spy(store, 'setAccounts');

return store.loadAccounts();
});

afterEach(() => {
store.setAccounts.restore();
});

it('calls into parity_getNewDappsWhitelist', () => {
expect(api.parity.getNewDappsWhitelist).to.have.been.called;
});

it('calls into parity_allAccountsInfo', () => {
expect(api.parity.allAccountsInfo).to.have.been.called;
});

it('sets the accounts', () => {
expect(store.setAccounts).to.have.been.called;
});
});

describe('makeDefaultAccount', () => {
beforeEach(() => {
return store.makeDefaultAccount(ACCOUNT_NEW);
});

it('calls into parity_setNewDappsWhitelist (with ordering)', () => {
expect(api.parity.setNewDappsWhitelist).to.have.been.calledWith([
ACCOUNT_NEW, ACCOUNT_FIRST, ACCOUNT_DEFAULT
]);
});
});
});
});
Loading

0 comments on commit dbb45f8

Please sign in to comment.