"use client"; import { useState, useTransition } from "react"; import { startAuthentication, startRegistration, } from "@simplewebauthn/browser"; import { finishPasskeyLogin, finishPasskeyRegistration, startPasskeyLogin, startPasskeyRegistration, } from "./functions"; export function Login() { const [username, setUsername] = useState(""); const [result, setResult] = useState(""); const [isPending, startTransition] = useTransition(); const passkeyLogin = async () => { // 1. Get a challenge from the worker const options = await startPasskeyLogin(); // 2. Ask the browser to sign the challenge const login = await startAuthentication({ optionsJSON: options }); // 3. Give the signed challenge to the worker to finish the login process const success = await finishPasskeyLogin(login); if (!success) { setResult("Login failed"); } else { setResult("Login successful!"); } }; const passkeyRegister = async () => { // 1. Get a challenge from the worker const options = await startPasskeyRegistration(username); // 2. Ask the browser to sign the challenge const registration = await startRegistration({ optionsJSON: options }); // 3. Give the signed challenge to the worker to finish the registration process const success = await finishPasskeyRegistration(username, registration); if (!success) { setResult("Registration failed"); } else { setResult("Registration successful!"); } }; const handlePerformPasskeyLogin = () => { startTransition(() => void passkeyLogin()); }; const handlePerformPasskeyRegister = () => { startTransition(() => void passkeyRegister()); }; return ( <> setUsername(e.target.value)} placeholder="Username" /> {result &&
{result}
} ); }