diff options
Diffstat (limited to 'ui/app/models')
-rw-r--r-- | ui/app/models/account.js | 143 | ||||
-rw-r--r-- | ui/app/models/dummy_account.js | 33 |
2 files changed, 176 insertions, 0 deletions
diff --git a/ui/app/models/account.js b/ui/app/models/account.js new file mode 100644 index 0000000..52fea93 --- /dev/null +++ b/ui/app/models/account.js @@ -0,0 +1,143 @@ +// +// An account is an abstraction of a user and a provider. +// The user part is optional, so an Account might just represent a provider. +// + +import bitmask from 'lib/bitmask' + +export default class Account { + + constructor(address, props={}) { + this.address = address + this._authenticated = props.authenticated + } + + // + // currently, bitmask.js uses address for id, so we return address here too. + // also, we don't know uuid until after authentication. + // + // TODO: change to uuid when possible. + // + get id() { + return this._address + } + + get domain() { + return this._address.split('@')[1] + } + + get address() { + return this._address + } + + set address(address) { + if (!address.match('@')) { + this._address = '@' + address + } else { + this._address = address + } + } + + get userpart() { + return this._address.split('@')[0] + } + + get authenticated() { + return this._authenticated + } + + get hasEmail() { + return true + } + + // + // returns a promise, fulfill is passed account object + // + login(password) { + return bitmask.bonafide.user.auth(this.address, password).then( + response => { + if (response.uuid) { + this._uuid = response.uuid + this._authenticated = true + } + return this + } + ) + } + + // + // returns a promise, fulfill is passed account object + // + logout() { + return bitmask.bonafide.user.logout(this.id).then( + response => { + this._authenticated = false + this._address = '@' + this.domain + return this + } + ) + } + + // + // returns the matching account in the list of accounts, or adds it + // if it is not already present. + // + static find(address) { + // search by full address + let account = Account.list.find(i => { + return i.address == address + }) + // failing that, search by domain + if (!account) { + let domain = '@' + address.split('@')[1] + account = Account.list.find(i => { + return i.address == domain + }) + if (account) { + account.address = address + } + } + // failing that, create new account + if (!account) { + account = new Account(address) + Account.list.push(account) + } + return account + } + + // + // returns a promise, fullfill is passed account object + // + static active() { + return bitmask.bonafide.user.active().then( + response => { + if (response.user == '<none>') { + return null + } else { + return new Account(response.user, {authenticated: true}) + } + } + ) + } + + static add(account) { + if (!Account.list.find(i => {return i.id == account.id})) { + Account.list.push(account) + } + } + + static remove(account) { + Account.list = Account.list.filter(i => { + return i.id != account.id + }) + } + // return Account.list + // return new Promise(function(resolve, reject) { + // window.setTimeout(function() { + // resolve(['@blah', '@lala']) + // }, 1000) + // }) + // } +} + +Account.list = [] diff --git a/ui/app/models/dummy_account.js b/ui/app/models/dummy_account.js new file mode 100644 index 0000000..99fb662 --- /dev/null +++ b/ui/app/models/dummy_account.js @@ -0,0 +1,33 @@ +// +// A proxy of an account, but with a different ID. For testing. +// + +import bitmask from 'lib/bitmask' + +export default class DummyAccount { + + constructor(account) { + this.account = account + } + + get id() { + return 'dummy--' + this.account.address + } + + get domain() {return this.account.domain} + get address() {return this.account.address} + get userpart() {return this.account.userpart} + get authenticated() {return this.account.authenticated} + get hasEmail() {return this.account.hasEmail} + login(password) {return this.account.login(password)} + + logout() { + return bitmask.bonafide.user.logout(this.address).then( + response => { + this._authenticated = false + this._address = '@' + this.domain + return this + } + ) + } +} |