Bug: useScan() ignores `enabled: false` and always starts scanning

Author: jalbarrangCreated May 29, 2026Updated Aug 25, 2026

Description

useScan() unconditionally calls start() regardless of the enabled option, unlike scan() which properly guards against it.

typescript
// scan() — respects enabled ✅
export const scan = (options: Options = {}) => {
  setOptions(options);
  if (options.enabled === false && options.showToolbar !== true) {
    return;
  }
  start();
};

// useScan() — ignores enabled ❌
export const useScan = (options: Options = {}) => {
  setOptions(options);
  start(); // always runs regardless of enabled
};

Reproduction

typescript
import { useScan } from "react-scan";

function App() {
  useScan({ enabled: false }); // scanning still activates
  return <div>Hello</div>;
}

Expected Behavior

When enabled: false is passed to useScan(), scanning and the toolbar should not activate — matching the behavior of scan().

Related

  • #269 — "scan is always enabled as long as showToolbar is true" (closed but a commenter confirmed still broken in 0.3.3)
  • #101 — Added the enabled guard to scan() but never applied it to useScan()

Proposed Fix

Apply the same iframe and enabled guards from scan() to useScan():

typescript
export const useScan = (options: Options = {}) => {
  setOptions(options);
  const isInIframe = Store.isInIframe.value;

  if (
    isInIframe &&
    !ReactScanInternals.options.value.allowInIframe &&
    !ReactScanInternals.runInAllEnvironments
  ) {
    return;
  }

  if (options.enabled === false && options.showToolbar !== true) {
    return;
  }

  start();
};

Branch with the fix: https://github.com/jalbarrang/react-scan/tree/fix/usescan-respects-enabled

Note: Unable to open a PR since the repo restricts PRs to collaborators.