Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions components/application.jade
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,9 @@ dom-module#maki-application
datastore: {
type: Object
},
identity: {
type: Object
},
worker: { type: Object }
},
_route: function(ctx) {
Expand Down
2 changes: 1 addition & 1 deletion components/collection.jade
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ dom-module#maki-collection
var datastore = document.querySelectorAll('maki-datastore')[0];
console.log('[MAKI:COLLECTION]','_handleQuery:', e, key);
datastore._retrieve(key, function(err, data) {
if (!data) self.fire('datastore:miss', hash);
if (!data) self.fire('datastore:miss', key);
if (err) {
console.error('_handleQuery error:', err);
data = [];
Expand Down
18 changes: 13 additions & 5 deletions components/datastore.jade
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ dom-module#maki-datastore
},
store: {
type: Object
},
private: {
type: Boolean
}
},
listeners: {
Expand All @@ -18,13 +21,14 @@ dom-module#maki-datastore
_store: function(key, val, cb) {
var self = this;
console.log('[MAKI:DATASTORE]', '_store', typeof val, key, val);
if (val instanceof Array && val.length === 0) return;
if (val instanceof Array && val.length === 0) return cb('Empty array not allowed.');
self.store.put(key, val, function(err) {
if (err) console.error(err);
self.fire('datastore:change', {
key: key,
val: val
});
return cb(err);
});
},
_retrieve: function(key, cb) {
Expand All @@ -34,9 +38,9 @@ dom-module#maki-datastore
asBuffer: false
}, function(err, val) {
if (err) console.error(err);
if (!val) return self.fire('datastore:miss', key);
console.log('[MAKI:DATASTORE]', '_retrieve result:', key, val);
return cb(err, val);
if (val) return cb(null, val);
self.fire('datastore:miss', key);
return cb('datastore:miss');
});
},
_patch: function(key, ops, cb) {
Expand All @@ -58,6 +62,8 @@ dom-module#maki-datastore
var key = e.detail;

console.log('[MAKI:DATASTORE]', '_handleMiss', e, detail);
console.log('private:', self.private);
if (self.private) return;

$.getJSON(key, function(data) {
console.log('[MAKI:DATASTORE]', 'retrieved (from remote)', data);
Expand Down Expand Up @@ -116,7 +122,9 @@ dom-module#maki-datastore
self.store.open(function(err) {
console.log('[MAKI:DATASTORE]', 'open');
var event = new Event('datastore:open')
window.dispatchEvent(event);
document.dispatchEvent(event);
var event = new Event('datastore:'+self.name+':open')
document.dispatchEvent(event);

if (err) console.error(err);
self._sync();
Expand Down
128 changes: 128 additions & 0 deletions components/identities.jade
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
dom-module#maki-identities
template
maki-datastore(name="identity", private)
.ui.three.doubling.cards
template(is="dom-repeat", items="{{identities}}")
.ui.card
.image
img(src="/img/stevie.jpg")
.content
.header
//- TODO: break into its own component
maki-field(path="/name")
template(is="dom-if", if="{{item.name}}")
.value {{item.name}}
template(is="dom-if", if="{{!item.name}}")
.value anonymous
.ui.two.bottom.attached.buttons
template(is="dom-if", if="{{item.name}}")
.ui.button(on-tap="_beginEditing") change name
template(is="dom-if", if="{{!item.name}}")
.ui.bottom.attached.button(on-tap="_beginEditing") set name
.ui.button(on-tap="_delete") delete
script.
Polymer({
is: 'maki-identities',
properties: {
identities: {
type: Array
}
},
_handleChange: function(e) {
var self = this;
if (e.which === 13) {
e.preventDefault();
self._lockName();
}

var field = $('maki-field[path="/name"] .value');
var value = field.html();

var identity = self.identity;

console.log('[MAKI:IDENTITIES]', identity);
identity.name = value;

var db = document.querySelectorAll('maki-identity maki-datastore')[0];
db._patch('/identities', [
{ op: 'replace', path: '/0', value: identity }
], function(err) {
console.log('db._patch back:', err);
});

},
_beginEditing: function() {
var self = this;
var field = $('maki-field[path="/name"] .value');
var handler = _.debounce(self._handleChange, 250);
field.keypress(handler.bind(self));
self._unlockName();
field.focus();
},
_unlockName: function() {
var self = this;
var field = $('maki-field[path="/name"] .value');
field.attr('contenteditable', true);
},
_lockName: function() {
var self = this;
var field = $('maki-field[path="/name"] .value');
field.attr('contenteditable', false);
},
_list: function() {
var self = this;
console.log('identity datastore open, initializing work...');
var db = document.querySelectorAll('maki-datastore[name=identity]')[0];
var melody = document.querySelectorAll('melody-application')[0];

db._retrieve('/identities', function(err, identities) {
console.log('[MAKI:IDENTITIES]', 'retrieved:', err, identities);
if (err) console.error(err);
self.identities = identities;
self.identity = identities[0];
melody.identity = identities[0];
});
},
_store: function(identity) {
var self = this;
console.log('[MAKI:IDENTITIES]', '_storeIdentity', identity);
// TODO: only if autoregister enabled...
var db = document.querySelectorAll('maki-datastore[name=identity]')[0];
var key = '/identities/' + identity.key.public.toString();

var clone = _.cloneDeep(identity);
clone.key.public = identity.key.public.toString();

db._store(key, clone, function(err) {
console.log('identity registered!', err);
});
},
_register: function(identity) {
var self = this;
console.log('[MAKI:IDENTITIES]', '_storeIdentity', identity);
// TODO: only if autoregister enabled...
var db = document.querySelectorAll('maki-datastore[name=melody]')[0];
var key = '/identities/' + identity.key.public.toString();

var clone = _.cloneDeep(identity);
clone.key.public = identity.key.public.toString();

delete clone.key.private;

db._store(key, clone, function(err) {
console.log('identity registered!', err);
});
},
_generate: function(done) {
// TODO: do this in a Web Worker to prevent UI jank
var Mnemonic = require('bitcore-mnemonic');
var mnemonic = new Mnemonic();
done(null, mnemonic);
},
ready: function() {
var self = this;
var db = document.querySelectorAll('maki-identities maki-datastore')[0];
console.log('[MAKI:IDENTITIES]', 'ready');
document.addEventListener('datastore:identity:open', self._list.bind(self), false);
}
});
23 changes: 23 additions & 0 deletions components/identity-card.jade
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
dom-module#maki-identity-card
template
.image
img(src="/img/stevie.jpg")
.content
.header {{identity.name}}
.ui.bottom.attached.button(on-tap="_selectIdentity") use {{identity.name}}
script.
Polymer({
is: 'maki-identity-card',
attributes: {
identity: {
type: Object
}
},
_selectIdentity: function(e, detail) {
var self = this;
console.log('[MAKI:IDENTITY]', '_selectIdentity', e, detail);
var manager = document.querySelectorAll('maki-identity')[0];
manager.identity = self.identity;
manager._register();
},
});
Loading