'use client' import * as React from 'react' import { useRegisteredComponent } from '@open-mercato/ui/backend/injection/useRegisteredComponent' import { buildMfaProviderComponentHandles } from '../lib/mfa-provider-interface' import GenericProviderSetup from './GenericProviderSetup' import GenericProviderVerify from './GenericProviderVerify' import type { MfaMethod, MfaProvider } from '../types' import type { MfaChallengeMethod } from './MfaChallengePanel' import GenericMfaProviderListItem from './mfa-provider-list-items/GenericMfaProviderListItem' import MfaProviderMethodListItem from './MfaProviderMethodListItem' export type ProviderSetupComponentProps = { provider: MfaProvider onComplete: (recoveryCodes: string[]) => void onCancel: () => void } type ProviderSetupComponent = React.ComponentType function GenericProviderSetupComponent({ provider, onComplete, onCancel, }: ProviderSetupComponentProps) { return ( ) } export function useProviderSetupComponent(provider: { type: string label: string components?: MfaProvider['components'] }): ProviderSetupComponent { const fallback = React.useMemo(() => GenericProviderSetupComponent, []) return useRegisteredComponent( provider.components?.setup ?? buildMfaProviderComponentHandles(provider.type).setup, fallback, ) } export type ProviderListComponentProps = { provider: MfaProvider configuredCount: number onClick: () => void } type ProviderListComponent = React.ComponentType export function useProviderListComponent(provider: MfaProvider): ProviderListComponent { const fallback = React.useMemo(() => GenericMfaProviderListItem, []) return useRegisteredComponent( provider.components?.list ?? buildMfaProviderComponentHandles(provider.type).list, fallback, ) } export type ProviderDetailsComponentProps = { provider: MfaProvider methods: MfaMethod[] saving: boolean onRemoveMethod: (method: MfaMethod) => Promise onMethodsChanged: () => Promise } type ProviderDetailsComponent = React.ComponentType function GenericProviderDetailsComponent({ provider, methods, saving, onRemoveMethod, onMethodsChanged, }: ProviderDetailsComponentProps) { return (
{ void onMethodsChanged() }} /> {methods.length > 0 ? (
{methods.map((method) => ( { void onRemoveMethod(entry) }} /> ))}
) : null}
) } export function useProviderDetailsComponent(provider: MfaProvider): ProviderDetailsComponent { const fallback = React.useMemo(() => GenericProviderDetailsComponent, []) return useRegisteredComponent( provider.components?.details ?? buildMfaProviderComponentHandles(provider.type).details, fallback, ) } export type ProviderChallengeComponentProps = { method: MfaChallengeMethod loading: boolean onVerify: (payload: Record) => Promise onPrepare: () => Promise | undefined> onResend?: () => Promise submitLabel: string } type ProviderChallengeComponent = React.ComponentType function GenericProviderChallengeComponent({ onVerify, onResend, submitLabel, }: ProviderChallengeComponentProps) { return ( ) } export function useProviderChallengeComponent(method: { type: string; components?: MfaProvider['components'] }): ProviderChallengeComponent { const fallback = React.useMemo(() => GenericProviderChallengeComponent, []) return useRegisteredComponent( method.components?.challenge ?? buildMfaProviderComponentHandles(method.type).challenge, fallback, ) }