Home Reference Source

packages/oo7-substrate/src/addressBook.js

  1. const { Bond } = require('oo7')
  2. const { ss58Encode } = require('./ss58')
  3. const { AccountId } = require('./types')
  4.  
  5. class AddressBook extends Bond {
  6. constructor () {
  7. super()
  8. this._accounts = []
  9. this._load()
  10. }
  11.  
  12. submit (account, name) {
  13. this._accounts.push({account, name})
  14. this._sync()
  15. }
  16.  
  17. accounts () {
  18. return this._accounts.map(i => i.account)
  19. }
  20.  
  21. find (identifier) {
  22. if (this._accounts.indexOf(identifier) !== -1) {
  23. return identifier
  24. }
  25. if (identifier instanceof Uint8Array && identifier.length == 32 || identifier instanceof AccountId) {
  26. identifier = ss58Encode(identifier)
  27. }
  28. return this._byAddress[identifier] ? this._byAddress[identifier] : this._byName[identifier]
  29. }
  30.  
  31. forget (identifier) {
  32. let item = this.find(identifier)
  33. if (item) {
  34. console.info(`Forgetting account ${item.name} (${item.address})`)
  35. this._accounts = this._accounts.filter(i => i !== item)
  36. this._sync()
  37. }
  38. }
  39.  
  40. _load () {
  41. if (localStorage.addressBook) {
  42. this._accounts = JSON.parse(localStorage.addressBook)
  43. } else {
  44. this._accounts = []
  45. }
  46. this._sync()
  47. }
  48.  
  49. _sync () {
  50. let byAddress = {}
  51. let byName = {}
  52. this._accounts = this._accounts.map(({address, account, name}) => {
  53. account = account || ss58Decode(address)
  54. address = address || ss58Encode(account)
  55. let item = {name, account, address}
  56. byAddress[address] = item
  57. byName[name] = item
  58. return item
  59. })
  60. this._byAddress = byAddress
  61. this._byName = byName
  62. localStorage.addressBook = JSON.stringify(this._accounts.map(k => ({address: k.address, name: k.name})))
  63. this.trigger({accounts: this._accounts, byAddress: this._byAddress, byName: this._byName})
  64. }
  65. }
  66.  
  67. let s_addressBook = null;
  68.  
  69. function addressBook() {
  70. if (s_addressBook === null) {
  71. s_addressBook = new AddressBook;
  72. }
  73. return s_addressBook;
  74. }
  75.  
  76. module.exports = { addressBook, AddressBook };