{"id":86873,"date":"2024-12-05T08:12:44","date_gmt":"2024-12-05T04:42:44","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/username-and-password-authentication-with-betterauth-nextjs-prisma-shadcn-and-tailwindcss-1hc6\/"},"modified":"2024-12-05T08:12:44","modified_gmt":"2024-12-05T04:42:44","slug":"username-and-password-authentication-with-betterauth-nextjs-prisma-shadcn-and-tailwindcss-1hc6","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/username-and-password-authentication-with-betterauth-nextjs-prisma-shadcn-and-tailwindcss-1hc6\/","title":{"rendered":"\u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0648 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0628\u0627 Better_Auth\u060c Next.js\u060c Prisma\u060c Shadcn \u0648 TailwindCSS"},"content":{"rendered":"<p>Summarize this content to 400 words in Persian Lang<br \/>\n              \u062f\u0631 \u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627 \u0627\u062c\u0631\u0627 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0648 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0628\u0631\u0627\u06cc \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0628 \u0645\u062f\u0631\u0646 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u067e\u0634\u062a\u0647 \u0627\u06cc \u0642\u0648\u06cc \u0648 \u0627\u06cc\u0645\u0646 \u0627\u0632 \u0627\u0628\u0632\u0627\u0631. \u0627\u06cc\u0646 \u0648\u06cc\u0698\u06af\u06cc \u0645\u0648\u062c\u0648\u062f \u0631\u0627 \u062a\u06a9\u0645\u06cc\u0644 \u062e\u0648\u0627\u0647\u062f \u06a9\u0631\u062f \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u06cc\u0645\u06cc\u0644 \u0648 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647. \u062f\u0631 \u067e\u0627\u06cc\u0627\u0646 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634\u060c \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0628\u0647 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc \u062f\u0647\u062f \u062a\u0627 \u0628\u0627 \u0647\u0631 \u06a9\u062f\u0627\u0645 \u0627\u0632 \u0622\u0646\u0647\u0627 \u0648\u0627\u0631\u062f \u0633\u06cc\u0633\u062a\u0645 \u0634\u0648\u0646\u062f \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc \u06cc\u0627 \u0627\u06cc\u0645\u06cc\u0644\u060c \u0628\u0627 \u0627\u062e\u062a\u06cc\u0627\u0631\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u062f\u0648 \u0639\u0627\u0645\u0644\u06cc \u0645\u0628\u062a\u0646\u06cc \u0628\u0631 OTP (2FA) \u0628\u0631\u0627\u06cc \u0627\u0645\u0646\u06cc\u062a \u0628\u06cc\u0634\u062a\u0631.<\/p>\n<p>  \u067e\u0634\u062a\u0647 \u0641\u0646\u0627\u0648\u0631\u06cc<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u067e\u0634\u062a\u0647 \u0641\u0646\u0627\u0648\u0631\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f:<\/p>\n<p>Better_Auth \u0646\u0633\u062e\u0647 1: \u06cc\u06a9 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a TypeScript \u0633\u0628\u06a9 \u0648 \u0642\u0627\u0628\u0644 \u062a\u0648\u0633\u0639\u0647.<\/p>\n<p>Next.js: \u06cc\u06a9 \u0641\u0631\u06cc\u0645\u0648\u0631\u06a9 \u0642\u062f\u0631\u062a\u0645\u0646\u062f React \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u0631\u0646\u062f\u0631 \u0634\u062f\u0647 \u062a\u0648\u0633\u0637 \u0633\u0631\u0648\u0631.<\/p>\n<p>\u067e\u0631\u06cc\u0633\u0645\u0627: \u06cc\u06a9 ORM \u0645\u062f\u0631\u0646 \u0628\u0631\u0627\u06cc \u062a\u0639\u0627\u0645\u0644 \u06a9\u0627\u0631\u0622\u0645\u062f \u0648 \u0627\u06cc\u0645\u0646 \u0628\u0627 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647.<\/p>\n<p>ShadCN: \u06cc\u06a9 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0645\u0624\u0644\u0641\u0647 \u0627\u0628\u0632\u0627\u0631 \u0627\u0648\u0644 \u0628\u0631\u0627\u06cc \u062a\u0648\u0633\u0639\u0647 \u0633\u0631\u06cc\u0639 \u0631\u0627\u0628\u0637 \u06a9\u0627\u0631\u0628\u0631\u06cc.<\/p>\n<p>TailwindCSS: \u06cc\u06a9 \u0686\u0627\u0631\u0686\u0648\u0628 CSS \u0645\u062d\u0628\u0648\u0628 \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u0631\u0627\u0628\u0637 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u06cc \u0645\u062f\u0631\u0646.<\/p>\n<p>\u0627\u0631\u0633\u0627\u0644 \u0645\u062c\u062f\u062f: \u06cc\u06a9 \u0633\u0631\u0648\u06cc\u0633 \u0627\u06cc\u0645\u06cc\u0644 \u0642\u0627\u0628\u0644 \u0627\u0639\u062a\u0645\u0627\u062f \u0628\u0631\u0627\u06cc \u0627\u0631\u0633\u0627\u0644 OTP.<\/p>\n<p>  \u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632\u0647\u0627<\/p>\n<p>\u0642\u0628\u0644 \u0627\u0632 \u0627\u062f\u0627\u0645\u0647\u060c \u0645\u0637\u0645\u0626\u0646 \u0634\u0648\u06cc\u062f \u06a9\u0647 \u0645\u0648\u0627\u0631\u062f \u0632\u06cc\u0631 \u0631\u0627 \u0622\u0645\u0627\u062f\u0647 \u06a9\u0631\u062f\u0647 \u0627\u06cc\u062f:<\/p>\n<p>Node.js (\u0646\u0633\u062e\u0647 LTS) \u0646\u0635\u0628 \u0634\u062f\u0647 \u0627\u0633\u062a.<br \/>\n\u0645\u062f\u06cc\u0631 \u0628\u0633\u062a\u0647 \u0645\u0627\u0646\u0646\u062f npm\u060c \u0646\u062e\u060c \u06cc\u0627 pnpm (\u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f pnpm \u062f\u0631 \u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627).<br \/>\n\u0627\u0644\u0641 \u0646\u0645\u0648\u0646\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 PostgreSQL (\u0645\u062d\u0644\u06cc \u06cc\u0627 \u0645\u06cc\u0632\u0628\u0627\u0646\u06cc \u0634\u062f\u0647\u060c \u0645\u0627\u0646\u0646\u062f \u0633\u0648\u067e\u0627 \u0628\u06cc\u0633 \u06cc\u0627 PlanetScale).<\/p>\n<p>\u0627\u06af\u0631 \u0628\u0647 \u0635\u0648\u0631\u062a \u0645\u062d\u0644\u06cc \u06a9\u0627\u0631 \u0645\u06cc \u06a9\u0646\u06cc\u062f\u060c \u062f\u0627\u06a9\u0631 \u06cc\u06a9 \u0631\u0627\u0647 \u0639\u0627\u0644\u06cc \u0628\u0631\u0627\u06cc \u062a\u0646\u0638\u06cc\u0645 \u0627\u06cc\u0646 \u0627\u0633\u062a.<\/p>\n<p>\u0622\u0634\u0646\u0627\u06cc\u06cc \u0628\u0627 TypeScript\u060c Next.js\u060c \u0648 \u067e\u0631\u06cc\u0633\u0645\u0627.<\/p>\n<p>  \u0634\u0628\u06cc\u0647 \u0633\u0627\u0632\u06cc \u067e\u0631\u0648\u0698\u0647 \u0622\u063a\u0627\u0632\u06af\u0631:<\/p>\n<p>\u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627 \u0628\u0631 \u0627\u0633\u0627\u0633 \u0639\u0645\u0644\u06a9\u0631\u062f\u0647\u0627\u06cc\u06cc \u0645\u0627\u0646\u0646\u062f \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u06cc\u0645\u06cc\u0644-\u06af\u0630\u0631\u0648\u0627\u0698\u0647 \u0648 \u062a\u0627\u06cc\u06cc\u062f \u0627\u06cc\u0645\u06cc\u0644. \u0634\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f:<\/p>\n<p>\u0628\u0627 \u062f\u0646\u0628\u0627\u0644 \u06a9\u0631\u062f\u0646 \u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627\u0647\u0627 \u0627\u0632 \u0627\u0628\u062a\u062f\u0627 \u0634\u0631\u0648\u0639 \u06a9\u0646\u06cc\u062f:<\/p>\n<p>\u06cc\u0627 \u067e\u0631\u0648\u0698\u0647 \u0634\u0631\u0648\u0639 \u06a9\u0646\u0646\u062f\u0647 \u0631\u0627 \u0634\u0628\u06cc\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f:<\/p>\n<p>git clone -b feat-username https:\/\/github.com\/Daanish2003\/better_auth_nextjs.git  <\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0628\u0647 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u067e\u0631\u0648\u0698\u0647 \u0628\u0631\u0648\u06cc\u062f \u0648 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627 \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f:<\/p>\n<p>pnpm install  <\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc<\/p>\n<p>  1. \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u06a9\u0646\u06cc\u062f .env \u0641\u0627\u06cc\u0644<\/p>\n<p>\u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 .env \u062f\u0631 \u0631\u06cc\u0634\u0647 \u067e\u0631\u0648\u0698\u0647 \u062e\u0648\u062f \u0641\u0627\u06cc\u0644 \u06a9\u0646\u06cc\u062f \u0648 \u0627\u06cc\u0646 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<p># Authentication settings<br \/>\nBETTER_AUTH_SECRET=&#8221;your-secret-key&#8221; # Replace with a secure key<br \/>\nBETTER_AUTH_URL=&#8221;http:\/\/localhost:3000&#8243;<br \/>\nNEXT_PUBLIC_APP_URL=&#8221;http:\/\/localhost:3000&#8243;<\/p>\n<p># Database settings<br \/>\nPOSTGRES_PASSWORD=&#8221;your-password&#8221;<br \/>\nPOSTGRES_USER=&#8221;your-username&#8221;<br \/>\nDATABASE_URL=&#8221;postgresql:\/\/your-username:your-password@localhost:5432\/mydb?schema=public&#8221;<\/p>\n<p># Resend API Key<br \/>\nRESEND_API_KEY=&#8221;your-resend-api-key&#8221;<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u06af\u0631 \u0627\u0632 Docker \u0628\u0631\u0627\u06cc PostgreSQL \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u062f\u060c \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 \u0631\u0627 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f:<\/p>\n<p>docker compose up -d<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  \u062a\u0648\u062c\u0647:<\/p>\n<p>\u0642\u0628\u0644 \u0627\u0632 \u0627\u06cc\u0646\u06a9\u0647 \u0628\u0647 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0648 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u06a9\u0627\u0645\u0644 \u067e\u0634\u062a\u0647 \u0634\u0645\u0627 \u0628\u067e\u0631\u062f\u0627\u0632\u06cc\u0645. \u0628\u0647 \u0627\u0637\u0644\u0627\u0639 \u0634\u0645\u0627 \u0645\u06cc\u200c\u0631\u0633\u0627\u0646\u0645 \u06a9\u0647 \u062f\u0631 \u0627\u06cc\u0646 \u0648\u0628\u0644\u0627\u06af \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0648 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0628\u0627 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u06cc\u0645\u06cc\u0644 \u0648 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0645\u0648\u062c\u0648\u062f \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645. \u0628\u0647 \u0637\u0648\u0631\u06cc \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u06cc\u0645\u06cc\u0644 \u06cc\u0627 \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0648\u0627\u0631\u062f \u0633\u06cc\u0633\u062a\u0645 \u0634\u0648\u062f.<\/p>\n<p>  \u0645\u0631\u062d\u0644\u0647 1: \u0628\u0647 \u0631\u0648\u0632 \u0631\u0633\u0627\u0646\u06cc schema.prisma \u0641\u0627\u06cc\u0644<\/p>\n<p>\u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f schema.prisma\u0631\u0627 \u062f\u0631 \u067e\u0648\u0634\u0647 \u067e\u0631\u0648\u0698\u0647 \u062e\u0648\u062f \u0642\u0631\u0627\u0631 \u062f\u0647\u06cc\u062f \u0648 \u0633\u067e\u0633 \u0622\u0646 \u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u062f user\u0645\u062f\u0644 \u062f\u0631 \u0637\u0631\u062d\u0648\u0627\u0631\u0647 \u0628\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 username \u0633\u062a\u0648\u0646 \u0628\u0627 \u0631\u0634\u062a\u0647 \u0646\u0648\u0639 \u0627\u062e\u062a\u06cc\u0627\u0631\u06cc \u0628\u0647 \u0622\u0646.<\/p>\n<p>model User {<br \/>\n  id               String      @id @default(cuid())<br \/>\n  name             String<br \/>\n  email            String<br \/>\n  emailVerified    Boolean     @default(false)<br \/>\n  image            String?<br \/>\n  createdAt        DateTime    @default(now())<br \/>\n  updatedAt        DateTime    @updatedAt<br \/>\n  twoFactorEnabled Boolean     @default(false)<br \/>\n  \/\/ Add only username column with type of string and ignore other columns if you already implemented user model<br \/>\n  username         String?<br \/>\n  isAnonymous      Boolean?<br \/>\n  Session          Session[]\n  Account          Account[]\n  TwoFactor        TwoFactor[] \/\/ if you implemented 2FA add this column<\/p>\n<p>  @@unique([email])<br \/>\n  @@map(&#8220;user&#8221;)<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0633\u067e\u0633 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062f\u0633\u062a\u0648\u0631 \u0632\u06cc\u0631 \u0641\u0627\u06cc\u0644 prisma \u0631\u0627 \u062a\u0648\u0644\u06cc\u062f \u0648 \u0627\u0646\u062a\u0642\u0627\u0644 \u062f\u0647\u06cc\u062f<\/p>\n<p>pnpx prisma generate<br \/>\npnpx prisma migrate dev &#8211;name username<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  \u0645\u0631\u062d\u0644\u0647 2: \u0628\u0647 \u0631\u0648\u0632 \u0631\u0633\u0627\u0646\u06cc auth.ts  \u0648 auth-client.ts\u0641\u0627\u06cc\u0644<\/p>\n<p>\u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f auth.ts  \u062f\u0631 \u0645\u062e\u0632\u0646 \u067e\u0631\u0648\u0698\u0647 \u062e\u0648\u062f \u0641\u0627\u06cc\u0644 \u06a9\u0646\u06cc\u062f \u0648 \u0633\u067e\u0633 \u0622\u0646 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f username()\u067e\u0644\u0627\u06af\u06cc\u0646 \u0628\u0647 \u0622\u0631\u0627\u06cc\u0647 \u067e\u0644\u0627\u06af\u06cc\u0646 \u0627\u0632 \u062a\u0627\u0628\u0639 betterAuth.<\/p>\n<p>\/\/ src\/lib\/auth.ts<br \/>\nimport { betterAuth } from &#8220;better-auth&#8221;<br \/>\nimport { username } from &#8220;better-auth\/plugins&#8221;<\/p>\n<p>const auth = betterAuth({<br \/>\n    \/\/ other config options<br \/>\n    plugins: [<br \/>\n        \/\/ other plugins<br \/>\n        username()<br \/>\n    ]\n})<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0633\u067e\u0633\u060c \u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f auth-client.ts \u062f\u0631 \u0645\u062e\u0632\u0646 \u067e\u0631\u0648\u0698\u0647 \u062e\u0648\u062f \u0641\u0627\u06cc\u0644 \u06a9\u0646\u06cc\u062f \u0648 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f usernameClient() \u0639\u0645\u0644\u06a9\u0631\u062f \u067e\u0644\u0627\u06af\u06cc\u0646 \u0628\u0647 \u0622\u0631\u0627\u06cc\u0647 \u067e\u0644\u0627\u06af\u06cc\u0646<\/p>\n<p>\/\/ src\/lib\/auth-client.ts<br \/>\nimport { createAuthClient } from &#8220;better-auth\/client&#8221;<br \/>\nimport { usernameClient } from &#8220;better-auth\/client\/plugins&#8221;<\/p>\n<p>export const authClient = createAuthClient({<br \/>\n    baseURL: process.env.NEXT_PUBLIC_APP_URL,<br \/>\n    plugins: [<br \/>\n        usernameClient()<br \/>\n    ]\n})<\/p>\n<p>export const {<br \/>\n    signIn,<br \/>\n    signOut,<br \/>\n    signUp,<br \/>\n    useSession<br \/>\n} = authClient;<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  \u0645\u0631\u062d\u0644\u0647 3: \u0628\u0647 \u0631\u0648\u0632 \u0631\u0633\u0627\u0646\u06cc login-schema.ts  \u0648 signup-schema.ts \u0641\u0627\u06cc\u0644<\/p>\n<p>\u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f login-schema.ts\u062f\u0631 \u0645\u062e\u0632\u0646 \u067e\u0631\u0648\u0698\u0647 \u062e\u0648\u062f \u0641\u0627\u06cc\u0644 \u06a9\u0646\u06cc\u062f \u0648 \u0637\u0631\u062d\u0648\u0627\u0631\u0647 \u0631\u0627 \u0628\u0627 \u06a9\u062f \u0632\u06cc\u0631 \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\/\/ src\/helpers\/zod\/login-schema.ts<br \/>\nimport { z } from &#8220;zod&#8221;;<\/p>\n<p>const LoginSchema = z<br \/>\n  .object({<br \/>\n    \/\/ checks if the input given by the user is email or username<br \/>\n    emailOrUsername: z<br \/>\n      .string()<br \/>\n      .min(1, { message: &#8220;Email or username is required&#8221; }),<br \/>\n    password: z<br \/>\n      .string()<br \/>\n      .min(8, { message: &#8220;Password must be at least 8 characters long&#8221; })<br \/>\n      .max(20, { message: &#8220;Password must be at most 20 characters long&#8221; }),<br \/>\n  })<br \/>\n  .refine(<br \/>\n    (data) =&gt;<br \/>\n      \/\/ checks if the email or username is valid<br \/>\n      \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test(data.emailOrUsername) || \/^[a-zA-Z0-9_.]+$\/.test(data.emailOrUsername),<br \/>\n    {<br \/>\n      message: &#8220;Provide a valid email or username&#8221;,<br \/>\n      path: [&#8220;emailOrUsername&#8221;],<br \/>\n    }<br \/>\n  );<\/p>\n<p>export default LoginSchema<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0633\u067e\u0633\u060c \u0631\u0627 \u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f signup-schema.ts \u062f\u0631 \u0645\u062e\u0632\u0646 \u067e\u0631\u0648\u0698\u0647 \u062e\u0648\u062f \u0641\u0627\u06cc\u0644 \u06a9\u0646\u06cc\u062f \u0648 \u0641\u06cc\u0644\u062f \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0648 \u0646\u0648\u0639 \u0622\u0646 \u0631\u0627 \u062f\u0631 \u0637\u0631\u062d zod \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\/\/ src\/helpers\/zod\/signup-schema.ts<br \/>\nexport const SignupSchema = z<br \/>\n  .object({<br \/>\n    name: z<br \/>\n      .string()<br \/>\n      .min(2, { message: &#8220;Minimum 2 characters are required&#8221; })<br \/>\n      .max(20, { message: &#8220;Maximum of 20 characters are allowed&#8221; }),<br \/>\n    email: z<br \/>\n      .string()<br \/>\n      .email({ message: &#8220;Invalid email address&#8221; })<br \/>\n      .min(1, { message: &#8220;Email is required&#8221; }),<br \/>\n    password: z<br \/>\n      .string()<br \/>\n      .min(8, { message: &#8220;Password must be at least 8 characters long&#8221; })<br \/>\n      .max(20, { message: &#8220;Password must be at most 20 characters long&#8221; }),<br \/>\n    \/\/ Added the username field to check its type<br \/>\n    username: z<br \/>\n      .string()<br \/>\n      .min(3, { message: &#8220;Username must be at least 3 characters long&#8221; })<br \/>\n      .max(25, { message: &#8220;Username must be at most 25 characters long&#8221; })<br \/>\n      .regex(\/^[a-zA-Z0-9_.]+$\/, { message: &#8220;Username can only contain letters, numbers, underscores, and dots&#8221; }),<br \/>\n  })<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  \u0645\u0631\u062d\u0644\u0647 4: \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f generateUsername \u0641\u0627\u06cc\u0644<\/p>\n<p>\u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 generate-username.ts  \u062f\u0627\u062e\u0644 helper\/auth\/ \u067e\u0648\u0634\u0647 \u0648 \u06a9\u062f \u0631\u0627 \u0627\u0632 \u0632\u06cc\u0631 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/p>\n<p>\/\/ helpers\/auth\/generate-username.ts<br \/>\nexport const generateUsername = (name: string) =&gt; {<br \/>\n    const randomNumbers = Math.floor(1000 + Math.random() * 9000); \/\/ Generate a random 4-digit number<br \/>\n    return `${name.replace(\/\\s+\/g, &#8221;).toLowerCase()}${randomNumbers}`;<br \/>\n};<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>GenerateUsername\u062a\u0627\u0628\u0639 \u0628\u0631\u0627\u06cc \u062a\u0648\u0644\u06cc\u062f \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc \u062a\u0635\u0627\u062f\u0641\u06cc \u0627\u0632 \u0646\u0627\u0645 \u062f\u0627\u062f\u0647 \u0634\u062f\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f.<\/p>\n<p>  \u0645\u0631\u062d\u0644\u0647 5: \u0645\u0624\u0644\u0641\u0647 SignIn \u0648 \u0645\u0624\u0644\u0641\u0647 Signup \u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u062f<\/p>\n<p>  \u062c\u0632\u0621 \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645:<\/p>\n<p>\/\/ src\/components\/auth\/sign-in.tsx<br \/>\n&#8220;use client&#8221;<br \/>\nimport React from &#8216;react&#8217;<br \/>\nimport CardWrapper from &#8216;..\/card-wrapper&#8217;<br \/>\nimport FormError from &#8216;..\/form-error&#8217;<br \/>\nimport { FormSuccess } from &#8216;..\/form-success&#8217;<br \/>\nimport { FcGoogle } from &#8216;react-icons\/fc&#8217;<br \/>\nimport SocialButton from &#8216;.\/social-button&#8217;<br \/>\nimport { FaGithub } from &#8216;react-icons\/fa&#8217;<br \/>\nimport { useAuthState } from &#8216;@\/hooks\/useAuthState&#8217;<br \/>\nimport { useForm } from &#8216;react-hook-form&#8217;<br \/>\nimport { zodResolver } from &#8216;@hookform\/resolvers\/zod&#8217;<br \/>\nimport { z } from &#8216;zod&#8217;<br \/>\nimport { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from &#8216;..\/ui\/form&#8217;<br \/>\nimport { Input } from &#8216;..\/ui\/input&#8217;<br \/>\nimport { Button } from &#8216;..\/ui\/button&#8217;<br \/>\nimport { SignupSchema } from &#8216;@\/helpers\/zod\/signup-schema&#8217;<br \/>\nimport { signUp } from &#8216;@\/lib\/auth-client&#8217;<br \/>\nimport { generateUsername } from &#8216;@\/helpers\/auth\/generate-username&#8217;<\/p>\n<p>const SignUp = () =&gt; {<br \/>\n    const { error, success, loading, setLoading, setError, setSuccess, resetState } = useAuthState();<\/p>\n<p>    const form = useForm&lt;z.infer&lt;typeof SignupSchema&gt;&gt;({<br \/>\n        resolver: zodResolver(SignupSchema),<br \/>\n        defaultValues: {<br \/>\n            name: &#8221;,<br \/>\n            email: &#8221;,<br \/>\n            password: &#8221;,<br \/>\n            username: &#8221;, \/\/ Added username field<br \/>\n        }<br \/>\n    })<\/p>\n<p>    const onSubmit = async (values: z.infer&lt;typeof SignupSchema&gt;) =&gt; {<br \/>\n        try {<br \/>\n            await signUp.email({<br \/>\n                name: values.name,<br \/>\n                email: values.email,<br \/>\n                password: values.password,<br \/>\n                username: values.username, \/\/ Add the username fields<br \/>\n                callbackURL: &#8216;\/&#8217;<br \/>\n            }, {<br \/>\n                onResponse: () =&gt; {<br \/>\n                    setLoading(false)<br \/>\n                },<br \/>\n                onRequest: () =&gt; {<br \/>\n                    resetState()<br \/>\n                    setLoading(true)<br \/>\n                },<br \/>\n                onSuccess: () =&gt; {<br \/>\n                    setSuccess(&#8220;Verification link has been sent to your mail&#8221;)<br \/>\n                },<br \/>\n                onError: (ctx) =&gt; {<br \/>\n                    setError(ctx.error.message);<br \/>\n                },<br \/>\n            });<br \/>\n        } catch (error) {<br \/>\n            console.error(error)<br \/>\n            setError(&#8220;Something went wrong&#8221;)<br \/>\n        }<\/p>\n<p>    }<\/p>\n<p>    return (<br \/>\n        &lt;CardWrapper<br \/>\n            cardTitle=&#8217;SignUp&#8217;<br \/>\n            cardDescription=&#8217;Create an new account&#8217;<br \/>\n            cardFooterLink=&#8217;\/signin&#8217;<br \/>\n            cardFooterDescription=&#8217;Already have an account?&#8217;<br \/>\n            cardFooterLinkTitle=&#8217;Signin&#8217;<br \/>\n        &gt;<br \/>\n            &lt;Form {&#8230;form}&gt;<br \/>\n                 {\/* Make changes to only name field of the form*\/}<br \/>\n                &lt;form className=&#8217;space-y-4&#8242; onSubmit={form.handleSubmit(onSubmit)}&gt;<br \/>\n                    &lt;FormField<br \/>\n                        control={form.control}<br \/>\n                        name=&#8221;name&#8221;<br \/>\n                        render={({ field }) =&gt; (<br \/>\n                            &lt;FormItem&gt;<br \/>\n                                &lt;FormLabel&gt;NameFormLabel&gt;<br \/>\n                                &lt;FormControl&gt;<br \/>\n                                    &lt;Input<br \/>\n                                        disabled={loading}<br \/>\n                                        type=&#8221;text&#8221;<br \/>\n                                        placeholder=&#8217;john&#8217;<br \/>\n                                        {&#8230;field}<br \/>\n                                        onChange={(e) =&gt; {<br \/>\n                                            field.onChange(e); \/\/ Update form state<br \/>\n                                            const username = generateUsername(e.target.value);<br \/>\n                                            form.setValue(&#8216;username&#8217;, username); \/\/ Auto-fill username<br \/>\n                                        }}<br \/>\n                                        \/&gt;<br \/>\n                                FormControl&gt;<br \/>\n                                &lt;FormMessage \/&gt;<br \/>\n                            FormItem&gt;<br \/>\n                        )}<br \/>\n                    \/&gt;<br \/>\n                    {\/* All other exisitng formfields like email and password *\/}<br \/>\n                form&gt;<br \/>\n            Form&gt;<br \/>\n        CardWrapper&gt;<br \/>\n    )<br \/>\n}<\/p>\n<p>export default SignUp<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0645\u0646\u0637\u0642 \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0631\u0627 \u0628\u0647 \u0622\u0646 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f SignUp:<\/p>\n<p>\u062a\u0648\u0644\u06cc\u062f \u062e\u0648\u062f\u06a9\u0627\u0631 \u0646\u0627\u0645 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u06cc \u0628\u0631 \u0627\u0633\u0627\u0633 \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631.<\/p>\n<p>  \u062c\u0632\u0621 \u062b\u0628\u062a \u0646\u0627\u0645<\/p>\n<p>&#8220;use client&#8221;;<\/p>\n<p>import React from &#8220;react&#8221;;<br \/>\nimport { useForm } from &#8220;react-hook-form&#8221;;<br \/>\nimport { zodResolver } from &#8220;@hookform\/resolvers\/zod&#8221;;<br \/>\nimport { z } from &#8220;zod&#8221;;<br \/>\nimport { useRouter } from &#8220;next\/navigation&#8221;;<br \/>\nimport Link from &#8220;next\/link&#8221;;<\/p>\n<p>import CardWrapper from &#8220;..\/card-wrapper&#8221;;<br \/>\nimport FormError from &#8220;..\/form-error&#8221;;<br \/>\nimport { FormSuccess } from &#8220;..\/form-success&#8221;;<br \/>\nimport { FcGoogle } from &#8220;react-icons\/fc&#8221;;<br \/>\nimport { FaGithub } from &#8220;react-icons\/fa&#8221;;<\/p>\n<p>import SocialButton from &#8220;.\/social-button&#8221;;<br \/>\nimport LoginSchema from &#8220;@\/helpers\/zod\/login-schema&#8221;;<br \/>\nimport { useAuthState } from &#8220;@\/hooks\/useAuthState&#8221;;<br \/>\nimport { signIn } from &#8220;@\/lib\/auth-client&#8221;;<br \/>\nimport { requestOTP } from &#8220;@\/helpers\/auth\/request-otp&#8221;;<\/p>\n<p>import {<br \/>\n    Form,<br \/>\n    FormControl,<br \/>\n    FormField,<br \/>\n    FormItem,<br \/>\n    FormLabel,<br \/>\n    FormMessage,<br \/>\n} from &#8220;..\/ui\/form&#8221;;<br \/>\nimport { Input } from &#8220;..\/ui\/input&#8221;;<br \/>\nimport { Button } from &#8220;..\/ui\/button&#8221;;<\/p>\n<p>const SignIn = () =&gt; {<br \/>\n    const router = useRouter();<br \/>\n    \/\/ handles error, success, loading and resetState of a form<br \/>\n    const { error, success, loading, setSuccess, setError, setLoading, resetState } = useAuthState();<\/p>\n<p>    const form = useForm&lt;z.infer&lt;typeof LoginSchema&gt;&gt;({<br \/>\n        resolver: zodResolver(LoginSchema),<br \/>\n        defaultValues: {<br \/>\n            emailOrUsername: &#8220;&#8221;, \/\/ update the field email to emailOrUsername<br \/>\n            password: &#8220;&#8221;,<br \/>\n        },<br \/>\n    });<\/p>\n<p>    \/\/ Check if the value is an email<br \/>\n    const isEmail = (value: string) =&gt; \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test(value);<\/p>\n<p>    const onSubmit = async (values: z.infer&lt;typeof LoginSchema&gt;) =&gt; {<br \/>\n        const { emailOrUsername, password } = values;<\/p>\n<p>        \/\/ Determine if the input is an email or username<br \/>\n        const isEmailInput = isEmail(emailOrUsername);<\/p>\n<p>        try {<br \/>\n            \/\/ resetState of a form after resubmit<br \/>\n            resetState();<br \/>\n            setLoading(true);<\/p>\n<p>            if (isEmailInput) {<br \/>\n              \/\/ if user has given email and its true then signin using email and password<br \/>\n              \/\/ also send 2FA code to the user&#8217;s email, if enabled<br \/>\n                await signIn.email(<br \/>\n                    { email: emailOrUsername, password },<br \/>\n                    {<br \/>\n                        onRequest: () =&gt; setLoading(true),<br \/>\n                        onResponse: () =&gt; setLoading(false),<br \/>\n                        onSuccess: async (ctx) =&gt; {<br \/>\n                            if (ctx.data.twoFactorRedirect) {<br \/>\n                                const res = await requestOTP(); \/\/ request otp for 2fa<br \/>\n                                if (res?.data) {<br \/>\n                                    setSuccess(&#8220;OTP has been sent to your email&#8221;);<br \/>\n                                    router.push(&#8220;two-factor&#8221;);<br \/>\n                                } else if (res?.error) {<br \/>\n                                    setError(res.error.message);<br \/>\n                                }<br \/>\n                            } else { \/\/ if didn&#8217;t enable 2FA show loggedIn message<br \/>\n                                setSuccess(&#8220;Logged in successfully&#8221;);<br \/>\n                                router.replace(&#8220;\/&#8221;);<br \/>\n                            }<br \/>\n                        },<br \/>\n                        onError: (ctx) =&gt; {<br \/>\n                            const errorMessage =<br \/>\n                                ctx.error.status === 403<br \/>\n                                    ? &#8220;Please verify your email address&#8221;<br \/>\n                                    : ctx.error.message;<br \/>\n                            setError(errorMessage);<br \/>\n                        },<br \/>\n                    }<br \/>\n                );<br \/>\n            } else {<br \/>\n                \/\/ if user has given username then signin using username and password<br \/>\n                \/\/ also send 2FA code to the user&#8217;s email, if enabled<br \/>\n                await signIn.username(<br \/>\n                    { username: emailOrUsername, password },<br \/>\n                    {<br \/>\n                        onRequest: () =&gt; setLoading(true),<br \/>\n                        onResponse: () =&gt; setLoading(false),<br \/>\n                        onSuccess: async (ctx) =&gt; {<br \/>\n                            if (ctx.data.twoFactorRedirect) {<br \/>\n                                const res = await requestOTP();<br \/>\n                                if (res?.data) {<br \/>\n                                    setSuccess(&#8220;OTP has been sent to your email&#8221;);<br \/>\n                                    router.push(&#8220;two-factor&#8221;);<br \/>\n                                } else if (res?.error) {<br \/>\n                                    setError(res.error.message);<br \/>\n                                }<br \/>\n                            } else {<br \/>\n                                setSuccess(&#8220;Logged in successfully&#8221;);<br \/>\n                                router.replace(&#8220;\/&#8221;);<br \/>\n                            }<br \/>\n                        },<br \/>\n                        onError: (ctx) =&gt; {<br \/>\n                            const errorMessage =<br \/>\n                                ctx.error.status === 403<br \/>\n                                    ? &#8220;Please verify your email address&#8221;<br \/>\n                                    : ctx.error.message;<br \/>\n                            setError(errorMessage);<br \/>\n                        },<br \/>\n                    }<br \/>\n                );<br \/>\n            }<br \/>\n        } catch (err) { \/\/ catch the error<br \/>\n            console.error(err);<br \/>\n            setError(&#8220;Something went wrong. Please try again.&#8221;);<br \/>\n        } finally { \/\/ set the loading to false after submitting the form<br \/>\n            setLoading(false);<br \/>\n        }<br \/>\n    };<\/p>\n<p>    return (<br \/>\n        &lt;CardWrapper<br \/>\n            cardTitle=&#8221;Sign In&#8221;<br \/>\n            {\/* change the cardDescription for email to email or password *\/}<br \/>\n            cardDescription=&#8221;Enter your email or username below to login to your account&#8221;<br \/>\n            cardFooterDescription=&#8221;Don&#8217;t have an account?&#8221;<br \/>\n            cardFooterLink=&#8221;\/signup&#8221;<br \/>\n            cardFooterLinkTitle=&#8221;Sign up&#8221;<br \/>\n        &gt;<br \/>\n            &lt;Form {&#8230;form}&gt;<br \/>\n                &lt;form className=&#8221;space-y-4&#8243; onSubmit={form.handleSubmit(onSubmit)}&gt;<br \/>\n                    {\/* Email or Username Field *\/}<br \/>\n                    &lt;FormField<br \/>\n                        control={form.control}<br \/>\n                        name=&#8221;emailOrUsername&#8221;<br \/>\n                        render={({ field }) =&gt; (<br \/>\n                            &lt;FormItem&gt;<br \/>\n                                &lt;FormLabel&gt;Email or UsernameFormLabel&gt;<br \/>\n                                &lt;FormControl&gt;<br \/>\n                                    &lt;Input<br \/>\n                                        disabled={loading}<br \/>\n                                        type=&#8221;text&#8221; \/\/ update the type from email to text<br \/>\n                                        placeholder=&#8221;Enter email or username&#8221; \/\/ update the placeholder<br \/>\n                                        {&#8230;field}<br \/>\n                                    \/&gt;<br \/>\n                                FormControl&gt;<br \/>\n                                &lt;FormMessage \/&gt;<br \/>\n                            FormItem&gt;<br \/>\n                        )}<br \/>\n                    \/&gt;<br \/>\n                    {\/* All other exisitng formfields like password and form message *\/}<br \/>\n                form&gt;<br \/>\n            Form&gt;<br \/>\n        CardWrapper&gt;<br \/>\n    );<br \/>\n};<\/p>\n<p>export default SignIn;<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0648\u0631\u0648\u062f \u0628\u0627 \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc \u06cc\u0627 \u0627\u06cc\u0645\u06cc\u0644 \u0631\u0627 \u0641\u0639\u0627\u0644 \u06a9\u0646\u06cc\u062f SignIn:<\/p>\n<p>\u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u062f email \u0645\u06cc\u062f\u0627\u0646 \u0628\u0647 emailOrUsername.<br \/>\n\u0628\u0631\u0627\u06cc \u062a\u0639\u06cc\u06cc\u0646 \u0627\u06cc\u0646\u06a9\u0647 \u0622\u06cc\u0627 \u0648\u0631\u0648\u062f\u06cc \u06cc\u06a9 \u0627\u06cc\u0645\u06cc\u0644 \u06cc\u0627 \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0627\u0633\u062a \u0627\u0632 \u06cc\u06a9 \u062a\u0627\u0628\u0639 \u0627\u0628\u0632\u0627\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>  \u0645\u0631\u062d\u0644\u0647 6: \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f:<\/p>\n<p>\u0633\u0631\u0648\u0631 \u062a\u0648\u0633\u0639\u0647 \u062e\u0648\u062f \u0631\u0627 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f:<\/p>\n<p>pnpm dev<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0628\u0647 \u0633\u0645\u062a \u062e\u0648\u062f \u062d\u0631\u06a9\u062a \u06a9\u0646\u06cc\u062f sign-up \u0645\u0633\u06cc\u0631 \u0648 sign-in \u0645\u0633\u06cc\u0631 \u0648 \u0633\u0639\u06cc \u06a9\u0646\u06cc\u062f \u0627\u0628\u062a\u062f\u0627 \u06a9\u0627\u0631\u0628\u0631 \u0631\u0627 \u0628\u0627 \u0627\u06cc\u0645\u06cc\u0644\u060c \u0646\u0627\u0645 \u0648 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u062b\u0628\u062a \u0646\u0627\u0645 \u06a9\u0646\u06cc\u062f \u0648 \u0633\u067e\u0633 \u0627\u0632 \u0627\u06cc\u0645\u06cc\u0644 \u06cc\u0627 \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>  \u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc<\/p>\n<p>\u062a\u0628\u0631\u06cc\u06a9 \u0645\u06cc \u06af\u0648\u06cc\u0645! \ud83c\udf89 \u0634\u0645\u0627 \u0628\u0627 \u0645\u0648\u0641\u0642\u06cc\u062a \u06cc\u06a9 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0648 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0633\u06cc\u0633\u062a\u0645 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0634\u0645\u0627 \u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u0646\u062f \u0628\u0627 \u0627\u06cc\u0645\u06cc\u0644 \u06cc\u0627 \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc \u062e\u0648\u062f \u0648\u0627\u0631\u062f \u0633\u06cc\u0633\u062a\u0645 \u0634\u0648\u0646\u062f \u0648 \u0627\u06cc\u0646 \u062a\u062c\u0631\u0628\u0647 \u0631\u0627 \u0627\u0646\u0639\u0637\u0627\u0641 \u067e\u0630\u06cc\u0631\u062a\u0631 \u0648 \u06a9\u0627\u0631\u0628\u0631 \u067e\u0633\u0646\u062f\u062a\u0631 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>  \u0644\u06cc\u0646\u06a9 \u0647\u0627\u06cc \u0648\u0628\u0644\u0627\u06af:<\/p>\n<p>\u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u062f\u0648 \u0639\u0627\u0645\u0644\u06cc \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 BetterAuth: https:\/\/dev.to\/daanish2003\/two-factor-authentication-using-betterauth-nextjs-prisma-shadcn-and-resend-1b5p<\/p>\n<p>Forgot and Reset Password with BetterAuth: https:\/\/dev.to\/daanish2003\/forgot-and-reset-password-using-betterauth-nextjs-and-resend-ilj<\/p>\n<p>\u0648\u0628\u0644\u0627\u06af \u062a\u0623\u06cc\u06cc\u062f \u0627\u06cc\u0645\u06cc\u0644: https:\/\/dev.to\/daanish2003\/email-verification-using-betterauth-nextjs-and-resend-37gn<\/p>\n<p>\u0627\u06cc\u0645\u06cc\u0644 \u0648 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0628\u0627 Better_Auth: https:\/\/dev.to\/daanish2003\/email-and-password-auth-using-betterauth-nextjs-prisma-shadcn-and-tailwindcss-hgc<\/p>\n<p>\u0648\u0628\u0644\u0627\u06af OAuth: https:\/\/dev.to\/daanish2003\/oauth-using-betterauth-nextjs-prisma-shadcn-and-tailwindcss-45bp<\/p>\n<p>Better_Auth Docs: https:\/\/www.better-auth.com\/<\/p>\n<p>\u0627\u0633\u0646\u0627\u062f pnpm: https:\/\/pnpm.io\/<\/p>\n<p>Docker Docs: https:\/\/docs.docker.com\/<\/p>\n<p>Prisma Docs: https:\/\/www.prisma.io\/docs\/getting-started<\/p>\n<p>Shadcn Docs: https:\/\/ui.shadcn.com\/<\/p>\n<p>\u0627\u0633\u0646\u0627\u062f Next.js: https:\/\/nextjs.org\/<\/p>\n<p>Tailwindcss Docs: https:\/\/tailwindcss.com\/<\/p>\n<p>\u0645\u062e\u0632\u0646 Github: https:\/\/github.com\/Daanish2003\/better_auth_nextjs<\/p>\n<div data-article-id=\"2137309\" id=\"article-body\">\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627 \u0627\u062c\u0631\u0627 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f <strong>\u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0648 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631<\/strong> \u0628\u0631\u0627\u06cc \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0628 \u0645\u062f\u0631\u0646 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u067e\u0634\u062a\u0647 \u0627\u06cc \u0642\u0648\u06cc \u0648 \u0627\u06cc\u0645\u0646 \u0627\u0632 \u0627\u0628\u0632\u0627\u0631. \u0627\u06cc\u0646 \u0648\u06cc\u0698\u06af\u06cc \u0645\u0648\u062c\u0648\u062f \u0631\u0627 \u062a\u06a9\u0645\u06cc\u0644 \u062e\u0648\u0627\u0647\u062f \u06a9\u0631\u062f <strong>\u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u06cc\u0645\u06cc\u0644 \u0648 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631<\/strong> \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647. \u062f\u0631 \u067e\u0627\u06cc\u0627\u0646 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634\u060c \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0628\u0647 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc \u062f\u0647\u062f \u062a\u0627 \u0628\u0627 \u0647\u0631 \u06a9\u062f\u0627\u0645 \u0627\u0632 \u0622\u0646\u0647\u0627 \u0648\u0627\u0631\u062f \u0633\u06cc\u0633\u062a\u0645 \u0634\u0648\u0646\u062f <strong>\u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc<\/strong> \u06cc\u0627 <strong>\u0627\u06cc\u0645\u06cc\u0644<\/strong>\u060c \u0628\u0627 \u0627\u062e\u062a\u06cc\u0627\u0631\u06cc <strong>\u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u062f\u0648 \u0639\u0627\u0645\u0644\u06cc \u0645\u0628\u062a\u0646\u06cc \u0628\u0631 OTP<\/strong> (2FA) \u0628\u0631\u0627\u06cc \u0627\u0645\u0646\u06cc\u062a \u0628\u06cc\u0634\u062a\u0631.<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"\u062a\u063a\u06cc\u06cc\u0631 \u0648\u0636\u0639\u06cc\u062a \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/username-and-password-authentication-with-betterauth-nextjs-prisma-shadcn-and-tailwindcss-1hc6\/#%D9%BE%D8%B4%D8%AA%D9%87_%D9%81%D9%86%D8%A7%D9%88%D8%B1%DB%8C\" >\u067e\u0634\u062a\u0647 \u0641\u0646\u0627\u0648\u0631\u06cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/username-and-password-authentication-with-betterauth-nextjs-prisma-shadcn-and-tailwindcss-1hc6\/#%D9%BE%DB%8C%D8%B4_%D9%86%DB%8C%D8%A7%D8%B2%D9%87%D8%A7\" >\u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632\u0647\u0627<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/username-and-password-authentication-with-betterauth-nextjs-prisma-shadcn-and-tailwindcss-1hc6\/#%D8%B4%D8%A8%DB%8C%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%D9%BE%D8%B1%D9%88%DA%98%D9%87_%D8%A2%D8%BA%D8%A7%D8%B2%DA%AF%D8%B1\" >\u0634\u0628\u06cc\u0647 \u0633\u0627\u0632\u06cc \u067e\u0631\u0648\u0698\u0647 \u0622\u063a\u0627\u0632\u06af\u0631:<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/username-and-password-authentication-with-betterauth-nextjs-prisma-shadcn-and-tailwindcss-1hc6\/#%D8%B1%D8%A7%D9%87_%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C\" >\u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/nabfollower.com\/blog\/username-and-password-authentication-with-betterauth-nextjs-prisma-shadcn-and-tailwindcss-1hc6\/#1_%D9%BE%DB%8C%DA%A9%D8%B1%D8%A8%D9%86%D8%AF%DB%8C_%DA%A9%D9%86%DB%8C%D8%AF_env_%D9%81%D8%A7%DB%8C%D9%84\" >1. \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u06a9\u0646\u06cc\u062f .env \u0641\u0627\u06cc\u0644<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/nabfollower.com\/blog\/username-and-password-authentication-with-betterauth-nextjs-prisma-shadcn-and-tailwindcss-1hc6\/#%D8%AA%D9%88%D8%AC%D9%87\" >\u062a\u0648\u062c\u0647:<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/nabfollower.com\/blog\/username-and-password-authentication-with-betterauth-nextjs-prisma-shadcn-and-tailwindcss-1hc6\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_1_%D8%A8%D9%87_%D8%B1%D9%88%D8%B2_%D8%B1%D8%B3%D8%A7%D9%86%DB%8C_schemaprisma_%D9%81%D8%A7%DB%8C%D9%84\" >\u0645\u0631\u062d\u0644\u0647 1: \u0628\u0647 \u0631\u0648\u0632 \u0631\u0633\u0627\u0646\u06cc schema.prisma \u0641\u0627\u06cc\u0644<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/nabfollower.com\/blog\/username-and-password-authentication-with-betterauth-nextjs-prisma-shadcn-and-tailwindcss-1hc6\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_2_%D8%A8%D9%87_%D8%B1%D9%88%D8%B2_%D8%B1%D8%B3%D8%A7%D9%86%DB%8C_authts_%D9%88_auth-clientts%D9%81%D8%A7%DB%8C%D9%84\" >\u0645\u0631\u062d\u0644\u0647 2: \u0628\u0647 \u0631\u0648\u0632 \u0631\u0633\u0627\u0646\u06cc auth.ts  \u0648 auth-client.ts\u0641\u0627\u06cc\u0644<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/nabfollower.com\/blog\/username-and-password-authentication-with-betterauth-nextjs-prisma-shadcn-and-tailwindcss-1hc6\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_3_%D8%A8%D9%87_%D8%B1%D9%88%D8%B2_%D8%B1%D8%B3%D8%A7%D9%86%DB%8C_login-schemats_%D9%88_signup-schemats_%D9%81%D8%A7%DB%8C%D9%84\" >\u0645\u0631\u062d\u0644\u0647 3: \u0628\u0647 \u0631\u0648\u0632 \u0631\u0633\u0627\u0646\u06cc login-schema.ts  \u0648 signup-schema.ts \u0641\u0627\u06cc\u0644<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/nabfollower.com\/blog\/username-and-password-authentication-with-betterauth-nextjs-prisma-shadcn-and-tailwindcss-1hc6\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_4_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF_generateUsername_%D9%81%D8%A7%DB%8C%D9%84\" >\u0645\u0631\u062d\u0644\u0647 4: \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f generateUsername \u0641\u0627\u06cc\u0644<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/nabfollower.com\/blog\/username-and-password-authentication-with-betterauth-nextjs-prisma-shadcn-and-tailwindcss-1hc6\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_5_%D9%85%D8%A4%D9%84%D9%81%D9%87_SignIn_%D9%88_%D9%85%D8%A4%D9%84%D9%81%D9%87_Signup_%D8%B1%D8%A7_%D8%A8%D9%87_%D8%B1%D9%88%D8%B2_%DA%A9%D9%86%DB%8C%D8%AF\" >\u0645\u0631\u062d\u0644\u0647 5: \u0645\u0624\u0644\u0641\u0647 SignIn \u0648 \u0645\u0624\u0644\u0641\u0647 Signup \u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u062f<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/nabfollower.com\/blog\/username-and-password-authentication-with-betterauth-nextjs-prisma-shadcn-and-tailwindcss-1hc6\/#%D8%AC%D8%B2%D8%A1_%D9%88%D8%B1%D9%88%D8%AF_%D8%A8%D9%87_%D8%B3%DB%8C%D8%B3%D8%AA%D9%85\" >\u062c\u0632\u0621 \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645:<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/nabfollower.com\/blog\/username-and-password-authentication-with-betterauth-nextjs-prisma-shadcn-and-tailwindcss-1hc6\/#%D8%AC%D8%B2%D8%A1_%D8%AB%D8%A8%D8%AA_%D9%86%D8%A7%D9%85\" >\u062c\u0632\u0621 \u062b\u0628\u062a \u0646\u0627\u0645<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/nabfollower.com\/blog\/username-and-password-authentication-with-betterauth-nextjs-prisma-shadcn-and-tailwindcss-1hc6\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_6_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_%D8%AE%D9%88%D8%AF_%D8%B1%D8%A7_%D8%A7%D8%AC%D8%B1%D8%A7_%DA%A9%D9%86%DB%8C%D8%AF\" >\u0645\u0631\u062d\u0644\u0647 6: \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f:<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/nabfollower.com\/blog\/username-and-password-authentication-with-betterauth-nextjs-prisma-shadcn-and-tailwindcss-1hc6\/#%D9%86%D8%AA%DB%8C%D8%AC%D9%87_%DA%AF%DB%8C%D8%B1%DB%8C\" >\u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/nabfollower.com\/blog\/username-and-password-authentication-with-betterauth-nextjs-prisma-shadcn-and-tailwindcss-1hc6\/#%D9%84%DB%8C%D9%86%DA%A9_%D9%87%D8%A7%DB%8C_%D9%88%D8%A8%D9%84%D8%A7%DA%AF\" >\u0644\u06cc\u0646\u06a9 \u0647\u0627\u06cc \u0648\u0628\u0644\u0627\u06af:<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D9%BE%D8%B4%D8%AA%D9%87_%D9%81%D9%86%D8%A7%D9%88%D8%B1%DB%8C\"><\/span>\n<p>  <strong>\u067e\u0634\u062a\u0647 \u0641\u0646\u0627\u0648\u0631\u06cc<\/strong><br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u067e\u0634\u062a\u0647 \u0641\u0646\u0627\u0648\u0631\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f:<\/p>\n<ul>\n<li>\n<strong>Better_Auth \u0646\u0633\u062e\u0647 1<\/strong>: \u06cc\u06a9 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a TypeScript \u0633\u0628\u06a9 \u0648 \u0642\u0627\u0628\u0644 \u062a\u0648\u0633\u0639\u0647.<\/li>\n<li>\n<strong>Next.js<\/strong>: \u06cc\u06a9 \u0641\u0631\u06cc\u0645\u0648\u0631\u06a9 \u0642\u062f\u0631\u062a\u0645\u0646\u062f React \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u0631\u0646\u062f\u0631 \u0634\u062f\u0647 \u062a\u0648\u0633\u0637 \u0633\u0631\u0648\u0631.<\/li>\n<li>\n<strong>\u067e\u0631\u06cc\u0633\u0645\u0627<\/strong>: \u06cc\u06a9 ORM \u0645\u062f\u0631\u0646 \u0628\u0631\u0627\u06cc \u062a\u0639\u0627\u0645\u0644 \u06a9\u0627\u0631\u0622\u0645\u062f \u0648 \u0627\u06cc\u0645\u0646 \u0628\u0627 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647.<\/li>\n<li>\n<strong>ShadCN<\/strong>: \u06cc\u06a9 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0645\u0624\u0644\u0641\u0647 \u0627\u0628\u0632\u0627\u0631 \u0627\u0648\u0644 \u0628\u0631\u0627\u06cc \u062a\u0648\u0633\u0639\u0647 \u0633\u0631\u06cc\u0639 \u0631\u0627\u0628\u0637 \u06a9\u0627\u0631\u0628\u0631\u06cc.<\/li>\n<li>\n<strong>TailwindCSS<\/strong>: \u06cc\u06a9 \u0686\u0627\u0631\u0686\u0648\u0628 CSS \u0645\u062d\u0628\u0648\u0628 \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u0631\u0627\u0628\u0637 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u06cc \u0645\u062f\u0631\u0646.<\/li>\n<li>\n<strong>\u0627\u0631\u0633\u0627\u0644 \u0645\u062c\u062f\u062f<\/strong>: \u06cc\u06a9 \u0633\u0631\u0648\u06cc\u0633 \u0627\u06cc\u0645\u06cc\u0644 \u0642\u0627\u0628\u0644 \u0627\u0639\u062a\u0645\u0627\u062f \u0628\u0631\u0627\u06cc \u0627\u0631\u0633\u0627\u0644 OTP.<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"%D9%BE%DB%8C%D8%B4_%D9%86%DB%8C%D8%A7%D8%B2%D9%87%D8%A7\"><\/span>\n<p>  <strong>\u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632\u0647\u0627<\/strong><br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0642\u0628\u0644 \u0627\u0632 \u0627\u062f\u0627\u0645\u0647\u060c \u0645\u0637\u0645\u0626\u0646 \u0634\u0648\u06cc\u062f \u06a9\u0647 \u0645\u0648\u0627\u0631\u062f \u0632\u06cc\u0631 \u0631\u0627 \u0622\u0645\u0627\u062f\u0647 \u06a9\u0631\u062f\u0647 \u0627\u06cc\u062f:<\/p>\n<ol>\n<li>\n<strong>Node.js (\u0646\u0633\u062e\u0647 LTS)<\/strong> \u0646\u0635\u0628 \u0634\u062f\u0647 \u0627\u0633\u062a.<\/li>\n<li>\u0645\u062f\u06cc\u0631 \u0628\u0633\u062a\u0647 \u0645\u0627\u0646\u0646\u062f <strong>npm<\/strong>\u060c <strong>\u0646\u062e<\/strong>\u060c \u06cc\u0627 <strong>pnpm<\/strong> (\u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f <code>pnpm<\/code> \u062f\u0631 \u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627).<\/li>\n<li>\u0627\u0644\u0641 <strong>\u0646\u0645\u0648\u0646\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 PostgreSQL<\/strong> (\u0645\u062d\u0644\u06cc \u06cc\u0627 \u0645\u06cc\u0632\u0628\u0627\u0646\u06cc \u0634\u062f\u0647\u060c \u0645\u0627\u0646\u0646\u062f <strong>\u0633\u0648\u067e\u0627 \u0628\u06cc\u0633<\/strong> \u06cc\u0627 <strong>PlanetScale<\/strong>).\n<ul>\n<li>\u0627\u06af\u0631 \u0628\u0647 \u0635\u0648\u0631\u062a \u0645\u062d\u0644\u06cc \u06a9\u0627\u0631 \u0645\u06cc \u06a9\u0646\u06cc\u062f\u060c <strong>\u062f\u0627\u06a9\u0631<\/strong> \u06cc\u06a9 \u0631\u0627\u0647 \u0639\u0627\u0644\u06cc \u0628\u0631\u0627\u06cc \u062a\u0646\u0638\u06cc\u0645 \u0627\u06cc\u0646 \u0627\u0633\u062a.<\/li>\n<\/ul>\n<\/li>\n<li>\u0622\u0634\u0646\u0627\u06cc\u06cc \u0628\u0627 <strong>TypeScript<\/strong>\u060c <strong>Next.js<\/strong>\u060c \u0648 <strong>\u067e\u0631\u06cc\u0633\u0645\u0627<\/strong>.<\/li>\n<\/ol>\n<h2><span class=\"ez-toc-section\" id=\"%D8%B4%D8%A8%DB%8C%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%D9%BE%D8%B1%D9%88%DA%98%D9%87_%D8%A2%D8%BA%D8%A7%D8%B2%DA%AF%D8%B1\"><\/span>\n<p>  \u0634\u0628\u06cc\u0647 \u0633\u0627\u0632\u06cc \u067e\u0631\u0648\u0698\u0647 \u0622\u063a\u0627\u0632\u06af\u0631:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627 \u0628\u0631 \u0627\u0633\u0627\u0633 \u0639\u0645\u0644\u06a9\u0631\u062f\u0647\u0627\u06cc\u06cc \u0645\u0627\u0646\u0646\u062f <strong>\u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u06cc\u0645\u06cc\u0644-\u06af\u0630\u0631\u0648\u0627\u0698\u0647<\/strong> \u0648 <strong>\u062a\u0627\u06cc\u06cc\u062f \u0627\u06cc\u0645\u06cc\u0644<\/strong>. \u0634\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f:<\/p>\n<ul>\n<li>\u0628\u0627 \u062f\u0646\u0628\u0627\u0644 \u06a9\u0631\u062f\u0646 \u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627\u0647\u0627 \u0627\u0632 \u0627\u0628\u062a\u062f\u0627 \u0634\u0631\u0648\u0639 \u06a9\u0646\u06cc\u062f:\n<\/li>\n<li>\u06cc\u0627 \u067e\u0631\u0648\u0698\u0647 \u0634\u0631\u0648\u0639 \u06a9\u0646\u0646\u062f\u0647 \u0631\u0627 \u0634\u0628\u06cc\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f:\n<\/li>\n<\/ul>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>git clone <span class=\"nt\">-b<\/span> feat-username https:\/\/github.com\/Daanish2003\/better_auth_nextjs.git  \n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0628\u0647 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u067e\u0631\u0648\u0698\u0647 \u0628\u0631\u0648\u06cc\u062f \u0648 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627 \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>pnpm <span class=\"nb\">install<\/span>  \n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D8%B1%D8%A7%D9%87_%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C\"><\/span>\n<p>  \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3><span class=\"ez-toc-section\" id=\"1_%D9%BE%DB%8C%DA%A9%D8%B1%D8%A8%D9%86%D8%AF%DB%8C_%DA%A9%D9%86%DB%8C%D8%AF_env_%D9%81%D8%A7%DB%8C%D9%84\"><\/span>\n<p>  1. \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u06a9\u0646\u06cc\u062f <code>.env<\/code> \u0641\u0627\u06cc\u0644<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 <code>.env<\/code> \u062f\u0631 \u0631\u06cc\u0634\u0647 \u067e\u0631\u0648\u0698\u0647 \u062e\u0648\u062f \u0641\u0627\u06cc\u0644 \u06a9\u0646\u06cc\u062f \u0648 \u0627\u06cc\u0646 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight tsx\"><code><span class=\"err\">#<\/span> <span class=\"nx\">Authentication<\/span> <span class=\"nx\">settings<\/span>\n<span class=\"nx\">BETTER_AUTH_SECRET<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">your-secret-key<\/span><span class=\"dl\">\"<\/span> <span class=\"err\">#<\/span> <span class=\"nx\">Replace<\/span> <span class=\"kd\">with<\/span> <span class=\"nx\">a<\/span> <span class=\"nx\">secure<\/span> <span class=\"nx\">key<\/span>\n<span class=\"nx\">BETTER_AUTH_URL<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">http:\/\/localhost:3000<\/span><span class=\"dl\">\"<\/span>\n<span class=\"nx\">NEXT_PUBLIC_APP_URL<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">http:\/\/localhost:3000<\/span><span class=\"dl\">\"<\/span>\n\n<span class=\"err\">#<\/span> <span class=\"nx\">Database<\/span> <span class=\"nx\">settings<\/span>\n<span class=\"nx\">POSTGRES_PASSWORD<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">your-password<\/span><span class=\"dl\">\"<\/span>\n<span class=\"nx\">POSTGRES_USER<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">your-username<\/span><span class=\"dl\">\"<\/span>\n<span class=\"nx\">DATABASE_URL<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">postgresql:\/\/your-username:your-password@localhost:5432\/mydb?schema=public<\/span><span class=\"dl\">\"<\/span>\n\n<span class=\"err\">#<\/span> <span class=\"nx\">Resend<\/span> <span class=\"nx\">API<\/span> <span class=\"nx\">Key<\/span>\n<span class=\"nx\">RESEND_API_KEY<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">your-resend-api-key<\/span><span class=\"dl\">\"<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06af\u0631 \u0627\u0632 Docker \u0628\u0631\u0627\u06cc PostgreSQL \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u062f\u060c \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 \u0631\u0627 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>docker compose up <span class=\"nt\">-d<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D8%AA%D9%88%D8%AC%D9%87\"><\/span>\n<p>  \u062a\u0648\u062c\u0647:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0642\u0628\u0644 \u0627\u0632 \u0627\u06cc\u0646\u06a9\u0647 \u0628\u0647 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0648 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u06a9\u0627\u0645\u0644 \u067e\u0634\u062a\u0647 \u0634\u0645\u0627 \u0628\u067e\u0631\u062f\u0627\u0632\u06cc\u0645. \u0628\u0647 \u0627\u0637\u0644\u0627\u0639 \u0634\u0645\u0627 \u0645\u06cc\u200c\u0631\u0633\u0627\u0646\u0645 \u06a9\u0647 \u062f\u0631 \u0627\u06cc\u0646 \u0648\u0628\u0644\u0627\u06af \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0648 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0628\u0627 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u06cc\u0645\u06cc\u0644 \u0648 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0645\u0648\u062c\u0648\u062f \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645. \u0628\u0647 \u0637\u0648\u0631\u06cc \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u06cc\u0645\u06cc\u0644 \u06cc\u0627 \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0648\u0627\u0631\u062f \u0633\u06cc\u0633\u062a\u0645 \u0634\u0648\u062f.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_1_%D8%A8%D9%87_%D8%B1%D9%88%D8%B2_%D8%B1%D8%B3%D8%A7%D9%86%DB%8C_schemaprisma_%D9%81%D8%A7%DB%8C%D9%84\"><\/span>\n<p>  \u0645\u0631\u062d\u0644\u0647 1: \u0628\u0647 \u0631\u0648\u0632 \u0631\u0633\u0627\u0646\u06cc <code>schema.prisma<\/code> \u0641\u0627\u06cc\u0644<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f <code>schema.prisma<\/code>\u0631\u0627 \u062f\u0631 \u067e\u0648\u0634\u0647 \u067e\u0631\u0648\u0698\u0647 \u062e\u0648\u062f \u0642\u0631\u0627\u0631 \u062f\u0647\u06cc\u062f \u0648 \u0633\u067e\u0633 \u0622\u0646 \u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u062f <code>user<\/code>\u0645\u062f\u0644 \u062f\u0631 \u0637\u0631\u062d\u0648\u0627\u0631\u0647 \u0628\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 <code>username<\/code> \u0633\u062a\u0648\u0646 \u0628\u0627 \u0631\u0634\u062a\u0647 \u0646\u0648\u0639 \u0627\u062e\u062a\u06cc\u0627\u0631\u06cc \u0628\u0647 \u0622\u0646.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>model User {\n  id               String      @id @default(cuid())\n  name             String\n  email            String\n  emailVerified    Boolean     @default(false)\n  image            String?\n  createdAt        DateTime    @default(now())\n  updatedAt        DateTime    @updatedAt\n  twoFactorEnabled Boolean     @default(false)\n  \/\/ Add only username column with type of string and ignore other columns if you already implemented user model\n  username         String?\n  isAnonymous      Boolean?\n  Session          Session[]\n  Account          Account[]\n  TwoFactor        TwoFactor[] \/\/ if you implemented 2FA add this column\n\n  @@unique([email])\n  @@map(\"user\")\n}\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0633\u067e\u0633 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062f\u0633\u062a\u0648\u0631 \u0632\u06cc\u0631 \u0641\u0627\u06cc\u0644 prisma \u0631\u0627 \u062a\u0648\u0644\u06cc\u062f \u0648 \u0627\u0646\u062a\u0642\u0627\u0644 \u062f\u0647\u06cc\u062f<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>pnpx prisma generate\npnpx prisma migrate dev <span class=\"nt\">--name<\/span> username\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_2_%D8%A8%D9%87_%D8%B1%D9%88%D8%B2_%D8%B1%D8%B3%D8%A7%D9%86%DB%8C_authts_%D9%88_auth-clientts%D9%81%D8%A7%DB%8C%D9%84\"><\/span>\n<p>  \u0645\u0631\u062d\u0644\u0647 2: \u0628\u0647 \u0631\u0648\u0632 \u0631\u0633\u0627\u0646\u06cc <code>auth.ts<\/code>  \u0648 <code>auth-client.ts<\/code>\u0641\u0627\u06cc\u0644<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f <code>auth.ts<\/code>  \u062f\u0631 \u0645\u062e\u0632\u0646 \u067e\u0631\u0648\u0698\u0647 \u062e\u0648\u062f \u0641\u0627\u06cc\u0644 \u06a9\u0646\u06cc\u062f \u0648 \u0633\u067e\u0633 \u0622\u0646 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f <code>username()<\/code>\u067e\u0644\u0627\u06af\u06cc\u0646 \u0628\u0647 \u0622\u0631\u0627\u06cc\u0647 \u067e\u0644\u0627\u06af\u06cc\u0646 \u0627\u0632 \u062a\u0627\u0628\u0639 betterAuth.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight tsx\"><code><span class=\"c1\">\/\/ src\/lib\/auth.ts<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">betterAuth<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">better-auth<\/span><span class=\"dl\">\"<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">username<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">better-auth\/plugins<\/span><span class=\"dl\">\"<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">auth<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">betterAuth<\/span><span class=\"p\">({<\/span>\n    <span class=\"c1\">\/\/ other config options<\/span>\n    <span class=\"na\">plugins<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span> \n        <span class=\"c1\">\/\/ other plugins<\/span>\n        <span class=\"nf\">username<\/span><span class=\"p\">()<\/span> \n    <span class=\"p\">]<\/span> \n<span class=\"p\">})<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0633\u067e\u0633\u060c \u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f <code>auth-client.ts<\/code> \u062f\u0631 \u0645\u062e\u0632\u0646 \u067e\u0631\u0648\u0698\u0647 \u062e\u0648\u062f \u0641\u0627\u06cc\u0644 \u06a9\u0646\u06cc\u062f \u0648 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f <code>usernameClient()<\/code> \u0639\u0645\u0644\u06a9\u0631\u062f \u067e\u0644\u0627\u06af\u06cc\u0646 \u0628\u0647 \u0622\u0631\u0627\u06cc\u0647 \u067e\u0644\u0627\u06af\u06cc\u0646<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight tsx\"><code><span class=\"c1\">\/\/ src\/lib\/auth-client.ts<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">createAuthClient<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">better-auth\/client<\/span><span class=\"dl\">\"<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">usernameClient<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">better-auth\/client\/plugins<\/span><span class=\"dl\">\"<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">authClient<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">createAuthClient<\/span><span class=\"p\">({<\/span>\n    <span class=\"na\">baseURL<\/span><span class=\"p\">:<\/span> <span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"p\">.<\/span><span class=\"nx\">NEXT_PUBLIC_APP_URL<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">plugins<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span> \n        <span class=\"nf\">usernameClient<\/span><span class=\"p\">()<\/span> \n    <span class=\"p\">]<\/span> \n<span class=\"p\">})<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nx\">signIn<\/span><span class=\"p\">,<\/span>\n    <span class=\"nx\">signOut<\/span><span class=\"p\">,<\/span>\n    <span class=\"nx\">signUp<\/span><span class=\"p\">,<\/span>\n    <span class=\"nx\">useSession<\/span>\n<span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">authClient<\/span><span class=\"p\">;<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_3_%D8%A8%D9%87_%D8%B1%D9%88%D8%B2_%D8%B1%D8%B3%D8%A7%D9%86%DB%8C_login-schemats_%D9%88_signup-schemats_%D9%81%D8%A7%DB%8C%D9%84\"><\/span>\n<p>  \u0645\u0631\u062d\u0644\u0647 3: \u0628\u0647 \u0631\u0648\u0632 \u0631\u0633\u0627\u0646\u06cc <code>login-schema.ts<\/code>  \u0648 <code>signup-schema.ts<\/code> \u0641\u0627\u06cc\u0644<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f <code>login-schema.ts<\/code>\u062f\u0631 \u0645\u062e\u0632\u0646 \u067e\u0631\u0648\u0698\u0647 \u062e\u0648\u062f \u0641\u0627\u06cc\u0644 \u06a9\u0646\u06cc\u062f \u0648 \u0637\u0631\u062d\u0648\u0627\u0631\u0647 \u0631\u0627 \u0628\u0627 \u06a9\u062f \u0632\u06cc\u0631 \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight tsx\"><code><span class=\"c1\">\/\/ src\/helpers\/zod\/login-schema.ts<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">z<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">zod<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">LoginSchema<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">z<\/span>\n  <span class=\"p\">.<\/span><span class=\"nf\">object<\/span><span class=\"p\">({<\/span>\n    <span class=\"c1\">\/\/ checks if the input given by the user is email or username<\/span>\n    <span class=\"na\">emailOrUsername<\/span><span class=\"p\">:<\/span> <span class=\"nx\">z<\/span>\n      <span class=\"p\">.<\/span><span class=\"nf\">string<\/span><span class=\"p\">()<\/span>\n      <span class=\"p\">.<\/span><span class=\"nf\">min<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"na\">message<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Email or username is required<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">}),<\/span>\n    <span class=\"na\">password<\/span><span class=\"p\">:<\/span> <span class=\"nx\">z<\/span>\n      <span class=\"p\">.<\/span><span class=\"nf\">string<\/span><span class=\"p\">()<\/span>\n      <span class=\"p\">.<\/span><span class=\"nf\">min<\/span><span class=\"p\">(<\/span><span class=\"mi\">8<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"na\">message<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Password must be at least 8 characters long<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">})<\/span>\n      <span class=\"p\">.<\/span><span class=\"nf\">max<\/span><span class=\"p\">(<\/span><span class=\"mi\">20<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"na\">message<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Password must be at most 20 characters long<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">}),<\/span>\n  <span class=\"p\">})<\/span>\n  <span class=\"p\">.<\/span><span class=\"nf\">refine<\/span><span class=\"p\">(<\/span>\n    <span class=\"p\">(<\/span><span class=\"nx\">data<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span>\n      <span class=\"c1\">\/\/ checks if the email or username is valid<\/span>\n      <span class=\"sr\">\/^<\/span><span class=\"se\">[^\\s<\/span><span class=\"sr\">@<\/span><span class=\"se\">]<\/span><span class=\"sr\">+@<\/span><span class=\"se\">[^\\s<\/span><span class=\"sr\">@<\/span><span class=\"se\">]<\/span><span class=\"sr\">+<\/span><span class=\"se\">\\.[^\\s<\/span><span class=\"sr\">@<\/span><span class=\"se\">]<\/span><span class=\"sr\">+$\/<\/span><span class=\"p\">.<\/span><span class=\"nf\">test<\/span><span class=\"p\">(<\/span><span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">emailOrUsername<\/span><span class=\"p\">)<\/span> <span class=\"o\">||<\/span> <span class=\"sr\">\/^<\/span><span class=\"se\">[<\/span><span class=\"sr\">a-zA-Z0-9_.<\/span><span class=\"se\">]<\/span><span class=\"sr\">+$\/<\/span><span class=\"p\">.<\/span><span class=\"nf\">test<\/span><span class=\"p\">(<\/span><span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">emailOrUsername<\/span><span class=\"p\">),<\/span>\n    <span class=\"p\">{<\/span>\n      <span class=\"na\">message<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Provide a valid email or username<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">path<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">emailOrUsername<\/span><span class=\"dl\">\"<\/span><span class=\"p\">],<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"p\">);<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"nx\">LoginSchema<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0633\u067e\u0633\u060c \u0631\u0627 \u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f <code>signup-schema.ts<\/code> \u062f\u0631 \u0645\u062e\u0632\u0646 \u067e\u0631\u0648\u0698\u0647 \u062e\u0648\u062f \u0641\u0627\u06cc\u0644 \u06a9\u0646\u06cc\u062f \u0648 \u0641\u06cc\u0644\u062f \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0648 \u0646\u0648\u0639 \u0622\u0646 \u0631\u0627 \u062f\u0631 \u0637\u0631\u062d zod \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight tsx\"><code><span class=\"c1\">\/\/ src\/helpers\/zod\/signup-schema.ts<\/span>\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">SignupSchema<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">z<\/span>\n  <span class=\"p\">.<\/span><span class=\"nf\">object<\/span><span class=\"p\">({<\/span>\n    <span class=\"na\">name<\/span><span class=\"p\">:<\/span> <span class=\"nx\">z<\/span>\n      <span class=\"p\">.<\/span><span class=\"nf\">string<\/span><span class=\"p\">()<\/span>\n      <span class=\"p\">.<\/span><span class=\"nf\">min<\/span><span class=\"p\">(<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"na\">message<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Minimum 2 characters are required<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">})<\/span>\n      <span class=\"p\">.<\/span><span class=\"nf\">max<\/span><span class=\"p\">(<\/span><span class=\"mi\">20<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"na\">message<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Maximum of 20 characters are allowed<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">}),<\/span>\n    <span class=\"na\">email<\/span><span class=\"p\">:<\/span> <span class=\"nx\">z<\/span>\n      <span class=\"p\">.<\/span><span class=\"nf\">string<\/span><span class=\"p\">()<\/span>\n      <span class=\"p\">.<\/span><span class=\"nf\">email<\/span><span class=\"p\">({<\/span> <span class=\"na\">message<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Invalid email address<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">})<\/span>\n      <span class=\"p\">.<\/span><span class=\"nf\">min<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"na\">message<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Email is required<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">}),<\/span>\n    <span class=\"na\">password<\/span><span class=\"p\">:<\/span> <span class=\"nx\">z<\/span>\n      <span class=\"p\">.<\/span><span class=\"nf\">string<\/span><span class=\"p\">()<\/span>\n      <span class=\"p\">.<\/span><span class=\"nf\">min<\/span><span class=\"p\">(<\/span><span class=\"mi\">8<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"na\">message<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Password must be at least 8 characters long<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">})<\/span>\n      <span class=\"p\">.<\/span><span class=\"nf\">max<\/span><span class=\"p\">(<\/span><span class=\"mi\">20<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"na\">message<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Password must be at most 20 characters long<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">}),<\/span>\n    <span class=\"c1\">\/\/ Added the username field to check its type <\/span>\n    <span class=\"na\">username<\/span><span class=\"p\">:<\/span> <span class=\"nx\">z<\/span>\n      <span class=\"p\">.<\/span><span class=\"nf\">string<\/span><span class=\"p\">()<\/span>\n      <span class=\"p\">.<\/span><span class=\"nf\">min<\/span><span class=\"p\">(<\/span><span class=\"mi\">3<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"na\">message<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Username must be at least 3 characters long<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">})<\/span>\n      <span class=\"p\">.<\/span><span class=\"nf\">max<\/span><span class=\"p\">(<\/span><span class=\"mi\">25<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"na\">message<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Username must be at most 25 characters long<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">})<\/span>\n      <span class=\"p\">.<\/span><span class=\"nf\">regex<\/span><span class=\"p\">(<\/span><span class=\"sr\">\/^<\/span><span class=\"se\">[<\/span><span class=\"sr\">a-zA-Z0-9_.<\/span><span class=\"se\">]<\/span><span class=\"sr\">+$\/<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"na\">message<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Username can only contain letters, numbers, underscores, and dots<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">}),<\/span>\n  <span class=\"p\">})<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_4_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF_generateUsername_%D9%81%D8%A7%DB%8C%D9%84\"><\/span>\n<p>  \u0645\u0631\u062d\u0644\u0647 4: \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f <code>generateUsername<\/code> \u0641\u0627\u06cc\u0644<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 <code>generate-username.ts<\/code>  \u062f\u0627\u062e\u0644 <code>helper\/auth\/<\/code> \u067e\u0648\u0634\u0647 \u0648 \u06a9\u062f \u0631\u0627 \u0627\u0632 \u0632\u06cc\u0631 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight tsx\"><code><span class=\"c1\">\/\/ helpers\/auth\/generate-username.ts<\/span>\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">generateUsername<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"nx\">name<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">randomNumbers<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">Math<\/span><span class=\"p\">.<\/span><span class=\"nf\">floor<\/span><span class=\"p\">(<\/span><span class=\"mi\">1000<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">Math<\/span><span class=\"p\">.<\/span><span class=\"nf\">random<\/span><span class=\"p\">()<\/span> <span class=\"o\">*<\/span> <span class=\"mi\">9000<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ Generate a random 4-digit number<\/span>\n    <span class=\"k\">return<\/span> <span class=\"s2\">`<\/span><span class=\"p\">${<\/span><span class=\"nx\">name<\/span><span class=\"p\">.<\/span><span class=\"nf\">replace<\/span><span class=\"p\">(<\/span><span class=\"sr\">\/<\/span><span class=\"se\">\\s<\/span><span class=\"sr\">+\/g<\/span><span class=\"p\">,<\/span> <span class=\"dl\">''<\/span><span class=\"p\">).<\/span><span class=\"nf\">toLowerCase<\/span><span class=\"p\">()}${<\/span><span class=\"nx\">randomNumbers<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">};<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><code>GenerateUsername<\/code>\u062a\u0627\u0628\u0639 \u0628\u0631\u0627\u06cc \u062a\u0648\u0644\u06cc\u062f \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc \u062a\u0635\u0627\u062f\u0641\u06cc \u0627\u0632 \u0646\u0627\u0645 \u062f\u0627\u062f\u0647 \u0634\u062f\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_5_%D9%85%D8%A4%D9%84%D9%81%D9%87_SignIn_%D9%88_%D9%85%D8%A4%D9%84%D9%81%D9%87_Signup_%D8%B1%D8%A7_%D8%A8%D9%87_%D8%B1%D9%88%D8%B2_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \u0645\u0631\u062d\u0644\u0647 5: \u0645\u0624\u0644\u0641\u0647 SignIn \u0648 \u0645\u0624\u0644\u0641\u0647 Signup \u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3><span class=\"ez-toc-section\" id=\"%D8%AC%D8%B2%D8%A1_%D9%88%D8%B1%D9%88%D8%AF_%D8%A8%D9%87_%D8%B3%DB%8C%D8%B3%D8%AA%D9%85\"><\/span>\n<p>  \u062c\u0632\u0621 \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight tsx\"><code><span class=\"c1\">\/\/ src\/components\/auth\/sign-in.tsx<\/span>\n<span class=\"dl\">\"<\/span><span class=\"s2\">use client<\/span><span class=\"dl\">\"<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">React<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">CardWrapper<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">..\/card-wrapper<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">FormError<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">..\/form-error<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">FormSuccess<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">..\/form-success<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">FcGoogle<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react-icons\/fc<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">SocialButton<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/social-button<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">FaGithub<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react-icons\/fa<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">useAuthState<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@\/hooks\/useAuthState<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">useForm<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react-hook-form<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">zodResolver<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@hookform\/resolvers\/zod<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">z<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">zod<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Form<\/span><span class=\"p\">,<\/span> <span class=\"nx\">FormControl<\/span><span class=\"p\">,<\/span> <span class=\"nx\">FormField<\/span><span class=\"p\">,<\/span> <span class=\"nx\">FormItem<\/span><span class=\"p\">,<\/span> <span class=\"nx\">FormLabel<\/span><span class=\"p\">,<\/span> <span class=\"nx\">FormMessage<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">..\/ui\/form<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Input<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">..\/ui\/input<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Button<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">..\/ui\/button<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">SignupSchema<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@\/helpers\/zod\/signup-schema<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">signUp<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@\/lib\/auth-client<\/span><span class=\"dl\">'<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">generateUsername<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@\/helpers\/auth\/generate-username<\/span><span class=\"dl\">'<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">SignUp<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">error<\/span><span class=\"p\">,<\/span> <span class=\"nx\">success<\/span><span class=\"p\">,<\/span> <span class=\"nx\">loading<\/span><span class=\"p\">,<\/span> <span class=\"nx\">setLoading<\/span><span class=\"p\">,<\/span> <span class=\"nx\">setError<\/span><span class=\"p\">,<\/span> <span class=\"nx\">setSuccess<\/span><span class=\"p\">,<\/span> <span class=\"nx\">resetState<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">useAuthState<\/span><span class=\"p\">();<\/span>\n\n    <span class=\"kd\">const<\/span> <span class=\"nx\">form<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useForm<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">z<\/span><span class=\"p\">.<\/span><span class=\"nx\">infer<\/span><span class=\"o\">&lt;<\/span><span class=\"k\">typeof<\/span> <span class=\"nx\">SignupSchema<\/span><span class=\"o\">&gt;&gt;<\/span><span class=\"p\">({<\/span>\n        <span class=\"na\">resolver<\/span><span class=\"p\">:<\/span> <span class=\"nf\">zodResolver<\/span><span class=\"p\">(<\/span><span class=\"nx\">SignupSchema<\/span><span class=\"p\">),<\/span>\n        <span class=\"na\">defaultValues<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n            <span class=\"na\">name<\/span><span class=\"p\">:<\/span> <span class=\"dl\">''<\/span><span class=\"p\">,<\/span>\n            <span class=\"na\">email<\/span><span class=\"p\">:<\/span> <span class=\"dl\">''<\/span><span class=\"p\">,<\/span>\n            <span class=\"na\">password<\/span><span class=\"p\">:<\/span> <span class=\"dl\">''<\/span><span class=\"p\">,<\/span>\n            <span class=\"na\">username<\/span><span class=\"p\">:<\/span> <span class=\"dl\">''<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ Added username field<\/span>\n        <span class=\"p\">}<\/span>\n    <span class=\"p\">})<\/span>\n\n    <span class=\"kd\">const<\/span> <span class=\"nx\">onSubmit<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async <\/span><span class=\"p\">(<\/span><span class=\"na\">values<\/span><span class=\"p\">:<\/span> <span class=\"nx\">z<\/span><span class=\"p\">.<\/span><span class=\"nx\">infer<\/span><span class=\"o\">&lt;<\/span><span class=\"k\">typeof<\/span> <span class=\"nx\">SignupSchema<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">try<\/span> <span class=\"p\">{<\/span>\n            <span class=\"k\">await<\/span> <span class=\"nx\">signUp<\/span><span class=\"p\">.<\/span><span class=\"nf\">email<\/span><span class=\"p\">({<\/span>\n                <span class=\"na\">name<\/span><span class=\"p\">:<\/span> <span class=\"nx\">values<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span><span class=\"p\">,<\/span>\n                <span class=\"na\">email<\/span><span class=\"p\">:<\/span> <span class=\"nx\">values<\/span><span class=\"p\">.<\/span><span class=\"nx\">email<\/span><span class=\"p\">,<\/span>\n                <span class=\"na\">password<\/span><span class=\"p\">:<\/span> <span class=\"nx\">values<\/span><span class=\"p\">.<\/span><span class=\"nx\">password<\/span><span class=\"p\">,<\/span>\n                <span class=\"na\">username<\/span><span class=\"p\">:<\/span> <span class=\"nx\">values<\/span><span class=\"p\">.<\/span><span class=\"nx\">username<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ Add the username fields<\/span>\n                <span class=\"na\">callbackURL<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">\/<\/span><span class=\"dl\">'<\/span>\n            <span class=\"p\">},<\/span> <span class=\"p\">{<\/span>\n                <span class=\"na\">onResponse<\/span><span class=\"p\">:<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n                    <span class=\"nf\">setLoading<\/span><span class=\"p\">(<\/span><span class=\"kc\">false<\/span><span class=\"p\">)<\/span>\n                <span class=\"p\">},<\/span>\n                <span class=\"na\">onRequest<\/span><span class=\"p\">:<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n                    <span class=\"nf\">resetState<\/span><span class=\"p\">()<\/span>\n                    <span class=\"nf\">setLoading<\/span><span class=\"p\">(<\/span><span class=\"kc\">true<\/span><span class=\"p\">)<\/span>\n                <span class=\"p\">},<\/span>\n                <span class=\"na\">onSuccess<\/span><span class=\"p\">:<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n                    <span class=\"nf\">setSuccess<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">Verification link has been sent to your mail<\/span><span class=\"dl\">\"<\/span><span class=\"p\">)<\/span>\n                <span class=\"p\">},<\/span>\n                <span class=\"na\">onError<\/span><span class=\"p\">:<\/span> <span class=\"p\">(<\/span><span class=\"nx\">ctx<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n                    <span class=\"nf\">setError<\/span><span class=\"p\">(<\/span><span class=\"nx\">ctx<\/span><span class=\"p\">.<\/span><span class=\"nx\">error<\/span><span class=\"p\">.<\/span><span class=\"nx\">message<\/span><span class=\"p\">);<\/span>\n                <span class=\"p\">},<\/span>\n            <span class=\"p\">});<\/span>\n        <span class=\"p\">}<\/span> <span class=\"k\">catch <\/span><span class=\"p\">(<\/span><span class=\"nx\">error<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n            <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">error<\/span><span class=\"p\">(<\/span><span class=\"nx\">error<\/span><span class=\"p\">)<\/span>\n            <span class=\"nf\">setError<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">Something went wrong<\/span><span class=\"dl\">\"<\/span><span class=\"p\">)<\/span>\n        <span class=\"p\">}<\/span>\n\n    <span class=\"p\">}<\/span>\n\n    <span class=\"k\">return <\/span><span class=\"p\">(<\/span>\n        <span class=\"p\">&lt;<\/span><span class=\"nc\">CardWrapper<\/span>\n            <span class=\"na\">cardTitle<\/span><span class=\"p\">=<\/span><span class=\"s\">'SignUp'<\/span>\n            <span class=\"na\">cardDescription<\/span><span class=\"p\">=<\/span><span class=\"s\">'Create an new account'<\/span>\n            <span class=\"na\">cardFooterLink<\/span><span class=\"p\">=<\/span><span class=\"s\">'\/signin'<\/span>\n            <span class=\"na\">cardFooterDescription<\/span><span class=\"p\">=<\/span><span class=\"s\">'Already have an account?'<\/span>\n            <span class=\"na\">cardFooterLinkTitle<\/span><span class=\"p\">=<\/span><span class=\"s\">'Signin'<\/span>\n        <span class=\"p\">&gt;<\/span>\n            <span class=\"p\">&lt;<\/span><span class=\"nc\">Form<\/span> <span class=\"si\">{<\/span><span class=\"p\">...<\/span><span class=\"nx\">form<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>\n                 <span class=\"si\">{<\/span><span class=\"cm\">\/* Make changes to only name field of the form*\/<\/span><span class=\"si\">}<\/span>\n                <span class=\"p\">&lt;<\/span><span class=\"nt\">form<\/span> <span class=\"na\">className<\/span><span class=\"p\">=<\/span><span class=\"s\">'space-y-4'<\/span> <span class=\"na\">onSubmit<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">form<\/span><span class=\"p\">.<\/span><span class=\"nf\">handleSubmit<\/span><span class=\"p\">(<\/span><span class=\"nx\">onSubmit<\/span><span class=\"p\">)<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>\n                    <span class=\"p\">&lt;<\/span><span class=\"nc\">FormField<\/span>\n                        <span class=\"na\">control<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">form<\/span><span class=\"p\">.<\/span><span class=\"nx\">control<\/span><span class=\"si\">}<\/span>\n                        <span class=\"na\">name<\/span><span class=\"p\">=<\/span><span class=\"s\">\"name\"<\/span>\n                        <span class=\"na\">render<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"p\">({<\/span> <span class=\"nx\">field<\/span> <span class=\"p\">})<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">(<\/span>\n                            <span class=\"p\">&lt;<\/span><span class=\"nc\">FormItem<\/span><span class=\"p\">&gt;<\/span>\n                                <span class=\"p\">&lt;<\/span><span class=\"nc\">FormLabel<\/span><span class=\"p\">&gt;<\/span>Name<span class=\"p\"\/><span class=\"nc\">FormLabel<\/span><span class=\"p\">&gt;<\/span>\n                                <span class=\"p\">&lt;<\/span><span class=\"nc\">FormControl<\/span><span class=\"p\">&gt;<\/span>\n                                    <span class=\"p\">&lt;<\/span><span class=\"nc\">Input<\/span>\n                                        <span class=\"na\">disabled<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">loading<\/span><span class=\"si\">}<\/span>\n                                        <span class=\"na\">type<\/span><span class=\"p\">=<\/span><span class=\"s\">\"text\"<\/span>\n                                        <span class=\"na\">placeholder<\/span><span class=\"p\">=<\/span><span class=\"s\">'john'<\/span>\n                                        <span class=\"si\">{<\/span><span class=\"p\">...<\/span><span class=\"nx\">field<\/span><span class=\"si\">}<\/span> \n                                        <span class=\"na\">onChange<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"p\">(<\/span><span class=\"nx\">e<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n                                            <span class=\"nx\">field<\/span><span class=\"p\">.<\/span><span class=\"nf\">onChange<\/span><span class=\"p\">(<\/span><span class=\"nx\">e<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ Update form state<\/span>\n                                            <span class=\"kd\">const<\/span> <span class=\"nx\">username<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">generateUsername<\/span><span class=\"p\">(<\/span><span class=\"nx\">e<\/span><span class=\"p\">.<\/span><span class=\"nx\">target<\/span><span class=\"p\">.<\/span><span class=\"nx\">value<\/span><span class=\"p\">);<\/span>\n                                            <span class=\"nx\">form<\/span><span class=\"p\">.<\/span><span class=\"nf\">setValue<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">username<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">username<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ Auto-fill username<\/span>\n                                        <span class=\"p\">}<\/span><span class=\"si\">}<\/span>\n                                        <span class=\"p\">\/&gt;<\/span>\n                                <span class=\"p\"\/><span class=\"nc\">FormControl<\/span><span class=\"p\">&gt;<\/span>\n                                <span class=\"p\">&lt;<\/span><span class=\"nc\">FormMessage<\/span> <span class=\"p\">\/&gt;<\/span>\n                            <span class=\"p\"\/><span class=\"nc\">FormItem<\/span><span class=\"p\">&gt;<\/span>\n                        <span class=\"p\">)<\/span><span class=\"si\">}<\/span>\n                    <span class=\"p\">\/&gt;<\/span>\n                    <span class=\"si\">{<\/span><span class=\"cm\">\/* All other exisitng formfields like email and password *\/<\/span><span class=\"si\">}<\/span>\n                <span class=\"p\"\/><span class=\"nt\">form<\/span><span class=\"p\">&gt;<\/span>\n            <span class=\"p\"\/><span class=\"nc\">Form<\/span><span class=\"p\">&gt;<\/span>\n        <span class=\"p\"\/><span class=\"nc\">CardWrapper<\/span><span class=\"p\">&gt;<\/span>\n    <span class=\"p\">)<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"nx\">SignUp<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><strong>\u0645\u0646\u0637\u0642 \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0631\u0627 \u0628\u0647 \u0622\u0646 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f <code>SignUp<\/code>:<\/strong><\/p>\n<ul>\n<li>\u062a\u0648\u0644\u06cc\u062f \u062e\u0648\u062f\u06a9\u0627\u0631 \u0646\u0627\u0645 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u06cc \u0628\u0631 \u0627\u0633\u0627\u0633 \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631.<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"%D8%AC%D8%B2%D8%A1_%D8%AB%D8%A8%D8%AA_%D9%86%D8%A7%D9%85\"><\/span>\n<p>  \u062c\u0632\u0621 \u062b\u0628\u062a \u0646\u0627\u0645<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight tsx\"><code><span class=\"dl\">\"<\/span><span class=\"s2\">use client<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"nx\">React<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">react<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">useForm<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">react-hook-form<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">zodResolver<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@hookform\/resolvers\/zod<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">z<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">zod<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">useRouter<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">next\/navigation<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">Link<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">next\/link<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"nx\">CardWrapper<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/card-wrapper<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">FormError<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/form-error<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">FormSuccess<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/form-success<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">FcGoogle<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">react-icons\/fc<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">FaGithub<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">react-icons\/fa<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"nx\">SocialButton<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/social-button<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">LoginSchema<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@\/helpers\/zod\/login-schema<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">useAuthState<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@\/hooks\/useAuthState<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">signIn<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@\/lib\/auth-client<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">requestOTP<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@\/helpers\/auth\/request-otp<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nx\">Form<\/span><span class=\"p\">,<\/span>\n    <span class=\"nx\">FormControl<\/span><span class=\"p\">,<\/span>\n    <span class=\"nx\">FormField<\/span><span class=\"p\">,<\/span>\n    <span class=\"nx\">FormItem<\/span><span class=\"p\">,<\/span>\n    <span class=\"nx\">FormLabel<\/span><span class=\"p\">,<\/span>\n    <span class=\"nx\">FormMessage<\/span><span class=\"p\">,<\/span>\n<span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/ui\/form<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Input<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/ui\/input<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Button<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/ui\/button<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">SignIn<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">router<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">useRouter<\/span><span class=\"p\">();<\/span>\n    <span class=\"c1\">\/\/ handles error, success, loading and resetState of a form<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">error<\/span><span class=\"p\">,<\/span> <span class=\"nx\">success<\/span><span class=\"p\">,<\/span> <span class=\"nx\">loading<\/span><span class=\"p\">,<\/span> <span class=\"nx\">setSuccess<\/span><span class=\"p\">,<\/span> <span class=\"nx\">setError<\/span><span class=\"p\">,<\/span> <span class=\"nx\">setLoading<\/span><span class=\"p\">,<\/span> <span class=\"nx\">resetState<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">useAuthState<\/span><span class=\"p\">();<\/span>\n\n    <span class=\"kd\">const<\/span> <span class=\"nx\">form<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useForm<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">z<\/span><span class=\"p\">.<\/span><span class=\"nx\">infer<\/span><span class=\"o\">&lt;<\/span><span class=\"k\">typeof<\/span> <span class=\"nx\">LoginSchema<\/span><span class=\"o\">&gt;&gt;<\/span><span class=\"p\">({<\/span>\n        <span class=\"na\">resolver<\/span><span class=\"p\">:<\/span> <span class=\"nf\">zodResolver<\/span><span class=\"p\">(<\/span><span class=\"nx\">LoginSchema<\/span><span class=\"p\">),<\/span>\n        <span class=\"na\">defaultValues<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n            <span class=\"na\">emailOrUsername<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"\"<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ update the field email to emailOrUsername<\/span>\n            <span class=\"na\">password<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"p\">},<\/span>\n    <span class=\"p\">});<\/span>\n\n    <span class=\"c1\">\/\/ Check if the value is an email<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">isEmail<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"na\">value<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"sr\">\/^<\/span><span class=\"se\">[^\\s<\/span><span class=\"sr\">@<\/span><span class=\"se\">]<\/span><span class=\"sr\">+@<\/span><span class=\"se\">[^\\s<\/span><span class=\"sr\">@<\/span><span class=\"se\">]<\/span><span class=\"sr\">+<\/span><span class=\"se\">\\.[^\\s<\/span><span class=\"sr\">@<\/span><span class=\"se\">]<\/span><span class=\"sr\">+$\/<\/span><span class=\"p\">.<\/span><span class=\"nf\">test<\/span><span class=\"p\">(<\/span><span class=\"nx\">value<\/span><span class=\"p\">);<\/span>\n\n    <span class=\"kd\">const<\/span> <span class=\"nx\">onSubmit<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async <\/span><span class=\"p\">(<\/span><span class=\"na\">values<\/span><span class=\"p\">:<\/span> <span class=\"nx\">z<\/span><span class=\"p\">.<\/span><span class=\"nx\">infer<\/span><span class=\"o\">&lt;<\/span><span class=\"k\">typeof<\/span> <span class=\"nx\">LoginSchema<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">emailOrUsername<\/span><span class=\"p\">,<\/span> <span class=\"nx\">password<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">values<\/span><span class=\"p\">;<\/span>\n\n        <span class=\"c1\">\/\/ Determine if the input is an email or username<\/span>\n        <span class=\"kd\">const<\/span> <span class=\"nx\">isEmailInput<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">isEmail<\/span><span class=\"p\">(<\/span><span class=\"nx\">emailOrUsername<\/span><span class=\"p\">);<\/span>\n\n        <span class=\"k\">try<\/span> <span class=\"p\">{<\/span>\n            <span class=\"c1\">\/\/ resetState of a form after resubmit<\/span>\n            <span class=\"nf\">resetState<\/span><span class=\"p\">();<\/span>\n            <span class=\"nf\">setLoading<\/span><span class=\"p\">(<\/span><span class=\"kc\">true<\/span><span class=\"p\">);<\/span>\n\n            <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">isEmailInput<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n              <span class=\"c1\">\/\/ if user has given email and its true then signin using email and password<\/span>\n              <span class=\"c1\">\/\/ also send 2FA code to the user's email, if enabled<\/span>\n                <span class=\"k\">await<\/span> <span class=\"nx\">signIn<\/span><span class=\"p\">.<\/span><span class=\"nf\">email<\/span><span class=\"p\">(<\/span>\n                    <span class=\"p\">{<\/span> <span class=\"na\">email<\/span><span class=\"p\">:<\/span> <span class=\"nx\">emailOrUsername<\/span><span class=\"p\">,<\/span> <span class=\"nx\">password<\/span> <span class=\"p\">},<\/span>\n                    <span class=\"p\">{<\/span>\n                        <span class=\"na\">onRequest<\/span><span class=\"p\">:<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nf\">setLoading<\/span><span class=\"p\">(<\/span><span class=\"kc\">true<\/span><span class=\"p\">),<\/span>\n                        <span class=\"na\">onResponse<\/span><span class=\"p\">:<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nf\">setLoading<\/span><span class=\"p\">(<\/span><span class=\"kc\">false<\/span><span class=\"p\">),<\/span>\n                        <span class=\"na\">onSuccess<\/span><span class=\"p\">:<\/span> <span class=\"k\">async <\/span><span class=\"p\">(<\/span><span class=\"nx\">ctx<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n                            <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">ctx<\/span><span class=\"p\">.<\/span><span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">twoFactorRedirect<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n                                <span class=\"kd\">const<\/span> <span class=\"nx\">res<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nf\">requestOTP<\/span><span class=\"p\">();<\/span> <span class=\"c1\">\/\/ request otp for 2fa<\/span>\n                                <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">res<\/span><span class=\"p\">?.<\/span><span class=\"nx\">data<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n                                    <span class=\"nf\">setSuccess<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">OTP has been sent to your email<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n                                    <span class=\"nx\">router<\/span><span class=\"p\">.<\/span><span class=\"nf\">push<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">two-factor<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n                                <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">res<\/span><span class=\"p\">?.<\/span><span class=\"nx\">error<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n                                    <span class=\"nf\">setError<\/span><span class=\"p\">(<\/span><span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nx\">error<\/span><span class=\"p\">.<\/span><span class=\"nx\">message<\/span><span class=\"p\">);<\/span>\n                                <span class=\"p\">}<\/span>\n                            <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span> <span class=\"c1\">\/\/ if didn't enable 2FA show loggedIn message<\/span>\n                                <span class=\"nf\">setSuccess<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">Logged in successfully<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n                                <span class=\"nx\">router<\/span><span class=\"p\">.<\/span><span class=\"nf\">replace<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n                            <span class=\"p\">}<\/span>\n                        <span class=\"p\">},<\/span>\n                        <span class=\"na\">onError<\/span><span class=\"p\">:<\/span> <span class=\"p\">(<\/span><span class=\"nx\">ctx<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n                            <span class=\"kd\">const<\/span> <span class=\"nx\">errorMessage<\/span> <span class=\"o\">=<\/span>\n                                <span class=\"nx\">ctx<\/span><span class=\"p\">.<\/span><span class=\"nx\">error<\/span><span class=\"p\">.<\/span><span class=\"nx\">status<\/span> <span class=\"o\">===<\/span> <span class=\"mi\">403<\/span>\n                                    <span class=\"p\">?<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Please verify your email address<\/span><span class=\"dl\">\"<\/span>\n                                    <span class=\"p\">:<\/span> <span class=\"nx\">ctx<\/span><span class=\"p\">.<\/span><span class=\"nx\">error<\/span><span class=\"p\">.<\/span><span class=\"nx\">message<\/span><span class=\"p\">;<\/span>\n                            <span class=\"nf\">setError<\/span><span class=\"p\">(<\/span><span class=\"nx\">errorMessage<\/span><span class=\"p\">);<\/span>\n                        <span class=\"p\">},<\/span>\n                    <span class=\"p\">}<\/span>\n                <span class=\"p\">);<\/span>\n            <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\n                <span class=\"c1\">\/\/ if user has given username then signin using username and password<\/span>\n                <span class=\"c1\">\/\/ also send 2FA code to the user's email, if enabled<\/span>\n                <span class=\"k\">await<\/span> <span class=\"nx\">signIn<\/span><span class=\"p\">.<\/span><span class=\"nf\">username<\/span><span class=\"p\">(<\/span>\n                    <span class=\"p\">{<\/span> <span class=\"na\">username<\/span><span class=\"p\">:<\/span> <span class=\"nx\">emailOrUsername<\/span><span class=\"p\">,<\/span> <span class=\"nx\">password<\/span> <span class=\"p\">},<\/span>\n                    <span class=\"p\">{<\/span>\n                        <span class=\"na\">onRequest<\/span><span class=\"p\">:<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nf\">setLoading<\/span><span class=\"p\">(<\/span><span class=\"kc\">true<\/span><span class=\"p\">),<\/span>\n                        <span class=\"na\">onResponse<\/span><span class=\"p\">:<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nf\">setLoading<\/span><span class=\"p\">(<\/span><span class=\"kc\">false<\/span><span class=\"p\">),<\/span>\n                        <span class=\"na\">onSuccess<\/span><span class=\"p\">:<\/span> <span class=\"k\">async <\/span><span class=\"p\">(<\/span><span class=\"nx\">ctx<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n                            <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">ctx<\/span><span class=\"p\">.<\/span><span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">twoFactorRedirect<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n                                <span class=\"kd\">const<\/span> <span class=\"nx\">res<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nf\">requestOTP<\/span><span class=\"p\">();<\/span>\n                                <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">res<\/span><span class=\"p\">?.<\/span><span class=\"nx\">data<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n                                    <span class=\"nf\">setSuccess<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">OTP has been sent to your email<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n                                    <span class=\"nx\">router<\/span><span class=\"p\">.<\/span><span class=\"nf\">push<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">two-factor<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n                                <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">res<\/span><span class=\"p\">?.<\/span><span class=\"nx\">error<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n                                    <span class=\"nf\">setError<\/span><span class=\"p\">(<\/span><span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"nx\">error<\/span><span class=\"p\">.<\/span><span class=\"nx\">message<\/span><span class=\"p\">);<\/span>\n                                <span class=\"p\">}<\/span>\n                            <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\n                                <span class=\"nf\">setSuccess<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">Logged in successfully<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n                                <span class=\"nx\">router<\/span><span class=\"p\">.<\/span><span class=\"nf\">replace<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\/<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n                            <span class=\"p\">}<\/span>\n                        <span class=\"p\">},<\/span>\n                        <span class=\"na\">onError<\/span><span class=\"p\">:<\/span> <span class=\"p\">(<\/span><span class=\"nx\">ctx<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n                            <span class=\"kd\">const<\/span> <span class=\"nx\">errorMessage<\/span> <span class=\"o\">=<\/span>\n                                <span class=\"nx\">ctx<\/span><span class=\"p\">.<\/span><span class=\"nx\">error<\/span><span class=\"p\">.<\/span><span class=\"nx\">status<\/span> <span class=\"o\">===<\/span> <span class=\"mi\">403<\/span>\n                                    <span class=\"p\">?<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Please verify your email address<\/span><span class=\"dl\">\"<\/span>\n                                    <span class=\"p\">:<\/span> <span class=\"nx\">ctx<\/span><span class=\"p\">.<\/span><span class=\"nx\">error<\/span><span class=\"p\">.<\/span><span class=\"nx\">message<\/span><span class=\"p\">;<\/span>\n                            <span class=\"nf\">setError<\/span><span class=\"p\">(<\/span><span class=\"nx\">errorMessage<\/span><span class=\"p\">);<\/span>\n                        <span class=\"p\">},<\/span>\n                    <span class=\"p\">}<\/span>\n                <span class=\"p\">);<\/span>\n            <span class=\"p\">}<\/span>\n        <span class=\"p\">}<\/span> <span class=\"k\">catch <\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span> <span class=\"c1\">\/\/ catch the error<\/span>\n            <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">error<\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">);<\/span>\n            <span class=\"nf\">setError<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">Something went wrong. Please try again.<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n        <span class=\"p\">}<\/span> <span class=\"k\">finally<\/span> <span class=\"p\">{<\/span> <span class=\"c1\">\/\/ set the loading to false after submitting the form<\/span>\n            <span class=\"nf\">setLoading<\/span><span class=\"p\">(<\/span><span class=\"kc\">false<\/span><span class=\"p\">);<\/span>\n        <span class=\"p\">}<\/span>\n    <span class=\"p\">};<\/span>\n\n    <span class=\"k\">return <\/span><span class=\"p\">(<\/span>\n        <span class=\"p\">&lt;<\/span><span class=\"nc\">CardWrapper<\/span>\n            <span class=\"na\">cardTitle<\/span><span class=\"p\">=<\/span><span class=\"s\">\"Sign In\"<\/span>\n            <span class=\"si\">{<\/span><span class=\"cm\">\/* change the cardDescription for email to email or password *\/<\/span><span class=\"si\">}<\/span>\n            <span class=\"na\">cardDescription<\/span><span class=\"p\">=<\/span><span class=\"s\">\"Enter your email or username below to login to your account\"<\/span>\n            <span class=\"na\">cardFooterDescription<\/span><span class=\"p\">=<\/span><span class=\"s\">\"Don't have an account?\"<\/span>\n            <span class=\"na\">cardFooterLink<\/span><span class=\"p\">=<\/span><span class=\"s\">\"\/signup\"<\/span>\n            <span class=\"na\">cardFooterLinkTitle<\/span><span class=\"p\">=<\/span><span class=\"s\">\"Sign up\"<\/span>\n        <span class=\"p\">&gt;<\/span>\n            <span class=\"p\">&lt;<\/span><span class=\"nc\">Form<\/span> <span class=\"si\">{<\/span><span class=\"p\">...<\/span><span class=\"nx\">form<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>\n                <span class=\"p\">&lt;<\/span><span class=\"nt\">form<\/span> <span class=\"na\">className<\/span><span class=\"p\">=<\/span><span class=\"s\">\"space-y-4\"<\/span> <span class=\"na\">onSubmit<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">form<\/span><span class=\"p\">.<\/span><span class=\"nf\">handleSubmit<\/span><span class=\"p\">(<\/span><span class=\"nx\">onSubmit<\/span><span class=\"p\">)<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>\n                    <span class=\"si\">{<\/span><span class=\"cm\">\/* Email or Username Field *\/<\/span><span class=\"si\">}<\/span>\n                    <span class=\"p\">&lt;<\/span><span class=\"nc\">FormField<\/span>\n                        <span class=\"na\">control<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">form<\/span><span class=\"p\">.<\/span><span class=\"nx\">control<\/span><span class=\"si\">}<\/span>\n                        <span class=\"na\">name<\/span><span class=\"p\">=<\/span><span class=\"s\">\"emailOrUsername\"<\/span>\n                        <span class=\"na\">render<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"p\">({<\/span> <span class=\"nx\">field<\/span> <span class=\"p\">})<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">(<\/span>\n                            <span class=\"p\">&lt;<\/span><span class=\"nc\">FormItem<\/span><span class=\"p\">&gt;<\/span>\n                                <span class=\"p\">&lt;<\/span><span class=\"nc\">FormLabel<\/span><span class=\"p\">&gt;<\/span>Email or Username<span class=\"p\"\/><span class=\"nc\">FormLabel<\/span><span class=\"p\">&gt;<\/span>\n                                <span class=\"p\">&lt;<\/span><span class=\"nc\">FormControl<\/span><span class=\"p\">&gt;<\/span>\n                                    <span class=\"p\">&lt;<\/span><span class=\"nc\">Input<\/span>\n                                        <span class=\"na\">disabled<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">loading<\/span><span class=\"si\">}<\/span>\n                                        <span class=\"na\">type<\/span><span class=\"p\">=<\/span><span class=\"s\">\"text\"<\/span> <span class=\"c1\">\/\/ update the type from email to text<\/span>\n                                        <span class=\"na\">placeholder<\/span><span class=\"p\">=<\/span><span class=\"s\">\"Enter email or username\"<\/span> <span class=\"c1\">\/\/ update the placeholder<\/span>\n                                        <span class=\"si\">{<\/span><span class=\"p\">...<\/span><span class=\"nx\">field<\/span><span class=\"si\">}<\/span>\n                                    <span class=\"p\">\/&gt;<\/span>\n                                <span class=\"p\"\/><span class=\"nc\">FormControl<\/span><span class=\"p\">&gt;<\/span>\n                                <span class=\"p\">&lt;<\/span><span class=\"nc\">FormMessage<\/span> <span class=\"p\">\/&gt;<\/span>\n                            <span class=\"p\"\/><span class=\"nc\">FormItem<\/span><span class=\"p\">&gt;<\/span>\n                        <span class=\"p\">)<\/span><span class=\"si\">}<\/span>\n                    <span class=\"p\">\/&gt;<\/span>\n                    <span class=\"si\">{<\/span><span class=\"cm\">\/* All other exisitng formfields like password and form message *\/<\/span><span class=\"si\">}<\/span>\n                <span class=\"p\"\/><span class=\"nt\">form<\/span><span class=\"p\">&gt;<\/span>\n            <span class=\"p\"\/><span class=\"nc\">Form<\/span><span class=\"p\">&gt;<\/span>\n        <span class=\"p\"\/><span class=\"nc\">CardWrapper<\/span><span class=\"p\">&gt;<\/span>\n    <span class=\"p\">);<\/span>\n<span class=\"p\">};<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"nx\">SignIn<\/span><span class=\"p\">;<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><strong>\u0648\u0631\u0648\u062f \u0628\u0627 \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc \u06cc\u0627 \u0627\u06cc\u0645\u06cc\u0644 \u0631\u0627 \u0641\u0639\u0627\u0644 \u06a9\u0646\u06cc\u062f <code>SignIn<\/code>:<\/strong><\/p>\n<ul>\n<li>\u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u062f <code>email<\/code> \u0645\u06cc\u062f\u0627\u0646 \u0628\u0647 <code>emailOrUsername<\/code>.<\/li>\n<li>\u0628\u0631\u0627\u06cc \u062a\u0639\u06cc\u06cc\u0646 \u0627\u06cc\u0646\u06a9\u0647 \u0622\u06cc\u0627 \u0648\u0631\u0648\u062f\u06cc \u06cc\u06a9 \u0627\u06cc\u0645\u06cc\u0644 \u06cc\u0627 \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0627\u0633\u062a \u0627\u0632 \u06cc\u06a9 \u062a\u0627\u0628\u0639 \u0627\u0628\u0632\u0627\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_6_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_%D8%AE%D9%88%D8%AF_%D8%B1%D8%A7_%D8%A7%D8%AC%D8%B1%D8%A7_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \u0645\u0631\u062d\u0644\u0647 6: \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0633\u0631\u0648\u0631 \u062a\u0648\u0633\u0639\u0647 \u062e\u0648\u062f \u0631\u0627 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>pnpm dev\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0628\u0647 \u0633\u0645\u062a \u062e\u0648\u062f \u062d\u0631\u06a9\u062a \u06a9\u0646\u06cc\u062f <code>sign-up<\/code> \u0645\u0633\u06cc\u0631 \u0648 <code>sign-in<\/code> \u0645\u0633\u06cc\u0631 \u0648 \u0633\u0639\u06cc \u06a9\u0646\u06cc\u062f \u0627\u0628\u062a\u062f\u0627 \u06a9\u0627\u0631\u0628\u0631 \u0631\u0627 \u0628\u0627 \u0627\u06cc\u0645\u06cc\u0644\u060c \u0646\u0627\u0645 \u0648 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u062b\u0628\u062a \u0646\u0627\u0645 \u06a9\u0646\u06cc\u062f \u0648 \u0633\u067e\u0633 \u0627\u0632 \u0627\u06cc\u0645\u06cc\u0644 \u06cc\u0627 \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D9%86%D8%AA%DB%8C%D8%AC%D9%87_%DA%AF%DB%8C%D8%B1%DB%8C\"><\/span>\n<p>  <strong>\u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc<\/strong><br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062a\u0628\u0631\u06cc\u06a9 \u0645\u06cc \u06af\u0648\u06cc\u0645! \ud83c\udf89 \u0634\u0645\u0627 \u0628\u0627 \u0645\u0648\u0641\u0642\u06cc\u062a \u06cc\u06a9 <strong>\u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0648 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631<\/strong> \u0633\u06cc\u0633\u062a\u0645 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0634\u0645\u0627 \u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u0646\u062f \u0628\u0627 \u0627\u06cc\u0645\u06cc\u0644 \u06cc\u0627 \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc \u062e\u0648\u062f \u0648\u0627\u0631\u062f \u0633\u06cc\u0633\u062a\u0645 \u0634\u0648\u0646\u062f \u0648 \u0627\u06cc\u0646 \u062a\u062c\u0631\u0628\u0647 \u0631\u0627 \u0627\u0646\u0639\u0637\u0627\u0641 \u067e\u0630\u06cc\u0631\u062a\u0631 \u0648 \u06a9\u0627\u0631\u0628\u0631 \u067e\u0633\u0646\u062f\u062a\u0631 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D9%84%DB%8C%D9%86%DA%A9_%D9%87%D8%A7%DB%8C_%D9%88%D8%A8%D9%84%D8%A7%DA%AF\"><\/span>\n<p>  \u0644\u06cc\u0646\u06a9 \u0647\u0627\u06cc \u0648\u0628\u0644\u0627\u06af:<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u062f\u0648 \u0639\u0627\u0645\u0644\u06cc \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 BetterAuth: https:\/\/dev.to\/daanish2003\/two-factor-authentication-using-betterauth-nextjs-prisma-shadcn-and-resend-1b5p<\/p>\n<p>Forgot and Reset Password with BetterAuth: https:\/\/dev.to\/daanish2003\/forgot-and-reset-password-using-betterauth-nextjs-and-resend-ilj<\/p>\n<p>\u0648\u0628\u0644\u0627\u06af \u062a\u0623\u06cc\u06cc\u062f \u0627\u06cc\u0645\u06cc\u0644: https:\/\/dev.to\/daanish2003\/email-verification-using-betterauth-nextjs-and-resend-37gn<\/p>\n<p>\u0627\u06cc\u0645\u06cc\u0644 \u0648 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0628\u0627 Better_Auth: https:\/\/dev.to\/daanish2003\/email-and-password-auth-using-betterauth-nextjs-prisma-shadcn-and-tailwindcss-hgc<\/p>\n<p>\u0648\u0628\u0644\u0627\u06af OAuth: https:\/\/dev.to\/daanish2003\/oauth-using-betterauth-nextjs-prisma-shadcn-and-tailwindcss-45bp<\/p>\n<p>Better_Auth Docs: https:\/\/www.better-auth.com\/<\/p>\n<p>\u0627\u0633\u0646\u0627\u062f pnpm: https:\/\/pnpm.io\/<\/p>\n<p>Docker Docs: https:\/\/docs.docker.com\/<\/p>\n<p>Prisma Docs: https:\/\/www.prisma.io\/docs\/getting-started<\/p>\n<p>Shadcn Docs: https:\/\/ui.shadcn.com\/<\/p>\n<p>\u0627\u0633\u0646\u0627\u062f Next.js: https:\/\/nextjs.org\/<\/p>\n<p>Tailwindcss Docs: https:\/\/tailwindcss.com\/<\/p>\n<p>\u0645\u062e\u0632\u0646 Github: https:\/\/github.com\/Daanish2003\/better_auth_nextjs<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Summarize this content to 400 words in Persian Lang \u062f\u0631 \u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627 \u0627\u062c\u0631\u0627 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0648 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0628\u0631\u0627\u06cc \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0628 \u0645\u062f\u0631\u0646 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u067e\u0634\u062a\u0647 \u0627\u06cc \u0642\u0648\u06cc \u0648 \u0627\u06cc\u0645\u0646 \u0627\u0632 \u0627\u0628\u0632\u0627\u0631. \u0627\u06cc\u0646 \u0648\u06cc\u0698\u06af\u06cc \u0645\u0648\u062c\u0648\u062f \u0631\u0627 \u062a\u06a9\u0645\u06cc\u0644 \u062e\u0648\u0627\u0647\u062f \u06a9\u0631\u062f \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u06cc\u0645\u06cc\u0644 \u0648 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647. \u062f\u0631 \u067e\u0627\u06cc\u0627\u0646 \u0627\u06cc\u0646 &hellip;<\/p>\n","protected":false},"author":2,"featured_media":86874,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-86873","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/86873","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=86873"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/86873\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/86874"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=86873"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=86873"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=86873"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}