Next.js Discord

Discord Forum

You're importing a component that needs next/headers

Unanswered
Blue Picardy Spaniel posted this in #help-forum
Open in Discord
Blue Picardy SpanielOP
logout.tsx:
import { lucia, validateRequest } from "@/lib/auth";
import { DropdownMenuItem } from "@/components/ui/dropdown-menu";
import { LogOut as LogoutIcon } from "lucide-react";
import { cookies } from "next/headers";

export default function Logout() {
  async function logout() {
    const { session } = await validateRequest();
    if(!session) return;

    await lucia.invalidateSession(session.id);

    const sessionCookie = lucia.createBlankSessionCookie();
    cookies().set(sessionCookie.name, sessionCookie.value, sessionCookie.attributes);
  }

  return (
    <div>
      <DropdownMenuItem className="cursor-pointer">
        <LogoutIcon className="mr-2 h-4 w-4 text-red-500" />

        <form action={logout}>
          <button className="text-red-500">Log out</button>
        </form>
      </DropdownMenuItem>
    </div>
  );
}

You're importing a component that needs next/headers. That only works in a Server Component which is not supported in the pages/ directory.

14 Replies

Blue Picardy SpanielOP
./src/components/navbar/logout.tsx
Error: 
  × You're importing a component that needs next/headers. That only works in a Server Component which is not supported in the pages/ directory. Read more: https://nextjs.org/docs/getting-started/
  │ react-essentials#server-components
  │ 
  │ 
   ╭─[C:\Users\Ethan\Desktop\Projects\watchdog-website\src\components\navbar\logout.tsx:1:1]
 1 │ import { lucia, validateRequest } from "@/lib/auth";
 2 │ import { DropdownMenuItem } from "@/components/ui/dropdown-menu";
 3 │ import { LogOut as LogoutIcon } from "lucide-react";
 4 │ import { cookies } from "next/headers";
   · ───────────────────────────────────────
 5 │ 
 6 │ export default function Logout() {
 6 │   async function logout() {
   ╰────

  × It is not allowed to define inline "use server" annotated Server Actions in Client Components.
  │ To use Server Actions in a Client Component, you can either export them from a separate file with "use server" at the top, or pass them down through props from a Server Component.
  │ 
  │ Read more: https://nextjs.org/docs/app/api-reference/functions/server-actions#with-client-components
  │ 
    ╭─[C:\Users\Ethan\Desktop\Projects\watchdog-website\src\components\navbar\logout.tsx:4:1]
  4 │     import { cookies } from "next/headers";
  5 │     
  6 │     export default function Logout() {
  7 │ ╭─▶   async function logout() {
  8 │ │       "use server";
  9 │ │   
 10 │ │       const { session } = await validateRequest();
 11 │ │       if(!session) return;
 12 │ │   
 13 │ │       await lucia.invalidateSession(session.id);
 14 │ │   
 15 │ │       const sessionCookie = lucia.createBlankSessionCookie();
 16 │ │       cookies().set(sessionCookie.name, sessionCookie.value, sessionCookie.attributes);
 17 │ ╰─▶   }
 18 │     
 19 │       return (
 19 │         <div>
    ╰────
now im getting this
@Blue Picardy Spaniel now im getting this
where do you render <Logout />?
@Ray where do you render `<Logout />`?
Blue Picardy SpanielOP
ohhhh in a client component, but i dont understand why i cant mix client and server components
@Blue Picardy Spaniel ohhhh in a client component, but i dont understand why i cant mix client and server components
every component imported to client component will become client
Blue Picardy SpanielOP
oh
@Ray https://nextjs.org/docs/app/building-your-application/rendering/composition-patterns#supported-pattern-passing-server-components-to-client-components-as-props
Blue Picardy SpanielOP
hold on im so confused, do you know of a youtube tutorial that could help?
Blue Picardy SpanielOP
thanks i'll try and work it out
@Blue Picardy Spaniel thanks i'll try and work it out
I think you can move that logout function to a new file and export it. In that file, put ‘use server’ at the top
Blue Picardy SpanielOP
yea i figured it out ty!<3
Then import the logout function in the Logout component