diff --git a/www/app/[domain]/rooms/[roomName]/page.tsx b/www/app/[domain]/[roomName]/page.tsx similarity index 85% rename from www/app/[domain]/rooms/[roomName]/page.tsx rename to www/app/[domain]/[roomName]/page.tsx index 3d16e532..35ba3422 100644 --- a/www/app/[domain]/rooms/[roomName]/page.tsx +++ b/www/app/[domain]/[roomName]/page.tsx @@ -1,8 +1,8 @@ "use client"; import "@whereby.com/browser-sdk/embed"; -import { useCallback, useEffect, useRef } from "react"; -import useRoomMeeting from "../../rooms/useRoomMeeting"; +import { useRef } from "react"; +import useRoomMeeting from "./useRoomMeeting"; export type RoomDetails = { params: { diff --git a/www/app/[domain]/rooms/useRoomMeeting.tsx b/www/app/[domain]/[roomName]/useRoomMeeting.tsx similarity index 100% rename from www/app/[domain]/rooms/useRoomMeeting.tsx rename to www/app/[domain]/[roomName]/useRoomMeeting.tsx diff --git a/www/app/[domain]/rooms/page.tsx b/www/app/[domain]/rooms/page.tsx index 0ed6a119..219b035c 100644 --- a/www/app/[domain]/rooms/page.tsx +++ b/www/app/[domain]/rooms/page.tsx @@ -49,6 +49,8 @@ interface SelectOption extends OptionBase { value: string; } +const RESERVED_PATHS = ["browse", "rooms", "transcripts"]; + export default function RoomsList() { const { isOpen, onOpen, onClose } = useDisclosure(); const [room, setRoom] = useState({ @@ -63,6 +65,7 @@ export default function RoomsList() { const [page, setPage] = useState(1); const { loading, response, refetch } = useRoomList(page); const [streams, setStreams] = useState([]); + const [error, setError] = useState(""); const { zulip_streams } = useContext(DomainContext); @@ -99,7 +102,11 @@ export default function RoomsList() { const handleSaveRoom = async () => { try { - console.log(room); + if (RESERVED_PATHS.includes(room.name)) { + setError("This room name is reserved. Please choose another name."); + return; + } + if (isEditing) { await api?.v1RoomsUpdate({ roomId: editRoomId, @@ -128,8 +135,11 @@ export default function RoomsList() { }); setIsEditing(false); setEditRoomId(""); + setError(""); refetch(); - } catch (err) {} + } catch (err) { + console.error(err); + } onClose(); }; @@ -151,7 +161,9 @@ export default function RoomsList() { roomId, }); refetch(); - } catch (err) {} + } catch (err) { + console.error(err); + } }; const handleRoomChange = (e) => { @@ -161,6 +173,7 @@ export default function RoomsList() { .replace(/[^a-zA-Z0-9\s-]/g, "") .replace(/\s+/g, "-") .toLowerCase(); + setError(""); } setRoom({ ...room, @@ -197,6 +210,7 @@ export default function RoomsList() { zulipStream: "", zulipTopic: "", }); + setError(""); onOpen(); }} > @@ -219,6 +233,7 @@ export default function RoomsList() { No spaces or special characters allowed + {error && {error}} @@ -291,9 +306,7 @@ export default function RoomsList() { - - {roomData.name} - + {roomData.name} diff --git a/www/middleware.ts b/www/middleware.ts index 9b048676..a5f2bb96 100644 --- a/www/middleware.ts +++ b/www/middleware.ts @@ -9,7 +9,7 @@ export async function middleware(request: NextRequest) { if ( request.nextUrl.pathname.match( - "/((?!api|_next/static|_next/image|favicon.ico).*)", + "^/((?!api|_next/static|_next/image|favicon.ico).*)", ) ) { // Feature-flag protedted paths @@ -24,19 +24,11 @@ export async function middleware(request: NextRequest) { if (config.features.requireLogin) { const fiefMiddleware = await getFiefAuthMiddleware(request.nextUrl); const fiefResponse = await fiefMiddleware(request); - - if ( - request.nextUrl.pathname == "/" || - request.nextUrl.pathname.startsWith("/transcripts") || - request.nextUrl.pathname.startsWith("/browse") || - request.nextUrl.pathname.startsWith("/rooms") - ) { - if (!fiefResponse.headers.get("x-middleware-rewrite")) { - fiefResponse.headers.set( - "x-middleware-rewrite", - request.nextUrl.origin + "/" + domain + request.nextUrl.pathname, - ); - } + if (!fiefResponse.headers.get("x-middleware-rewrite")) { + fiefResponse.headers.set( + "x-middleware-rewrite", + request.nextUrl.origin + "/" + domain + request.nextUrl.pathname, + ); } return fiefResponse; }