allauth/ (44 files) is a django-allauth React UI — a separate concern from the Mizan protocol. Moved to legacy/ pending extraction into a standalone mizan-django-allauth package. Also moved to legacy/: - client/AuthContext.tsx — generic auth state from /me endpoint - client/RouterContext.tsx — framework-agnostic router adapter - client/routing.tsx — UserRoute/StaffRoute/AnonymousRoute guards - client/nextjs.tsx — Next.js router adapter for auth These are auth UI infrastructure, not Mizan protocol. The Mizan core only needs JWT for auth header selection (jwt/ stays — MizanProvider depends on useJWT() to decide between Bearer and session auth). Cleaned up re-exports in client/react.ts and vitest aliases. 33 React tests pass. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
52 lines
1.3 KiB
TypeScript
52 lines
1.3 KiB
TypeScript
'use client'
|
|
|
|
import { useState } from 'react'
|
|
import { useAllauthAPI } from '../../contexts/APIContext'
|
|
import { AuthDjangoForm } from '../AuthDjangoForm'
|
|
|
|
interface MFARecoveryCodesViewProps {
|
|
onSuccess?: () => void
|
|
onCancel?: () => void
|
|
onBack?: () => void
|
|
isReauth?: boolean
|
|
}
|
|
|
|
export function MFARecoveryCodesView({ onSuccess, onCancel, onBack, isReauth }: MFARecoveryCodesViewProps) {
|
|
const api = useAllauthAPI()
|
|
const [cancelling, setCancelling] = useState(false)
|
|
|
|
const handleCancel = async () => {
|
|
setCancelling(true)
|
|
try {
|
|
await api.session.logout()
|
|
onCancel?.()
|
|
} catch {
|
|
setCancelling(false)
|
|
}
|
|
}
|
|
|
|
// Build footer links
|
|
const footerLinks = []
|
|
if (onBack) {
|
|
footerLinks.push({ label: 'Use a different method', onClick: onBack })
|
|
}
|
|
if (onCancel) {
|
|
footerLinks.push({
|
|
label: cancelling ? 'Cancelling...' : 'Cancel',
|
|
onClick: handleCancel
|
|
})
|
|
}
|
|
|
|
const formName = isReauth ? 'mfa_reauthenticate' : 'mfa_authenticate'
|
|
|
|
return (
|
|
<AuthDjangoForm
|
|
formName={formName}
|
|
title="Recovery Code"
|
|
subtitle="Enter one of your recovery codes."
|
|
onSuccess={() => onSuccess?.()}
|
|
footerLinks={footerLinks}
|
|
/>
|
|
)
|
|
}
|