Skip to content

Instantly share code, notes, and snippets.

@adrianhajdin
Created May 5, 2023 13:13
Show Gist options
  • Save adrianhajdin/6df61c6cd5ed052dce814a765bff9032 to your computer and use it in GitHub Desktop.
Save adrianhajdin/6df61c6cd5ed052dce814a765bff9032 to your computer and use it in GitHub Desktop.
Next.js 13 Full Course 2023 | Build and Deploy a Full Stack App Using the Official React Framework
@import url("https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&display=swap");
@tailwind base;
@tailwind components;
@tailwind utilities;
/*
Note: The styles for this gradient grid background is heavily inspired by the creator of this amazing site (https://dub.sh) – all credits go to them!
*/
.main {
width: 100vw;
min-height: 100vh;
position: fixed;
display: flex;
justify-content: center;
padding: 120px 24px 160px 24px;
pointer-events: none;
}
.main:before {
background: radial-gradient(circle, rgba(2, 0, 36, 0) 0, #fafafa 100%);
position: absolute;
content: "";
z-index: 2;
width: 100%;
height: 100%;
top: 0;
}
.main:after {
content: "";
background-image: url("/assets/images/grid.svg");
z-index: 1;
position: absolute;
width: 100%;
height: 100%;
top: 0;
opacity: 0.4;
filter: invert(1);
}
.gradient {
height: fit-content;
z-index: 3;
width: 100%;
max-width: 640px;
background-image: radial-gradient(
at 27% 37%,
hsla(215, 98%, 61%, 1) 0px,
transparent 0%
),
radial-gradient(at 97% 21%, hsla(125, 98%, 72%, 1) 0px, transparent 50%),
radial-gradient(at 52% 99%, hsla(354, 98%, 61%, 1) 0px, transparent 50%),
radial-gradient(at 10% 29%, hsla(256, 96%, 67%, 1) 0px, transparent 50%),
radial-gradient(at 97% 96%, hsla(38, 60%, 74%, 1) 0px, transparent 50%),
radial-gradient(at 33% 50%, hsla(222, 67%, 73%, 1) 0px, transparent 50%),
radial-gradient(at 79% 53%, hsla(343, 68%, 79%, 1) 0px, transparent 50%);
position: absolute;
content: "";
width: 100%;
height: 100%;
filter: blur(100px) saturate(150%);
top: 80px;
opacity: 0.15;
}
@media screen and (max-width: 640px) {
.main {
padding: 0;
}
}
/* Tailwind Styles */
.app {
@apply relative z-10 flex justify-center items-center flex-col max-w-7xl mx-auto sm:px-16 px-6;
}
.black_btn {
@apply rounded-full border border-black bg-black py-1.5 px-5 text-white transition-all hover:bg-white hover:text-black text-center text-sm font-inter flex items-center justify-center;
}
.outline_btn {
@apply rounded-full border border-black bg-transparent py-1.5 px-5 text-black transition-all hover:bg-black hover:text-white text-center text-sm font-inter flex items-center justify-center;
}
.head_text {
@apply mt-5 text-5xl font-extrabold leading-[1.15] text-black sm:text-6xl;
}
.orange_gradient {
@apply bg-gradient-to-r from-amber-500 via-orange-600 to-yellow-500 bg-clip-text text-transparent;
}
.green_gradient {
@apply bg-gradient-to-r from-green-400 to-green-500 bg-clip-text text-transparent;
}
.blue_gradient {
@apply bg-gradient-to-r from-blue-600 to-cyan-600 bg-clip-text text-transparent;
}
.desc {
@apply mt-5 text-lg text-gray-600 sm:text-xl max-w-2xl;
}
.search_input {
@apply block w-full rounded-md border border-gray-200 bg-white py-2.5 font-satoshi pl-5 pr-12 text-sm shadow-lg font-medium focus:border-black focus:outline-none focus:ring-0;
}
.copy_btn {
@apply w-7 h-7 rounded-full bg-white/10 shadow-[inset_10px_-50px_94px_0_rgb(199,199,199,0.2)] backdrop-blur flex justify-center items-center cursor-pointer;
}
.glassmorphism {
@apply rounded-xl border border-gray-200 bg-white/20 shadow-[inset_10px_-50px_94px_0_rgb(199,199,199,0.2)] backdrop-blur p-5;
}
.prompt_layout {
@apply space-y-6 py-8 sm:columns-2 sm:gap-6 xl:columns-3;
}
/* Feed Component */
.feed {
@apply mt-16 mx-auto w-full max-w-xl flex justify-center items-center flex-col gap-2;
}
/* Form Component */
.form_textarea {
@apply w-full flex rounded-lg h-[200px] mt-2 p-3 text-sm text-gray-500 outline-0;
}
.form_input {
@apply w-full flex rounded-lg mt-2 p-3 text-sm text-gray-500 outline-0;
}
/* Nav Component */
.logo_text {
@apply max-sm:hidden font-satoshi font-semibold text-lg text-black tracking-wide;
}
.dropdown {
@apply absolute right-0 top-full mt-3 w-full p-5 rounded-lg bg-white min-w-[210px] flex flex-col gap-2 justify-end items-end;
}
.dropdown_link {
@apply text-sm font-inter text-gray-700 hover:text-gray-500 font-medium;
}
/* PromptCard Component */
.prompt_card {
@apply flex-1 break-inside-avoid rounded-lg border border-gray-300 bg-white/20 bg-clip-padding p-6 pb-4 backdrop-blur-lg backdrop-filter md:w-[360px] w-full h-fit;
}
.flex-center {
@apply flex justify-center items-center;
}
.flex-start {
@apply flex justify-start items-start;
}
.flex-end {
@apply flex justify-end items-center;
}
.flex-between {
@apply flex justify-between items-center;
}
{
"compilerOptions": {
"paths": {
"@*": ["./*"]
}
}
}
import Prompt from "@models/prompt";
import { connectToDB } from "@utils/database";
export const GET = async (request, { params }) => {
try {
await connectToDB()
const prompt = await Prompt.findById(params.id).populate("creator")
if (!prompt) return new Response("Prompt Not Found", { status: 404 });
return new Response(JSON.stringify(prompt), { status: 200 })
} catch (error) {
return new Response("Internal Server Error", { status: 500 });
}
}
export const PATCH = async (request, { params }) => {
const { prompt, tag } = await request.json();
try {
await connectToDB();
// Find the existing prompt by ID
const existingPrompt = await Prompt.findById(params.id);
if (!existingPrompt) {
return new Response("Prompt not found", { status: 404 });
}
// Update the prompt with new data
existingPrompt.prompt = prompt;
existingPrompt.tag = tag;
await existingPrompt.save();
return new Response("Successfully updated the Prompts", { status: 200 });
} catch (error) {
return new Response("Error Updating Prompt", { status: 500 });
}
};
export const DELETE = async (request, { params }) => {
try {
await connectToDB();
// Find the prompt by ID and remove it
await Prompt.findByIdAndRemove(params.id);
return new Response("Prompt deleted successfully", { status: 200 });
} catch (error) {
return new Response("Error deleting prompt", { status: 500 });
}
};
/** @type {import('tailwindcss').Config} */
module.exports = {
content: [
'./pages/**/*.{js,ts,jsx,tsx,mdx}',
'./components/**/*.{js,ts,jsx,tsx,mdx}',
'./app/**/*.{js,ts,jsx,tsx,mdx}',
],
theme: {
extend: {
fontFamily: {
satoshi: ['Satoshi', 'sans-serif'],
inter: ['Inter', 'sans-serif'],
},
colors: {
'primary-orange': '#FF5722',
}
},
},
plugins: [],
}
username: {
type: String,
required: [true, 'Username is required!'],
match: [/^(?=.{8,20}$)(?![_.])(?!.*[_.]{2})[a-zA-Z0-9._]+(?<![_.])$/, "Username invalid, it should contain 8-20 alphanumeric letters and be unique!"]
},
@krizto8
Copy link

krizto8 commented Jul 6, 2024

Hii all, when i am deploying my project on vercel it is giving me error like below... Export encountered errors on following paths: /update-prompt/page: /update-prompt

please help me with that Screenshot 2024-07-02 183946

just go to the next.config.mjs and add the following line in the experimental attribute=> missingSuspenseWithCSRBailout: false

@Y3ASIN
Copy link

Y3ASIN commented Jul 17, 2024

Hii all, when i am deploying my project on vercel it is giving me error like below... Export encountered errors on following paths: /update-prompt/page: /update-prompt
please help me with that Screenshot 2024-07-02 183946

Hi @Harshitn24 I am stuck with the same error as well I did everything I could to wrap the component that uses the useSearchParams() in suspense boundary and I haven't solved it as well. Lol maybe if we shout! together someone might hear us and help

error-suspense


The solution to the problem is to warp the (EditPrompt or UpdatePrompt) component with the react 18 Suspense wrapper.

update-prompt/page.jsx

// page.jsx

import { Suspense } from "react";
import dynamic from "next/dynamic";

const EditPrompt = dynamic(() => import("@components/EditPrompt"), {
  suspense: true,
});

const Page = () => {
  return (
    <Suspense>
      <EditPrompt />
    </Suspense>
  );
};

export default Page;

components/EditPormpt

// EditPrompt.jsx

"use client";

import { useState, useEffect } from "react";
import { useRouter, useSearchParams } from "next/navigation";

import Form from "@components/Form";

const EditPrompt = () => {
  const router = useRouter();
  const searchParams = useSearchParams();
  const promptId = searchParams.get("id");

  const [submitting, setSubmitting] = useState(false);
  const [post, setPost] = useState({
    prompt: "",
    tag: "",
  });

  useEffect(() => {
    const getPromptDetails = async () => {
      const response = await fetch(`/api/prompt/${promptId}`);
      const data = await response.json();

      setPost({
        prompt: data.prompt,
        tag: data.tag,
      });
    };

    if (promptId) getPromptDetails();
  }, [promptId]);

  const updatePrompt = async (e) => {
    e.preventDefault();
    setSubmitting(true);

    if (!promptId) return alert("Prompt Id not found!");

    try {
      const response = await fetch(`/api/prompt/${promptId}`, {
        method: "PATCH",
        body: JSON.stringify({
          prompt: post.prompt,
          tag: post.tag,
        }),
      });

      if (response.ok) {
        router.push("/");
      }
    } catch (error) {
      console.log(error);
    } finally {
      setSubmitting(false);
    }
  };

  return (
    <Form
      type="Edit"
      post={post}
      setPost={setPost}
      submitting={submitting}
      handleSubmit={updatePrompt}
    />
  );
};

export default EditPrompt;

Follow: How I solved
I moved the EditPrompt component to the components folder and imported it from there.

@Y3ASIN
Copy link

Y3ASIN commented Jul 17, 2024

"use client";
import Link from "next/link";
import Image from "next/image";
import { useState, useEffect } from `"react";` <- typo here
import { useState, useEffect } from "react";
import { signIn, signOut, useSession, getProviders } from "next-auth/react";

const Nav = () => {
  const {data:session} = useSession();
  const [providers, setProviders] = useState(null);
  const [toggle,setToggle] = useState(false);
  useEffect(() => {
    const setUpProviders = async () => {
      const response = await getProviders();
      // alert(response);
      console.log(response);
      setProviders(response);
      console.log(providers);
    };
    setUpProviders();
  }, []);
  return (
    <div className="w-full flex-between m-2 ">
      <Link href="/">
        <Image
          src="/assets/images/logo.svg"
          alt="logo"
          width={30}
          height={30}
        />
      </Link>
      {/* {alert(providers)} */}
      {/* desktop view */}
      <div className="sm:flex hidden">
        {session?.user ? (
          <div className="flex gap-2">
            <Link href="/create-prompt" className="black_btn">
              Create Post
            </Link>
            <button type="button" onClick={signOut} className="outline_btn">
              {" "}
              Sign Out
            </button>
            <Link href="profile">
              <Image
                src="/assets/images/logo.svg"
                width={37}
                height={37}
                alt="profile"
              ></Image>
            </Link>
          </div>
        ) : (
          <>
            {providers &&
              Object.values(providers).map((provider) => {
                <button
                  type="button"
                  key={provider.name}
                  onClick={() => signIn(provider.id)}
                  className="black_btn" <- was missing
                >
                  Sign In
                </button>;
              })}
          </>
        )}
      </div >
      {/* mobile view */}
      <div className="sm:hidden relative flex">
        {session?.user ? (<div>
              <Image
                src="/assets/images/logo.svg"
                width={37}
                height={37}
                alt="profile"
                onClick={()=>setToggle((prev)=>!prev)}
              />
              {toggle && (
                <div className="dropdown">
                  <Link
                    href="/profile"
                    className="dropdown_link"
                    onClick={() => setToggle(false)}
                  >
                    Profile
                  </Link>
                  <Link
                    href="/create-prompt"
                    className="dropdown_link"
                    onClick={() => setToggle(false)}
                  >
                    Create Post
                  </Link>
                  <button
                    type="button"
                    onClick={() => {
                      setToggle(false);
                      signOut();
                    }}
                    className="mt-5 w-full black_btn"
                  >
                    Sign Out
                  </button>
                </div>
              )}
              </div>
        ) : (
          <>
            {providers &&
              Object.values(providers).map((provider) => {
                <button
                  type="button"
                  key={provider.name}
                  onClick={() => signIn(provider.id)}
                  className="black_btn" <- was missing
                >
                  Sign In
                </button>;
              })}
          </>
        )}
      </div>
    </div>
  );
};

export default Nav;

Sign in button not showing, pls help.


@Rishik-Seth

Here Typo

import { useState, useEffect } from `"react";` <- typo here
import { useState, useEffect } from "react";

In providers state conditional rendering missing className='black_btn'

{providers &&
   Object.values(providers).map((provider) => {
      <button
         type="button"
         key={provider.name}
         onClick={() => signIn(provider.id)}
         className="black_btn" <- was missing
        >
        Sign In
       </button>;
})}

My code is working fine. You can look into codes.

You can also look here: Showing Sign-in button

@Y3ASIN
Copy link

Y3ASIN commented Jul 17, 2024

Hii all, when i am deploying my project on vercel it is giving me error like below... Export encountered errors on following paths: /update-prompt/page: /update-prompt
please help me with that Screenshot 2024-07-02 183946

just go to the next.config.mjs and add the following line in the experimental attribute=> missingSuspenseWithCSRBailout: false


@krizto8

In next.js documentation, it is not ideal as they say. Next js documentation

@drshshzaman
Copy link

Screenshot 2024-07-17 151832

i successfully went through the access denied error but when i try to login it says to try with a different account. Can anyone please help. Its been 3hours and i am working on this error

@Y3ASIN
Copy link

Y3ASIN commented Jul 17, 2024

Screenshot 2024-07-17 151832

i successfully went through the access denied error but when i try to login it says to try with a different account. Can anyone please help. Its been 3hours and i am working on this error


@drshshzaman

Check your 'console.cloud' on Google OAuth 2.0, and check for typos. It happened in my case and I was able to solve it.

@brotherSI
Copy link

brotherSI commented Jul 17, 2024 via email

@drshshzaman
Copy link

Screenshot 2024-07-17 151832
i successfully went through the access denied error but when i try to login it says to try with a different account. Can anyone please help. Its been 3hours and i am working on this error

@drshshzaman
Check your 'console.cloud' on Google OAuth 2.0, and check for typos. It happened in my case and I was able to solve it.

I have checked everything triple times but still it doesnt work. i cant even find its fix in the documentation. please help

@Y3ASIN
Copy link

Y3ASIN commented Jul 17, 2024

Screenshot 2024-07-17 151832
i successfully went through the access denied error but when i try to login it says to try with a different account. Can anyone please help. Its been 3hours and i am working on this error

@drshshzaman
Check your 'console.cloud' on Google OAuth 2.0, and check for typos. It happened in my case and I was able to solve it.

I have checked everything triple times but still it doesnt work. i cant even find its fix in the documentation. please help


@drshshzaman

Check your api/auth/[...nextauth] route.js
Next Auth route

@drshshzaman
Copy link

Screenshot 2024-07-17 151832
i successfully went through the access denied error but when i try to login it says to try with a different account. Can anyone please help. Its been 3hours and i am working on this error

@drshshzaman
Check your 'console.cloud' on Google OAuth 2.0, and check for typos. It happened in my case and I was able to solve it.

I have checked everything triple times but still it doesnt work. i cant even find its fix in the documentation. please help

@drshshzaman
Check your api/auth/[...nextauth] route.js Next Auth route

I have literally copy pasted from the repo and checked three times everything. i cant get it whats wrong.
as

i have added this line in the end
export { handler as GET, handler as POST };

please tell me the fix. its been two days and i am stuck

@LauraCopetti
Copy link

Hello everyone. I´ve been having this issue and don´t know how to fix it.
imagem_2024-07-18_211952807
Would appreciate some help.

@Boat718
Copy link

Boat718 commented Jul 20, 2024

Hello everyone. I´ve been having this issue and don´t know how to fix it. imagem_2024-07-18_211952807 Would appreciate some help.

I think you have to use "use client" at the top of your importing
example:
'use client' import { useSession } from 'next-auth/react' import { useRouter } from 'next/navigation' import {useState, useEffect} from 'react'

@satyaki07
Copy link

satyaki07 commented Jul 24, 2024

After moving the async functions in route.js inside callbacks object, I am getting timed out error
Screenshot 2024-07-24 at 2 17 52 PM
MongooseError: Operation users.findOne() buffering timed out after 10000ms
at Timeout. (/Users/satbose/promptopia/node_modules/mongoose/lib/drivers/node-mongodb-native/collection.js:185:23)
at listOnTimeout (node:internal/timers:573:17)
at process.processTimers (node:internal/timers:514:7)
GET /api/auth/callback/google?state=LtbhGTi_II6RGfOs0fHyFkTPDeU6EJIDAR_yfCfjk_w&code=4%2F0AcvDMrA8ZXoWghvqrxPqWThKv0pwJ3WRSTKrVZa4xeuDXANUZUZoI-nlUeJs-87lqP0LGg&scope=email+profile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+openid&authuser=0&prompt=none 302 in 10846ms
GET /api/auth/error?error=AccessDenied 403 in 18ms
MongooseError: Operation users.findOne() buffering timed out after 10000ms
at Timeout. (/Users/satbose/promptopia/node_modules/mongoose/lib/drivers/node-mongodb-native/collection.js:185:23)
at listOnTimeout (node:internal/timers:573:17)
at process.processTimers (node:internal/timers:514:7)

@M7Moaz
Copy link

M7Moaz commented Aug 7, 2024

Screenshot 2024-07-17 151832
i successfully went through the access denied error but when i try to login it says to try with a different account. Can anyone please help. Its been 3hours and i am working on this error

@drshshzaman
Check your 'console.cloud' on Google OAuth 2.0, and check for typos. It happened in my case and I was able to solve it.

I have checked everything triple times but still it doesnt work. i cant even find its fix in the documentation. please help

@drshshzaman
Check your api/auth/[...nextauth] route.js Next Auth route

I have literally copy pasted from the repo and checked three times everything. i cant get it whats wrong. as

i have added this line in the end export { handler as GET, handler as POST };

please tell me the fix. its been two days and i am stuck

Hi, I get the same issue and I could not solve it. Did you find a solution to the problem?

@PauloMBorges
Copy link

Screenshot 2024-07-17 151832
i successfully went through the access denied error but when i try to login it says to try with a different account. Can anyone please help. Its been 3hours and i am working on this error

@drshshzaman
Check your 'console.cloud' on Google OAuth 2.0, and check for typos. It happened in my case and I was able to solve it.

I have checked everything triple times but still it doesnt work. i cant even find its fix in the documentation. please help

@drshshzaman
Check your api/auth/[...nextauth] route.js Next Auth route

I have literally copy pasted from the repo and checked three times everything. i cant get it whats wrong. as
i have added this line in the end export { handler as GET, handler as POST };
please tell me the fix. its been two days and i am stuck

Hi, I get the same issue and I could not solve it. Did you find a solution to the problem?

After some time trying different solutions, I found one that worked for me:
I changed the .env from the 'utils' directory to the root directory of the project and restarted the development server (by running npm run dev)
This resolved the issue for me. To confirm, I moved the .env file back to the utils directory, and the problem reappeared

@M7Moaz
Copy link

M7Moaz commented Aug 14, 2024

Screenshot 2024-07-17 151832
i successfully went through the access denied error but when i try to login it says to try with a different account. Can anyone please help. Its been 3hours and i am working on this error

@drshshzaman
Check your 'console.cloud' on Google OAuth 2.0, and check for typos. It happened in my case and I was able to solve it.

I have checked everything triple times but still it doesnt work. i cant even find its fix in the documentation. please help

@drshshzaman
Check your api/auth/[...nextauth] route.js Next Auth route

I have literally copy pasted from the repo and checked three times everything. i cant get it whats wrong. as
i have added this line in the end export { handler as GET, handler as POST };
please tell me the fix. its been two days and i am stuck

Hi, I get the same issue and I could not solve it. Did you find a solution to the problem?

After some time trying different solutions, I found one that worked for me: I changed the .env from the 'utils' directory to the root directory of the project and restarted the development server (by running npm run dev) This resolved the issue for me. To confirm, I moved the .env file back to the utils directory, and the problem reappeared

i will try this. thank you

@Shashi460
Copy link

Hey guys! For those, who have "Access Denied" error. After spent some time debugging, I figured: My google name is less longer then 8 characters. So, I just change validation from 8 to 6 characters, which solved this issue

username: { type: String, required: [true, 'Username is required!'], match: [/^(?=.{6,20}$)(?![.])(?!.*[.]{2})[a-zA-Z0-9.]+(?<![.])$/, }

Hoping this will help somebody to get out from error.

Thank you for the information it resolve my error

@Destycoco
Copy link

whenever I try to use http://localhost:3000 on google cloud console, it doesn't' accept it. please how can I go about this??

@shakir-xcode
Copy link

whenever I try to use http://localhost:3000 on google cloud console, it doesn't' accept it. please how can I go about this??

I faced the same issue, I proceeded without setting it and it worked just fine.

@Gmohsin
Copy link

Gmohsin commented Aug 20, 2024

I'm getting the following error, any solution ?

message: 'Operation users.findOne() buffering timed out after 10000ms',
stack: 'MongooseError: Operation users.findOne() buffering timed out after 10000ms\n' +
' at Timeout. (C:\Users\Mohsin\Documents\nextapp\node_modules\mongoose\lib\drivers\node-mongodb-native\collection.js:185:23)\n' +
' at listOnTimeout (node:internal/timers:581:17)\n' +
' at process.processTimers (node:internal/timers:519:7)',
name: 'MongooseError'

@shakir-xcode
Copy link

I'm getting the following error, any solution ?

message: 'Operation users.findOne() buffering timed out after 10000ms',
stack: 'MongooseError: Operation users.findOne() buffering timed out after 10000ms\n' +
' at Timeout. (C:\Users\Mohsin\Documents\nextapp\node_modules\mongoose\lib\drivers\node-mongodb-native\collection.js:185:23)\n' +
' at listOnTimeout (node:internal/timers:581:17)\n' +
' at process.processTimers (node:internal/timers:519:7)',
name: 'MongooseError'

In my case I wasn't getting connected to DB because of invalid mongodb uri.

@Ayo-lenz
Copy link

i am unable to delete the prompt permanently, it deletes initially but when i go back to my feed i still find it there and if i navigate back to my profile also i see it the even after deleting, it comes back

@JesseZeph
Copy link

i am unable to delete the prompt permanently, it deletes initially but when i go back to my feed i still find it there and if i navigate back to my profile also i see it the even after deleting, it comes back

It should be findByIdAndDelete not findByIdAndRemove

@metuDein
Copy link

Screenshot 2024-07-17 151832

i successfully went through the access denied error but when i try to login it says to try with a different account. Can anyone please help. Its been 3hours and i am working on this error

the username in the user.js model is what is causing this error

@ANGIRAVO
Copy link

[next-auth][warn][NEXTAUTH_URL]
https://next-auth.js.org/warnings#nextauth_url
[next-auth][warn][NO_SECRET]
https://next-auth.js.org/warnings#no_secret
GET /api/auth/providers 200 in 389ms
my nav.jsx code is

"use client";
import Link from "next/link";
import Image from "next/image";
import { useEffect, useState } from "react";
import { signIn, signOut, useSession, getProviders } from "next-auth/react";

const Nav = () => {
const { data: session } = useSession();
// if the user is not logged in

const [providers, setProviders] = useState(null);
const [toggleDropdown, setToggleDropdown] = useState(false);



useEffect(() => {
    (async () => {
      const res = await getProviders();
      setProviders(res);
    })();
  }, []);

return (



logo


Promptopia



{/* Desktop Navigation */}

   <div className='sm:flex hidden'>
    {session?.user ?(
        <div className="flex gap-3 md:gap-5">
            <Link href="/create-prompt" className="black_btn">
            create post
            </Link>
            <button type='button' onClick={signOut} className='outline_btn'>
          Sign Out
         </button>
         <Link href='/profile'>
          <Image
            src={session?.user.image}
            width={37}
            height={37}
            className='rounded-full'
            alt='profile'
          />
        </Link>


        </div>
    ):(
        <>
        {providers &&
          Object.values(providers).map((provider) => (
            <button
              type='button'
              key={provider.name}
              onClick={() => {
                signIn(provider.id);
              }}
              className='black_btn'
            >
              Sign in
            </button>
          ))}
        </>

    )}
{/* Mobile Navigation */}
{session?.user ? (
profile setToggleDropdown(!toggleDropdown)} />
        {toggleDropdown && (
          <div className='dropdown'>
            <Link
              href='/profile'
              className='dropdown_link'
              onClick={() => setToggleDropdown(false)}
            >
              My Profile
            </Link>
            <Link
              href='/create-prompt'
              className='dropdown_link'
              onClick={() => setToggleDropdown(false)}
            >
              Create Prompt
            </Link>
            <button
              type='button'
              onClick={() => {
                setToggleDropdown(false);
                signOut();
              }}
              className='mt-5 w-full black_btn'
            >
              Sign Out
            </button>
          </div>
        )}
      </div>
    ) : (
      <>
        {providers &&
          Object.values(providers).map((provider) => (
            <button
              type='button'
              key={provider.name}
              onClick={() => {
                signIn(provider.id);
              }}
              className='black_btn'
            >
              Sign in
            </button>
          ))}
      </>
    )}
  </div>
</nav>

);
};

export default Nav;

it is not showing the create post and right icon. please help

@Y3ASIN
Copy link

Y3ASIN commented Sep 15, 2024

@ANGIRAVO

You should recheck the code of next auth. You can follow mine
Also check the Nav component

@ANGIRAVO
Copy link

message: 'client_id is required',
stack: 'TypeError: client_id is required\n' +
' at new BaseClient (webpack-internal:///(rsc)/./node_modules/openid-client/lib/client.js:148:19)\n' +
' at new Client (webpack-internal:///(rsc)/./node_modules/openid-client/lib/client.js:1673:13)\n' +
' at openidClient (webpack-internal:///(rsc)/./node_modules/next-auth/core/lib/oauth/client.js:29:18)\n' +
' at process.processTicksAndRejections (node:internal/process/task_queues:95:5)\n' +
' at async getAuthorizationUrl (webpack-internal:///(rsc)/./node_modules/next-auth/core/lib/oauth/authorization-url.js:70:18)\n' +
' at async Object.signin (webpack-internal:///(rsc)/./node_modules/next-auth/core/routes/signin.js:38:24)\n' +
' at async AuthHandler (webpack-internal:///(rsc)/./node_modules/next-auth/core/index.js:260:26)\n' +
' at async NextAuthRouteHandler (webpack-internal:///(rsc)/./node_modules/next-auth/next/index.js:69:28)\n' +
' at async NextAuth._args$ (webpack-internal:///(rsc)/./node_modules/next-auth/next/index.js:105:16)\n' +
' at async C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\compiled\next-server\app-route.runtime.dev.js:6:55755\n' +
' at async eO.execute (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\compiled\next-server\app-route.runtime.dev.js:6:46523)\n' +
' at async eO.handle (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\compiled\next-server\app-route.runtime.dev.js:6:57089)\n' +
' at async doRender (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\base-server.js:1359:42)\n' +
' at async cacheEntry.responseCache.get.routeKind (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\base-server.js:1569:40)\n' +
' at async DevServer.renderToResponseWithComponentsImpl (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\base-server.js:1489:28)\n' +
' at async DevServer.renderPageComponent (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\base-server.js:1920:24)\n' +
' at async DevServer.renderToResponseImpl (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\base-server.js:1958:32)\n' +
' at async DevServer.pipeImpl (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\base-server.js:917:25)\n' +
' at async NextNodeServer.handleCatchallRenderRequest (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\next-server.js:272:17)\n' +
' at async DevServer.handleRequestImpl (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\base-server.js:813:17)\n' +
' at async C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\dev\next-dev-server.js:339:20\n' +
' at async Span.traceAsyncFn (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\trace\trace.js:154:20)\n' +
' at async DevServer.handleRequest (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\dev\next-dev-server.js:336:24)\n' +
' at async invokeRender (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\lib\router-server.js:173:21)\n' +
' at async handleRequest (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\lib\router-server.js:350:24)\n' +
' at async requestHandlerImpl (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\lib\router-server.js:374:13)\n' +
' at async Server.requestListener (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\lib\start-server.js:141:13)',
name: 'TypeError'
},
providerId: 'google',
message: 'client_id is required'
}
POST /api/auth/signin/google 302 in 131ms
GET /api/auth/error?error=OAuthSignin 302 in 12ms
[next-auth][error][SIGNIN_OAUTH_ERROR]
https://next-auth.js.org/errors#signin_oauth_error client_id is required {
error: {
message: 'client_id is required',
stack: 'TypeError: client_id is required\n' +
' at new BaseClient (webpack-internal:///(rsc)/./node_modules/openid-client/lib/client.js:148:19)\n' +
' at new Client (webpack-internal:///(rsc)/./node_modules/openid-client/lib/client.js:1673:13)\n' +
' at openidClient (webpack-internal:///(rsc)/./node_modules/next-auth/core/lib/oauth/client.js:29:18)\n' +
' at process.processTicksAndRejections (node:internal/process/task_queues:95:5)\n' +
' at async getAuthorizationUrl (webpack-internal:///(rsc)/./node_modules/next-auth/core/lib/oauth/authorization-url.js:70:18)\n' +
' at async Object.signin (webpack-internal:///(rsc)/./node_modules/next-auth/core/routes/signin.js:38:24)\n' +
' at async AuthHandler (webpack-internal:///(rsc)/./node_modules/next-auth/core/index.js:260:26)\n' +
' at async NextAuthRouteHandler (webpack-internal:///(rsc)/./node_modules/next-auth/next/index.js:69:28)\n' +
' at async NextAuth._args$ (webpack-internal:///(rsc)/./node_modules/next-auth/next/index.js:105:16)\n' +
' at async C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\compiled\next-server\app-route.runtime.dev.js:6:55755\n' +
' at async eO.execute (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\compiled\next-server\app-route.runtime.dev.js:6:46523)\n' +
' at async eO.handle (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\compiled\next-server\app-route.runtime.dev.js:6:57089)\n' +
' at async doRender (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\base-server.js:1359:42)\n' +
' at async cacheEntry.responseCache.get.routeKind (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\base-server.js:1569:40)\n' +
' at async DevServer.renderToResponseWithComponentsImpl (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\base-server.js:1489:28)\n' +
' at async DevServer.renderPageComponent (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\base-server.js:1920:24)\n' +
' at async DevServer.renderToResponseImpl (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\base-server.js:1958:32)\n' +
' at async DevServer.pipeImpl (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\base-server.js:917:25)\n' +
' at async NextNodeServer.handleCatchallRenderRequest (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\next-server.js:272:17)\n' +
' at async DevServer.handleRequestImpl (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\base-server.js:813:17)\n' +
' at async C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\dev\next-dev-server.js:339:20\n' +
' at async Span.traceAsyncFn (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\trace\trace.js:154:20)\n' +
' at async DevServer.handleRequest (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\dev\next-dev-server.js:336:24)\n' +
' at async invokeRender (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\lib\router-server.js:173:21)\n' +
' at async handleRequest (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\lib\router-server.js:350:24)\n' +
' at async requestHandlerImpl (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\lib\router-server.js:374:13)\n' +
' at async Server.requestListener (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\lib\start-server.js:141:13)',
name: 'TypeError'
},
providerId: 'google',
message: 'client_id is required'
}
POST /api/auth/signin/google 302 in 114ms
GET /api/auth/error?error=OAuthSignin 302 in 11ms
GET /api/auth/signin?error=OAuthSignin 200 in 15ms
[next-auth][error][SIGNIN_OAUTH_ERROR]
https://next-auth.js.org/errors#signin_oauth_error client_id is required {
error: {
message: 'client_id is required',
stack: 'TypeError: client_id is required\n' +
' at new BaseClient (webpack-internal:///(rsc)/./node_modules/openid-client/lib/client.js:148:19)\n' +
' at new Client (webpack-internal:///(rsc)/./node_modules/openid-client/lib/client.js:1673:13)\n' +
' at openidClient (webpack-internal:///(rsc)/./node_modules/next-auth/core/lib/oauth/client.js:29:18)\n' +
' at process.processTicksAndRejections (node:internal/process/task_queues:95:5)\n' +
' at async getAuthorizationUrl (webpack-internal:///(rsc)/./node_modules/next-auth/core/lib/oauth/authorization-url.js:70:18)\n' +
' at async Object.signin (webpack-internal:///(rsc)/./node_modules/next-auth/core/routes/signin.js:38:24)\n' +
' at async AuthHandler (webpack-internal:///(rsc)/./node_modules/next-auth/core/index.js:260:26)\n' +
' at async NextAuthRouteHandler (webpack-internal:///(rsc)/./node_modules/next-auth/next/index.js:69:28)\n' +
' at async NextAuth._args$ (webpack-internal:///(rsc)/./node_modules/next-auth/next/index.js:105:16)\n' +
' at async C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\compiled\next-server\app-route.runtime.dev.js:6:55755\n' +
' at async eO.execute (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\compiled\next-server\app-route.runtime.dev.js:6:46523)\n' +
' at async eO.handle (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\compiled\next-server\app-route.runtime.dev.js:6:57089)\n' +
' at async doRender (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\base-server.js:1359:42)\n' +
' at async cacheEntry.responseCache.get.routeKind (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\base-server.js:1569:40)\n' +
' at async DevServer.renderToResponseWithComponentsImpl (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\base-server.js:1489:28)\n' +
' at async DevServer.renderPageComponent (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\base-server.js:1920:24)\n' +
' at async DevServer.renderToResponseImpl (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\base-server.js:1958:32)\n' +
' at async DevServer.pipeImpl (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\base-server.js:917:25)\n' +
' at async NextNodeServer.handleCatchallRenderRequest (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\next-server.js:272:17)\n' +
' at async DevServer.handleRequestImpl (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\base-server.js:813:17)\n' +
' at async C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\dev\next-dev-server.js:339:20\n' +
' at async Span.traceAsyncFn (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\trace\trace.js:154:20)\n' +
' at async DevServer.handleRequest (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\dev\next-dev-server.js:336:24)\n' +
' at async invokeRender (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\lib\router-server.js:173:21)\n' +
' at async handleRequest (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\lib\router-server.js:350:24)\n' +
' at async requestHandlerImpl (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\lib\router-server.js:374:13)\n' +
' at async Server.requestListener (C:\Users\angir\OneDrive\Desktop\promptopia\node_modules\next\dist\server\lib\start-server.js:141:13)',
name: 'TypeError'
},
providerId: 'google',
message: 'client_id is required'
}
POST /api/auth/signin/google 302 in 115ms
GET /api/auth/error?error=OAuthSignin 302 in 11ms
GET /api/auth/signin?error=OAuthSignin 200 in 11ms i have correctly done the google outh part still it is showing this evrytime and i could not sign in

@DwiPriyatmoko
Copy link

Screenshot 2024-09-25 202119
Screenshot 2024-09-25 203048

I got an error while working on PromptCard.jsx (at youtube 2:24:42).
I think this problem applies to
{post.creator.image}
{post.creator.username}
{post.creator.email}

I would appreciate some help 😊

@Y3ASIN
Copy link

Y3ASIN commented Sep 30, 2024

@DwiPriyatmoko

Try adding optional chaining like this

{post?.creator?.image}
{post?.creator?.username}
{post?.creator?.email}

@DwiPriyatmoko
Copy link

@DwiPriyatmoko

Try adding optional chaining like this

{post?.creator?.image}
{post?.creator?.username}
{post?.creator?.email}

I was using this technique, but in the end, it caused some issues, bro.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment