1. Register
Membuat Routing Register dan Login
Membuat Interface Auth
payload endpoint register
{
"nama" : "ihsan santana w",
"email" :"ihsanabuhanifah@gmail.com",
"password" : "12345678"
}
app/auth/interface/index.ts
interface User {
id?: number;
nama: string;
email: string;
password: string;
}
export interface RegisterResponse extends BaseResponseSuccess {}
export interface RegisterPayload
extends Pick<User, "nama" | "email" | "password"> {}
Membuat Service Register
app/auth/lib/index.ts
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { useToast } from "@/hook";
import {
LoginPayload,
LoginResponse,
RegisterPayload,
RegisterResponse,
} from "../interface";
import { axiosClient } from "@/lib/axiosClient";
import { signIn } from "next-auth/react";
import { useRouter } from "next/navigation";
const useAuthModule = () => {
const { toastError, toastSuccess, toastWarning } = useToast();
const router = useRouter();
const register = async (
payload: RegisterPayload
): Promise<RegisterResponse> => {
return axiosClient.post("/auth/register", payload).then((res) => res.data);
};
const useRegister = () => {
const { mutate, isLoading } = useMutation(
(payload: RegisterPayload) => register(payload),
{
onSuccess: (response) => {
toastSuccess(response.message);
router.push("/auth/login");
},
onError: (error) => {
toastError();
},
}
);
return { mutate, isLoading };
};
return { useRegister };
};
export default useAuthModule;
Membuat Halaman Register dan Integrasi dengan Service
app/auth/register/page.tsx
"use client";
import { useFormik, Form, FormikProvider, getIn } from "formik";
import Link from "next/link";
import * as yup from "yup";
import { RegisterPayload } from "../interface";
import InputText from "@/components/InputText";
import Label from "@/components/Label";
import Button from "@/components/Button";
import useAuthModule from "../lib";
export const registerSchema = yup.object().shape({
nama: yup.string().nullable().default("").required("Wajib isi"),
email: yup
.string()
.nullable()
.default("")
.email("Gunakan format email")
.required("Wajib isi"),
password: yup
.string()
.nullable()
.default("")
.required("Wajib isi")
.min(8, "Minimal 8 karakater"),
});
const Register = () => {
const { useRegister } = useAuthModule();
const { mutate, isLoading } = useRegister();
const formik = useFormik<RegisterPayload>({
initialValues: registerSchema.getDefault(),
validationSchema: registerSchema,
enableReinitialize: true,
onSubmit: (payload) => {
mutate(payload);
},
});
const {
handleChange,
handleSubmit,
handleBlur,
values,
errors,
resetForm,
setValues,
} = formik;
return (
<section>
<div className="flex items-center justify-center w-full">
<h1 className="text-3xl text-blue-400">Register</h1>
</div>
<FormikProvider value={formik}>
<Form className="space-y-5" onSubmit={handleSubmit}>
<section>
<Label htmlFor="nama" title="Nama" />
<InputText
value={values.nama}
placeholder="ihsan"
id="nama"
name="nama"
onChange={handleChange}
onBlur={handleBlur}
isError={getIn(errors, "nama")}
messageError={getIn(errors, "nama")}
/>
</section>
<section>
<Label htmlFor="email" title="Email" />
<InputText
value={values.email}
placeholder="exampel@email.com"
id="email"
name="email"
onChange={handleChange}
onBlur={handleBlur}
isError={getIn(errors, "email")}
messageError={getIn(errors, "email")}
/>
</section>
<section>
<Label htmlFor="password" title="Password" />
<InputText
value={values.password}
placeholder="**********"
id="password"
name="password"
type="password"
onChange={handleChange}
onBlur={handleBlur}
isError={getIn(errors, "password")}
messageError={getIn(errors, "password")}
/>
</section>
<section>
<Button
height="lg"
title="Register"
colorSchema="blue"
isLoading={isLoading}
isDisabled={isLoading}
/>
<Link href={'login'}>
<Button title="HalamanLogin" colorSchema="green"/>
</Link>
</section>
</Form>
</FormikProvider>
</section>
);
};
export default Register;