A wrapper around React that will hide hooks from the React Server Component compiler
npm install rehacktreact so that you're able to use shared imports with react in server-side Next.js code without throwing an error to your users.
tsx
"use client"
import { useFormState } from "react-dom"
import someAction from "./action";
export const ClientComp = () => {
const [data, action] = useFormState(someAction, "Hello client");
return
}
`
`tsx
"use server"
// action.ts
import {data} from "./shared-code";
export default async function someAction() {
return "Hello " + data.name;
}
`
`tsx
// shared-code.ts
import {useState} from "react";
export const data = {
useForm: (val: T) => {
useState(val)
},
name: "server"
}
`
While you're not intending to use data.useForm in your action.ts server-only file, you'll still receive the following error from Next.js' build process when trying to use this code:
`shell
./src/app/shared-code.ts
ReactServerComponentsError:
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", so they're Server Components by default.
Learn more: https://nextjs.org/docs/getting-started/react-essentials
╭─[/src/app/shared-code.ts:1:1]
1 │ import {useState} from "react";
· ────────
2 │
3 │ export const data = {
3 │ useForm: (val: T) => {
╰────
Maybe one of these should be marked as a client entry with "use client":
./src/app/shared-code.ts
./src/app/action.ts
`
This is because Next.js statically analyzes usage of useState to ensure it's not being utilized in server-only code.
By replacing the import from react to rehackt:
`tsx
// shared-code.ts
import {useState} from "rehackt";
export const data = {
useForm: (val: T) => {
useState(val)
},
name: "server"
}
`
You'll no longer see this error.
> Keep in mind, this does not enable usage of useState` in server-only code, this just removes the error described above.