UNPKG

red-foot

Version:

Framework para frontends em JS

64 lines (55 loc) 1.6 kB
/* jshint node:true */ "use strict"; 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;