Redesign WatchLink application UI
This commit is contained in:
53
src/lib/room-actions.ts
Normal file
53
src/lib/room-actions.ts
Normal file
@@ -0,0 +1,53 @@
|
||||
"use server";
|
||||
|
||||
import { RoomVisibility } from "@prisma/client";
|
||||
import { revalidatePath } from "next/cache";
|
||||
import { redirect } from "next/navigation";
|
||||
import { prisma } from "./prisma";
|
||||
import { requireCurrentUser } from "./session";
|
||||
|
||||
function normalizeSlug(value: string) {
|
||||
return value
|
||||
.trim()
|
||||
.toLowerCase()
|
||||
.replace(/[^a-z0-9_-]+/g, "-")
|
||||
.replace(/^-+|-+$/g, "")
|
||||
.slice(0, 48);
|
||||
}
|
||||
|
||||
export async function createRoom(formData: FormData) {
|
||||
const user = await requireCurrentUser();
|
||||
const name = String(formData.get("name") || "").trim();
|
||||
const visibility = String(formData.get("visibility") || "FRIENDS");
|
||||
const baseSlug = normalizeSlug(name);
|
||||
|
||||
if (!name || !baseSlug) {
|
||||
redirect("/rooms?error=invalid-room");
|
||||
}
|
||||
|
||||
let slug = baseSlug;
|
||||
let suffix = 2;
|
||||
while (await prisma.room.findUnique({ where: { slug }, select: { id: true } })) {
|
||||
slug = `${baseSlug}-${suffix}`;
|
||||
suffix += 1;
|
||||
}
|
||||
|
||||
const allowedVisibility: RoomVisibility[] = ["PUBLIC", "FRIENDS", "EXPLICIT", "ROLE_RESTRICTED"];
|
||||
const roomVisibility = allowedVisibility.includes(visibility as RoomVisibility)
|
||||
? (visibility as RoomVisibility)
|
||||
: "FRIENDS";
|
||||
|
||||
const room = await prisma.room.create({
|
||||
data: {
|
||||
name,
|
||||
slug,
|
||||
ownerId: user.id,
|
||||
visibility: roomVisibility
|
||||
},
|
||||
select: { slug: true }
|
||||
});
|
||||
|
||||
revalidatePath("/rooms");
|
||||
revalidatePath("/dashboard");
|
||||
redirect(`/rooms/${encodeURIComponent(room.slug)}`);
|
||||
}
|
||||
Reference in New Issue
Block a user