Dokumentasi using useActionState
// action.js
"use server";
export async function loginAction(prevData, formData) {
const data = {
id_user: formData.get("id_user"),
password: formData.get("password"),
};
const req = await fetch("https://demo4.zakialawi.my.id/api/auth/login", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(data),
});
const res = await req.json();
if (req.ok) {
return res;
} else {
return {
...res,
data: {
id_user: data.id_user,
},
};
}
}
// page.jsx
"use client";
import { loginAction } from "../action";
import { useActionState } from "react";
const initialState = {
data: {
id_user: "",
password: "",
},
message: "",
success: null,
};
export default function LoginPage() {
const [state, formAction, pending] = useActionState(loginAction, initialState);
** can add useEffect here for showing message or something with state depends **
<form action={formAction}>
<div className="space-y-4">
<div className="space-y-2">
<Label htmlFor="id_user">Email/Username</Label>
<Input
id="id_user"
type="text"
name="id_user"
defaultValue={state?.data?.id_user}
placeholder="you@example.com"
disabled={pending}
required
/>
</div>
<div className="space-y-2">
<Label htmlFor="password">Password</Label>
<Input id="password" type="password" name="password" disabled={pending} required />
</div>
</div>
<Button type="submit" className="w-full mt-4" disabled={pending}>
Sign In
</Button>
</form>