@@ -3,19 +3,21 @@ import React, { forwardRef, useImperativeHandle, useRef } from 'react';
33import { StyleSheet } from 'react-native' ;
44import WebView from 'react-native-webview' ;
55import { WIDGET_URL } from './constants' ;
6- import { generateScript , safeParse } from './utils' ;
6+ import { generateScript , generateScriptGetError , safeParse } from './utils' ;
77
88const propTypes = {
99 channelId : PropTypes . string . isRequired ,
1010 user : PropTypes . object ,
1111 onLoaded : PropTypes . func ,
1212 onClosedWidget : PropTypes . func ,
1313 onNewMessage : PropTypes . func ,
14+ onError : PropTypes . func ,
1415} ;
1516
16- const WebViewComponent = forwardRef ( ( { channelId, user, onLoaded, onClosedWidget, onNewMessage } , ref ) => {
17+ const WebViewComponent = forwardRef ( ( { channelId, user, onLoaded, onClosedWidget, onNewMessage, onError } , ref ) => {
1718 const webViewRef = useRef ( null ) ;
1819 const javascriptInit = React . useMemo ( ( ) => generateScript ( user ) , [ user ] ) ;
20+ const errorScript = React . useMemo ( ( ) => generateScriptGetError ( ) , [ ] ) ;
1921
2022 useImperativeHandle ( ref , ( ) => ( {
2123 injectJavaScript : ( script ) => {
@@ -30,12 +32,12 @@ const WebViewComponent = forwardRef(({ channelId, user, onLoaded, onClosedWidget
3032 < WebView
3133 ref = { webViewRef }
3234 style = { styles . webViewContainer }
35+ injectedJavaScript = { errorScript }
3336 source = { {
3437 uri : `${ WIDGET_URL } /${ channelId } ?mode=livechat&state=${ user ? 'off' : 'on' } ` ,
3538 } }
3639 onLoadEnd = { ( ) => {
3740 webViewRef . current ?. injectJavaScript ( javascriptInit ) ;
38- onLoaded && onLoaded ( ) ;
3941 } }
4042 onMessage = { ( event ) => {
4143 const { data } = event . nativeEvent ;
@@ -48,6 +50,14 @@ const WebViewComponent = forwardRef(({ channelId, user, onLoaded, onClosedWidget
4850 if ( parsedData . event === 'new-agent-message' ) {
4951 onNewMessage && onNewMessage ( ) ;
5052 }
53+
54+ if ( parsedData . event === 'ready' ) {
55+ onLoaded && onLoaded ( ) ;
56+ }
57+
58+ if ( parsedData . event === 'error' ) {
59+ onError && onError ( parsedData . message ) ;
60+ }
5161 } }
5262 />
5363 ) ;
@@ -61,4 +71,4 @@ const styles = StyleSheet.create({
6171
6272WebViewComponent . propTypes = propTypes ;
6373
64- export default WebViewComponent ;
74+ export default React . memo ( WebViewComponent ) ;
0 commit comments