You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
1.1 KiB
TypeScript
51 lines
1.1 KiB
TypeScript
"use server";
|
|
|
|
import { headers } from "next/headers";
|
|
import { redirect } from "next/navigation";
|
|
import { isAPIError } from "better-auth/api";
|
|
import { z } from "zod";
|
|
import { auth } from "@/lib/auth";
|
|
|
|
const loginSchema = z.object({
|
|
username: z.string().trim().min(1, "Username wajib diisi"),
|
|
password: z.string().min(1, "Password wajib diisi"),
|
|
});
|
|
|
|
export type LoginState = {
|
|
error?: string;
|
|
username?: string;
|
|
};
|
|
|
|
export async function login(
|
|
_prevState: LoginState,
|
|
formData: FormData,
|
|
): Promise<LoginState> {
|
|
const parsed = loginSchema.safeParse({
|
|
username: formData.get("username"),
|
|
password: formData.get("password"),
|
|
});
|
|
if (!parsed.success) {
|
|
return {
|
|
error: parsed.error.issues[0].message,
|
|
username: String(formData.get("username") ?? ""),
|
|
};
|
|
}
|
|
|
|
try {
|
|
await auth.api.signInUsername({
|
|
body: parsed.data,
|
|
headers: await headers(),
|
|
});
|
|
} catch (error) {
|
|
if (isAPIError(error)) {
|
|
return {
|
|
error: "Username atau password salah",
|
|
username: parsed.data.username,
|
|
};
|
|
}
|
|
throw error;
|
|
}
|
|
|
|
redirect("/");
|
|
}
|