forked from danielweinmann/react-native-stateless-form
-
Notifications
You must be signed in to change notification settings - Fork 0
/
StatelessForm.js
79 lines (71 loc) · 1.91 KB
/
StatelessForm.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
import React, {Component, PropTypes} from 'react'
import { Platform, ScrollView, View } from 'react-native'
export default class StatelessForm extends Component {
componentDidMount() {
this.willFocusInput = false
}
childrenWithProps() {
let nextInput = null
let inputCount = 0
return React.Children.map(this.props.children, (child) => child).reverse().map((child) => {
if (child.type.propTypes && child.type.propTypes.value && child.type.propTypes.valid) {
inputCount++
const input = React.cloneElement(child, {
ref: `input${inputCount}`,
nextInput: nextInput,
onNextInputFocus: this.handleNextInputFocus.bind(this),
onFocus: this.handleFocus.bind(this),
onBlur: this.handleBlur.bind(this),
})
nextInput = input
return input
} else {
return child
}
}).reverse()
}
handleNextInputFocus(nextInput, currentInput) {
if (nextInput) {
const input = this.refs[nextInput.ref]
this.willFocusInput = true
input.focus()
} else {
currentInput.blur()
}
}
handleBlur() {
if (!this.willFocusInput) {
this.refs.scrollView.scrollTo({y: 0})
}
this.willFocusInput = false
}
handleFocus(scrollTo) {
this.willFocusInput = false
this.refs.scrollView.scrollTo({y: scrollTo})
}
render() {
return (
<ScrollView
keyboardShouldPersistTaps={false}
{ ...this.props }
ref='scrollView'
style={[{
flex: 1,
alignSelf: 'stretch',
}, this.props.style]}
>
{this.childrenWithProps()}
{ Platform.OS == 'android' && <View style={{ height: 500 }}/> }
</ScrollView>
)
}
}
StatelessForm.propTypes = {
style: PropTypes.oneOfType([
React.PropTypes.object,
React.PropTypes.arrayOf(React.PropTypes.object),
]),
}
StatelessForm.defaultProps = {
style: {},
}