Vectrum
Sign In
34 lines · 1.2 KB · TypeScript
"use server";

import { redirect } from "next/navigation";
import { endSession, safeNext, startSession } from "@/lib/auth";
import { authenticateUser, createUser, UserError } from "@/lib/users";
import type { FormState } from "./types";

export async function signupAction(_prev: FormState, formData: FormData): Promise<FormState> {
  try {
    const user = await createUser({
      username: String(formData.get("username") ?? ""),
      email: String(formData.get("email") ?? ""),
      password: String(formData.get("password") ?? ""),
      name: String(formData.get("name") ?? ""),
    });
    await startSession(user.id);
  } catch (e) {
    if (e instanceof UserError) return { error: e.message };
    throw e;
  }
  redirect(safeNext(formData.get("next")));
}

export async function loginAction(_prev: FormState, formData: FormData): Promise<FormState> {
  const user = await authenticateUser(String(formData.get("login") ?? ""), String(formData.get("password") ?? ""));
  if (!user) return { error: "Incorrect username or password." };
  await startSession(user.id);
  redirect(safeNext(formData.get("next")));
}

export async function logoutAction() {
  await endSession();
  redirect("/");
}