@@ -2,15 +2,15 @@ import React, {Component, PropTypes} from 'react';
2
2
import WebViewBridge from 'react-native-webview-bridge-updated' ;
3
3
import { InjectedMessageHandler } from './WebviewMessageHandler' ;
4
4
import { actions , messages } from './const' ;
5
- import { Modal , View , Text , StyleSheet , TextInput , TouchableOpacity , Platform , PixelRatio , Keyboard } from 'react-native' ;
5
+ import { Modal , View , Text , StyleSheet , TextInput , TouchableOpacity , Platform , PixelRatio , Keyboard , Dimensions } from 'react-native' ;
6
6
7
7
const injectScript = `
8
8
(function () {
9
9
${ InjectedMessageHandler }
10
10
}());
11
11
` ;
12
12
13
- const PlatfomIOS = Platform . OS === 'ios' ;
13
+ const PlatformIOS = Platform . OS === 'ios' ;
14
14
15
15
export default class RichTextEditor extends Component {
16
16
static propTypes = {
@@ -21,7 +21,8 @@ export default class RichTextEditor extends Component {
21
21
editorInitializedCallback : PropTypes . func ,
22
22
customCSS : PropTypes . string ,
23
23
hiddenTitle : PropTypes . bool ,
24
- enableOnChange : PropTypes . bool
24
+ enableOnChange : PropTypes . bool ,
25
+ footerHeight : PropTypes . number
25
26
} ;
26
27
27
28
constructor ( props ) {
@@ -44,7 +45,7 @@ export default class RichTextEditor extends Component {
44
45
}
45
46
46
47
componentWillMount ( ) {
47
- if ( PlatfomIOS ) {
48
+ if ( PlatformIOS ) {
48
49
this . keyboardEventListeners = [
49
50
Keyboard . addListener ( 'keyboardWillShow' , this . _onKeyboardWillShow ) ,
50
51
Keyboard . addListener ( 'keyboardWillHide' , this . _onKeyboardWillHide )
@@ -67,12 +68,24 @@ export default class RichTextEditor extends Component {
67
68
if ( this . state . keyboardHeight === newKeyboardHeight ) {
68
69
return ;
69
70
}
71
+ if ( newKeyboardHeight ) {
72
+ this . setEditorAvailableHeightBasedOnKeyboardHeight ( newKeyboardHeight ) ;
73
+ }
70
74
this . setState ( { keyboardHeight : newKeyboardHeight } ) ;
71
75
}
72
76
73
77
_onKeyboardWillHide ( event ) {
74
78
this . setState ( { keyboardHeight : 0 } ) ;
75
79
}
80
+
81
+ setEditorAvailableHeightBasedOnKeyboardHeight ( keyboardHeight ) {
82
+ const { top = 0 , bottom = 0 } = this . props . contentInset ;
83
+ const { marginTop = 0 , marginBottom = 0 } = this . props . style ;
84
+ const spacing = marginTop + marginBottom + top + bottom ;
85
+
86
+ const editorAvailableHeight = Dimensions . get ( 'window' ) . height - keyboardHeight - spacing ;
87
+ this . setEditorHeight ( editorAvailableHeight ) ;
88
+ }
76
89
77
90
onBridgeMessage ( str ) {
78
91
try {
@@ -189,7 +202,7 @@ export default class RichTextEditor extends Component {
189
202
onRequestClose = { ( ) => this . setState ( { showLinkDialog : false } ) }
190
203
>
191
204
< View style = { styles . modal } >
192
- < View style = { [ styles . innerModal , { marginBottom : PlatfomIOS ? this . state . keyboardHeight : 0 } ] } >
205
+ < View style = { [ styles . innerModal , { marginBottom : PlatformIOS ? this . state . keyboardHeight : 0 } ] } >
193
206
< Text style = { styles . inputTitle } > Title</ Text >
194
207
< View style = { styles . inputWrapper } >
195
208
< TextInput
@@ -209,7 +222,7 @@ export default class RichTextEditor extends Component {
209
222
autoCorrect = { false }
210
223
/>
211
224
</ View >
212
- { PlatfomIOS && < View style = { styles . lineSeparator } /> }
225
+ { PlatformIOS && < View style = { styles . lineSeparator } /> }
213
226
{ this . _renderModalButtons ( ) }
214
227
</ View >
215
228
</ View >
@@ -228,11 +241,11 @@ export default class RichTextEditor extends Component {
228
241
229
242
_renderModalButtons ( ) {
230
243
const insertUpdateDisabled = this . state . linkTitle . trim ( ) . length <= 0 || this . state . linkUrl . trim ( ) . length <= 0 ;
231
- const containerPlatformStyle = PlatfomIOS ? { justifyContent : 'space-between' } : { paddingTop : 15 } ;
232
- const buttonPlatformStyle = PlatfomIOS ? { flex : 1 , height : 45 , justifyContent : 'center' } : { } ;
244
+ const containerPlatformStyle = PlatformIOS ? { justifyContent : 'space-between' } : { paddingTop : 15 } ;
245
+ const buttonPlatformStyle = PlatformIOS ? { flex : 1 , height : 45 , justifyContent : 'center' } : { } ;
233
246
return (
234
247
< View style = { [ { alignSelf : 'stretch' , flexDirection : 'row' } , containerPlatformStyle ] } >
235
- { ! PlatfomIOS && < View style = { { flex : 1 } } /> }
248
+ { ! PlatformIOS && < View style = { { flex : 1 } } /> }
236
249
< TouchableOpacity
237
250
onPress = { ( ) => this . _hideModal ( ) }
238
251
style = { buttonPlatformStyle }
@@ -266,16 +279,15 @@ export default class RichTextEditor extends Component {
266
279
}
267
280
268
281
_upperCaseButtonTextIfNeeded ( buttonText ) {
269
- return PlatfomIOS ? buttonText : buttonText . toUpperCase ( ) ;
282
+ return PlatformIOS ? buttonText : buttonText . toUpperCase ( ) ;
270
283
}
271
284
272
285
render ( ) {
273
286
//in release build, external html files in Android can't be required, so they must be placed in the assets folder and accessed via uri
274
- const pageSource = PlatfomIOS ? require ( './editor.html' ) : { uri : 'file:///android_asset/editor.html' } ;
287
+ const pageSource = PlatformIOS ? require ( './editor.html' ) : { uri : 'file:///android_asset/editor.html' } ;
275
288
return (
276
289
< View style = { { flex : 1 } } >
277
290
< WebViewBridge
278
- style = { { flex : 1 } }
279
291
{ ...this . props }
280
292
hideKeyboardAccessoryView = { true }
281
293
keyboardDisplayRequiresUserAction = { false }
@@ -504,6 +516,22 @@ export default class RichTextEditor extends Component {
504
516
505
517
init ( ) {
506
518
this . _sendAction ( actions . init ) ;
519
+ this . setPlatform ( ) ;
520
+ if ( this . props . footerHeight ) {
521
+ this . setFooterHeight ( ) ;
522
+ }
523
+ }
524
+
525
+ setEditorHeight ( height ) {
526
+ this . _sendAction ( actions . setEditorHeight , height ) ;
527
+ }
528
+
529
+ setFooterHeight ( ) {
530
+ this . _sendAction ( actions . setFooterHeight , this . props . footerHeight ) ;
531
+ }
532
+
533
+ setPlatform ( ) {
534
+ this . _sendAction ( actions . setPlatform , Platform . OS ) ;
507
535
}
508
536
509
537
async getTitleHtml ( ) {
@@ -587,12 +615,12 @@ const styles = StyleSheet.create({
587
615
innerModal : {
588
616
backgroundColor : 'rgba(255, 255, 255, 0.9)' ,
589
617
paddingTop : 20 ,
590
- paddingBottom : PlatfomIOS ? 0 : 20 ,
618
+ paddingBottom : PlatformIOS ? 0 : 20 ,
591
619
paddingLeft : 20 ,
592
620
paddingRight : 20 ,
593
621
alignSelf : 'stretch' ,
594
622
margin : 40 ,
595
- borderRadius : PlatfomIOS ? 8 : 2
623
+ borderRadius : PlatformIOS ? 8 : 2
596
624
} ,
597
625
button : {
598
626
fontSize : 16 ,
@@ -603,13 +631,13 @@ const styles = StyleSheet.create({
603
631
marginTop : 5 ,
604
632
marginBottom : 10 ,
605
633
borderBottomColor : '#4a4a4a' ,
606
- borderBottomWidth : PlatfomIOS ? 1 / PixelRatio . get ( ) : 0
634
+ borderBottomWidth : PlatformIOS ? 1 / PixelRatio . get ( ) : 0
607
635
} ,
608
636
inputTitle : {
609
637
color : '#4a4a4a'
610
638
} ,
611
639
input : {
612
- height : PlatfomIOS ? 20 : 40 ,
640
+ height : PlatformIOS ? 20 : 40 ,
613
641
paddingTop : 0
614
642
} ,
615
643
lineSeparator : {
0 commit comments