From d84ccbc67c5fc92fa07bb89ce5869c73fe15ad33 Mon Sep 17 00:00:00 2001 From: Diego Rodrigues de Sa e Souza <8016841+diegosouzapw@users.noreply.github.com> Date: Tue, 14 Jul 2026 21:15:54 -0300 Subject: [PATCH] fix(dashboard): implement missing handleToggleSource on Free Pool tab (#7161) (#7200) --- changelog.d/fixes/7161-free-pool-handletogglesource.md | 1 + .../settings/components/proxy/FreePoolTab.tsx | 10 ++++++++++ tests/unit/free-pool-tab.test.tsx | 7 ++++--- 3 files changed, 15 insertions(+), 3 deletions(-) create mode 100644 changelog.d/fixes/7161-free-pool-handletogglesource.md diff --git a/changelog.d/fixes/7161-free-pool-handletogglesource.md b/changelog.d/fixes/7161-free-pool-handletogglesource.md new file mode 100644 index 0000000000..b85d16d651 --- /dev/null +++ b/changelog.d/fixes/7161-free-pool-handletogglesource.md @@ -0,0 +1 @@ +- fix(dashboard): implement missing `handleToggleSource` callback on the Free Pool tab so the page no longer crashes with a `ReferenceError` (#7161) diff --git a/src/app/(dashboard)/dashboard/settings/components/proxy/FreePoolTab.tsx b/src/app/(dashboard)/dashboard/settings/components/proxy/FreePoolTab.tsx index daca24c8d6..a30aa5d796 100644 --- a/src/app/(dashboard)/dashboard/settings/components/proxy/FreePoolTab.tsx +++ b/src/app/(dashboard)/dashboard/settings/components/proxy/FreePoolTab.tsx @@ -139,6 +139,16 @@ export default function FreePoolTab() { }); }; + const handleToggleSource = (source: SourceId) => { + setDisabledSources((prev) => { + const next = new Set(prev); + if (next.has(source)) next.delete(source); + else next.add(source); + saveDisabledSources(next); + return next; + }); + }; + const handleToggleSelect = (id: string) => { setSelected((prev) => { const next = new Set(prev); diff --git a/tests/unit/free-pool-tab.test.tsx b/tests/unit/free-pool-tab.test.tsx index 6279174fa4..91ee249776 100644 --- a/tests/unit/free-pool-tab.test.tsx +++ b/tests/unit/free-pool-tab.test.tsx @@ -91,13 +91,13 @@ afterEach(() => { // ── Tests ───────────────────────────────────────────────────────────────────── describe("FreePoolTab source toggles", () => { - it("renders a toggle group with exactly 3 buttons", async () => { + it("renders a toggle group with exactly 4 buttons", async () => { const el = renderTab(); await waitForCondition(() => el.querySelector("[role='group']") !== null); const bar = el.querySelector("[role='group']")!; expect(bar).toBeTruthy(); const buttons = bar.querySelectorAll("button"); - expect(buttons.length).toBe(3); + expect(buttons.length).toBe(4); }); it("all toggles start enabled (aria-pressed=true)", async () => { @@ -160,7 +160,7 @@ describe("FreePoolTab source toggles", () => { expect(stored).toContain("1proxy"); }); - it("button labels are 1proxy, Proxifly, IPLocate", async () => { + it("button labels are 1proxy, Proxifly, IPLocate, Webshare", async () => { const el = renderTab(); await waitForCondition(() => el.querySelector("[role='group']") !== null); const texts = Array.from(el.querySelector("[role='group']")!.querySelectorAll("button")).map( @@ -169,6 +169,7 @@ describe("FreePoolTab source toggles", () => { expect(texts).toContain("1proxy"); expect(texts).toContain("Proxifly"); expect(texts).toContain("IPLocate"); + expect(texts).toContain("Webshare"); }); });