Skip to content

Instantly share code, notes, and snippets.

@simenbrekken
Created March 21, 2014 13:44
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save simenbrekken/9686582 to your computer and use it in GitHub Desktop.
Save simenbrekken/9686582 to your computer and use it in GitHub Desktop.
React Store + DataManifest Prototype
'use strict';
var rsvp = require('rsvp'),
lodash = require('lodash'),
invariant = require('react/lib/invariant')
function resolve(resource) {
if (resource instanceof rsvp.Promise) {
return resource
} else if (lodash.isArray(resource)) {
return rsvp.all(resource)
} else if (lodash.isObject(resource)) {
return rsvp.hash(resource)
}
}
var DataManifestMixin = {
loadData: function(params) {
invariant(
this.type.createManifest !== undefined,
'Component must implement a static createManifest method'
)
return resolve(this.type.createManifest(params))
},
componentWillMount: function() {
this.loadData(this.props.params).then(this.setState.bind(this))
},
}
module.exports = DataManifestMixin
/** @jsx React.DOM */
'use strict';
var React = require('react'),
Store = require('./Store'),
DataManifestMixin = require('./DataManifestMixin')
var Products = React.createClass({
mixins: [DataManifestMixin],
render: function() {
var products = this.state.products
if (!this.state.products) {
console.log('Loading...')
} else {
console.log('Products:', products)
}
},
statics: {
createManifest: function(params) {
return {
products: Store.products.query(params.limit, params.offset)
}
}
}
})
module.exports = Products
'use strict';
var rsvp = require('rsvp'),
superagent = require('superagent')
var baseUrl = 'http://mytestapi.apiary.io'
// Add promise method to superagent
superagent.Request.prototype.promise = function() {
return new rsvp.Promise(function(resolve, reject) {
if (this.method !== 'GET') this.type('json')
if (this.method !== 'DELETE') this.accept('json')
if (this.url.charAt(0) == '/') this.url = baseUrl + this.url
this.end(function(err, res) {
if (err) return reject(err)
if (res.error) return reject(res.error.message)
resolve(res.body)
})
}.bind(this))
}
var InventoryStore = {
query: function(limit, offset) {
return superagent
.get('/inventory')
.query({
offset: offset,
limit: limit
})
.promise()
}
}
var ProductsStore = {
query: function(limit, offset) {
return superagent
.get('/products')
.query({
offset: offset,
limit: limit
})
.promise()
},
create: function(name, eans) {
var items = eans.map(function(ean) {
return {
ean: ean
}
})
return superagent
.post('/products')
.send({
name: name,
items: items
})
.promise()
.then(function(res) {
return res.id
})
},
get: function(id) {
return superagent.get('/products/' + id).promise()
},
patch: function(id, properties) {
return superagent
.patch('/products/' + id)
.send(properties)
.promise()
}
}
var Store = {
inventory: InventoryStore,
products: ProductsStore
}
module.exports = Store
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment