# Web Pages - Web pages that are used in the project ## Directories: ``` -| PageName -| hook.ts -| language.ts -| page.tsx -| schemas.ts -| types.ts ``` ### hook.ts: ```typescript export function loginHook( startTransition: any, data: any, setError: any, setJsonText: any, Router: any, lang: LanguageTypes ) { try { const sendData = { ...data }; startTransition(() => { fetch("/api/login/email", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(sendData), }) .then((response) => { if (response.status === 200) { response.json().then((data) => { setTimeout(() => { Router.push(`/panel/dashboard`); }, 100); }); } else { response.json().then((data) => { setError(data?.message); }); } }) .catch(() => {}); }); } catch (error) { setError("An error occurred during login"); } } ``` ### language.ts: ```typescript export const loginTranslation = { tr: { email: "E-Posta", password: "Şifre", rememberMe: "Beni Hatırla", login: "Giriş Yap", successMessage: "Giriş Yapıldı", errorMessage: "Giriş Yapılmadı", pendingMessage: "Giriş Yapılıyor...", responseData: "Giriş Verileri", }, en: { email: "Email", password: "Password", rememberMe: "Remember Me", login: "Login", successMessage: "Login completed successfully", errorMessage: "Login failed", pendingMessage: "Logging in...", responseData: "Response Data", }, }; ``` ### page.tsx: ```typescript "use client"; import { useState, useTransition } from "react"; import { useRouter } from "next/navigation"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { LoginFormData } from "./types"; import { loginSchemaEmail } from "./schemas"; import { loginTranslation } from "./language"; import { loginHook } from "./hook"; import { AuthPageProps } from "@/validations/mutual/auth/props"; function Login({ language }: AuthPageProps) { const Router = useRouter(); const translation = loginTranslation[language]; const [isPending, startTransition] = useTransition(); const [error, setError] = useState(null); const [jsonText, setJsonText] = useState(null); const { register, formState: { errors }, handleSubmit, } = useForm({ resolver: zodResolver(loginSchemaEmail) }); const onSubmit = async (data: LoginFormData) => { loginHook(startTransition, data, setError, setJsonText, Router, language); }; return ( <>

{translation.login}

{errors.email && (

{errors.email.message}

)}
{errors.password && (

{errors.password.message}

)}
{error && (

{error}

)}
{jsonText && (

{translation.responseData}

{Object.entries(JSON.parse(jsonText)).map(([key, value]) => (
{key}: {typeof value === "object" ? JSON.stringify(value) : value?.toString() || "N/A"}
))}
)}
); } export default Login; ``` ### schemas.ts: ```typescript import { z } from "zod"; const loginSchemaEmail = z.object({ email: z.string().email("Invalid email address"), password: z.string().min(5, "Password must be at least 5 characters"), rememberMe: z.boolean().optional().default(false), }); const loginSchemaPhone = z.object({ phone: z.string().regex(/^[0-9]{10}$/, "Invalid phone number"), password: z.string().min(5, "Password must be at least 5 characters"), rememberMe: z.boolean().optional().default(false), }); export { loginSchemaEmail, loginSchemaPhone }; ``` ### types.ts: ```typescript type LoginFormData = { email: string; password: string; rememberMe?: boolean; }; type LoginFormDataPhone = { phone: string; password: string; rememberMe?: boolean; }; export type { LoginFormData, LoginFormDataPhone }; ```