"use client" import { Button } from "@/components/ui/button" import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from "@/components/ui/dialog" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { login as loginApi } from "@/lib/api" import { toApiError } from "@/lib/errors" import { notifyInfo } from "@/lib/toast" import { useAuthStore } from "@/store/auth" import { useLoginDialogStore } from "@/store/login-dialog" import { standardSchemaResolver } from "@hookform/resolvers/standard-schema" import { useRouter } from "next/navigation" import { useForm } from "react-hook-form" import { z } from "zod" const loginSchema = z.object({ username: z.string().min(1, "请输入用户名"), password: z.string().min(6, "密码至少6位"), }) interface LoginDialogProps { open: boolean onOpenChange: (open: boolean) => void } export function LoginDialog({ open, onOpenChange }: LoginDialogProps) { const router = useRouter() const { login: storeLogin } = useAuthStore() const consumePendingAction = useLoginDialogStore((state) => state.consumePendingAction) const { register, handleSubmit, formState: { errors, isSubmitting }, } = useForm({ resolver: standardSchemaResolver(loginSchema), }) const onSubmit = async (data: z.infer) => { try { const user = await loginApi({ username: data.username, password: data.password }) storeLogin(user, ["consumer", "player", "owner"]) consumePendingAction() onOpenChange(false) } catch (err) { notifyInfo(toApiError(err).msg) } } return ( 登录聚玩 请先登录以继续操作
{errors.username && (

{errors.username.message}

)}
{errors.password && (

{errors.password.message}

)}
) }