Skip to content

preview server (email dev) does not work with any React hook #649

@bergold

Description

@bergold

Describe the Bug

I tried using React context in my email templates, which works perfectly fine with the render package, but breaks with the email dev command.

I get the following error on the console:

Warning: Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:
1. You might have mismatching versions of React and the renderer (such as React DOM)
2. You might be breaking the Rules of Hooks
3. You might have more than one copy of React in the same app
See https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem.
Complete console output
$ email dev
✔ Emails preview generated
⠋ Installing dependencies...
[1/4] Resolving packages...
warning workspace-aggregator-f031c1ce-e58a-457c-a803-e5cf375879b8 > react-email-client > @types/[email protected]: This is a stub types definition. classnames provides its own type definitions, so you do not need this installed.
[2/4] Fetching packages...
[3/4] Linking dependencies...
[4/4] Building fresh packages...
✔ Dependencies installed
warning From Yarn 1.0 onwards, scripts don't require "--" for options to be forwarded. In a future version, any explicit "--" will be forwarded as-is to the scripts.
$ next dev -p 3000
ready - started server on 0.0.0.0:3000, url: http://localhost:3000
warn  - You have enabled experimental feature (appDir) in next.config.js.
warn  - Experimental features are not covered by semver, and may cause unexpected or broken application behavior. Use at your own risk.

info  - Thank you for testing `appDir` please leave your feedback at https://nextjs.link/app-feedback
event - compiled client and server successfully in 935 ms (262 modules)
wait  - compiling...
event - compiled client and server successfully in 147 ms (262 modules)
wait  - compiling /_error (client and server)...
event - compiled client and server successfully in 48 ms (263 modules)
warn  - Fast Refresh had to perform a full reload due to a runtime error.
wait  - compiling /preview/[slug]/page (client and server)...
event - compiled client and server successfully in 2.7s (1433 modules)
wait  - compiling...
event - compiled successfully in 172 ms (746 modules)
Warning: Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:
1. You might have mismatching versions of React and the renderer (such as React DOM)
2. You might be breaking the Rules of Hooks
3. You might have more than one copy of React in the same app
See https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem.
error - TypeError: Cannot read properties of null (reading 'useContext')
    at useCtx (./emails/components/context.tsx:12:64)
    at Foo (./emails/components/foo.tsx:14:70)
error - TypeError: Cannot read properties of null (reading 'useContext')
    at useCtx (./emails/components/context.tsx:12:64)
    at Foo (./emails/components/foo.tsx:14:70)
digest: "2702191682"
error - TypeError: Cannot read properties of null (reading 'useContext')
    at useContext (/Users/bergold/Sources/_tmp/react-email-reproductions/react-email-starter/node_modules/next/dist/compiled/react/cjs/react.development.js:1753:21)
    at useCtx (webpack-internal:///./emails/components/context.tsx:12:64)
    at Foo (webpack-internal:///./emails/components/foo.tsx:14:70)
    at renderWithHooks (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7042:26)
    at renderIndeterminateComponent (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7101:25)
    at renderElement (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7292:21)
    at renderNodeDestructiveImpl (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7431:29)
    at renderNodeDestructive (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7407:28)
    at renderNode (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7555:24)
    at renderChildrenArray (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7517:21)
    at renderNodeDestructiveImpl (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7462:21)
    at renderNodeDestructive (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7407:28)
    at renderNode (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7555:24)
    at renderHostElement (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7029:13)
    at renderElement (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7297:17)
    at renderNodeDestructiveImpl (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7431:29)
    at renderNodeDestructive (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7407:28)
    at renderNode (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7555:24)
    at renderHostElement (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7029:13)
    at renderElement (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7297:17)
    at renderNodeDestructiveImpl (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7431:29)
    at renderNodeDestructive (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7407:28)
    at renderNode (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7555:24)
    at renderHostElement (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7029:13)
    at renderElement (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7297:17)
    at renderNodeDestructiveImpl (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7431:29)
    at renderNodeDestructive (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7407:28)
    at renderNode (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7555:24)
    at renderHostElement (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7029:13)
    at renderElement (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7297:17)
    at renderNodeDestructiveImpl (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7431:29)
    at renderNodeDestructive (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7407:28)
    at renderForwardRef (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7209:17)
    at renderElement (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7348:29)
    at renderNodeDestructiveImpl (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7431:29)
    at renderNodeDestructive (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7407:28)
    at renderNode (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7555:24)
    at renderHostElement (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7029:13)
    at renderElement (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7297:17)
    at renderNodeDestructiveImpl (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7431:29)
    at renderNodeDestructive (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7407:28)
    at renderIndeterminateComponent (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7143:21)
    at renderElement (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7292:21)
    at renderNodeDestructiveImpl (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7431:29)
    at renderNodeDestructive (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7407:28)
    at renderNode (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7555:24)
    at renderChildrenArray (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7517:21)
    at renderNodeDestructiveImpl (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7462:21)
    at renderNodeDestructive (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7407:28)
    at renderNode (webpack-internal:///(sc_server)/../node_modules/next/dist/compiled/react-dom/cjs/react-dom-server-legacy.node.development.js:7555:24) {
  page: '/preview/notion-magic-link'
}

Which package is affected (leave empty if unsure)

react-email

Link to the code that reproduces this issue

https://github.com/bergold/react-email-usecontext

To Reproduce

  1. Checkout the linked reproduction repository
  2. Make note of the use of...
    • createContext in emails/components/context.tsx
    • Provider in emails/notion-magic-link.tsx
    • useContext in emails/components/foo.tsx
  3. Install deps yarn
  4. Run yarn run dev
  5. Open localhost:3000/preview/notion-magic-link in your browser
  6. Observe the error in your terminal output

Expected Behavior

No errors and the <Foo /> component should render the context value.

What's your node version? (if relevant)

18.14.0

Metadata

Metadata

Assignees

Labels

Package: react-emailThis is the CLI we generally use as just `email` on the temrinal.Type: BugConfirmed bug

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions