Tutorial Authentication Dengan Laravel JWT & Next.js #4 : Membuat Proses Register


Tutorial Authentication Dengan Laravel JWT & Next.js #4 : Membuat Proses Register

Halo teman-teman semuanya, di artikel sebelumnya kita telah banyak belajar bagaimana cara melakukan installasi Bootstrap dan membuat layout di Next.js. Dan pada kesempatan kali ini kita akan lanjutkan membuat proses register di dalam Next.js.

Langkah 1 - Installasi Library Axios

Karena nanti kita akan berinteraksi dengan server / backend, maka kita butuh Axios untuk menghubungkannya.

Sekarang kita akan melakukan installasi library Axios di dalam project Next.js. Silahkan teman-teman jalankan perintah berikut ini di dalam terminal/CMD dan pastikan sudah berada di dalam project Next.js-nya.

npm i axios@0.27.2

Silahkan tunggu proses installasinya sampai selesai, dan pastikan harus terhubung dengan internet karena Axios akan di unduh secara online.

Langkah 2 - Konfigurasi Endpoint API

Silahkan buat file baru di project Next.js dengan nama .env.local, kemudian masukkan kode berikut ini di dalamnya.

NEXT_PUBLIC_API_BACKEND = 'http://localhost:8000'

Di atas, kita menambahkan endpoint http://localhost:8000, dan itu merupakan alamat dari project Laravel JWT. Dan pastikan teman-teman sudah menjalankan project Laravel-nya.

Langkah 3 - Membuat Proses Register

Sekarang kita akan lanjutkan membuat halaman yang nantinya digunakan untuk menampilkan form register. Silahkan buat file baru dengan nama register.js di dalam folder pages, kemudian masukkan kode berikut ini di dalamnya.

//layout
import Layout from "../layouts/default";

//import hook react
import { useState } from 'react';

//import Head
import Head from 'next/head';

//import router
import Router from 'next/router';

//import axios
import axios from "axios";

function Register() {
    
    //define state
    const [name, setName] = useState("");
    const [email, setEmail] = useState("");
    const [password, setPassword] = useState("");
    const [passwordConfirmation, setPasswordConfirmation] = useState("");

    //define state validation
    const [validation, setValidation] = useState([]);

    //function "registerHanlder"
    const registerHandler = async (e) => {
        e.preventDefault();
        
        //initialize formData
        const formData = new FormData();

        //append data to formData
        formData.append('name', name);
        formData.append('email', email);
        formData.append('password', password);
        formData.append('password_confirmation', passwordConfirmation);

        //send data to server
        await axios.post(`${process.env.NEXT_PUBLIC_API_BACKEND}/api/register`, formData)
        .then(() => {

            //redirect to logi page
            Router.push('/login')
        })
        .catch((error) => {

            //assign error to state "validation"
            setValidation(error.response.data);
        })
    };

    return(
        <Layout>
            <Head>
                <title>Register Account - SantriKoding.com</title>
            </Head>
            <div className="container" style={{ marginTop: '80px' }}>
                <div className="row justify-content-center">
                    <div className="col-md-8">
                        <div className="card border-0 rounded shadow-sm">
                            <div className="card-body">
                                <h4 className="fw-bold">HALAMAN REGISTER</h4>
                                <hr/>
                                <form onSubmit={registerHandler}>
                                    <div className="row">
                                        <div className="col-md-6">
                                            <div className="mb-3">
                                                <label className="form-label">NAMA LENGKAP</label>
                                                <input type="text" className="form-control" value={name} onChange={(e) => setName(e.target.value)} placeholder="Masukkan Nama Lengkap"/>
                                            </div>
                                            {
                                            validation.name && (
                                                <div className="alert alert-danger">
                                                    {validation.name[0]}
                                                </div>
                                            )
                                            }
                                        </div>
                                        <div className="col-md-6">
                                            <div className="mb-3">
                                                <label className="form-label">ALAMAT EMAIL</label>
                                                <input type="email" className="form-control" value={email} onChange={(e) => setEmail(e.target.value)} placeholder="Masukkan Alamat Email"/>
                                            </div>
                                            {
                                                validation.email && (
                                                    <div className="alert alert-danger">
                                                        {validation.email[0]}
                                                    </div>
                                                )
                                            }
                                        </div>
                                    </div>
                                    <div className="row">
                                        <div className="col-md-6">
                                            <div className="mb-3">
                                                <label className="form-label">PASSWORD</label>
                                                <input type="password" className="form-control" value={password} onChange={(e) => setPassword(e.target.value)} placeholder="Masukkan Password"/>
                                            </div>
                                            {
                                                validation.password && (
                                                    <div className="alert alert-danger">
                                                        {validation.password[0]}
                                                    </div>
                                                )
                                            }
                                        </div>
                                        <div className="col-md-6">
                                            <div className="mb-3">
                                                <label className="form-label">KONFIRMASI PASSWORD</label>
                                                <input type="password" className="form-control" value={passwordConfirmation} onChange={(e) => setPasswordConfirmation(e.target.value)} placeholder="Masukkan Konfirmasi Password"/>
                                            </div>
                                        </div>
                                    </div>
                                    <button type="submit" className="btn btn-primary">REGISTER</button>
                                </form>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </Layout>
    )
}

export default Register

Dari perubahan kode di atas, pertama kita import layout.

//layout
import Layout from "../layouts/default";

Kemudian kita import hook useState dari React.js, hook ini akan kita gunakan untuk menyimpan data yang di dapatkan dari form.

//import hook react
import { useState } from 'react';

Dan kita juga import Head dari Next.js.

//import Head
import Head from 'next/head';

Karena setelah berhasil register kita akan melakukan navigasi ke route login, maka kita akan import Router dari Next.js.

//import router
import Router from 'next/router';

Dan karena kita nanti akan mengirim data ke dalam server menggunakan Rest API, maka kita butuh Axios. Dan kita juga import di halaman ini.

//import axios
import axios from 'axios';

Di dalam function component Register, pertama-tama kita membuat definisi state baru, dimana state ini yang nanti akan digunakan untuk menampung data yang di inputkan di dalam form.

//define state
const [name, setName] = useState("");
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const [passwordConfirmation, setPasswordConfirmation] = useState("");

Kemudian, kita juga membuat 1 state lagi yang nanti akan digunakan untuk menyimpan error response validasi dari Rest API.

//define state validation
const [validation, setValidation] = useState([]);

Setelah itu. kita buat method baru dengan nama registerHanlder, method ini akan dijalankan apabila form disubmit.

<form onSubmit={registerHandler}>

	//...
	
</form>
//function "registerHanlder"
const registerHandler = async (e) => {
	
	//...
	
}

Di dalam method di atas, pertama kita melakukan inisialisasi formData terlebih dahulu. Ini akan kita gunakan untuk menampung data yang diinputkan di dalam form.

//initialize formData
const formData = new FormData();

Setelah itu, kita akan append atau assign data ke dalam formData, dimana data tersebut akan kita ambil dari state-state yang sudah kita buat di atas.

//append data to formData
formData.append('name', name);
formData.append('email', email);
formData.append('password', password);
formData.append('password_confirmation', passwordConfirmation);

INFORMASI : pada append formData, kita mempunyai 2 parameter. Parameter pertama berupa key dan parameter kedua berupa data value.

formData.append('key', 'value');

Kemudian kita kirimkan data di atas ke dalam server menggunakan Axios dengan method POST.

//send data to server
await axios.post(`${process.env.NEXT_PUBLIC_API_BACKEND}/api/register`, formData)

Dan jika berhasil, maka kita akan redirect atau arahkan ke dalam URL /login.

//redirect to logi page
Router.push('/login')

Dan apapbila gagal, maka kita akan assign error response validasi ke dalam state validation.

//assign error to state "validation"
setValidation(error.response.data);

Untuk mendapatkan value yang diinputkan di dalam form dan di simpan ke state, kurang lebih contohnya seperti berikut ini.

<input type="text" className="form-control" value={name} onChange={(e) => setName(e.target.value)} placeholder="Masukkan Nama Lengkap"/>

Di atas, kita menggunakan onChange dan kita assign value dari input ke dalam state, yaitu setName(e.target.value).

Dan untuk menampilkan validasi, kita bisa menggunakan kode seperti berkut ini :

{
   validation.name && (
       <div className="alert alert-danger">
          {validation.name[0]}
       </div>
   )
}

Di atas, kita buat kondisi, jika ada validation.name, maka kita akan menampilkan alert yang isinya adalah response dari Rest API.

Langkah 4 - Uji Coba Proses Register

INFORMASI : pastikan project Laravel-nya sudah dijalankan!.

Silahkan teman-teman klik button REGISTER yang ada pada navbar dan jika berhasil maka kita akan mendapatkan hasil seperti berikut ini.

Silahkan klik button REGISTER tanpa mengisi data apapun dan jika berhasil kita akan emndapatkan error validasi yang dikirimkan oleh Laravel.

Dan sekarang silahkan masukkan data yang teman-teman inginkan, jika berhasil kita akan mendapatkan hasil seperti berikut ini.

Di atas, kita sudah berhasil melakukan register dan jika diperhatikan kita diarahkan ke URL /login. Error di atas muncul karena kita memang belum memiliki route atau halaman .login dan kita akan membuatnya pada artikel selanjutnya.

Kurang lebih seperti itu bagaimana cara membuat proses register di Next.js dengan API yang ada di Laravel. Pada artikel selanjutnya kita akan belajar melakukan proses login dari data yang sudah kita register di atas.

Terima Kasih



Fika Ridaul Maulayya
Full-Stack Developer, Content Creator and CO-Founder SantriKoding.com

Suka dengan tulisan di SantriKoding? Kamu bisa memberikan dukungan dengan berdonasi atau bagikan konten ini di sosial media. Terima kasih atas dukungan Anda!

KEBIJAKAN KOMENTAR

Saat memberikan komenatar silahkan memberikan informasi lengkap tentang error, seperti: screenshot, link kode, dll. Baca aturan komentar kami