diff --git a/web/src/pages/app/modules/preview.ts b/web/src/pages/app/modules/preview.ts index 1a4dcf3..b569517 100644 --- a/web/src/pages/app/modules/preview.ts +++ b/web/src/pages/app/modules/preview.ts @@ -64,6 +64,14 @@ export type PreviewImportScenePayload = { selectedCraftPlayData: P_OPERATION | null; }; +type ParentImportScenePayload = { + model: Pick; + modelUrl: string; + basePointEnabled: boolean; + basePoint: PreviewResolvedBasePoint; + rawOperationTree: string; +}; + export type ModelPreviewOptions = { onImportScene?: (payload: PreviewImportScenePayload) => Promise | void; }; @@ -214,6 +222,43 @@ export function createImportScenePayload(options: { export function emitImportScenePayload(payload: PreviewImportScenePayload) { window.dispatchEvent(new CustomEvent("dmt:import-scene", { detail: payload })); + if (window.parent && window.parent !== window) { + try { + window.parent.postMessage({ + type: "DMT_MODEL_LIBRARY_IMPORT_SCENE", + payload: buildParentImportScenePayload(payload) + }, resolveParentOrigin()); + } catch (error) { + notifyError(error); + } + } +} + +function buildParentImportScenePayload(payload: PreviewImportScenePayload): ParentImportScenePayload { + return { + model: { + id: payload.model.id, + name: payload.model.name, + original_filename: payload.model.original_filename, + file_url: payload.model.file_url + }, + modelUrl: payload.modelUrl, + basePointEnabled: payload.basePointEnabled, + basePoint: payload.basePoint, + rawOperationTree: payload.rawOperationTree + }; +} + +function resolveParentOrigin() { + try { + const meta = import.meta as ImportMeta & { env?: Record }; + const configuredOrigin = meta.env?.VITE_DMT_PARENT_ORIGIN; + if (configuredOrigin) return configuredOrigin; + if (document.referrer) return new URL(document.referrer).origin; + } catch { + return "*"; + } + return "*"; } function parseModelOperations(value: string): PreviewOperation[] {