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.

56 lines
1.2 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("/");
}
export async function logout() {
await auth.api.signOut({ headers: await headers() });
redirect("/login");
}