-
Notifications
You must be signed in to change notification settings - Fork 312
/
withInitialCall.js
83 lines (69 loc) · 1.8 KB
/
withInitialCall.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// @flow
import React from 'react'
import { string } from 'prop-types'
import {
withCall,
withProgress,
progressValues,
type Actions,
type Progress,
} from 'spunky'
import { omit } from 'lodash-es'
import pureStrategy from './helpers/pureStrategy'
const { INITIAL } = progressValues
const PROGRESS_PROP = '__progress__'
type Options = {
propName: string,
strategy: (Array<Object>) => Progress,
}
function defaultMapPropsToAction(props) {
return props
}
const withInitialCall = (
actions: Actions,
mapPropsToAction: Function = defaultMapPropsToAction,
{
propName = PROGRESS_PROP,
strategy = pureStrategy,
...options
}: Options = {},
) => (Component: Class<React.Component<*>>): Class<React.Component<*>> => {
type Props = {
[propName: string]: string,
}
class ConditionalCallComponent extends React.Component<Props> {
static propTypes = {
[propName]: string.isRequired,
}
componentWillMount() {
// $FlowFixMe
this.Component = this.createComponent(this.props)
}
componentWillReceiveProps(nextProps) {
const progress = this.props[propName]
const nextProgress = nextProps[propName]
if (
progress !== nextProgress &&
(progress === INITIAL || nextProgress === INITIAL)
) {
// $FlowFixMe
this.Component = this.createComponent(nextProps)
}
}
render() {
// $FlowFixMe
const { Component } = this
return <Component {...omit(this.props, propName)} />
}
createComponent = props => {
if (props[propName] === INITIAL) {
return withCall(actions, mapPropsToAction)(Component)
}
return Component
}
}
return withProgress(actions, { propName, strategy, ...options })(
ConditionalCallComponent,
)
}
export default withInitialCall