Added Loading Button to hub auth

This commit is contained in:
PxlLoewe
2025-03-11 22:49:54 -07:00
parent 3c26d5b476
commit 30b0caf19f
2 changed files with 297 additions and 297 deletions

View File

@@ -1,12 +1,13 @@
"use client"; "use client";
import { zodResolver } from "@hookform/resolvers/zod"; import { zodResolver } from "@hookform/resolvers/zod";
import { signIn } from "next-auth/react"; import { signIn, useSession } from "next-auth/react";
import Link from "next/link"; import Link from "next/link";
import { redirect, useSearchParams } from "next/navigation"; import { redirect, useSearchParams } from "next/navigation";
import { useState } from "react"; import { useState } from "react";
import { useForm } from "react-hook-form"; import { useForm } from "react-hook-form";
import { Toaster, toast } from "react-hot-toast"; import { Toaster, toast } from "react-hot-toast";
import { z } from "zod"; import { z } from "zod";
import { Button } from "../../../_components/ui/Button";
export const Login = () => { export const Login = () => {
const [isLoading, setIsLoading] = useState(false); const [isLoading, setIsLoading] = useState(false);
@@ -99,12 +100,13 @@ export const Login = () => {
/> />
</label> </label>
<div className="card-actions mt-6"> <div className="card-actions mt-6">
<button className="btn btn-primary btn-block" disabled={isLoading}> <Button
{isLoading && ( disabled={isLoading}
<span className="loading loading-spinner loading-sm"></span> isLoading={isLoading}
)} className="btn btn-primary btn-block"
Login{isLoading && "..."} >
</button> Login
</Button>
</div> </div>
</form> </form>
); );

View File

@@ -1,19 +1,20 @@
'use client'; "use client";
import { zodResolver } from '@hookform/resolvers/zod'; import { zodResolver } from "@hookform/resolvers/zod";
import { useForm } from 'react-hook-form'; import { useForm } from "react-hook-form";
import { z } from 'zod'; import { z } from "zod";
import { register } from '../action'; import { register } from "../action";
import { signIn } from 'next-auth/react'; import { signIn } from "next-auth/react";
import Link from 'next/link'; import Link from "next/link";
import { useState } from 'react'; import { useState } from "react";
import clsx, { ClassValue } from 'clsx'; import clsx, { ClassValue } from "clsx";
import { twMerge } from 'tailwind-merge'; import { twMerge } from "tailwind-merge";
import { Button } from "../../../_components/ui/Button";
export const Register = () => { export const Register = () => {
const schema = z const schema = z
.object({ .object({
email: z.string().email({ email: z.string().email({
message: 'Please enter a valid email', message: "Please enter a valid email",
}), }),
firstname: z.string().min(2).max(30), firstname: z.string().min(2).max(30),
lastname: z.string().min(2).max(30), lastname: z.string().min(2).max(30),
@@ -23,9 +24,9 @@ export const Register = () => {
.superRefine(({ password, passwordConfirm }, ctx) => { .superRefine(({ password, passwordConfirm }, ctx) => {
if (password !== passwordConfirm) { if (password !== passwordConfirm) {
ctx.addIssue({ ctx.addIssue({
code: 'custom', code: "custom",
message: 'Die Passwörter stimmen nicht überein', message: "Die Passwörter stimmen nicht überein",
path: ['confirmPassword'], path: ["confirmPassword"],
}); });
} }
}); });
@@ -37,9 +38,9 @@ export const Register = () => {
const form = useForm<IFormInput>({ const form = useForm<IFormInput>({
resolver: zodResolver(schema), resolver: zodResolver(schema),
defaultValues: { defaultValues: {
email: '', email: "",
password: '', password: "",
passwordConfirm: '', passwordConfirm: "",
}, },
}); });
console.log(form.formState.errors); console.log(form.formState.errors);
@@ -50,13 +51,13 @@ export const Register = () => {
setIsLoading(true); setIsLoading(true);
const values = form.getValues(); const values = form.getValues();
const user = await register({ const user = await register({
email: form.getValues('email'), email: form.getValues("email"),
password: form.getValues('password'), password: form.getValues("password"),
firstname: form.getValues('firstname'), firstname: form.getValues("firstname"),
lastname: form.getValues('lastname'), lastname: form.getValues("lastname"),
}); });
await signIn('credentials', { await signIn("credentials", {
callbackUrl: '/', callbackUrl: "/",
email: user.email, email: user.email,
password: values.password, password: values.password,
}); });
@@ -65,7 +66,7 @@ export const Register = () => {
> >
<h1 className="text-3xl font-bold">Registrierung</h1> <h1 className="text-3xl font-bold">Registrierung</h1>
<span className="text-sm font-medium"> <span className="text-sm font-medium">
Zurück zum{' '} Zurück zum{" "}
<Link href="/login" className="link link-accent link-hover"> <Link href="/login" className="link link-accent link-hover">
Login Login
</Link> </Link>
@@ -83,14 +84,14 @@ export const Register = () => {
<input <input
type="text" type="text"
className="grow" className="grow"
{...form.register('firstname')} {...form.register("firstname")}
placeholder="Vorname" placeholder="Vorname"
/> />
</label> </label>
<p className="text-error"> <p className="text-error">
{typeof form.formState.errors.firstname?.message === 'string' {typeof form.formState.errors.firstname?.message === "string"
? form.formState.errors.firstname.message ? form.formState.errors.firstname.message
: ''} : ""}
</p> </p>
<label className="input input-bordered flex items-center gap-2 mt-2 w-full"> <label className="input input-bordered flex items-center gap-2 mt-2 w-full">
<svg <svg
@@ -104,14 +105,14 @@ export const Register = () => {
<input <input
type="text" type="text"
className="grow" className="grow"
{...form.register('lastname')} {...form.register("lastname")}
placeholder="Nachname" placeholder="Nachname"
/> />
</label> </label>
<p className="text-error"> <p className="text-error">
{typeof form.formState.errors.lastname?.message === 'string' {typeof form.formState.errors.lastname?.message === "string"
? form.formState.errors.lastname.message ? form.formState.errors.lastname.message
: ''} : ""}
</p> </p>
<div className="divider">Account</div> <div className="divider">Account</div>
<label className="input input-bordered flex items-center gap-2 w-full"> <label className="input input-bordered flex items-center gap-2 w-full">
@@ -127,15 +128,15 @@ export const Register = () => {
<input <input
type="text" type="text"
className="grow" className="grow"
{...form.register('email')} {...form.register("email")}
placeholder="Email" placeholder="Email"
/> />
</label> </label>
<p className="text-error"> <p className="text-error">
{typeof form.formState.errors.email?.message === 'string' {typeof form.formState.errors.email?.message === "string"
? form.formState.errors.email.message ? form.formState.errors.email.message
: ''} : ""}
</p> </p>
<label className="input input-bordered flex items-center gap-2 mt-2 w-full"> <label className="input input-bordered flex items-center gap-2 mt-2 w-full">
<svg <svg
@@ -153,15 +154,15 @@ export const Register = () => {
<input <input
type="password" type="password"
autoComplete="new-password" autoComplete="new-password"
{...form.register('password')} {...form.register("password")}
placeholder="Passwort" placeholder="Passwort"
className="grow" className="grow"
/> />
</label> </label>
<p className="text-error"> <p className="text-error">
{typeof form.formState.errors.password?.message === 'string' {typeof form.formState.errors.password?.message === "string"
? form.formState.errors.password.message ? form.formState.errors.password.message
: ''} : ""}
</p> </p>
<label className="input input-bordered flex items-center gap-2 mt-2 w-full"> <label className="input input-bordered flex items-center gap-2 mt-2 w-full">
<svg <svg
@@ -179,27 +180,24 @@ export const Register = () => {
<input <input
type="password" type="password"
autoComplete="new-password" autoComplete="new-password"
{...form.register('passwordConfirm')} {...form.register("passwordConfirm")}
placeholder="Passwort bestätigen" placeholder="Passwort bestätigen"
className="grow" className="grow"
/> />
</label> </label>
<p className="text-error"> <p className="text-error">
{typeof form.formState.errors.passwordConfirm?.message === 'string' {typeof form.formState.errors.passwordConfirm?.message === "string"
? form.formState.errors.passwordConfirm.message ? form.formState.errors.passwordConfirm.message
: ''} : ""}
</p> </p>
<div className="card-actions mt-6"> <div className="card-actions mt-6">
<button <Button
className="btn btn-primary btn-block"
name="registerBtn"
disabled={isLoading} disabled={isLoading}
isLoading={isLoading}
className="btn btn-primary btn-block"
> >
{isLoading && ( Registrieren
<span className="loading loading-spinner loading-sm"></span> </Button>
)}
Registrieren{isLoading && '...'}
</button>
</div> </div>
</div> </div>
</form> </form>