Skip to content

Commit 9bde567

Browse files
Merge pull request #10 from testshallpass/add-render-props
Add render props
2 parents 38bba4a + d03b3e5 commit 9bde567

File tree

5 files changed

+186
-120
lines changed

5 files changed

+186
-120
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,6 @@ valueChanged(value) {
5555
| ```activeOpacity``` | Number | touch opacity | 0.4
5656
| ```disabledOpacity``` | Number | when step button is disabled | 0.5
5757
| ```disabled``` | Boolean | stepper disable state | false
58+
| ```renderIncrement``` | Function | render increment component(s) | null
59+
| ```renderDecrement``` | Function | render decrement component(s) | null
5860

SimpleStepper.js

Lines changed: 42 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ export default class SimpleStepper extends Component {
2020
disabledOpacity: PropTypes.number,
2121
incrementImage: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
2222
decrementImage: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
23-
disabled: PropTypes.bool
23+
disabled: PropTypes.bool,
24+
renderDecrement: PropTypes.func,
25+
renderIncrement: PropTypes.func
2426
};
2527
static defaultProps = {
2628
initialValue: 0,
@@ -39,7 +41,9 @@ export default class SimpleStepper extends Component {
3941
imageWidth: 36,
4042
activeOpacity: 0.4,
4143
disabledOpacity: 0.5,
42-
disabled: false
44+
disabled: false,
45+
renderDecrement: null,
46+
renderIncrement: null
4347
};
4448
constructor(props) {
4549
super(props);
@@ -221,6 +225,27 @@ export default class SimpleStepper extends Component {
221225
}
222226
return null;
223227
}
228+
renderImage(renderProp, style, tintStyle, opacity, src) {
229+
if (typeof renderProp == "function") {
230+
const data = {
231+
"style": style,
232+
"tintStyle": tintStyle,
233+
"opacity": opacity,
234+
"source": src
235+
}
236+
return renderProp(data)
237+
}
238+
return (
239+
<Image
240+
style={[
241+
style,
242+
tintStyle,
243+
{ opacity: opacity }
244+
]}
245+
source={src}
246+
/>
247+
)
248+
}
224249
render() {
225250
const {
226251
imageWidth,
@@ -233,18 +258,20 @@ export default class SimpleStepper extends Component {
233258
tintColor,
234259
backgroundColor,
235260
activeOpacity,
236-
disabled
261+
disabled,
262+
renderDecrement,
263+
renderIncrement,
237264
} = this.props;
238-
var tintIncrementStyle = this.tintStyle(tintOnIncrementImage);
239-
var tintDecrementStyle = this.tintStyle(tintOnDecrementImage);
240-
var decrementImageSrc = this.imageSrc(decrementImage, "decrement");
241-
var incrementImageSrc = this.imageSrc(incrementImage, "increment");
242-
var incrementStyle = this.imageStyle(
265+
const tintIncrementStyle = this.tintStyle(tintOnIncrementImage);
266+
const tintDecrementStyle = this.tintStyle(tintOnDecrementImage);
267+
const decrementImageSrc = this.imageSrc(decrementImage, "decrement");
268+
const incrementImageSrc = this.imageSrc(incrementImage, "increment");
269+
const incrementStyle = this.imageStyle(
243270
incrementImage,
244271
imageWidth,
245272
imageHeight
246273
);
247-
var decrementStyle = this.imageStyle(
274+
const decrementStyle = this.imageStyle(
248275
decrementImage,
249276
imageWidth,
250277
imageHeight
@@ -272,14 +299,9 @@ export default class SimpleStepper extends Component {
272299
onPress={this.decrementAction}
273300
disabled={hasReachedMin || disabled}
274301
>
275-
<Image
276-
style={[
277-
decrementStyle,
278-
tintDecrementStyle,
279-
{ opacity: decrementOpacity }
280-
]}
281-
source={decrementImageSrc}
282-
/>
302+
<View>
303+
{this.renderImage(renderDecrement, decrementStyle, tintDecrementStyle, decrementOpacity, decrementImageSrc)}
304+
</View>
283305
</TouchableOpacity>
284306
<TouchableOpacity
285307
ref={ref => this.incrementButton = ref}
@@ -291,14 +313,9 @@ export default class SimpleStepper extends Component {
291313
onPress={this.incrementAction}
292314
disabled={hasReachedMax || disabled}
293315
>
294-
<Image
295-
style={[
296-
incrementStyle,
297-
tintIncrementStyle,
298-
{ opacity: incrementOpacity }
299-
]}
300-
source={incrementImageSrc}
301-
/>
316+
<View>
317+
{this.renderImage(renderIncrement, incrementStyle, tintIncrementStyle, incrementOpacity, incrementImageSrc)}
318+
</View>
302319
</TouchableOpacity>
303320
</View>
304321
);

__tests__/SimpleStepper-test.js

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import 'react-native';
1+
import {Image} from 'react-native';
22
import React from 'react';
33
import SimpleStepper from '../SimpleStepper';
44
import renderer from 'react-test-renderer';
@@ -44,7 +44,7 @@ test('tintColor to be blue', () => {
4444
test('tintColor to be null', () => {
4545
const wrapper = shallow(<SimpleStepper />)
4646
const tintStyle = wrapper.instance().tintStyle(false)
47-
expect(tintStyle).toEqual(null)
47+
expect(tintStyle).toBeNull()
4848
});
4949
test('increment type imageSrc to be uri object', () => {
5050
const wrapper = shallow(<SimpleStepper />)
@@ -59,7 +59,7 @@ test('increment type imageSrc to be local asset number', () => {
5959
test('increment type imageSrc to be null', () => {
6060
const wrapper = shallow(<SimpleStepper />)
6161
const imageSrc = wrapper.instance().imageSrc(null, 'increment')
62-
expect(imageSrc).toEqual(null)
62+
expect(imageSrc).toBeNull()
6363
});
6464
test('decrement type imageSrc to be local asset number', () => {
6565
const wrapper = shallow(<SimpleStepper />)
@@ -69,7 +69,7 @@ test('decrement type imageSrc to be local asset number', () => {
6969
test('decrement type imageSrc to be undefined', () => {
7070
const wrapper = shallow(<SimpleStepper />)
7171
const imageSrc = wrapper.instance().imageSrc(undefined, 'decrement')
72-
expect(imageSrc).toEqual(undefined)
72+
expect(imageSrc).toBeUndefined()
7373
});
7474
test('unknown type imageSrc to be empty string', () => {
7575
const wrapper = shallow(<SimpleStepper />)
@@ -79,10 +79,20 @@ test('unknown type imageSrc to be empty string', () => {
7979
test('imageStyle to be null', () => {
8080
const wrapper = shallow(<SimpleStepper />)
8181
const imageStyle = wrapper.instance().imageStyle(null, 36, 36)
82-
expect(imageStyle).toEqual(null)
82+
expect(imageStyle).toBeNull()
8383
});
8484
test('imageStyle to be style object', () => {
8585
const wrapper = shallow(<SimpleStepper />)
8686
const imageStyle = wrapper.instance().imageStyle('https://facebook.github.io/react/img/logo_og.png', 69, 69)
8787
expect(imageStyle).toEqual({width: 69, height: 69})
88+
});
89+
test('renderImage to be Image', () => {
90+
const wrapper = shallow(<SimpleStepper />)
91+
const renderImage = wrapper.instance().renderImage('eeeee', {}, {}, 1, 1)
92+
expect(renderImage).toEqual(<Image source={1} style={[{}, {}, {opacity: 1}]} />)
93+
});
94+
test('renderImage to be Mock Function', () => {
95+
const wrapper = shallow(<SimpleStepper />)
96+
const renderImage = wrapper.instance().renderImage(jest.fn, {}, {}, 1, 1)
97+
expect(jest.isMockFunction(renderImage)).toEqual(true)
8898
});

__tests__/__snapshots__/SimpleStepper-test.js.snap

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -40,19 +40,21 @@ exports[`test renders correctly 1`] = `
4040
}
4141
testID={undefined}
4242
tvParallaxProperties={undefined}>
43-
<Image
44-
source={1}
45-
style={
46-
Array [
47-
null,
48-
Object {
49-
"tintColor": "blue",
50-
},
51-
Object {
52-
"opacity": 0.5,
53-
},
54-
]
55-
} />
43+
<View>
44+
<Image
45+
source={1}
46+
style={
47+
Array [
48+
null,
49+
Object {
50+
"tintColor": "blue",
51+
},
52+
Object {
53+
"opacity": 0.5,
54+
},
55+
]
56+
} />
57+
</View>
5658
</View>
5759
<View
5860
accessibilityComponentType={undefined}
@@ -82,19 +84,21 @@ exports[`test renders correctly 1`] = `
8284
}
8385
testID={undefined}
8486
tvParallaxProperties={undefined}>
85-
<Image
86-
source={1}
87-
style={
88-
Array [
89-
null,
90-
Object {
91-
"tintColor": "blue",
92-
},
93-
Object {
94-
"opacity": 1,
95-
},
96-
]
97-
} />
87+
<View>
88+
<Image
89+
source={1}
90+
style={
91+
Array [
92+
null,
93+
Object {
94+
"tintColor": "blue",
95+
},
96+
Object {
97+
"opacity": 1,
98+
},
99+
]
100+
} />
101+
</View>
98102
</View>
99103
</View>
100104
`;

0 commit comments

Comments
 (0)