import { Routes, Route, useNavigate } from 'react-router-dom';
import {
HumanityConnect,
useHumanity,
useVerification,
clearVerificationCache,
} from '@humanity-org/react-sdk';
import { useEffect } from 'react';
function IsHumanCheck() {
const { verify, result, isLoading } = useVerification();
useEffect(() => {
verify('is_human');
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
const isHuman = result?.value === true;
return (
<div className="status-card">
{isLoading && <p className="status-checking">Checking biometric status...</p>}
{!isLoading && isHuman && <p className="status-verified">✓ Biometrically verified</p>}
{!isLoading && !isHuman && <p className="status-unverified">✗ Not biometrically verified</p>}
{!isLoading && (
<button
className="btn-secondary"
onClick={() => { clearVerificationCache(); verify('is_human'); }}
>
Re-check
</button>
)}
</div>
);
}
function Home() {
const { isAuthenticated, isLoading, logout } = useHumanity();
if (isLoading) return <div className="screen"><p>Loading...</p></div>;
if (!isAuthenticated) {
return (
<div className="screen">
<h1>Humanity react-sdk-quickstart</h1>
<p>Connect your Humanity account to check your biometric verification status.</p>
<HumanityConnect
mode="redirect"
scopes={['openid', 'identity:read']}
onError={(err) => console.error(err)}
/>
</div>
);
}
return (
<div className="screen">
<h1>Humanity react-sdk-quickstart</h1>
<IsHumanCheck />
<button className="btn-ghost" onClick={logout}>Sign out</button>
</div>
);
}
function Callback() {
const { isAuthenticated, isLoading } = useHumanity();
const navigate = useNavigate();
useEffect(() => {
if (!isLoading && isAuthenticated) navigate('/', { replace: true });
}, [isAuthenticated, isLoading, navigate]);
return <div className="screen"><p>Completing sign-in...</p></div>;
}
export default function App() {
return (
<Routes>
<Route path="/" element={<Home />} />
<Route path="/callback" element={<Callback />} />
</Routes>
);
}