React components for Authsignal.
Add @authsignal/react to your package.json dependencies.
npm install @authsignal/reactyarn add @authsignal/reactRender the AuthsignalProvider component at the root of your app.
import { Authsignal } from '@authsignal/react';
function App() {
return (
<AuthsignalProvider tenantId="YOUR_TENANT_ID" baseUrl="YOUR_BASE_URL">
<Checkout />
</AuthsignalProvider>
);
}Import the useAuthsignal hook in your component.
Then pass the challengeOptions returned from your server to the startChallenge function.
import { useAuthsignal } from '@authsignal/react';
export function Checkout() {
const { startChallenge } = useAuthsignal();
const handlePayment = async () => {
const response = await fetch('/api/payment', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
});
const data = await response.json();
if (data.token) {
startChallenge({
token: data.token,
onChallengeSuccess: ({ token }) => {
// Challenge was successful
},
onCancel: () => {
// User cancelled the challenge
},
onTokenExpired: () => {
// Token expired
},
});
}
};
return (
<div>
<button type="button" onClick={handlePayment}>Pay</button>
</div>
);
}Alternatively, you can use the startChallengeAsync function to work with promises.
import { useAuthsignal, ChallengeError } from '@authsignal/react';
export function Checkout() {
const { startChallengeAsync } = useAuthsignal();
const handlePayment = async () => {
const response = await fetch('/api/payment', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
});
const data = await response.json();
if (data.token) {
try {
const { token } = await startChallengeAsync({
token: data.token,
});
// Challenge was successful
} catch (e) {
if (e instanceof ChallengeError) {
if (e.code === "USER_CANCELED") {
// User cancelled the challenge
} else if (e.code === "TOKEN_EXPIRED") {
// Token expired
}
}
}
}
};
return (
<div>
<button type="button" onClick={handlePayment}>Pay</button>
</div>
);
}