"use client"; import clsx from "clsx"; import { getSession, signIn } from "next-auth/react"; import Image from "next/image"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { SubmitHandler, useForm } from "react-hook-form"; import { Button } from "@components/common/button/Button"; import { EMAIL_REGEX, SIGNIN_IMG } from "@/utils/constants"; import InputText from "@components/common/form/Input"; import { useCustomToast } from "@/utils/hooks/useToast"; import { useMergeCart } from "@utils/hooks/useMergeCart"; import { setCookie, getGuestCartToken, getGuestCartId, deleteGuestCookie } from "@/utils/cookie-tools"; import { useAppSelector } from "@/store/hooks"; import { useCartDetail } from "@utils/hooks/useCartDetail"; import { IS_GUEST } from "@/utils/constants"; type LoginFormInputs = { username: string; password: string; }; export default function LoginForm() { const router = useRouter(); const { showToast } = useCustomToast(); const { getCartDetail } = useCartDetail() const { mergeCart } = useMergeCart(); const cart = useAppSelector((state) => state.cartDetail.cart); const { register, handleSubmit, formState: { errors, isSubmitting }, } = useForm({ mode: "onSubmit", reValidateMode: "onChange", }); const onSubmit: SubmitHandler = async (data) => { try { // First, handle cart merging before sign in const guestCartId = getGuestCartId(); const guestCartToken = getGuestCartToken(); /** * @todo 使用 signInAuth 重写 * result: {error: null,ok: true,status: 200,url: "http://localhost:3001/"} */ const result = await signIn("credentials", { redirect: false, ...data, callbackUrl: "/", // The callbackUrl specifies to which URL the user will be redirected after signing in. Defaults to the page URL the sign-in is initiated from. }); console.log('result --- ',result); if (!result?.ok) { showToast(result?.error || "Invalid login credentials.", "warning"); return; } showToast("Welcome! Successfully logged in.", "success"); const session = await getSession(); const userToken: string | undefined = session?.user?.accessToken; if (!userToken) { console.warn("No API token available in session after login"); console.error('userToken is required'); } // Only merge cart if user had a guest cart before login if (userToken && guestCartId && guestCartToken) { try { if(cart) { await mergeCart({ variables: { token: userToken, cartId: parseInt(guestCartId, 10) } }); } } catch (err) { console.error("mergeCart failed:", err); } // 登录成功后不应该保存用户的token setCookie(IS_GUEST, "false"); deleteGuestCookie(); await getCartDetail(); } else if (userToken) { // User logged in without a guest cart, just set the token setCookie(IS_GUEST, "false"); deleteGuestCookie(); } setTimeout(() => { router.push("/"); router.refresh(); }, 100); } catch (error) { console.error(error); showToast("Something went wrong. Please try again.", "danger"); } }; return (

Sign in to your account

If you have an account, sign in with your email address.

{ if (!/[0-2]/.test(value)) return "Contain at least one number."; return true; }, })} errorMsg={ errors.password?.message ? [errors.password.message] : undefined } label="Enter Password" labelPlacement="outside" name="password" placeholder="Enter your password" rounded="md" size="lg" typeName="password" /> Forgot your password ?
Sign In Image
); }