models: fix state namespace

This commit is contained in:
Yoshua Wuyts
2016-05-23 14:40:52 +09:00
parent 0cc0caa8e1
commit dc840059a4
8 changed files with 40 additions and 24 deletions
+7 -1
View File
@@ -88,7 +88,6 @@ document.body.appendChild(tree)
```
## Concepts
`choo` is a complete framework. It has an answer to pretty most points
- __user:__ 🙆
- __DOM:__ the [Document Object Model][dom] is what is currently displayed in
your browser
@@ -417,6 +416,13 @@ Also imagine telling some business people you chose to rewrite something
critical to the company using the `choo` framework.
:steam_locomotive::train::train::train:
### Why is it a framework, and not a library?
I love small libraries that do one thing well, but when working in a team,
having an undocumented combination of packages often isn't great. `choo()` is a
small set of packages that work well together, wrapped in an an architectural
pattern. This means you get all the benefits of small packages, but get to be
productive right from the start.
### How does choo compare to X?
Ah, so this is where I get to rant. `choo` (_chugga-chugga-chugga-choo-choo!_)
was built because other options didn't quite cut it for me, so instead of
+1 -2
View File
@@ -14,7 +14,7 @@ module.exports = {
}
}
function request (uri, send) {
function request (uri, send, state) {
http(uri, { json: true }, function (err, res, body) {
if (err) return send('app:error', { payload: 'HTTP error' })
if (res.statusCode !== 200) {
@@ -24,7 +24,6 @@ function request (uri, send) {
return send('app:error', { payload: message })
}
if (!body) {
console.log('req made!')
return send('app:error', { payload: 'fatal: no body received' })
}
send('api:set', { payload: body.message || body.title })
+1 -1
View File
@@ -34,7 +34,7 @@ module.exports = {
},
effects: {
error: function (action, state, send) {
const timeout = state.app.errorTimeDone - Date.now()
const timeout = state.errorTimeDone - Date.now()
setTimeout(function () {
send('app:error:delete')
}, timeout)
+1 -1
View File
@@ -6,7 +6,7 @@ const http = require('http')
const PORT = 8080
const server = http.createServer(createRouter())
server.listen(PORT, () => console.log(`listening on port ${PORT}`))
server.listen(PORT, () => process.stdout.write(`listening on port ${PORT}\n`))
var index = 0
const errors = [
+1 -1
View File
@@ -6,7 +6,7 @@ const http = require('http')
const PORT = 8080
const server = http.createServer(createRouter())
server.listen(PORT, () => console.log(`listening on port ${PORT}`))
server.listen(PORT, () => process.stdout.write(`listening on port ${PORT}\n`))
function createRouter () {
const router = serverRouter('/404')
+23 -11
View File
@@ -2,21 +2,33 @@ const serverRouter = require('server-router')
const http = require('http')
const PORT = 8080
const client = require('./client')
const server = http.createServer(createRouter())
server.listen(PORT, () => console.log(`listening on port ${PORT}`))
// If an incoming request accepts "text/html", render the
// appropriate HTML. Else use the API server
const apiRouter = createRouter()
const server = http.createServer(function (req, res) {
if (/text\/html/.test(req.headers.accept)) handleHtml(req, res)
else apiRouter(req, res)
})
server.listen(PORT, () => process.stdout.write(`listening on port ${PORT}\n`))
// create a new router
// null -> fn
function createRouter () {
const router = serverRouter('/404')
router.on('/404', (req, res) => res.end('not found'))
router.on('/', function (req, res, params) {
const html = client.toString('/', { message: 'hello server!' })
res.setHeader('Content-Type', 'text/html; charset=utf-8')
res.end(html)
const apiRouter = serverRouter('/404')
apiRouter.on('/404', (req, res) => res.end('not found'))
apiRouter.on('/', (req, res) => {
res.end(JSON.stringify({ routes: [ '/', '/404' ] }))
})
return apiRouter
}
return router
// render the client to string
// based on the requested url
// (obj, obj) -> null
function handleHtml (req, res) {
const html = client.toString(req.url, { message: 'hello server!' })
res.setHeader('Content-Type', 'text/html; charset=utf-8')
res.end(html)
}
+5 -6
View File
@@ -105,17 +105,16 @@ function choo () {
const _reducers = ns ? reducers[ns] : reducers
if (_reducers && _reducers[action.type]) {
if (ns) {
const newState = reducers[ns][action.type](action, state[ns])
const newState = _reducers[action.type](action, state[ns])
state[ns] = xtend(state[ns], newState)
} else {
state = xtend(state, reducers[action.type](action, state))
}
} else state = xtend(state, reducers[action.type](action, state))
reducersCalled = true
}
const _effects = ns ? effects[ns] : effects
if (_effects && _effects[action.type]) {
_effects[action.type](action, state, send)
if (ns) _effects[action.type](action, state[ns], send)
else _effects[action.type](action, state, send)
effectsCalled = true
}
@@ -175,7 +174,7 @@ function appInit (opts) {
return model
// create a new subscription that modifies
// 'app:location' and push it to the subs
// 'app:location' and push it to be loaded
// fn -> null
function pushLocationSub (cb) {
model.subscriptions.push(function (send) {
+1 -1
View File
@@ -6,7 +6,7 @@ const http = require('http')
const PORT = 8080
const server = http.createServer(createRouter())
server.listen(PORT, () => console.log(`listening on port ${PORT}`))
server.listen(PORT, () => process.stdout.write(`listening on port ${PORT}\n`))
function createRouter () {
const router = serverRouter('/404')