Merge pull request #1198 from MetaMask/i1165-predictive
Add predictive address functionality to recipient field in sendfeature/default_network_editable
commit
00f1a2d78d
@ -0,0 +1,79 @@ |
||||
const ObservableStore = require('obs-store') |
||||
const extend = require('xtend') |
||||
|
||||
class AddressBookController { |
||||
|
||||
|
||||
// Controller in charge of managing the address book functionality from the
|
||||
// recipients field on the send screen. Manages a history of all saved
|
||||
// addresses and all currently owned addresses.
|
||||
constructor (opts = {}, keyringController) { |
||||
const initState = extend({ |
||||
addressBook: [], |
||||
}, opts.initState) |
||||
this.store = new ObservableStore(initState) |
||||
this.keyringController = keyringController |
||||
} |
||||
|
||||
//
|
||||
// PUBLIC METHODS
|
||||
//
|
||||
|
||||
// Sets a new address book in store by accepting a new address and nickname.
|
||||
setAddressBook (address, name) { |
||||
return this._addToAddressBook(address, name) |
||||
.then((addressBook) => { |
||||
this.store.updateState({ |
||||
addressBook, |
||||
}) |
||||
return Promise.resolve() |
||||
}) |
||||
} |
||||
|
||||
//
|
||||
// PRIVATE METHODS
|
||||
//
|
||||
|
||||
|
||||
// Performs the logic to add the address and name into the address book. The
|
||||
// pushed object is an object of two fields. Current behavior does not set an
|
||||
// upper limit to the number of addresses.
|
||||
_addToAddressBook (address, name) { |
||||
let addressBook = this._getAddressBook() |
||||
let identities = this._getIdentities() |
||||
|
||||
let addressBookIndex = addressBook.findIndex((element) => { return element.address.toLowerCase() === address.toLowerCase() || element.name === name }) |
||||
let identitiesIndex = Object.keys(identities).findIndex((element) => { return element.toLowerCase() === address.toLowerCase() }) |
||||
// trigger this condition if we own this address--no need to overwrite.
|
||||
if (identitiesIndex !== -1) { |
||||
return Promise.resolve(addressBook) |
||||
// trigger this condition if we've seen this address before--may need to update nickname.
|
||||
} else if (addressBookIndex !== -1) { |
||||
addressBook.splice(addressBookIndex, 1) |
||||
} else if (addressBook.length > 15) { |
||||
addressBook.shift() |
||||
} |
||||
|
||||
|
||||
addressBook.push({ |
||||
address: address, |
||||
name, |
||||
}) |
||||
return Promise.resolve(addressBook) |
||||
} |
||||
|
||||
// Internal method to get the address book. Current persistence behavior
|
||||
// should not require that this method be called from the UI directly.
|
||||
_getAddressBook () { |
||||
return this.store.getState().addressBook |
||||
} |
||||
|
||||
// Retrieves identities from the keyring controller in order to avoid
|
||||
// duplication
|
||||
_getIdentities () { |
||||
return this.keyringController.memStore.getState().identities |
||||
} |
||||
|
||||
} |
||||
|
||||
module.exports = AddressBookController |
@ -0,0 +1,56 @@ |
||||
const assert = require('assert') |
||||
const extend = require('xtend') |
||||
const AddressBookController = require('../../app/scripts/controllers/address-book') |
||||
|
||||
const mockKeyringController = { |
||||
memStore: { |
||||
getState: function () { |
||||
return { |
||||
identities: { |
||||
'0x0aaa' : { |
||||
address: '0x0aaa', |
||||
name: 'owned', |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
describe('address-book-controller', function() { |
||||
var addressBookController |
||||
|
||||
beforeEach(function() { |
||||
addressBookController = new AddressBookController({}, mockKeyringController) |
||||
}) |
||||
|
||||
describe('addres book management', function () { |
||||
describe('#_getAddressBook', function () { |
||||
it('should be empty by default.', function () { |
||||
assert.equal(addressBookController._getAddressBook().length, 0) |
||||
}) |
||||
}) |
||||
describe('#setAddressBook', function () { |
||||
it('should properly set a new address.', function () { |
||||
addressBookController.setAddressBook('0x01234', 'test') |
||||
var addressBook = addressBookController._getAddressBook() |
||||
assert.equal(addressBook.length, 1, 'incorrect address book length.') |
||||
assert.equal(addressBook[0].address, '0x01234', 'incorrect addresss') |
||||
assert.equal(addressBook[0].name, 'test', 'incorrect nickname') |
||||
}) |
||||
|
||||
it('should reject duplicates.', function () { |
||||
addressBookController.setAddressBook('0x01234', 'test') |
||||
addressBookController.setAddressBook('0x01234', 'test') |
||||
var addressBook = addressBookController._getAddressBook() |
||||
assert.equal(addressBook.length, 1, 'incorrect address book length.') |
||||
}) |
||||
it('should not add any identities that are under user control', function () { |
||||
addressBookController.setAddressBook('0x0aaa', ' ') |
||||
var addressBook = addressBookController._getAddressBook() |
||||
assert.equal(addressBook.length, 0, 'incorrect address book length.') |
||||
}) |
||||
}) |
||||
}) |
||||
}) |
Loading…
Reference in new issue