shadcn-ui/ui · error · Error

useLocks must be used within LocksProvider

Error message

useLocks must be used within LocksProvider

What it means

Typeset variant of [143]. `useLocks` reads `LocksContext`; the typeset provider memoizes `{ locks, isLocked, toggleLock }`. A consumer outside `<LocksProvider>` throws so the lock contract can't be partially absent.

Source

Thrown at apps/v4/app/(app)/(typeset)/hooks/use-locks.tsx:50

      } else {
        next.add(param)
      }
      return next
    })
  }, [])

  const value = React.useMemo(
    () => ({ locks, isLocked, toggleLock }),
    [locks, isLocked, toggleLock]
  )

  return <LocksContext value={value}>{children}</LocksContext>
}

export function useLocks() {
  const context = React.useContext(LocksContext)
  if (!context) {
    throw new Error("useLocks must be used within LocksProvider")
  }
  return context
}

View on GitHub (pinned to efac598707)

Solutions

  1. Wrap the typeset subtree in `<LocksProvider>`.
  2. Import from the (typeset) use-locks module to match the context instance.
  3. Decorate tests with the provider.

Example fix

// before
<TypesetLockablePanel />

// after
<LocksProvider>
  <TypesetLockablePanel />
</LocksProvider>
Defensive patterns

Strategy: type-guard

Validate before calling

render(<LocksProvider>{<TypesetLockablePanel/>}</LocksProvider>) // (typeset) LocksProvider

Type guard

import React from "react"
import { LocksContext } from "@/(app)/(typeset)/hooks/use-locks"
const hasTypesetLocks = () => React.useContext(LocksContext) != null

Try / catch

try { useLocks() } catch (e) { if (e.message.includes("LocksProvider")) {/*wrap subtree*/} throw e }

Prevention

When it happens

Trigger: A typeset panel that calls `useLocks()` rendered without a `<LocksProvider>` ancestor; sharing a lock-aware panel across create/typeset without re-wrapping.

Common situations: Route layout changes; portal/dialog rendering; isolated tests.

Related errors


AI-assisted analysis of shadcn-ui/ui@efac598707 (2026-08-12). Data as JSON: /api/errors/57bd7daba9f48437. Report an issue: GitHub.