Appearance
Integrating LIQA into React Native app
Below is the guide for integrating LIQA into a React Native app using Expo and TypeScript language.
WebView with LIQA integrated
Here is a ready-to-use implementation of WebView with integrated LIQA functionality.
Production recommendation
For the simplicity of the guide, WebView loads the HTML page from a string containing the page‘s HTML content.
In a real-world application, you may consider loading the page from a CDN managed by your organization. Check the Hosting the HTML Page section for more details.
tsx
import { WebView, type WebViewMessageEvent } from "react-native-webview"
const HTML = ` PUT THE HTML PAGE CONTENT HERE `
export type Props = {
onLiqaEvent: (name: string, payload?: Object) => void
}
export const LiqaWebView = ({ onLiqaEvent }: Props) => {
const handleWebviewMessage = (event: WebViewMessageEvent) => {
const message = event.nativeEvent.data
const { name, payload } = JSON.parse(message)
onLiqaEvent(name, payload)
}
return (
<WebView
source={{
html: HTML,
// `https://` is required to get WebView camera working
baseUrl: "https://YOUR.DOMAIN.COM,
}}
originWhiteList={["*"]}
mediaPlaybackRequiresUserAction={false}
allowsInlineMediaPlayback={true}
onMessage={handleWebviewMessage}
// Set the mediaCapturePermissionGrantType to "grant" to avoid repetitive permission requests, especially on iOS
mediaCapturePermissionGrantType={"grant"}
/>
)
}
import { WebView, type WebViewMessageEvent } from "react-native-webview"
const HTML = ` PUT THE HTML PAGE CONTENT HERE `
export type Props = {
onLiqaEvent: (name: string, payload?: Object) => void
}
export const LiqaWebView = ({ onLiqaEvent }: Props) => {
const handleWebviewMessage = (event: WebViewMessageEvent) => {
const message = event.nativeEvent.data
const { name, payload } = JSON.parse(message)
onLiqaEvent(name, payload)
}
return (
<WebView
source={{
html: HTML,
// `https://` is required to get WebView camera working
baseUrl: "https://YOUR.DOMAIN.COM,
}}
originWhiteList={["*"]}
mediaPlaybackRequiresUserAction={false}
allowsInlineMediaPlayback={true}
onMessage={handleWebviewMessage}
// Set the mediaCapturePermissionGrantType to "grant" to avoid repetitive permission requests, especially on iOS
mediaCapturePermissionGrantType={"grant"}
/>
)
}
Before integrating the snippet into your app, please, ensure that:
- Content of the HTML Page is inlined into the
HTML
string. WebView.mediaPlaybackRequiresUserAction
is set tofalse
.WebView.allowsInlineMediaPlayback
is set totrue
.- WebView loads the page over HTTPS.
Application integration example
Here is an app‘s entry point, showcasing a sample integration of LiqaWebView
:
tsx
import { useState, useEffect } from "react"
import { Camera } from "expo-camera"
import Logs from "react-native-toast-message"
import { LiqaWebView } from "./LiqaWebView"
export default function App() {
const webview = <LiqaWebView onLiqaEvent={handleLiqaEvent} />
const [view, setContentView] = useState<React.JSX.Element>()
// Request camera permission before loading WebView
useEffect(() => {
Camera.requestCameraPermissionsAsync().then(() => setContentView(webview))
}, [])
return (
<>
{view}
<Logs />
</>
)
}
// The App‘s business logic for handling LIQA events
function handleLiqaEvent(name: string, payload?: Object) {
let text = `LIQA: ${name}`
if (payload) {
let extars = JSON.stringify(payload)
// Do not overwhelm the log
if (extars.length >= 1024) extars = extars.substring(0, 1024) + "..."
text += `\n${extars}`
}
log(text)
}
function log(message: string) {
const [text1, text2] = message.split("\n")
Logs.show({
text1,
text2,
position: "bottom",
})
}
import { useState, useEffect } from "react"
import { Camera } from "expo-camera"
import Logs from "react-native-toast-message"
import { LiqaWebView } from "./LiqaWebView"
export default function App() {
const webview = <LiqaWebView onLiqaEvent={handleLiqaEvent} />
const [view, setContentView] = useState<React.JSX.Element>()
// Request camera permission before loading WebView
useEffect(() => {
Camera.requestCameraPermissionsAsync().then(() => setContentView(webview))
}, [])
return (
<>
{view}
<Logs />
</>
)
}
// The App‘s business logic for handling LIQA events
function handleLiqaEvent(name: string, payload?: Object) {
let text = `LIQA: ${name}`
if (payload) {
let extars = JSON.stringify(payload)
// Do not overwhelm the log
if (extars.length >= 1024) extars = extars.substring(0, 1024) + "..."
text += `\n${extars}`
}
log(text)
}
function log(message: string) {
const [text1, text2] = message.split("\n")
Logs.show({
text1,
text2,
position: "bottom",
})
}
Feel free to adapt the example for your application needs.
Application permissions configuration
Additionally, there is an example of expo-camera configuration for LiqaWebView
to function correctly
tsx
{
"expo": {
"name": "LiqaReactNativeIntegration",
"slug": "liqa-react-native-integration",
"version": "0.0.0",
"orientation": "portrait",
"userInterfaceStyle": "light",
"assetBundlePatterns": ["**/*"],
"ios": {},
"android": {},
"web": {},
"plugins": [
[
"expo-camera",
{
"cameraPermission": "Allow $(PRODUCT_NAME) to access your camera"
}
]
]
}
}
{
"expo": {
"name": "LiqaReactNativeIntegration",
"slug": "liqa-react-native-integration",
"version": "0.0.0",
"orientation": "portrait",
"userInterfaceStyle": "light",
"assetBundlePatterns": ["**/*"],
"ios": {},
"android": {},
"web": {},
"plugins": [
[
"expo-camera",
{
"cameraPermission": "Allow $(PRODUCT_NAME) to access your camera"
}
]
]
}
}
Before running your app with LiqaWebView
integrated, please, ensure that:
- Camera permissions are enabled in the Expo
app.config
.
Need Assistance?
If you have any questions regarding the integration or need further assistance, please contact Haut.AI Support Team with this request via the Support Desk.