Skip to content

Instantly share code, notes, and snippets.

@IftekherSunny
Last active October 24, 2017 10:19
Show Gist options
  • Save IftekherSunny/f1e694fcc730938cfdc6a361d7063a06 to your computer and use it in GitHub Desktop.
Save IftekherSunny/f1e694fcc730938cfdc6a361d7063a06 to your computer and use it in GitHub Desktop.
// Element store
const elementStore = class ElementStore {
// set initial state
@observable path = null
@observable visible = false
@observable list = {}
// create a new instance of element store
constructor() {
this.list = sortElementsByName(elements)
}
// dynamically handle element events
handle(handlerName, {path}) {
switch (handlerName) {
case HIDE_ELEMENTS:
this.on(HIDE_ELEMENTS, store => console.log(store));
break;
case SHOW_ELEMENTS:
this.on(SHOW_ELEMENTS, (store, {path}) => console.log(store));
break;
case "UPDATE_RECENT_USED_ELEMENT_TIMESTAMP":
this.on("UPDATE_RECENT_USED_ELEMENT_TIMESTAMP", updateRecentUsedTimestamp);
break;
}
}
// get elements list.
// also dynamically bind get method for fetching element property.
getList() {
return _.map(this.list, (element) => {
element.get = (arg) => _.pick(element, [arg])[arg];
return element;
});
}
}
// instance of element store
let store = new elementStore();
/**
* Uses proxy for the element store.
**/
export default new Proxy(store, {
get(target, prop) {
if(target[prop] === undefined) {
return (...args) => _.map(elements, (element) => {
let e = _.pick(element, [args[0]])
// dynamically method binding...
e.get = (arg) => _.pick(element, [arg])[arg];
return e;
});
} else {
return target[prop];
}
},
set(target, prop) {
// set call handeler....
}
});
export default proxyStore;
/**
* example:
*
* let store = new ElementStore();
* store.get('groups'); // undefined function error
*
*
* let proxyElementStore = proxyStore;
* proxyElementStore.get('groups'); // returns array of elements data.
*
**/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment