red-foot
Version:
Framework para frontends em JS
64 lines (55 loc) • 1.6 kB
JavaScript
/* jshint node:true */
;
var gea = require('gea-js');
var Classe = require('pyoo.js');
var Redux = require('redux');
var ReduxThunk = require('redux-thunk').default;
var ReduxLogger = require('redux-logger')();
var _ = require('lodash');
function criarRedutorRaiz(modulos) {
return function(estado, acao) {
return _.reduce(modulos, function(estado_acc, modulo, nome_modulo) {
var novo_estado = {};
novo_estado[nome_modulo] = modulo(estado, acao);
return _.assign({}, estado, novo_estado);
}, {});
}
}
function __criarStore(modulos, store_antigo) {
return Redux.createStore(
criarRedutorRaiz(modulos),
store_antigo,
Redux.applyMiddleware(ReduxThunk, ReduxLogger)
);
}
var Mundo = Classe({
__init__: function(self) {
self.modulos = {};
self.store = __criarStore({});
self.destrutorDeObservadores = [];
self.observadores = {};
},
registrarComponente: function(self, componente, id) {
self.observadores[id] = componente;
self.__observar(componente);
},
__observar: function(self, componente) {
self.destrutorDeObservadores.push(self.store.subscribe(function() {
componente.atualizar(self.store.getState(), self.store.dispatch);
}));
},
dispensar: function(self, id) {
self.destrutorDeObservadores[id]();
},
modulo(nome, redutor) {
_(self.destrutorDeObservadores).each(function(destruir) {
destruir();
});
self.modulos[nome] = redutor;
self.store = __criarStore(self.modulos, self.store);
_(self.observadores).each(function(observador) {
self.__observar(observador);
});
}
});
module.exports = Mundo;