From 66f7875b7c0244b5e890fd6728f3e6a72f5f9f4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zain=F0=9F=8D=95?= Date: Tue, 2 Dec 2025 19:58:52 +0800 Subject: [PATCH 1/3] Configures HMR for improved reliability Explicitly sets the HMR host, port, and protocol. This helps prevent connection issues and ensures Hot Module Replacement functions consistently across various development environments. --- vite.config.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/vite.config.ts b/vite.config.ts index e10e96d..e8c60da 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -25,5 +25,11 @@ export default defineConfig({ cors: { origin: [/chrome-extension:\/\//], }, + + hmr: { + host: 'localhost', + port: 5173, + protocol: 'ws', + }, }, }) From b893c68085ee37e9910c05ca9f2cc7635a4c0ec8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zain=F0=9F=8D=95?= Date: Tue, 2 Dec 2025 19:59:32 +0800 Subject: [PATCH 2/3] Enhances side panel communication and reliability Refactors side panel messaging to use dedicated Port connections, ensuring direct communication for commands like `CLOSE_SIDE_PANEL`. Improves the service worker's ability to identify the correct window when a side panel connects by querying for the active tab if the window ID is not immediately available. Refines error handling for opening the side panel to consistently clean up processing state regardless of success or failure. --- src/service-worker.ts | 41 +++++++++++++++++-------- src/side-panel/use-register-listener.ts | 21 ++++--------- 2 files changed, 35 insertions(+), 27 deletions(-) diff --git a/src/service-worker.ts b/src/service-worker.ts index 18499a6..9c09d03 100644 --- a/src/service-worker.ts +++ b/src/service-worker.ts @@ -3,43 +3,60 @@ const processingWindows = new Set() const openSidePanel = async (tabId: number, windowId: number) => { if (processingWindows.has(windowId)) return + processingWindows.add(windowId) - try { - await chrome.sidePanel.open({ + chrome.sidePanel + .open({ tabId, windowId, }) - } catch (error) { - console.error('Failed to open side panel:', error) - processingWindows.delete(windowId) - } + .finally(() => { + processingWindows.delete(windowId) + }) } const closeSidePanel = (windowId: number) => { if (processingWindows.has(windowId)) return const port = ports.get(windowId) + if (port) { processingWindows.add(windowId) port.postMessage({ type: 'CLOSE_SIDE_PANEL' }) + } else { + throw new Error('Port not found') } } // Listen for port connections from side panel chrome.runtime.onConnect.addListener(port => { if (port.name === 'side-panel') { - const windowId = port.sender?.tab?.windowId + const tab = port.sender?.tab - if (typeof windowId === 'number') { - ports.set(windowId, port) - processingWindows.delete(windowId) + if (tab?.windowId) { + ports.set(tab.windowId, port) + processingWindows.delete(tab.windowId) // When port disconnects, side panel is closed port.onDisconnect.addListener(() => { - ports.delete(windowId) - processingWindows.delete(windowId) + ports.delete(tab.windowId) + processingWindows.delete(tab.windowId) }) + } else { + chrome.tabs + .query({ active: true, currentWindow: true }) + .then(tabs => { + const [tab] = tabs + ports.set(tab.windowId, port) + processingWindows.delete(tab.windowId) + + // When port disconnects, side panel is closed + port.onDisconnect.addListener(() => { + ports.delete(tab.windowId) + processingWindows.delete(tab.windowId) + }) + }) } } }) diff --git a/src/side-panel/use-register-listener.ts b/src/side-panel/use-register-listener.ts index 0ab51fe..4cf8cd4 100644 --- a/src/side-panel/use-register-listener.ts +++ b/src/side-panel/use-register-listener.ts @@ -12,6 +12,12 @@ export function useRegisterListener() { // This allows service worker to detect when side panel is closed const port = chrome.runtime.connect({ name: 'side-panel' }) + port.onMessage.addListener((message: { type: 'CLOSE_SIDE_PANEL' }) => { + if (message.type === 'CLOSE_SIDE_PANEL') { + window.close() + } + }) + return () => { port.disconnect() } @@ -31,21 +37,6 @@ export function useRegisterListener() { }) }, [setTabs, setActiveTab]) - // ✉️ ON MESSAGE - useEffect(() => { - const handleMessage = (message: { type: string }) => { - if (message.type === 'CLOSE_SIDE_PANEL') { - window.close() - } - } - - chrome.runtime.onMessage.addListener(handleMessage) - - return () => { - chrome.runtime.onMessage.removeListener(handleMessage) - } - }, []) - // 🆕 ON TAB CREATED useEffect(() => { const handleTabCreated = (tab: chrome.tabs.Tab) => { From 4395ad549cae2a345e50789c80956794ff385553 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zain=F0=9F=8D=95?= Date: Tue, 2 Dec 2025 20:05:25 +0800 Subject: [PATCH 3/3] Updates dependencies and bumps project version Upgrades `jotai` to `2.15.2`, `@types/chrome` to `0.1.32`, and `vite` to `7.2.6`. These updates incorporate the latest bug fixes, performance improvements, and security patches from the upstream libraries. Bumps the package version to `0.0.4` to reflect these dependency updates. --- bun.lock | 10 +++++++--- package.json | 8 ++++---- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/bun.lock b/bun.lock index b1087d3..0e066cf 100644 --- a/bun.lock +++ b/bun.lock @@ -251,7 +251,7 @@ "@types/chai": ["@types/chai@5.2.3", "", { "dependencies": { "@types/deep-eql": "*", "assertion-error": "^2.0.1" } }, "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA=="], - "@types/chrome": ["@types/chrome@0.1.31", "", { "dependencies": { "@types/filesystem": "*", "@types/har-format": "*" } }, "sha512-8fC9t02LRdqlSQ9bktaiLjP0NKujPNPaCKPfXxfIjZ35A9u831XY0pt0UEf2oup2SjcUEAaIYOB8mzJ51jhjmA=="], + "@types/chrome": ["@types/chrome@0.1.32", "", { "dependencies": { "@types/filesystem": "*", "@types/har-format": "*" } }, "sha512-n5Cqlh7zyAqRLQWLXkeV5K/1BgDZdVcO/dJSTa8x+7w+sx7m73UrDmduAptg4KorMtyTW2TNnPu8RGeaDMKNGg=="], "@types/deep-eql": ["@types/deep-eql@4.0.2", "", {}, "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="], @@ -415,7 +415,7 @@ "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], - "jotai": ["jotai@2.15.1", "", { "peerDependencies": { "@babel/core": ">=7.0.0", "@babel/template": ">=7.0.0", "@types/react": ">=17.0.0", "react": ">=17.0.0" }, "optionalPeers": ["@babel/core", "@babel/template", "@types/react", "react"] }, "sha512-yHT1HAZ3ba2Q8wgaUQ+xfBzEtcS8ie687I8XVCBinfg4bNniyqLIN+utPXWKQE93LMF5fPbQSVRZqgpcN5yd6Q=="], + "jotai": ["jotai@2.15.2", "", { "peerDependencies": { "@babel/core": ">=7.0.0", "@babel/template": ">=7.0.0", "@types/react": ">=17.0.0", "react": ">=17.0.0" }, "optionalPeers": ["@babel/core", "@babel/template", "@types/react", "react"] }, "sha512-El86CCfXNMEOytp20NPfppqGGmcp6H6kIA+tJHdmASEUURJCYW4fh8nTHEnB8rUXEFAY1pm8PdHPwnrcPGwdEg=="], "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], @@ -561,7 +561,7 @@ "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], - "vite": ["vite@7.2.4", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-NL8jTlbo0Tn4dUEXEsUg8KeyG/Lkmc4Fnzb8JXN/Ykm9G4HNImjtABMJgkQoVjOBN/j2WAwDTRytdqJbZsah7w=="], + "vite": ["vite@7.2.6", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-tI2l/nFHC5rLh7+5+o7QjKjSR04ivXDF4jcgV0f/bTQ+OJiITy5S6gaynVsEM+7RqzufMnVbIon6Sr5x1SDYaQ=="], "vite-plugin-zip-pack": ["vite-plugin-zip-pack@1.2.4", "", { "dependencies": { "jszip": "^3.10.1" }, "peerDependencies": { "vite": ">=2.x" } }, "sha512-QgZEeiWayE2ZvMbkvcqWf94p/Z5YeNHZlkwXWIkkoISjePiWVXKRX2xCGmsURe9acGVdkobZ31dFJuCp3j1hMg=="], @@ -612,5 +612,9 @@ "vite/rollup": ["rollup@4.53.2", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.53.2", "@rollup/rollup-android-arm64": "4.53.2", "@rollup/rollup-darwin-arm64": "4.53.2", "@rollup/rollup-darwin-x64": "4.53.2", "@rollup/rollup-freebsd-arm64": "4.53.2", "@rollup/rollup-freebsd-x64": "4.53.2", "@rollup/rollup-linux-arm-gnueabihf": "4.53.2", "@rollup/rollup-linux-arm-musleabihf": "4.53.2", "@rollup/rollup-linux-arm64-gnu": "4.53.2", "@rollup/rollup-linux-arm64-musl": "4.53.2", "@rollup/rollup-linux-loong64-gnu": "4.53.2", "@rollup/rollup-linux-ppc64-gnu": "4.53.2", "@rollup/rollup-linux-riscv64-gnu": "4.53.2", "@rollup/rollup-linux-riscv64-musl": "4.53.2", "@rollup/rollup-linux-s390x-gnu": "4.53.2", "@rollup/rollup-linux-x64-gnu": "4.53.2", "@rollup/rollup-linux-x64-musl": "4.53.2", "@rollup/rollup-openharmony-arm64": "4.53.2", "@rollup/rollup-win32-arm64-msvc": "4.53.2", "@rollup/rollup-win32-ia32-msvc": "4.53.2", "@rollup/rollup-win32-x64-gnu": "4.53.2", "@rollup/rollup-win32-x64-msvc": "4.53.2", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-MHngMYwGJVi6Fmnk6ISmnk7JAHRNF0UkuucA0CUW3N3a4KnONPEZz+vUanQP/ZC/iY1Qkf3bwPWzyY84wEks1g=="], "vitest/es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="], + + "vitest/vite": ["vite@7.2.4", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-NL8jTlbo0Tn4dUEXEsUg8KeyG/Lkmc4Fnzb8JXN/Ykm9G4HNImjtABMJgkQoVjOBN/j2WAwDTRytdqJbZsah7w=="], + + "vitest/vite/rollup": ["rollup@4.53.2", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.53.2", "@rollup/rollup-android-arm64": "4.53.2", "@rollup/rollup-darwin-arm64": "4.53.2", "@rollup/rollup-darwin-x64": "4.53.2", "@rollup/rollup-freebsd-arm64": "4.53.2", "@rollup/rollup-freebsd-x64": "4.53.2", "@rollup/rollup-linux-arm-gnueabihf": "4.53.2", "@rollup/rollup-linux-arm-musleabihf": "4.53.2", "@rollup/rollup-linux-arm64-gnu": "4.53.2", "@rollup/rollup-linux-arm64-musl": "4.53.2", "@rollup/rollup-linux-loong64-gnu": "4.53.2", "@rollup/rollup-linux-ppc64-gnu": "4.53.2", "@rollup/rollup-linux-riscv64-gnu": "4.53.2", "@rollup/rollup-linux-riscv64-musl": "4.53.2", "@rollup/rollup-linux-s390x-gnu": "4.53.2", "@rollup/rollup-linux-x64-gnu": "4.53.2", "@rollup/rollup-linux-x64-musl": "4.53.2", "@rollup/rollup-openharmony-arm64": "4.53.2", "@rollup/rollup-win32-arm64-msvc": "4.53.2", "@rollup/rollup-win32-ia32-msvc": "4.53.2", "@rollup/rollup-win32-x64-gnu": "4.53.2", "@rollup/rollup-win32-x64-msvc": "4.53.2", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-MHngMYwGJVi6Fmnk6ISmnk7JAHRNF0UkuucA0CUW3N3a4KnONPEZz+vUanQP/ZC/iY1Qkf3bwPWzyY84wEks1g=="], } } diff --git a/package.json b/package.json index 18dd60a..7152c73 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "url": "https://github.com/sensasi-delight/vertical-tabs-crx/issues" }, "dependencies": { - "jotai": "^2.15.1", + "jotai": "^2.15.2", "react": "^19.2.0", "react-dom": "^19.2.0" }, @@ -20,7 +20,7 @@ "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.0", "@testing-library/react-hooks": "^8.0.1", - "@types/chrome": "^0.1.31", + "@types/chrome": "^0.1.32", "@types/node": "^24.10.1", "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", @@ -28,7 +28,7 @@ "babel-plugin-react-compiler": "^1.0.0", "jsdom": "^27.2.0", "typescript": "~5.8.3", - "vite": "^7.2.4", + "vite": "^7.2.6", "vite-plugin-zip-pack": "^1.2.4", "vitest": "^4.0.14" }, @@ -60,5 +60,5 @@ "test": "vitest run" }, "type": "module", - "version": "0.0.3" + "version": "0.0.4" }