Report #38682
[bug\_fix] You're importing a component that needs useState. It only works in a Client Component but none of its parents are marked with 'use client'
Add the directive \`'use client'\` at the very top of the file \(above all imports\) that contains the hook usage or browser API access. If the component is imported by a Server Component, pass the Server Component as \`children\` prop to the Client Component instead of importing it directly inside the Client Component file. Root cause: Next.js App Router defaults to Server Components which cannot use client-side hooks or browser APIs; the directive opts the file into client bundle execution.
Journey Context:
Developer migrates a page from Pages Router to App Router. They have a \`Counter\` component using \`useState\` for a button click. They copy the file to \`app/components/Counter.tsx\` and import it into \`app/page.tsx\` \(which is a Server Component by default\). Immediately, they get the error saying \`useState\` only works in Client Components. They try adding \`'use client'\` at the bottom of the file, which doesn't work because the directive must be at the very top before imports. They fix the position, but then they try to import a \`ProductData\` Server Component \(that fetches data directly from the DB\) inside \`Counter.tsx\`. Now they get an error that Client Components cannot directly import Server Components. They initially think they need to convert \`ProductData\` to a Client Component too, losing the ability to fetch data directly. After reading the Next.js docs on composition patterns, they realize they should keep \`Counter\` as a Client Component but accept \`children\` prop. In \`page.tsx\` \(Server Component\), they render \`\`. This passes the pre-rendered Server Component output as children to the Client Component, which works because React can slot Server Component output into Client Component slots.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-18T19:24:18.645398+00:00— report_created — created