diff --git a/apps/mocksi-lite-next/src/pages/background/index.ts b/apps/mocksi-lite-next/src/pages/background/index.ts index da3affe..842295f 100644 --- a/apps/mocksi-lite-next/src/pages/background/index.ts +++ b/apps/mocksi-lite-next/src/pages/background/index.ts @@ -1,4 +1,9 @@ -import { AppEvents, AuthEvents, LayoutEvents } from "@pages/events"; +import { + AppEvents, + AuthEvents, + DemoEditEvents, + LayoutEvents, +} from "@pages/events"; import { jwtDecode } from "jwt-decode"; console.log("background script loaded"); @@ -109,6 +114,19 @@ addEventListener("install", () => { }); }); +let mainIframeSrcPort: null | chrome.runtime.Port = null; +let topIframeSrcPort: null | chrome.runtime.Port = null; + +chrome.runtime.onConnectExternal.addListener((port) => { + console.log("connecting...", port); + if (port.name === "extension/main") { + mainIframeSrcPort = port; + } + if (port.name === "extension/top") { + topIframeSrcPort = port; + } +}); + // when user clicks toolbar mount extension chrome.action.onClicked.addListener((tab) => { if (!tab?.id) { @@ -149,6 +167,21 @@ chrome.runtime.onMessageExternal.addListener( // execute in async block so that we return true // synchronously, telling chrome to wait for the response (async () => { + if ( + request.source === "extension/top" && + request.message === AppEvents.EDIT_DEMO_STOP + ) { + if (mainIframeSrcPort) { + // notify extension/main that demo edit mode exited in extension/top + mainIframeSrcPort.postMessage({ + ...request, + message: AppEvents.EDIT_DEMO_STOP, + }); + } else { + console.log("mainIframeSrcPort is not connected"); + } + } + if (request.message === AuthEvents.AUTH_ERROR) { await clearAuth(); sendResponse({ @@ -178,7 +211,8 @@ chrome.runtime.onMessageExternal.addListener( message: LayoutEvents.NO_TAB, status: "ok", }); - return; + console.error("No tab found"); + return true; } if ( @@ -201,16 +235,39 @@ chrome.runtime.onMessageExternal.addListener( showDefaultIcon(tab.id); } - chrome.tabs.sendMessage( - tab.id, - { - data: request.data, - message: request.message, - }, - (response) => { - sendResponse(response); - }, - ); + // send message to iframes and reactor in mocksi-extension + chrome.tabs.sendMessage(tab.id, request, async (response) => { + console.log("response from content script in background:", response); + if (response.message === DemoEditEvents.UNDO) { + // pass updated modifications from reactor to extension/main to store + if (mainIframeSrcPort) { + await mainIframeSrcPort.postMessage({ + ...response, + status: "ok", // response handler expects status + }); + } else { + console.log("mainIframeSrcPort is not connected"); + } + } + if ( + request.message === AppEvents.EDIT_DEMO_START || + request.message === DemoEditEvents.NEW_EDIT || + request.message === DemoEditEvents.CHAT_RESPONSE + ) { + // notify extension/top # of edits changed + if (topIframeSrcPort) { + await topIframeSrcPort.postMessage({ + ...response, + status: "ok", + }); + } else { + console.log("topIframeSrcPort is not connected"); + } + } + + sendResponse(response); + }); + return true; } })();