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 ## Concepts
`choo` is a complete framework. It has an answer to pretty most points
- __user:__ 🙆 - __user:__ 🙆
- __DOM:__ the [Document Object Model][dom] is what is currently displayed in - __DOM:__ the [Document Object Model][dom] is what is currently displayed in
your browser 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. critical to the company using the `choo` framework.
:steam_locomotive::train::train::train: :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? ### How does choo compare to X?
Ah, so this is where I get to rant. `choo` (_chugga-chugga-chugga-choo-choo!_) 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 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) { http(uri, { json: true }, function (err, res, body) {
if (err) return send('app:error', { payload: 'HTTP error' }) if (err) return send('app:error', { payload: 'HTTP error' })
if (res.statusCode !== 200) { if (res.statusCode !== 200) {
@@ -24,7 +24,6 @@ function request (uri, send) {
return send('app:error', { payload: message }) return send('app:error', { payload: message })
} }
if (!body) { if (!body) {
console.log('req made!')
return send('app:error', { payload: 'fatal: no body received' }) return send('app:error', { payload: 'fatal: no body received' })
} }
send('api:set', { payload: body.message || body.title }) send('api:set', { payload: body.message || body.title })
+1 -1
View File
@@ -34,7 +34,7 @@ module.exports = {
}, },
effects: { effects: {
error: function (action, state, send) { error: function (action, state, send) {
const timeout = state.app.errorTimeDone - Date.now() const timeout = state.errorTimeDone - Date.now()
setTimeout(function () { setTimeout(function () {
send('app:error:delete') send('app:error:delete')
}, timeout) }, timeout)
+1 -1
View File
@@ -6,7 +6,7 @@ const http = require('http')
const PORT = 8080 const PORT = 8080
const server = http.createServer(createRouter()) 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 var index = 0
const errors = [ const errors = [
+1 -1
View File
@@ -6,7 +6,7 @@ const http = require('http')
const PORT = 8080 const PORT = 8080
const server = http.createServer(createRouter()) 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 () { function createRouter () {
const router = serverRouter('/404') const router = serverRouter('/404')
+23 -11
View File
@@ -2,21 +2,33 @@ const serverRouter = require('server-router')
const http = require('http') const http = require('http')
const PORT = 8080 const PORT = 8080
const client = require('./client') const client = require('./client')
const server = http.createServer(createRouter()) // If an incoming request accepts "text/html", render the
server.listen(PORT, () => console.log(`listening on port ${PORT}`)) // 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 () { function createRouter () {
const router = serverRouter('/404') const apiRouter = serverRouter('/404')
apiRouter.on('/404', (req, res) => res.end('not found'))
router.on('/404', (req, res) => res.end('not found')) apiRouter.on('/', (req, res) => {
router.on('/', function (req, res, params) { res.end(JSON.stringify({ routes: [ '/', '/404' ] }))
const html = client.toString('/', { message: 'hello server!' })
res.setHeader('Content-Type', 'text/html; charset=utf-8')
res.end(html)
}) })
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 const _reducers = ns ? reducers[ns] : reducers
if (_reducers && _reducers[action.type]) { if (_reducers && _reducers[action.type]) {
if (ns) { 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) state[ns] = xtend(state[ns], newState)
} else { } else state = xtend(state, reducers[action.type](action, state))
state = xtend(state, reducers[action.type](action, state))
}
reducersCalled = true reducersCalled = true
} }
const _effects = ns ? effects[ns] : effects const _effects = ns ? effects[ns] : effects
if (_effects && _effects[action.type]) { 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 effectsCalled = true
} }
@@ -175,7 +174,7 @@ function appInit (opts) {
return model return model
// create a new subscription that modifies // create a new subscription that modifies
// 'app:location' and push it to the subs // 'app:location' and push it to be loaded
// fn -> null // fn -> null
function pushLocationSub (cb) { function pushLocationSub (cb) {
model.subscriptions.push(function (send) { model.subscriptions.push(function (send) {
+1 -1
View File
@@ -6,7 +6,7 @@ const http = require('http')
const PORT = 8080 const PORT = 8080
const server = http.createServer(createRouter()) 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 () { function createRouter () {
const router = serverRouter('/404') const router = serverRouter('/404')