A React library with QR code component and hooks for integrating Unforgettable account recovery into your React applications.
npm install @rarimo/unforgettable-sdk-reactyarn add @rarimo/unforgettable-sdk-reactpnpm add @rarimo/unforgettable-sdk-reactThe UnforgettableQrCode component renders a QR code that users can scan to complete the recovery process.
import UnforgettableQrCode from '@rarimo/unforgettable-sdk-react'
import { RecoveryFactor } from '@rarimo/unforgettable-sdk'
function App() {
return (
<UnforgettableQrCode
mode="create"
factors={[RecoveryFactor.Face, RecoveryFactor.Password]}
group="my-app"
// walletAddress="0x1234567890abcdef" // Required for 'restore' mode
qrProps={{ size: 300 }}
onSuccess={(privateKey) => {
console.log('Recovery successful!')
console.log('Private Key:', privateKey)
}}
onError={(error) => {
console.error('Recovery failed:', error)
}}
/>
)
}The useUnforgettableLink hook provides more control over the recovery process:
import { useUnforgettableLink } from '@rarimo/unforgettable-sdk-react'
import { RecoveryFactor } from '@rarimo/unforgettable-sdk'
import { QRCodeSVG } from 'qrcode.react'
function RecoverySetup() {
const recoveryLink = useUnforgettableLink({
mode: 'create',
factors: [RecoveryFactor.Face, RecoveryFactor.Password],
group: 'my-app',
// walletAddress="0x1234567890abcdef" // Required for 'restore' mode
pollingInterval: 3000,
onSuccess: (privateKey) => {
console.log('Recovered key:', privateKey)
},
onError: (error) => {
console.error('Error:', error)
}
})
return (
<div>
{recoveryLink ? (
<a href={recoveryLink} target="_blank" rel="noopener noreferrer">
<QRCodeSVG value={recoveryLink} size={256} />
</a>
) : (
<p>Generating recovery link...</p>
)}
</div>
)
}A React component that renders a QR code for account recovery.
interface UnforgettableQrCodeProps {
mode: 'create' | 'restore'
appUrl?: string
apiUrl?: string
factors?: RecoveryFactor[]
walletAddress?: string // Required for 'restore' mode
group?: string
customParams?: Record<string, string>
pollingInterval?: number // Default: 5000ms
pollingDisabled?: boolean // Default: false
onSuccess?: (privateKey: string) => void
onError?: (error: Error) => void
qrProps?: QRCodeSVGProps
loader?: React.ReactNode
// ...plus any valid <a> element attributes
}Parameters:
mode: Either'create'or'restore'appUrl: Optional custom Unforgettable app URLapiUrl: Optional custom API URLfactors: Optional list of recovery factors to usewalletAddress: Wallet address (required for restore mode)group: Optional group identifiercustomParams: Optional custom URL parameterspollingInterval: Polling interval in milliseconds (default: 5000)pollingDisabled: Disable automatic polling (default: false)onSuccess: Callback when recovery succeedsonError: Callback when an error occursqrProps: Props passed to the QR code component (size, colors, etc.)loader: Custom loading component
A React hook that generates a recovery link and handles polling.
interface UseUnforgettableLinkOptions {
mode: 'create' | 'restore'
appUrl?: string
apiUrl?: string
factors?: RecoveryFactor[]
walletAddress?: string
group?: string
customParams?: Record<string, string>
pollingInterval?: number
pollingDisabled?: boolean
onSuccess?: (privateKey: string) => void
onError?: (error: Error) => void
}string | null // The recovery URL or null if still generating<UnforgettableQrCode
mode="create"
factors={[RecoveryFactor.Face, RecoveryFactor.Image]}
qrProps={{
size: 300,
bgColor: '#ffffff',
fgColor: '#000000',
level: 'H'
}}
style={{
display: 'block',
margin: '20px auto',
padding: '10px',
border: '2px solid #ccc'
}}
loader={<div className="spinner">Loading...</div>}
onSuccess={(key) => console.log('Key:', key)}
/><UnforgettableQrCode
mode="restore"
walletAddress="0x1234567890abcdef"
factors={[RecoveryFactor.Face, RecoveryFactor.Password]}
pollingInterval={2000}
onSuccess={(privateKey) => {
// Restore wallet with the private key
restoreWallet(privateKey)
}}
onError={(error) => {
console.error(`Recovery failed: ${error.message}`)
}}
/>function ManualRecovery() {
const [startPolling, setStartPolling] = useState(false)
const link = useUnforgettableLink({
mode: 'create',
pollingDisabled: !startPolling,
onSuccess: (key) => {
console.log('Success:', key)
setStartPolling(false)
}
})
return (
<div>
{link && <QRCodeSVG value={link} />}
<button onClick={() => setStartPolling(true)}>
Start Polling
</button>
</div>
)
}enum RecoveryFactor {
Face = 1,
Image = 2,
Password = 3,
Geolocation = 4
}- React 17+
- Node.js 18+ or modern browser environment
MIT License - see LICENSE file for details