Redesign WatchLink application UI
All checks were successful
Template Compliance / compliance (push) Successful in 5s
Build / build (push) Successful in 12m36s
Release Dry Run / release-dry-run (push) Successful in 1m33s

This commit is contained in:
MrSphay
2026-05-15 20:13:29 +02:00
parent cea591b587
commit 9fbd79c7ef
22 changed files with 2370 additions and 533 deletions

53
src/lib/room-actions.ts Normal file
View 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)}`);
}