'use client'; import { zodResolver } from '@hookform/resolvers/zod'; import { useMutation } from '@tanstack/react-query'; import Link from 'next/link'; import { useRouter } from 'next/navigation'; import { useState } from 'react'; import { useForm } from 'react-hook-form'; import { z } from 'zod'; import { InlineMessage } from '@/components/feedback/inline-message'; import { useAuth } from '@/components/providers/auth-provider'; import { AppCard } from '@/components/ui/app-card'; import { linkExistingOAuthAccount } from '@/features/auth/api/auth'; import { AuthButton, AuthFormField, AuthInput, } from '@/features/auth/components/auth-form-primitives'; const schema = z.object({ username: z.string().min(1, '请输入用户名'), password: z.string().min(1, '请输入密码'), }); type FormValues = z.infer; export function OAuthLinkExistingForm() { const router = useRouter(); const { setUser } = useAuth(); const [errorMessage, setErrorMessage] = useState(''); const form = useForm({ resolver: zodResolver(schema), defaultValues: { username: '', password: '', }, }); const mutation = useMutation({ mutationFn: linkExistingOAuthAccount, onSuccess: (result) => { if (result.user) { setUser(result.user); router.replace('/'); return; } setErrorMessage('绑定成功但未返回用户信息,请重新登录。'); }, onError: (error: Error) => { setErrorMessage(error.message || '绑定失败,请稍后重试。'); }, }); const handleSubmit = form.handleSubmit((values) => { setErrorMessage(''); mutation.mutate(values); }); return (
{form.formState.errors.username ? ( {form.formState.errors.username.message} ) : null} {form.formState.errors.password ? ( {form.formState.errors.password.message} ) : null} {errorMessage ? ( ) : null} {mutation.isPending ? '绑定中...' : '绑定并登录'}
返回登录
); }