"use server"; import { revalidatePath } from "next/cache"; import { redirect } from "next/navigation"; import { api, unwrap } from "@/lib/api"; import { attempt, field, type ActionState } from "@/lib/actions"; const rating = (form: FormData) => (field(form, "rating") === "adult" ? ("adult" as const) : ("general" as const)); /** Makes a hosted room, then goes back to the list. */ export async function createRoom(_: ActionState, form: FormData): Promise { const state = await attempt(async () => { unwrap( await api["hosted-rooms"].post({ name: field(form, "name"), description: field(form, "description"), roomPid: Number(field(form, "roomPid")), rating: rating(form), maxUsers: Number(field(form, "maxUsers")), imvuId: Number(field(form, "imvuId")), }), ); revalidatePath("/rooms"); }); if (state?.error) return state; redirect("/rooms"); } /** The owner's changes to a room. */ export async function saveRoom(_: ActionState, form: FormData): Promise { const n = field(form, "n"); const state = await attempt(async () => { unwrap( await api["hosted-rooms"]({ n }).patch({ name: field(form, "name"), description: field(form, "description"), roomPid: Number(field(form, "roomPid")), rating: rating(form), maxUsers: Number(field(form, "maxUsers")), }), ); revalidatePath("/rooms"); }); if (state?.error) return state; redirect("/rooms"); } /** Closes a room: everyone in it is sent out. */ export async function closeRoom(_: ActionState, form: FormData): Promise { const n = field(form, "n"); const state = await attempt(async () => { unwrap(await api["hosted-rooms"]({ n }).delete()); revalidatePath("/rooms"); }); if (state?.error) return state; redirect("/rooms"); }