import {
BridgeHostProvider,
useBridgeCapability,
useBridgeHostError,
} from "@gbg/go-bridge-web-react";
import { useEffect, useState } from "react";
const JOURNEY_URL = "https://journey.example.com";
export default function App() {
const [iframe, setIframe] = useState<HTMLIFrameElement | null>(null);
const [permissionState, setPermissionState] = useState("prompt");
useEffect(() => {
if (!navigator.permissions) return;
navigator.permissions
.query({ name: "camera" as PermissionName })
.then((status) => setPermissionState(status.state))
.catch(() => undefined);
}, []);
return (
<BridgeHostProvider
iframe={iframe}
allowedOrigins={[new URL(JOURNEY_URL).origin]}
hostVersion="1.0.0"
capabilities={{
"camera.document": {
supported: true,
version: "1.0",
permissionState,
},
}}
>
<ErrorBanner />
<DocumentCaptureHandler />
<iframe
ref={setIframe}
src={JOURNEY_URL}
allow="camera"
style={{ width: "100vw", height: "100vh", border: 0 }}
/>
</BridgeHostProvider>
);
}
function DocumentCaptureHandler() {
useBridgeCapability("camera.document.capture", {
handle: async (_request, responder) => {
// Your capture UI here β return a base64 image
const image = "";
responder.success({ image });
},
});
return null;
}
function ErrorBanner() {
const [error, setError] = useState<Error | null>(null);
useBridgeHostError(setError);
if (!error) return null;
return (
<div
role="alert"
style={{
position: "fixed",
top: 12,
left: 12,
right: 12,
background: "crimson",
color: "white",
padding: 12,
borderRadius: 8,
zIndex: 1000,
}}
>
{error.message}
<button
onClick={() => setError(null)}
style={{
float: "right",
background: "transparent",
border: 0,
color: "white",
cursor: "pointer",
}}
>
Γ
</button>
</div>
);
}