'use client' import {useEffect, useRef, useState} from 'react' import Page from '@/components/page' import {Card, CardContent, CardHeader, CardTitle} from '@/components/ui/card' import {Form, FormField} from '@/components/ui/form' import {Button} from '@/components/ui/button' import {useForm} from 'react-hook-form' import {zodResolver} from '@hookform/resolvers/zod' import * as z from 'zod' import {useProfileStore} from '@/components/providers/StoreProvider' import {toast} from 'sonner' import {CheckCircle, QrCodeIcon} from 'lucide-react' import * as qrcode from 'qrcode' import Image from 'next/image' import banner from '@/app/admin/identify/_assets/banner.webp' import {Input} from '@/components/ui/input' import {merge} from '@/lib/utils' import {User} from '@/lib/models' import {update, updatePassword} from '@/actions/user' import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from '@/components/ui/dialog' import {sendSMS} from '@/actions/verify' import RechargeModal from '@/components/composites/recharge' import {useRouter} from 'next/navigation' export type ProfilePageProps = {} export default function ProfilePage(props: ProfilePageProps) { const router = useRouter() const profile = useProfileStore(store => store.profile) // ====================== // render // ====================== if (!profile) { return (

加载中...

请稍等片刻

) } return (
{/* banner */}
背景图

蓝狐HTTP邀请您参与【先测后买】服务

为了保障您的账户安全,请先完成实名认证,即可获取福利套餐测试资格

{/* 块信息 */}
帐号余额(元)

{profile?.balance}

实名认证 {!profile?.id_token ? ( <>

为了保障您的账户安全和正常使用服务,请您尽快完成实名认证

) : ( <>

{profile.name} {profile.id_no}

已认证

)}
{/* 安全信息 */}

安全信息

{profile.phone}

{/* 基本信息 */}
{/* 侧边栏:客服经理信息 */}
) } function Aftersale(props: { profile: User }) { const admin = props.profile.admin_id const canvasRef = useRef(null) useEffect(() => { if (admin && canvasRef.current) { qrcode.toCanvas(canvasRef.current, String(admin), { width: 180, margin: 0, }).catch((err) => { console.error(err) }) } }, [admin]) return ( 关于售后

1.全国100万+动态IP代理资源免费测试,先测后买让您安心使用。

2.注册即享新人福利,专业的客户经理,多维度为您提供在线代理相关答疑

3.1V1专属售后答疑,技术团队7*24小时在线支持提供专属解决方案

您的专属客服经理

扫描上方二维码添加客服经理微信
获取更多帮助与支持

) } function BasicForm(props: { profile: User }) { const schema = z.object({ username: z.string(), email: z.string().email('请输入正确的邮箱'), contact_qq: z.string(), contact_wechat: z.string(), }) type Schema = z.infer const form = useForm({ resolver: zodResolver(schema), defaultValues: { username: props.profile.username || '', email: props.profile.email || '', contact_qq: props.profile.contact_qq || '', contact_wechat: props.profile.contact_wechat || '', }, }) const handler = form.handleSubmit(async (value) => { try { const resp = await update(value) if (!resp.success) { throw new Error(resp.message) } await refreshProfile() toast.success(`保存成功`) } catch (e) { console.error(e) toast.error(`保存失败`, { description: e instanceof Error ? e.message : String(e), }) } }) const refreshProfile = useProfileStore(store => store.refreshProfile) return (

基本信息

name="username" label={用户名} className="grid grid-cols-[48px_1fr] grid-rows-[auto_auto] gap-x-4" classNames={{ message: `col-start-2`, }} > {({field}) => ( )} name="email" label={邮箱} className="grid grid-cols-[48px_1fr] grid-rows-[auto_auto] gap-x-4" classNames={{ message: `col-start-2`, }} > {({field}) => ( )} name="contact_qq" label={QQ} className="grid grid-cols-[48px_1fr] grid-rows-[auto_auto] gap-x-4" classNames={{ message: `col-start-2`, }} > {({field}) => ( )} name="contact_wechat" label={微信} className="grid grid-cols-[48px_1fr] grid-rows-[auto_auto] gap-x-4" classNames={{ message: `col-start-2`, }} > {({field}) => ( )}
) } function PasswordForm(props: { profile: User }) { // ====================== // open // ====================== const [open, setOpen] = useState(false) // ====================== // form // ====================== const schema = z.object({ phone: z.string().regex(/^1\d{10}$/, `请输入正确的手机号`), captcha: z.string().nonempty('请输入验证码'), code: z.string().regex(/^\d{6}$/, `请输入正确的验证码`), password: z.string().min(6, `密码至少6位`), confirm_password: z.string(), }).refine(data => data.password === data.confirm_password, { message: '两次输入的密码不一致', path: ['confirm_password'], }) type Schema = z.infer const form = useForm({ resolver: zodResolver(schema), defaultValues: { phone: '', captcha: '', code: '', password: '', confirm_password: '', }, }) const handler = form.handleSubmit(async (value) => { try { const resp = await updatePassword({ phone: value.phone, code: value.code, password: value.password, }) if (!resp.success) { throw new Error(resp.message) } toast.success(`保存成功`) setOpen(false) } catch (e) { console.error(e) toast.error(`保存失败`, { description: e instanceof Error ? e.message : String(e), }) } }) // ====================== // phone code // ====================== const [captchaUrl, setCaptchaUrl] = useState(`/captcha?t=${new Date().getTime()}`) const [captchaWait, setCaptchaWait] = useState(0) const interval = useRef(null) const refreshCaptcha = () => { setCaptchaUrl(`/captcha?t=${new Date().getTime()}`) } const sendVerifier = async () => { const result = await form.trigger(['phone', 'captcha']) if (!result) { return } const {phone, captcha} = form.getValues() const resp = await sendSMS({phone, captcha}) if (!resp.success) { toast.error(resp.message) refreshCaptcha() return } setCaptchaWait(60) interval.current = setInterval(() => { setCaptchaWait((wait) => { if (wait <= 1) { clearInterval(interval.current!) return 0 } return wait - 1 }) }, 1000) toast.success(`验证码已发送,请注意查收`) } // ====================== // render // ====================== return ( 修改密码
{/* 手机号 */} name="phone" label="手机号" className="flex-auto"> {({field}) => ( )} name="captcha" label="验证码"> {({field}) => (
)} {/* 短信令牌 */} name="code" label="短信令牌" className="flex-auto"> {({field}) => (
)} {/* 新密码 */} name="password" label="新密码" className="flex-auto"> {({field}) => ( )} {/* 确认密码 */} name="confirm_password" label="确认密码" className="flex-auto"> {({field}) => ( )}
) }