fix: rApp shapes auto-derive space context and load as applets directly

- folk-rapp now auto-derives spaceSlug from the current URL path
  (/{space}/canvas → space) so embedded rApps always know their space
- Fixed race condition where createRenderRoot overwrote moduleId
  that was already set via JS property setter (showed picker instead
  of loading the module directly)
- newShapeElement always passes communitySlug as fallback spaceSlug
  when restoring folk-rapp shapes from sync

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Jeff Emmett 2026-02-27 16:12:55 -08:00
parent 0c00a69d8a
commit 09d23f8fc1
2 changed files with 15 additions and 4 deletions

View File

@ -340,8 +340,15 @@ export class FolkRApp extends FolkShape {
override createRenderRoot() {
const root = super.createRenderRoot();
this.#moduleId = this.getAttribute("module-id") || "";
this.#spaceSlug = this.getAttribute("space-slug") || "";
// Prefer JS-set properties (from newShape props); fall back to HTML attributes
if (!this.#moduleId) this.#moduleId = this.getAttribute("module-id") || "";
if (!this.#spaceSlug) this.#spaceSlug = this.getAttribute("space-slug") || "";
// Auto-derive spaceSlug from current URL if not explicitly provided (/{space}/canvas → space)
if (!this.#spaceSlug) {
const pathParts = window.location.pathname.split("/").filter(Boolean);
if (pathParts.length >= 1) this.#spaceSlug = pathParts[0];
}
const meta = MODULE_META[this.#moduleId];
const headerColor = meta?.color || "#475569";
@ -530,7 +537,11 @@ export class FolkRApp extends FolkShape {
</div>
`;
// Create iframe
// Auto-derive space from URL if still missing
if (!this.#spaceSlug) {
const pathParts = window.location.pathname.split("/").filter(Boolean);
if (pathParts.length >= 1) this.#spaceSlug = pathParts[0];
}
const space = this.#spaceSlug || "demo";
const iframeUrl = `/${space}/${this.#moduleId}`;

View File

@ -1395,7 +1395,7 @@
case "folk-rapp":
shape = document.createElement("folk-rapp");
if (data.moduleId) shape.moduleId = data.moduleId;
if (data.spaceSlug) shape.spaceSlug = data.spaceSlug;
shape.spaceSlug = data.spaceSlug || communitySlug;
break;
case "folk-feed":
shape = document.createElement("folk-feed");