packages/oo7-substrate/src/addressBook.js
const { Bond } = require('oo7')
const { ss58Encode } = require('./ss58')
const { AccountId } = require('./types')
class AddressBook extends Bond {
constructor () {
super()
this._accounts = []
this._load()
}
submit (account, name) {
this._accounts.push({account, name})
this._sync()
}
accounts () {
return this._accounts.map(i => i.account)
}
find (identifier) {
if (this._accounts.indexOf(identifier) !== -1) {
return identifier
}
if (identifier instanceof Uint8Array && identifier.length == 32 || identifier instanceof AccountId) {
identifier = ss58Encode(identifier)
}
return this._byAddress[identifier] ? this._byAddress[identifier] : this._byName[identifier]
}
forget (identifier) {
let item = this.find(identifier)
if (item) {
console.info(`Forgetting account ${item.name} (${item.address})`)
this._accounts = this._accounts.filter(i => i !== item)
this._sync()
}
}
_load () {
if (localStorage.addressBook) {
this._accounts = JSON.parse(localStorage.addressBook)
} else {
this._accounts = []
}
this._sync()
}
_sync () {
let byAddress = {}
let byName = {}
this._accounts = this._accounts.map(({address, account, name}) => {
account = account || ss58Decode(address)
address = address || ss58Encode(account)
let item = {name, account, address}
byAddress[address] = item
byName[name] = item
return item
})
this._byAddress = byAddress
this._byName = byName
localStorage.addressBook = JSON.stringify(this._accounts.map(k => ({address: k.address, name: k.name})))
this.trigger({accounts: this._accounts, byAddress: this._byAddress, byName: this._byName})
}
}
let s_addressBook = null;
function addressBook() {
if (s_addressBook === null) {
s_addressBook = new AddressBook;
}
return s_addressBook;
}
module.exports = { addressBook, AddressBook };