import React, { useState, useEffect } from 'react'; import { Modal, SafeAreaView, Platform } from 'react-native'; import { WebView, WebViewMessageEvent } from 'react-native-webview'; import { Spinner } from './Spinner'; import type { OkHiLocationManagerResponse, OkHiLocationManagerProps, } from './types'; import { OkHiLocationManagerCore } from './OkHiLocationManagerCore'; import { getFrameUrl, generateJavaScriptStartScript, generateStartDataPayload, parseOkHiLocation, } from './Util'; import { ApplicationConfiguration, OkHiException, } from '@okhi/react-native-core'; /** * The OkHiLocationManager React Component is used to display an in app modal, enabling the user to quickly create an accurate OkHi address. */ const OkHiLocationManager = (props: OkHiLocationManagerProps) => { const [token, setToken] = useState(null); const [applicationConfiguration, setApplicationConfiguration] = useState(null); const defaultStyle = { flex: 1 }; const style = props.style ? { ...props.style, ...defaultStyle } : defaultStyle; const { user, onSuccess, onCloseRequest, onError, loader, launch } = props; useEffect(() => { if (launch && user.phone) { const core = new OkHiLocationManagerCore(); core.getBearerToken(user.phone).then(setToken).catch(onError); core.getConfiguration().then(setApplicationConfiguration).catch(onError); } }, [user.phone, launch, onError]); const handleOnMessage = ({ nativeEvent: { data } }: WebViewMessageEvent) => { try { const response: OkHiLocationManagerResponse = JSON.parse(data); if (response.message === 'fatal_exit') { onError( new OkHiException({ code: OkHiException.UNKNOWN_ERROR_CODE, message: response.payload.toString(), }) ); } else if (response.message === 'exit_app') { onCloseRequest(); } else { onSuccess({ ...response.payload, location: parseOkHiLocation(response.payload.location), }); } } catch (error) { let errorMessage = 'Something went wrong'; if (error instanceof Error) { errorMessage = error.message; } console.log(errorMessage); onError( new OkHiException({ code: OkHiException.UNKNOWN_ERROR_CODE, message: errorMessage, }) ); } }; const handleOnError = () => { onError( new OkHiException({ code: OkHiException.NETWORK_ERROR_CODE, message: OkHiException.NETWORK_ERROR_MESSAGE, }) ); }; const renderContent = () => { if (token === null || applicationConfiguration == null) { return loader || ; } const { jsAfterLoad, jsBeforeLoad } = generateJavaScriptStartScript({ message: 'select_location', payload: generateStartDataPayload(props, token, applicationConfiguration), }); return ( ); }; return ( {launch ? renderContent() : null} ); }; export default OkHiLocationManager;