1- import React from 'react' ;
2- import { StyleSheet , Linking } from 'react-native' ;
1+ import React , { useState , useMemo } from 'react' ;
2+ import { StyleSheet , Linking , View , ActivityIndicator , Text } from 'react-native' ;
33import { WebView } from 'react-native-webview' ;
44import PropTypes from 'prop-types' ;
55import { isJsonString , storeHelper , generateScripts , getMessage } from './utils' ;
@@ -30,6 +30,7 @@ const WebViewComponent = ({
3030 closeModal,
3131} ) => {
3232 const [ currentUrl , setCurrentUrl ] = React . useState ( null ) ;
33+ const [ loading , setLoading ] = useState ( true ) ;
3334 let widgetUrl = `${ baseUrl } /widget?website_token=${ websiteToken } &locale=${ locale } ` ;
3435
3536 if ( cwCookie ) {
@@ -59,43 +60,72 @@ const WebViewComponent = ({
5960 setCurrentUrl ( newNavState . url ) ;
6061 } ;
6162
63+ const opacity = useMemo ( ( ) => {
64+ if ( loading ) {
65+ return {
66+ opacity : 0 ,
67+ } ;
68+ }
69+ return {
70+ opacity : 1 ,
71+ } ;
72+ } , [ loading ] ) ;
73+
74+ const renderLoadingComponent = ( ) => {
75+ return (
76+ < View style = { styles . loadingContainer } >
77+ < ActivityIndicator size = "large" color = "#1f93ff" />
78+ < Text style = { styles . loadingText } > Loading...</ Text >
79+ </ View >
80+ ) ;
81+ } ;
82+
6283 return (
63- < WebView
64- source = { {
65- uri : widgetUrl ,
66- } }
67- onMessage = { ( event ) => {
68- const { data } = event . nativeEvent ;
69- const message = getMessage ( data ) ;
70- if ( isJsonString ( message ) ) {
71- const parsedMessage = JSON . parse ( message ) ;
72- const { event : eventType , type } = parsedMessage ;
73- if ( eventType === 'loaded' ) {
74- const {
75- config : { authToken } ,
76- } = parsedMessage ;
77- storeHelper . storeCookie ( authToken ) ;
78- }
79- if ( type === 'close-widget' ) {
80- closeModal ( ) ;
84+ < View style = { styles . container } >
85+ < WebView
86+ source = { {
87+ uri : widgetUrl ,
88+ } }
89+ onMessage = { ( event ) => {
90+ const { data } = event . nativeEvent ;
91+ const message = getMessage ( data ) ;
92+ if ( isJsonString ( message ) ) {
93+ const parsedMessage = JSON . parse ( message ) ;
94+ const { event : eventType , type } = parsedMessage ;
95+ if ( eventType === 'loaded' ) {
96+ const {
97+ config : { authToken } ,
98+ } = parsedMessage ;
99+ storeHelper . storeCookie ( authToken ) ;
100+ }
101+ if ( type === 'close-widget' ) {
102+ closeModal ( ) ;
103+ }
81104 }
82- }
83- } }
84- scalesPageToFit
85- useWebKit
86- sharedCookiesEnabled
87- javaScriptEnabled = { true }
88- domStorageEnabled = { true }
89- style = { styles . WebViewStyle }
90- injectedJavaScript = { injectedJavaScript }
91- onShouldStartLoadWithRequest = { onShouldStartLoadWithRequest }
92- onNavigationStateChange = { handleWebViewNavigationStateChange }
93- scrollEnabled
94- />
105+ } }
106+ scalesPageToFit
107+ useWebKit
108+ sharedCookiesEnabled
109+ javaScriptEnabled = { true }
110+ domStorageEnabled = { true }
111+ style = { [ styles . WebViewStyle , opacity ] }
112+ injectedJavaScript = { injectedJavaScript }
113+ onShouldStartLoadWithRequest = { onShouldStartLoadWithRequest }
114+ onNavigationStateChange = { handleWebViewNavigationStateChange }
115+ onLoadStart = { ( ) => setLoading ( true ) }
116+ onLoadProgress = { ( ) => setLoading ( true ) }
117+ onLoadEnd = { ( ) => setLoading ( false ) }
118+ scrollEnabled
119+ />
120+ { loading && renderLoadingComponent ( ) }
121+ </ View >
95122 ) ;
96123} ;
97124
98125const styles = StyleSheet . create ( {
126+ container : {
127+ flex : 1 ,
128+ } ,
99129 modal : {
100130 flex : 1 ,
101131 borderRadius : 4 ,
@@ -104,6 +134,24 @@ const styles = StyleSheet.create({
104134 webViewContainer : {
105135 flex : 1 ,
106136 } ,
137+ WebViewStyle : {
138+ flex : 1 ,
139+ } ,
140+ loadingContainer : {
141+ position : 'absolute' ,
142+ top : 0 ,
143+ left : 0 ,
144+ right : 0 ,
145+ bottom : 0 ,
146+ justifyContent : 'center' ,
147+ alignItems : 'center' ,
148+ backgroundColor : 'rgba(255, 255, 255, 0.9)' ,
149+ } ,
150+ loadingText : {
151+ marginTop : 10 ,
152+ fontSize : 16 ,
153+ color : '#666' ,
154+ } ,
107155} ) ;
108156WebViewComponent . propTypes = propTypes ;
109157export default WebViewComponent ;
0 commit comments