补充上传协议和实名认证

This commit is contained in:
Eamon
2026-09-11 17:06:29 +08:00
parent 8d8c9deba7
commit 8aaf43ed79
31 changed files with 301 additions and 108 deletions

View File

@@ -31,10 +31,13 @@ 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("")
@@ -46,6 +49,7 @@ export default function RealNameDialog({
})
const handleOpenChange = (next: boolean) => {
if (!next && mandatory) return
onOpenChange(next)
if (!next) {
form.reset({ name: "", idCode: "" })
@@ -56,7 +60,7 @@ export default function RealNameDialog({
const handleFinish = () => {
onVerified()
onOpenChange(false)
if (!mandatory) onOpenChange(false)
}
const onSubmit = async (data: RealNameValues) => {
@@ -80,7 +84,10 @@ export default function RealNameDialog({
}
if (code === 30000) {
toast.error("该身份已经进行认证,无法再次进行认证,请联系在线客服处理")
handleFinish()
return
}
if (code === -10000) {
toast.error("接口问题,请联系客服")
return
}
if (code === 10000 && url) {
@@ -93,7 +100,12 @@ export default function RealNameDialog({
return (
<Dialog open={open} onOpenChange={handleOpenChange}>
<DialogContent className="max-h-[85dvh] overflow-y-auto sm:max-w-lg">
<DialogContent
className="max-h-[85dvh] overflow-y-auto sm:max-w-lg"
showCloseButton={!mandatory}
onEscapeKeyDown={mandatory ? e => e.preventDefault() : undefined}
onPointerDownOutside={mandatory ? e => e.preventDefault() : undefined}
>
{stage === "form" ? (
<>
<DialogHeader>
@@ -159,13 +171,15 @@ export default function RealNameDialog({
</div>
<DialogFooter className="gap-3">
<Button
type="button"
variant="outline"
onClick={() => handleOpenChange(false)}
>
取消
</Button>
{!mandatory && (
<Button
type="button"
variant="outline"
onClick={() => handleOpenChange(false)}
>
取消
</Button>
)}
<Button
type="submit"
disabled={submitting}
@@ -195,9 +209,14 @@ export default function RealNameDialog({
</div>
<DialogFooter className="gap-3">
<Button variant="outline" onClick={() => handleOpenChange(false)}>
取消
</Button>
{!mandatory && (
<Button
variant="outline"
onClick={() => handleOpenChange(false)}
>
取消
</Button>
)}
<Button
onClick={handleFinish}
className="bg-linear-to-r from-blue-500 to-cyan-400 text-white hover:opacity-90"