Configurando o Formulário
Agora que sabemos que está tudo certo com o provider de email, vamos configurar nosso formulário customizado para implementar o Magic Link.
De novo, aqui vamos basicamente copiar tudo que fizemos nas outras opções de login
page.tsxlayout.tsxerror.tsx_components/login-form.tsx_actions/email-login.tsx
Criando a action
Nossa action vai ser bastante simples:
'use server';
import { signIn } from '@/auth';
export async function emailLogin(formData: FormData) {  const email = formData.get('email') as string;
  try {    await signIn('nodemailer', {      email,    });  } catch (error) {    throw error;  }}Maravilha, agora vamos fazer o link entre o formulário e a action.
Todos os arquivos
A página nada mais é do que um “encapsulamento” do nosso formulário de login:
import LoginForm from './_components/login-form';
export default async function LoginPage() {  return <LoginForm />;}O Componente de Formulário
'use client';
import { emailLogin } from '../_actions/email-login';import { Button } from '@/components/ui/button';import { Input } from '@/components/ui/input';import { Label } from '@/components/ui/label';import {  Card,  CardContent,  CardDescription,  CardHeader,  CardTitle,} from '@/components/ui/card';
export default function LoginForm() {  return (    <Card className="mx-auto max-w-96">      <CardHeader>        <CardTitle>Login</CardTitle>        <CardDescription>Entre com seu Email</CardDescription>      </CardHeader>      <CardContent>        <form action={emailLogin} className="text-left ">          <div className="space-y-6">            <div className="grid w-full max-w-sm items-center gap-1.5">              <Label htmlFor="email">Email</Label>              <Input name="email" type="email" id="email" placeholder="Email" />            </div>          </div>          <Button size={'lg'} type="submit" className=" w-full mt-10">            Login          </Button>        </form>      </CardContent>    </Card>  );}O Layout
import { buttonVariants } from '@/components/ui/button';import { cn } from '@/lib/utils';import Link from 'next/link';
export default async function LoginLayout({  children,}: {  children: React.ReactNode;}) {  return (    <main className="container p-20 mx-auto text-center">      {children}      <Link        className={cn(buttonVariants({ variant: 'link', size: 'lg' }), 'mt-8')}        href="/"      >        Voltar para Home      </Link>    </main>  );}A Página de Erro
'use client';
import ErrorCard from '../_components/error-card';
export default function RegisterError({  error,  reset,}: {  error: Error & { digest?: string };  reset: () => void;}) {  return <ErrorCard errorMessage={error.message} reset={reset} />;}