refactor(rmeets): remove /room/ prefix from meeting URLs

/rmeets/jeff now opens a room directly instead of requiring /rmeets/room/jeff.
Catch-all /:room route registered last so /meet, /recordings, /search still work.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Jeff Emmett 2026-03-31 11:17:42 -07:00
parent 7faaa5c977
commit 0519e113b6
1 changed files with 34 additions and 36 deletions

View File

@ -99,39 +99,6 @@ const MI_STYLES = `<style>
@media(max-width:600px){.mi-page{margin:1rem auto;padding:0 .75rem}.mi-cards{grid-template-columns:1fr}}
</style>`;
// ── Room embed ──
routes.get("/room/:room", (c) => {
const space = c.req.param("space") || "demo";
const room = c.req.param("room");
const director = c.req.query("director") === "1";
const sessionId = c.req.query("session") || "";
// Use Jitsi External API by default (cleaner toolbar, no stray close buttons).
// Pass ?iframe=1 to fall back to raw iframe embed.
if (c.req.query("iframe") === "1") {
return c.html(renderExternalAppShell({
title: `${room} — rMeets | rSpace`,
moduleId: "rmeets",
spaceSlug: space,
modules: getModuleInfoList(),
appUrl: `${JITSI_URL}/${encodeURIComponent(room)}`,
appName: "Jitsi Meet",
theme: "dark",
}));
}
return c.html(renderShell({
title: `${room} — rMeets | rSpace`,
moduleId: "rmeets",
spaceSlug: space,
modules: getModuleInfoList(),
theme: "dark",
body: `<folk-jitsi-room room="${escapeHtml(room)}" jitsi-url="${escapeHtml(JITSI_URL)}" space="${escapeHtml(space)}"${director ? ` director="1" session="${escapeHtml(sessionId)}"` : ""}></folk-jitsi-room>`,
scripts: `<script type="module" src="/modules/rmeets/components/folk-jitsi-room.js?v=2"></script>`,
}));
});
// ── Direct Jitsi lobby ──
routes.get("/meet", (c) => {
@ -437,14 +404,14 @@ routes.get("/", (c) => {
<h1>rMeets</h1>
<p>Video meetings powered by Jitsi no account required</p>
<nav class="rs-nav">
<a href="${base}/room/${randomId}">
<a href="${base}/${randomId}">
<span class="nav-icon">&#128640;</span>
<div class="nav-body">
<h3>Quick Meet</h3>
<p>Start an instant meeting with a random room name</p>
</div>
</a>
<form class="room-form" onsubmit="event.preventDefault();var n=this.querySelector('input').value.trim();if(n)location.href='${base}/room/'+encodeURIComponent(n)">
<form class="room-form" onsubmit="event.preventDefault();var n=this.querySelector('input').value.trim();if(n)location.href='${base}/'+encodeURIComponent(n)">
<span class="nav-icon">&#128279;</span>
<div class="nav-body">
<h3>Join a Room</h3>
@ -479,6 +446,37 @@ routes.get("/", (c) => {
}));
});
// ── Room embed (catch-all — must be LAST so /meet, /recordings, /search match first) ──
routes.get("/:room", (c) => {
const space = c.req.param("space") || "demo";
const room = c.req.param("room");
const director = c.req.query("director") === "1";
const sessionId = c.req.query("session") || "";
if (c.req.query("iframe") === "1") {
return c.html(renderExternalAppShell({
title: `${room} — rMeets | rSpace`,
moduleId: "rmeets",
spaceSlug: space,
modules: getModuleInfoList(),
appUrl: `${JITSI_URL}/${encodeURIComponent(room)}`,
appName: "Jitsi Meet",
theme: "dark",
}));
}
return c.html(renderShell({
title: `${room} — rMeets | rSpace`,
moduleId: "rmeets",
spaceSlug: space,
modules: getModuleInfoList(),
theme: "dark",
body: `<folk-jitsi-room room="${escapeHtml(room)}" jitsi-url="${escapeHtml(JITSI_URL)}" space="${escapeHtml(space)}"${director ? ` director="1" session="${escapeHtml(sessionId)}"` : ""}></folk-jitsi-room>`,
scripts: `<script type="module" src="/modules/rmeets/components/folk-jitsi-room.js?v=2"></script>`,
}));
});
// ── Helpers ──
function formatTimestamp(seconds: number): string {
@ -505,7 +503,7 @@ export const meetsModule: RSpaceModule = {
{ path: "rooms", name: "Rooms", icon: "🚪", description: "Meeting rooms and video calls" },
],
onboardingActions: [
{ label: "Start a Meeting", icon: "🚀", description: "Jump into an instant video call", type: "create", href: "/{space}/rmeets/room/quick" },
{ label: "Start a Meeting", icon: "🚀", description: "Jump into an instant video call", type: "create", href: "/{space}/rmeets/quick" },
{ label: "View Recordings", icon: "🎥", description: "Browse past meetings with transcripts and AI summaries", type: "link", href: "/{space}/rmeets/recordings" },
],
};