From 48400c7d8cbc85be1f162aa35aff0435934092b5 Mon Sep 17 00:00:00 2001 From: CODEX Date: Tue, 23 Jun 2026 14:08:12 +0300 Subject: [PATCH] Fix authenticated BIM share promotion --- frontend/dcViewer.css | 8 ++++++- frontend/dcViewer.js | 39 +++++++++++++++++++++++++++++----- frontend/index.html | 7 +++++++ server/index.js | 49 +++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 95 insertions(+), 8 deletions(-) diff --git a/frontend/dcViewer.css b/frontend/dcViewer.css index 3320b54..4e9f48c 100644 --- a/frontend/dcViewer.css +++ b/frontend/dcViewer.css @@ -3220,11 +3220,17 @@ header { } body[data-viewer-mode="guest"] .tb-btn:not([data-action="measure"]):not([data-action="section"]):not([data-action="projection"]), +html[data-share-startup="guest"] body:not([data-viewer-mode="standard"]) .tb-btn:not([data-action="measure"]):not([data-action="section"]):not([data-action="projection"]), body[data-viewer-mode="guest"] #settingsPanel, +html[data-share-startup="guest"] body:not([data-viewer-mode="standard"]) #settingsPanel, body[data-viewer-mode="guest"] #templatesPanel, +html[data-share-startup="guest"] body:not([data-viewer-mode="standard"]) #templatesPanel, body[data-viewer-mode="guest"] #projectNameSection, +html[data-share-startup="guest"] body:not([data-viewer-mode="standard"]) #projectNameSection, body[data-viewer-mode="guest"] #saveProjectSection, -body[data-viewer-mode="guest"] #modelVersionUploadButton { +html[data-share-startup="guest"] body:not([data-viewer-mode="standard"]) #saveProjectSection, +body[data-viewer-mode="guest"] #modelVersionUploadButton, +html[data-share-startup="guest"] body:not([data-viewer-mode="standard"]) #modelVersionUploadButton { display: none !important; } diff --git a/frontend/dcViewer.js b/frontend/dcViewer.js index 172c51d..6f0cdbb 100644 --- a/frontend/dcViewer.js +++ b/frontend/dcViewer.js @@ -184,6 +184,7 @@ const AUTH_SESSION_API = "/api/auth/session"; const SHARES_API = "/api/shares"; const COMMENTS_API = "/api/comments"; const UPLOAD_VERSIONS_API = "/api/uploads/versions"; +const SHARE_AUTH_GUEST_PARAM = "ndc_bim_guest"; const SHARE_PROMOTION_TIMEOUT_MS = 4500; const acceptByType = { @@ -624,13 +625,39 @@ const getShareTokenFromPath = () => { const getCurrentReturnPath = () => `${window.location.pathname}${window.location.search || ""}${window.location.hash || ""}`; const getShareTopLevelPromotionUrl = () => { - const promoteUrl = startupSharePayload?.promoteUrl; + const promoteUrl = startupSharePayload?.optionalPromoteUrl || startupSharePayload?.promoteUrl; return typeof promoteUrl === "string" && promoteUrl.trim() ? promoteUrl : ""; }; +const hasShareGuestAuthMarker = () => { + try { + return new URLSearchParams(window.location.search || "").get(SHARE_AUTH_GUEST_PARAM) === "1"; + } catch (_) { + return false; + } +}; + +const clearShareGuestAuthMarker = () => { + if (!hasShareGuestAuthMarker()) return; + try { + const url = new URL(window.location.href); + url.searchParams.delete(SHARE_AUTH_GUEST_PARAM); + window.history.replaceState(window.history.state, "", `${url.pathname}${url.search}${url.hash}`); + } catch (_) { + // keep current URL if the History API is unavailable + } +}; + const scheduleShareSessionPromotion = (shareToken) => { const silentPromoteUrl = startupSharePayload?.silentPromoteUrl; - if (!shareToken || viewerMode !== "guest" || runtimeSessionInfo.authenticated || typeof silentPromoteUrl !== "string" || !silentPromoteUrl.trim()) { + if ( + !shareToken || + hasShareGuestAuthMarker() || + viewerMode !== "guest" || + runtimeSessionInfo.authenticated || + typeof silentPromoteUrl !== "string" || + !silentPromoteUrl.trim() + ) { return; } let storageKey = ""; @@ -1810,6 +1837,7 @@ const applyRuntimeMode = () => { const initializeRuntimeMode = async () => { const shareToken = getShareTokenFromPath(); + const shareGuestAuthMarker = hasShareGuestAuthMarker(); if (shareToken) { viewerMode = "guest"; inspectorCollapsed = true; @@ -1849,7 +1877,8 @@ const initializeRuntimeMode = async () => { } applyRuntimeMode(); - if (shareToken && viewerMode === "guest") { + clearShareGuestAuthMarker(); + if (shareToken && viewerMode === "guest" && !shareGuestAuthMarker) { scheduleShareSessionPromotion(shareToken); } }; @@ -5182,13 +5211,13 @@ const applyViewerState = (state) => { }; const initViewer = async () => { - // remove preload hidden style ASAP + await initializeRuntimeMode(); + const preloadHidden = document.getElementById("preload-hidden"); if (preloadHidden) { preloadHidden.remove(); } document.body.style.opacity = "1"; - await initializeRuntimeMode(); const sdk = await import(SDK_URL); sdkRef = sdk; diff --git a/frontend/index.html b/frontend/index.html index eb38494..5bc6142 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -13,6 +13,13 @@ +