From 89292763963051c523b9aa8763045859ba71434f Mon Sep 17 00:00:00 2001 From: Matteo Date: Sun, 10 May 2026 12:47:44 +0200 Subject: [PATCH] Fix use-before-define in two pages, unpin eslint-plugin-react-hooks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit eslint-plugin-react-hooks 7.1.x adds a 'use-before-define' rule that flagged two pre-existing patterns: - connectors/store/page.tsx: useEffect referenced handleImportClick before the function was declared. - settings/license/page.tsx: useEffect referenced loadStatus before the function was declared. Both cases were temporally safe at runtime (the useEffect only runs during render, by which point the function exists), but the rule is correct that the order is hostile to readers and to React Compiler's analysis. Moving the function declarations above the useEffects satisfies the rule. Removes the temporary 7.0.1 pin from the root overrides — the rxjs override is enough to keep the workspace deduped, and react-hooks is now free to follow upstream. --- package-lock.json | 17 +----- package.json | 3 +- .../src/app/connectors/store/page.tsx | 54 +++++++++---------- .../src/app/settings/license/page.tsx | 8 +-- 4 files changed, 33 insertions(+), 49 deletions(-) diff --git a/package-lock.json b/package-lock.json index 81b1f770..abfb8d89 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12466,6 +12466,7 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -13610,22 +13611,6 @@ "url": "https://opencollective.com/node-fetch" } }, - "node_modules/gcp-metadata": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-7.0.1.tgz", - "integrity": "sha512-UcO3kefx6dCcZkgcTGgVOTFb7b1LlQ02hY1omMjjrrBzkajRMCFgYOjs7J71WqnuG1k2b+9ppGL7FsOfhZMQKQ==", - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "gaxios": "^7.0.0", - "google-logging-utils": "^1.0.0", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/generate-function": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", diff --git a/package.json b/package.json index ff25e4c7..30ec2022 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,6 @@ "class-validator": "^0.15.1" }, "overrides": { - "rxjs": "7.8.1", - "eslint-plugin-react-hooks": "7.0.1" + "rxjs": "7.8.1" } } diff --git a/packages/frontend/src/app/connectors/store/page.tsx b/packages/frontend/src/app/connectors/store/page.tsx index 7d75e7ec..7871be5b 100644 --- a/packages/frontend/src/app/connectors/store/page.tsx +++ b/packages/frontend/src/app/connectors/store/page.tsx @@ -98,16 +98,23 @@ function AdapterStoreContent() { .finally(() => setLoading(false)); }, [token]); - // Auto-import when ?install= is present (e.g. from website marketplace) - useEffect(() => { - if (autoInstallTriggered.current || loading || !token || list.length === 0) return; - const installSlug = searchParams.get('install'); - if (!installSlug) return; - const adapter = list.find((a) => a.slug === installSlug); - if (!adapter) return; - autoInstallTriggered.current = true; - handleImportClick(adapter); - }, [loading, list, token, searchParams]); + const doImport = async (slug: string, credentials?: Record) => { + if (!token) return; + setImporting(slug); + setMsg(''); + setConfigAdapter(null); + try { + const adapter = list.find((a) => a.slug === slug); + const result = await adapters.import(slug, token, credentials); + setMsg(result.message); + setImporting(null); + // Show MCP assignment modal + setImportedConnector({ id: result.connectorId, name: adapter?.name || slug }); + } catch (err: any) { + setMsg(`Import failed: ${err.message}`); + setImporting(null); + } + }; const handleImportClick = async (adapter: AdapterItem) => { if (!token) return; @@ -136,23 +143,16 @@ function AdapterStoreContent() { } }; - const doImport = async (slug: string, credentials?: Record) => { - if (!token) return; - setImporting(slug); - setMsg(''); - setConfigAdapter(null); - try { - const adapter = list.find((a) => a.slug === slug); - const result = await adapters.import(slug, token, credentials); - setMsg(result.message); - setImporting(null); - // Show MCP assignment modal - setImportedConnector({ id: result.connectorId, name: adapter?.name || slug }); - } catch (err: any) { - setMsg(`Import failed: ${err.message}`); - setImporting(null); - } - }; + // Auto-import when ?install= is present (e.g. from website marketplace) + useEffect(() => { + if (autoInstallTriggered.current || loading || !token || list.length === 0) return; + const installSlug = searchParams.get('install'); + if (!installSlug) return; + const adapter = list.find((a) => a.slug === installSlug); + if (!adapter) return; + autoInstallTriggered.current = true; + handleImportClick(adapter); + }, [loading, list, token, searchParams]); const handleConfigSubmit = () => { if (!configAdapter) return; diff --git a/packages/frontend/src/app/settings/license/page.tsx b/packages/frontend/src/app/settings/license/page.tsx index c2588c74..9e493878 100644 --- a/packages/frontend/src/app/settings/license/page.tsx +++ b/packages/frontend/src/app/settings/license/page.tsx @@ -25,10 +25,6 @@ export default function LicenseSettingsPage() { const isCloud = deploymentMode === 'cloud'; - useEffect(() => { - loadStatus(); - }, [token]); - const loadStatus = async () => { try { const data = await license.getStatus(token || undefined); @@ -38,6 +34,10 @@ export default function LicenseSettingsPage() { } }; + useEffect(() => { + loadStatus(); + }, [token]); + const handleActivate = async () => { if (!token || !licenseKey) return; setError('');