-
Notifications
You must be signed in to change notification settings - Fork 1
/
SecurityText.js
75 lines (67 loc) · 2.11 KB
/
SecurityText.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
/*
* A smart security text for react-native apps
* https://github.com/react-native-component/react-native-smart-security-text/
* Released under the MIT license
* Copyright (c) 2016 react-native-component <[email protected]>
*/
import React, {
PropTypes,
Component,
} from 'react'
import {
Text,
} from 'react-native'
export default class SecurityText extends Component {
static propTypes = {
...Text.propTypes,
securityOptions: PropTypes.shape({
isSecurity: PropTypes.bool,
startIndex: PropTypes.number,
endIndex: PropTypes.number,
length: PropTypes.number,
securityChar: PropTypes.string,
}),
}
render() {
return (
<Text
{...this.props}>
{this._renderContent(this.props.securityOptions)}
</Text>
)
}
_renderContent({isSecurity = false, startIndex = 0, endIndex, length, securityChar = '*'} = {}) {
if(isSecurity) {
let texts = []
React.Children.forEach(this.props.children, (child) => {
if(!React.isValidElement(child)) {
if(length > 0) {
child = this._padEnd(length, securityChar)
}
else {
let textLength = child.length
if(Math.abs(startIndex) > textLength - 1) {
startIndex = textLength - 1
}
if(Math.abs(endIndex) > textLength) {
endIndex = textLength
}
child = child.slice(0, startIndex) + this._padEnd(endIndex - startIndex, securityChar) + child.slice(endIndex)
}
texts.push(child)
}
})
return texts
}
else {
return this.props.children
}
}
_padEnd(length, string) {
let text = ''
for(let i = 0; i < length; i++) {
text += string
}
return text
}
}