feat: add path-based community routing under subdomain namespaces
cca.rspace.online/campaign/demo now loads the campaign-demo community. Path segments are joined with hyphens to derive the slug. Subdomain acts as a brand namespace; root path still loads the subdomain slug. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
533ce89cea
commit
73aee64401
|
|
@ -210,10 +210,24 @@ const server = Bun.serve<WSData>({
|
||||||
}
|
}
|
||||||
|
|
||||||
// Community canvas route (subdomain detected)
|
// Community canvas route (subdomain detected)
|
||||||
|
// Supports path-based slugs: cca.rspace.online/campaign/demo → slug "campaign-demo"
|
||||||
if (subdomain) {
|
if (subdomain) {
|
||||||
const community = await loadCommunity(subdomain);
|
const pathSegments = url.pathname.split("/").filter(Boolean);
|
||||||
|
|
||||||
|
// Derive slug: path segments joined with "-", or subdomain if at root
|
||||||
|
const slug = pathSegments.length > 0 ? pathSegments.join("-") : subdomain;
|
||||||
|
|
||||||
|
const community = await loadCommunity(slug);
|
||||||
if (!community) {
|
if (!community) {
|
||||||
return new Response("Community not found", { status: 404 });
|
// Path slug not found — fall back to subdomain slug if path was given
|
||||||
|
if (pathSegments.length > 0) {
|
||||||
|
const fallback = await loadCommunity(subdomain);
|
||||||
|
if (!fallback) {
|
||||||
|
return new Response("Community not found", { status: 404 });
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return new Response("Community not found", { status: 404 });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Serve canvas.html for community
|
// Serve canvas.html for community
|
||||||
|
|
|
||||||
|
|
@ -343,11 +343,22 @@
|
||||||
FolkSocialPost.define();
|
FolkSocialPost.define();
|
||||||
|
|
||||||
// Get community info from URL
|
// Get community info from URL
|
||||||
|
// Supports path-based slugs: cca.rspace.online/campaign/demo → slug "campaign-demo"
|
||||||
const hostname = window.location.hostname;
|
const hostname = window.location.hostname;
|
||||||
const subdomain = hostname.split(".")[0];
|
const subdomain = hostname.split(".")[0];
|
||||||
const isLocalhost = hostname === "localhost" || hostname === "127.0.0.1";
|
const isLocalhost = hostname === "localhost" || hostname === "127.0.0.1";
|
||||||
const urlParams = new URLSearchParams(window.location.search);
|
const urlParams = new URLSearchParams(window.location.search);
|
||||||
const communitySlug = urlParams.get("space") || (isLocalhost ? "demo" : subdomain);
|
|
||||||
|
const pathSegments = window.location.pathname.split("/").filter(Boolean);
|
||||||
|
const ignorePaths = ["canvas", "settings", "api"];
|
||||||
|
const cleanSegments = pathSegments.filter(s => !ignorePaths.includes(s));
|
||||||
|
|
||||||
|
let communitySlug = urlParams.get("space");
|
||||||
|
if (!communitySlug && cleanSegments.length > 0) {
|
||||||
|
communitySlug = cleanSegments.join("-");
|
||||||
|
} else if (!communitySlug) {
|
||||||
|
communitySlug = isLocalhost ? "demo" : subdomain;
|
||||||
|
}
|
||||||
|
|
||||||
// Update UI
|
// Update UI
|
||||||
document.getElementById("community-name").textContent = communitySlug;
|
document.getElementById("community-name").textContent = communitySlug;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue