import type { KycSubmission } from './kyc.types'; import { useForm } from '@tanstack/react-form'; import { useState } from 'react'; import { toast } from 'sonner'; import z from 'zod'; import { Field, FieldError, FieldLabel, } from '@/components/ui/field'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Spinner } from '@/components/ui/spinner'; import { Button } from '../../ui/button'; import { DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '../../ui/dialog'; const CnridSchema = z.object({ cnrid: z.string().min(18, '身份证号应为18位').max(18, '身份证号应为18位'), name: z.string().min(2, '姓名应至少2个字符').max(10, '姓名应不超过10个字符'), }); function CnridForm({ onSubmit }: { onSubmit: OnSubmit }) { const form = useForm({ defaultValues: { cnrid: '', name: '', }, validators: { onSubmit: CnridSchema, }, onSubmit: async (values) => { await onSubmit({ method: 'cnrid', ...values.value, }).catch(() => { toast('认证失败,请稍后再试'); }); }, }); return (
{ e.preventDefault(); e.stopPropagation(); void form.handleSubmit(); }} className="flex flex-col gap-4" > {field => ( 姓名 field.handleChange(e.target.value)} /> )} {field => ( 身份证号 field.handleChange(e.target.value)} /> )} [state.canSubmit, state.isPristine, state.isSubmitting]} children={([canSubmit, isPristine, isSubmitting]) => ( )} />
); } const PassportSchema = z.object({ passportId: z.string().min(9, '护照号应为9个字符').max(9, '护照号应为9个字符'), }); function PassportForm({ onSubmit }: { onSubmit: OnSubmit }) { const form = useForm({ defaultValues: { passportId: '', }, validators: { onSubmit: PassportSchema, }, onSubmit: async (values) => { await onSubmit({ method: 'passport', ...values.value, }).catch(() => { toast('认证失败,请稍后再试'); }); }, }); return (
{ e.preventDefault(); e.stopPropagation(); void form.handleSubmit(); }} className="flex flex-col gap-4" > {field => ( 护照号 field.handleChange(e.target.value)} /> )} [state.canSubmit, state.isPristine, state.isSubmitting]} children={([canSubmit, isPristine, isSubmitting]) => ( )} />
); } type OnSubmit = (submission: KycSubmission) => Promise; export function KycMethodSelectionDialogView({ onSubmit }: { onSubmit: OnSubmit }) { const [kycMethod, setKycMethod] = useState(null); return ( 选择身份认证模式

我们支持身份证和护照认证。

{kycMethod === 'cnrid' && } {kycMethod === 'passport' && }
); }