From 1b71ffbb0132edda4c7f4a4014a7e213037b5204 Mon Sep 17 00:00:00 2001 From: Jiri Spac Date: Thu, 21 Jan 2016 04:04:23 +0100 Subject: [PATCH] added optional before prop for rendering forms etc --- README.md | 17 +++++++++++++++++ async.js | 46 +++++++++++++++++++++++++++++----------------- package.json | 4 ++-- test/async.spec.js | 6 +++--- 4 files changed, 51 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index f4476ce..e0f0f8e 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,23 @@ const ExampleWithAsync = (props) =>
{v Much simpler, especially if your component is read-only, like the example. +In case you need user input before you can make the async call, there is a `before` property. Assign a function into it if you need to render a form for example. +```javascript + { + return
+ + +
+}} +/> +``` +The form is rendered before the promise is resolved. If you ever need to reset the Async to `before` after promise has resolved/rejected get the Async ref and use +```javascript +ref.setState({started: false}) +``` + ## install With jspm: diff --git a/async.js b/async.js index e0108b7..4c84f9a 100644 --- a/async.js +++ b/async.js @@ -1,10 +1,12 @@ -"format es6" +'format es6' import React, {PropTypes} from 'react' class Async extends React.Component { constructor (props) { super(props) - this.state = {} + this.state = { + started: false + } } componentWillReceiveProps (nP) { if (nP.promise !== this.props.promise) { @@ -14,6 +16,9 @@ class Async extends React.Component { } } handlePromise (prom) { + this.setState({ + started: true + }) prom.then((res) => { this.setState({ resolved: res, @@ -27,30 +32,37 @@ class Async extends React.Component { }) } componentWillMount () { - this.handlePromise(this.props.promise) + if (this.props.promise) { + this.handlePromise(this.props.promise) + } } render () { const {props, state} = this - if (!state.finished) { - if (props.pendingRender) { - return props.pendingRender // custom component to indicate load in progress + if (state.started) { + if (!state.finished) { + if (props.pendingRender) { + return props.pendingRender // custom component to indicate load in progress + } + return
} - return
- } - if (props.then && state.resolved) { - return props.then(state.resolved) - } - if (props.catch && state.rejected) { - return props.catch(state.rejected) + if (props.then && state.resolved) { + return props.then(state.resolved) + } + if (props.catch && state.rejected) { + return props.catch(state.rejected) + } + } else { + return this.props.before(this.handlePromise.bind(this)) } } } Async.propTypes = { - then: PropTypes.func, - catch: PropTypes.func, - pendingRender: PropTypes.node, - promise: PropTypes.object.isRequired + before: PropTypes.func, // renders it's return value before promise is handled + then: PropTypes.func, // renders it's return value when promise is resolved + catch: PropTypes.func, // renders it's return value when promise is rejected + pendingRender: PropTypes.node, // renders it's value when promise is pending + promise: PropTypes.object // promise itself } export default Async diff --git a/package.json b/package.json index cf8e2b1..6600373 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-promise", - "version": "1.0.3", + "version": "1.1.0", "description": "react.js component for rendering values behind promises", "main": "async.js", "scripts": { @@ -28,7 +28,7 @@ "babel-preset-react": "^6.3.13", "babel-register": "^6.3.13", "chai": "^3.4.1", - "enzyme": "^1.2.0", + "enzyme": "^1.3.1", "husky": "^0.10.2", "mocha": "^2.3.4", "react": "^0.14.3", diff --git a/test/async.spec.js b/test/async.spec.js index d76c909..d1e7637 100644 --- a/test/async.spec.js +++ b/test/async.spec.js @@ -2,7 +2,7 @@ 'use strict' import React from 'react' import Async from '../async' -import { shallow, describeWithDOM, mount } from 'enzyme' +import { describeWithDOM, mount } from 'enzyme' import {expect} from 'chai' describeWithDOM('async', function () { @@ -13,12 +13,12 @@ describeWithDOM('async', function () { }) it('should render empty div when promise is pending', function () { - const wrapper = shallow() + const wrapper = mount() expect(wrapper.html()).to.equal('
') }) it('should render a supplied pendingRender prop when promise is pending', function () { - const wrapper = shallow(Loading ...}/>) + const wrapper = mount(Loading ...}/>) expect(wrapper.html()).to.equal('Loading ...') })