import { zodResolver } from "@hookform/resolvers/zod" import { useState } from "react" import { Controller, useForm } from "react-hook-form" import { toast } from "sonner" import { z } from "zod" import { submitRealName } from "@/api/agreement" import { QrCodeImage } from "@/components/qrCodeImage" import { Button } from "@/components/ui/button" import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog" import { FieldError } from "@/components/ui/field" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" const realNameSchema = z.object({ name: z.string().trim().min(1, "请输入真实姓名"), idCode: z .string() .trim() .regex(/^\d{15}$|^\d{18}$|^\d{17}(\d|X|x)$/, "身份证号码不合法"), }) type RealNameValues = z.infer export default function RealNameDialog({ open, onOpenChange, onVerified, mandatory = false, }: { open: boolean onOpenChange: (open: boolean) => void onVerified: () => void /** 强制模式:不可关闭,直到完成实名认证(由外层 Gate 在认证成功后卸载) */ mandatory?: boolean }) { const [stage, setStage] = useState<"form" | "scan">("form") const [qrUrl, setQrUrl] = useState("") const [submitting, setSubmitting] = useState(false) const form = useForm({ resolver: zodResolver(realNameSchema), defaultValues: { name: "", idCode: "" }, }) const handleOpenChange = (next: boolean) => { if (!next && mandatory) return onOpenChange(next) if (!next) { form.reset({ name: "", idCode: "" }) setStage("form") setQrUrl("") } } const handleFinish = () => { onVerified() if (!mandatory) onOpenChange(false) } const onSubmit = async (data: RealNameValues) => { setSubmitting(true) const res = await submitRealName({ idCode: data.idCode, name: data.name, }) setSubmitting(false) if (!res.success) { toast.error(res.message) return } const { code, url } = res.data if (code === 20000) { toast.success("已经认证成功") handleFinish() return } if (code === 30000) { toast.error("该身份已经进行认证,无法再次进行认证,请联系在线客服处理") return } if (code === -10000) { toast.error("接口问题,请联系客服") return } if (code === 10000 && url) { setQrUrl(url) setStage("scan") return } toast.error("请正确填写姓名和身份证号码") } return ( e.preventDefault() : undefined} onPointerDownOutside={mandatory ? e => e.preventDefault() : undefined} > {stage === "form" ? ( <> 尊敬的用户,您还未进行实名认证!

《中华人民共和国网络安全法》第二十四条规定:
网络运营者为用户办理网络接入、域名注册服务,办理固定电话、移动电话等入网手续,或者为用户提供信息发布、即时通讯等服务,在与用户签订协议或者确认提供服务时,应当要求用户提供真实身份信息。用户不提供真实身份信息的,网络运营者不得为其提供相关服务。

1、为了你的帐号安全请勿使用他人手机号或身份信息

2、聚IP承诺:用户的个人隐私数据仅与国家公安一所信息库比对,本公司不调用及储存用户的实人认证数据,仅接收公安一所方面的实人认证结果!

3、若您扫脸认证不成功,请联系客服

( <> {fieldState.error?.message} )} />
( <> {fieldState.error?.message} )} />
{!mandatory && ( )}
) : ( <> 请打开微信扫码进行认证

若扫脸后仍未认证成功,请联系客服

{!mandatory && ( )} )}
) }