diff --git a/modules/rcal/components/folk-calendar-view.ts b/modules/rcal/components/folk-calendar-view.ts index 731541d..e94619b 100644 --- a/modules/rcal/components/folk-calendar-view.ts +++ b/modules/rcal/components/folk-calendar-view.ts @@ -354,8 +354,8 @@ class FolkCalendarView extends HTMLElement { private getApiBase(): string { // When on the rcal page directly, extract from URL - const match = window.location.pathname.match(/^\/([^/]+)\/rcal/); - if (match) return `/${match[1]}/rcal`; + const match = window.location.pathname.match(/^(\/[^/]+)?\/rcal/); + if (match) return match[0]; // When embedded as a canvas shape, use the space attribute if (this.space) return `/${this.space}/rcal`; return ""; diff --git a/modules/rcart/components/folk-cart-shop.ts b/modules/rcart/components/folk-cart-shop.ts index 1907b6c..d3b95c1 100644 --- a/modules/rcart/components/folk-cart-shop.ts +++ b/modules/rcart/components/folk-cart-shop.ts @@ -183,10 +183,9 @@ class FolkCartShop extends HTMLElement { } private getApiBase(): string { - const match = window.location.pathname.match(/^\/([^/]+)\/rcart/); - if (match) return `/${match[1]}/rcart`; - if (this.space) return `/${this.space}/rcart`; - return "/demo/rcart"; + const path = window.location.pathname; + const match = path.match(/^(\/[^/]+)?\/rcart/); + return match ? match[0] : "/rcart"; } private async loadData() { diff --git a/modules/rchoices/components/folk-choices-dashboard.ts b/modules/rchoices/components/folk-choices-dashboard.ts index 038f01f..034656e 100644 --- a/modules/rchoices/components/folk-choices-dashboard.ts +++ b/modules/rchoices/components/folk-choices-dashboard.ts @@ -42,10 +42,9 @@ class FolkChoicesDashboard extends HTMLElement { } private getApiBase(): string { - const match = window.location.pathname.match(/^\/([^/]+)\/rchoices/); - if (match) return `/${match[1]}/rchoices`; - if (this.space) return `/${this.space}/rchoices`; - return "/demo/rchoices"; + const path = window.location.pathname; + const match = path.match(/^(\/[^/]+)?\/rchoices/); + return match ? match[0] : "/rchoices"; } private async loadChoices() { diff --git a/modules/rfiles/components/folk-file-browser.ts b/modules/rfiles/components/folk-file-browser.ts index 545349c..11c6ebc 100644 --- a/modules/rfiles/components/folk-file-browser.ts +++ b/modules/rfiles/components/folk-file-browser.ts @@ -160,10 +160,9 @@ class FolkFileBrowser extends HTMLElement { } private getApiBase(): string { - const match = window.location.pathname.match(/^\/([^/]+)\/rfiles/); - if (match) return `/${match[1]}/rfiles`; - if (this.space) return `/${this.space}/rfiles`; - return ""; + const path = window.location.pathname; + const match = path.match(/^(\/[^/]+)?\/rfiles/); + return match ? match[0] : ""; } private formatSize(bytes: number): string { diff --git a/modules/rforum/components/folk-forum-dashboard.ts b/modules/rforum/components/folk-forum-dashboard.ts index cafff7a..778f2a7 100644 --- a/modules/rforum/components/folk-forum-dashboard.ts +++ b/modules/rforum/components/folk-forum-dashboard.ts @@ -42,10 +42,9 @@ class FolkForumDashboard extends HTMLElement { } private getApiBase(): string { - const match = window.location.pathname.match(/^\/([^/]+)\/rforum/); - if (match) return `/${match[1]}/rforum`; - if (this.space) return `/${this.space}/rforum`; - return ""; + const path = window.location.pathname; + const match = path.match(/^(\/[^/]+)?\/rforum/); + return match ? match[0] : ""; } private getAuthHeaders(): Record { diff --git a/modules/rfunds/components/folk-funds-app.ts b/modules/rfunds/components/folk-funds-app.ts index 0ba70a8..de74c26 100644 --- a/modules/rfunds/components/folk-funds-app.ts +++ b/modules/rfunds/components/folk-funds-app.ts @@ -131,10 +131,10 @@ class FolkFundsApp extends HTMLElement { } private getApiBase(): string { - const match = window.location.pathname.match(/^\/([^/]+)\/rfunds/); - if (match) return `/${match[1]}/rfunds`; - if (this.space) return `/${this.space}/rfunds`; - return ""; + const path = window.location.pathname; + // Subdomain: /rfunds/... or Direct: /{space}/rfunds/... + const match = path.match(/^(\/[^/]+)?\/rfunds/); + return match ? `${match[0]}` : ""; } private async loadFlows() { @@ -222,7 +222,7 @@ class FolkFundsApp extends HTMLElement { // ─── Landing page ────────────────────────────────────── private renderLanding(): string { - const demoUrl = this.getApiBase() ? `${this.getApiBase().replace(/\/funds$/, "")}/funds/demo` : "/demo"; + const demoUrl = this.getApiBase() ? `${this.getApiBase()}/demo` : "/rfunds/demo"; const authed = isAuthenticated(); const username = getUsername(); @@ -326,8 +326,8 @@ class FolkFundsApp extends HTMLElement { private renderFlowCard(f: FlowSummary): string { const detailUrl = this.getApiBase() - ? `${this.getApiBase().replace(/\/funds$/, "")}/funds/flow/${encodeURIComponent(f.id)}` - : `/flow/${encodeURIComponent(f.id)}`; + ? `${this.getApiBase()}/flow/${encodeURIComponent(f.id)}` + : `/rfunds/flow/${encodeURIComponent(f.id)}`; const value = f.totalValue != null ? `$${Math.floor(f.totalValue).toLocaleString()}` : ""; return ` @@ -346,8 +346,8 @@ class FolkFundsApp extends HTMLElement { private renderDetail(): string { const backUrl = this.getApiBase() - ? `${this.getApiBase().replace(/\/funds$/, "")}/funds/` - : "/"; + ? `${this.getApiBase()}/` + : "/rfunds/"; return `
@@ -2269,8 +2269,8 @@ class FolkFundsApp extends HTMLElement { // Navigate to the new flow if (flowId) { const detailUrl = this.getApiBase() - ? `${this.getApiBase().replace(/\/funds$/, "")}/funds/flow/${encodeURIComponent(flowId)}` - : `/flow/${encodeURIComponent(flowId)}`; + ? `${this.getApiBase()}/flow/${encodeURIComponent(flowId)}` + : `/rfunds/flow/${encodeURIComponent(flowId)}`; window.location.href = detailUrl; return; } diff --git a/modules/rmaps/components/folk-map-viewer.ts b/modules/rmaps/components/folk-map-viewer.ts index a5ac8e0..d6575fe 100644 --- a/modules/rmaps/components/folk-map-viewer.ts +++ b/modules/rmaps/components/folk-map-viewer.ts @@ -773,10 +773,9 @@ class FolkMapViewer extends HTMLElement { } private getApiBase(): string { - const match = window.location.pathname.match(/^\/([^/]+)\/rmaps/); - if (match) return `/${match[1]}/rmaps`; - if (this.space) return `/${this.space}/rmaps`; - return ""; + const path = window.location.pathname; + const match = path.match(/^(\/[^/]+)?\/rmaps/); + return match ? match[0] : ""; } private async checkSyncHealth() { diff --git a/modules/rnetwork/components/folk-graph-viewer.ts b/modules/rnetwork/components/folk-graph-viewer.ts index c2a3ea5..961a1fa 100644 --- a/modules/rnetwork/components/folk-graph-viewer.ts +++ b/modules/rnetwork/components/folk-graph-viewer.ts @@ -106,10 +106,9 @@ class FolkGraphViewer extends HTMLElement { } private getApiBase(): string { - const match = window.location.pathname.match(/^\/([^/]+)\/rnetwork/); - if (match) return `/${match[1]}/rnetwork`; - if (this.space) return `/${this.space}/rnetwork`; - return ""; + const path = window.location.pathname; + const match = path.match(/^(\/[^/]+)?\/rnetwork/); + return match ? match[0] : ""; } private async loadData() { diff --git a/modules/rnotes/components/folk-notes-app.ts b/modules/rnotes/components/folk-notes-app.ts index 42be989..d80a5a7 100644 --- a/modules/rnotes/components/folk-notes-app.ts +++ b/modules/rnotes/components/folk-notes-app.ts @@ -632,10 +632,9 @@ Gear: EUR 400 (10%)

Maya is tracking expenses in rF // ── REST (notebook list + search) ── private getApiBase(): string { - const match = window.location.pathname.match(/^\/([^/]+)\/rnotes/); - if (match) return `/${match[1]}/rnotes`; - if (this.space) return `/${this.space}/rnotes`; - return ""; + const path = window.location.pathname; + const match = path.match(/^(\/[^/]+)?\/rnotes/); + return match ? match[0] : ""; } private async loadNotebooks() { diff --git a/modules/rphotos/components/folk-photo-gallery.ts b/modules/rphotos/components/folk-photo-gallery.ts index c20c501..04bdc66 100644 --- a/modules/rphotos/components/folk-photo-gallery.ts +++ b/modules/rphotos/components/folk-photo-gallery.ts @@ -113,12 +113,12 @@ class FolkPhotoGallery extends HTMLElement { private getApiBase(): string { const path = window.location.pathname; - const match = path.match(/^\/([^/]+)\/rphotos/); - return match ? `/${match[1]}/rphotos` : ""; + const match = path.match(/^(\/[^/]+)?\/rphotos/); + return match ? match[0] : ""; } private getImmichUrl(): string { - return `/${this.space}/rphotos/album`; + return `${this.getApiBase()}/album`; } private async loadGallery() { diff --git a/modules/rswag/components/folk-swag-designer.ts b/modules/rswag/components/folk-swag-designer.ts index 8c26b9e..781c134 100644 --- a/modules/rswag/components/folk-swag-designer.ts +++ b/modules/rswag/components/folk-swag-designer.ts @@ -183,10 +183,9 @@ class FolkSwagDesigner extends HTMLElement { } private getApiBase(): string { - const match = window.location.pathname.match(/^\/([^/]+)\/rswag/); - if (match) return `/${match[1]}/rswag`; - if (this.space) return `/${this.space}/rswag`; - return "/demo/rswag"; + const path = window.location.pathname; + const match = path.match(/^(\/[^/]+)?\/rswag/); + return match ? match[0] : "/rswag"; } private getDemoProduct(): DemoProduct { diff --git a/modules/rtrips/components/folk-route-planner.ts b/modules/rtrips/components/folk-route-planner.ts index 7a5ae19..74ce80c 100644 --- a/modules/rtrips/components/folk-route-planner.ts +++ b/modules/rtrips/components/folk-route-planner.ts @@ -41,10 +41,9 @@ class FolkRoutePlanner extends HTMLElement { } private getApiBase(): string { - const match = window.location.pathname.match(/^\/([^/]+)\/rtrips/); - if (match) return `/${match[1]}/rtrips`; - if (this.space) return `/${this.space}/rtrips`; - return "/demo/rtrips"; + const path = window.location.pathname; + const match = path.match(/^(\/[^/]+)?\/rtrips/); + return match ? match[0] : "/rtrips"; } private async fetchRoute(input: RouteInput): Promise { diff --git a/modules/rtrips/components/folk-trips-planner.ts b/modules/rtrips/components/folk-trips-planner.ts index 820c1d8..ccb12cc 100644 --- a/modules/rtrips/components/folk-trips-planner.ts +++ b/modules/rtrips/components/folk-trips-planner.ts @@ -291,10 +291,9 @@ class FolkTripsPlanner extends HTMLElement { } private getApiBase(): string { - const match = window.location.pathname.match(/^\/([^/]+)\/rtrips/); - if (match) return `/${match[1]}/rtrips`; - if (this.space) return `/${this.space}/rtrips`; - return ""; + const path = window.location.pathname; + const match = path.match(/^(\/[^/]+)?\/rtrips/); + return match ? match[0] : ""; } private async loadTrips() { diff --git a/modules/rvote/components/folk-vote-dashboard.ts b/modules/rvote/components/folk-vote-dashboard.ts index 1e58e4c..645200c 100644 --- a/modules/rvote/components/folk-vote-dashboard.ts +++ b/modules/rvote/components/folk-vote-dashboard.ts @@ -132,10 +132,9 @@ class FolkVoteDashboard extends HTMLElement { } private getApiBase(): string { - const match = window.location.pathname.match(/^\/([^/]+)\/rvote/); - if (match) return `/${match[1]}/rvote`; - if (this.space) return `/${this.space}/rvote`; - return ""; + const path = window.location.pathname; + const match = path.match(/^(\/[^/]+)?\/rvote/); + return match ? match[0] : ""; } private async loadSpaces() { diff --git a/modules/rwallet/components/folk-wallet-viewer.ts b/modules/rwallet/components/folk-wallet-viewer.ts index 0981ce3..83495c4 100644 --- a/modules/rwallet/components/folk-wallet-viewer.ts +++ b/modules/rwallet/components/folk-wallet-viewer.ts @@ -85,10 +85,9 @@ class FolkWalletViewer extends HTMLElement { } private getApiBase(): string { - const match = window.location.pathname.match(/^\/([^/]+)\/rwallet/); - if (match) return `/${match[1]}/rwallet`; - if (this.space) return `/${this.space}/rwallet`; - return ""; + const path = window.location.pathname; + const match = path.match(/^(\/[^/]+)?\/rwallet/); + return match ? match[0] : ""; } private async detectChains() { diff --git a/modules/rwork/components/folk-work-board.ts b/modules/rwork/components/folk-work-board.ts index c685db4..5af32d1 100644 --- a/modules/rwork/components/folk-work-board.ts +++ b/modules/rwork/components/folk-work-board.ts @@ -55,10 +55,9 @@ class FolkWorkBoard extends HTMLElement { } private getApiBase(): string { - const match = window.location.pathname.match(/^\/([^/]+)\/rwork/); - if (match) return `/${match[1]}/rwork`; - if (this.space) return `/${this.space}/rwork`; - return ""; + const path = window.location.pathname; + const match = path.match(/^(\/[^/]+)?\/rwork/); + return match ? match[0] : ""; } private async loadWorkspaces() {