I am trying to to create an app using NextJS 13.4.7 and am using useMediaQuery
hook to detect if the view is mobile or not. My component is not a server component, but I keep getting client-only
hook errors. Now my client component is a part of server component but from the documentation it seems that it is allowed. Am I missing something? Below is the code,
"use client";
import { useContext, useState, useEffect } from "react";
import PageDataContext from "@/contexts/PageDataContext";
import useMediaQuery from "@/hooks/useMediaQuery";
import { motion } from "framer-motion";
export default function Header() {
const content = useContext(PageDataContext);
const isSmallDevice = useMediaQuery("only screen and (max-width : 991px)");
const [hideNav, setHideNav] = useState(isSmallDevice);
const { home: homeContent } = content;
const { navigation: navigationContent } = content;
const { name } = homeContent;
const [firstName, lastName] = name.split(" ");
const onTheRight = { x: "100%" };
const inTheCenter = { x: 0 };
const onTheLeft = { x: "-100%" };
const transition = { duration: 0.6, ease: "easeInOut" };
const variants = {
open: { opacity: 1, x: "0%" },
closed: { opacity: 0, x: "100%" },
};
const toggleSideNav = () => {
setHideNav(!hideNav);
};
useEffect(() => {
setHideNav(isSmallDevice);
}, [isSmallDevice]);
return (
<header id="site_header" className="header">
<div className="header-content clearfix">
<div className="text-logo">
<a href="/">
<div className="logo-symbol">{firstName[0].toUpperCase()}</div>
<div className="logo-text">
{firstName} <span>{lastName}</span>
</div>
</a>
</div>
<motion.div
animate={hideNav ? "closed" : "open"}
variants={variants}
style={{
position: "fixed",
width: "100%",
height: "calc(100% - 52px)",
top: "52px",
left: "auto",
}}
>
<div className="site-nav">
<ul className="leven-classic-menu site-main-menu">
{navigationContent.map((item, idx) => (
<li className="menu-item" key={"header_key_" + idx}>
<a href={item.url}>{item.title}</a>
</li>
))}
</ul>
</div>
</motion.div>
<a className="menu-toggle mobile-visible" onClick={toggleSideNav}>
<i className="fa fa-bars"></i>
</a>
</div>
</header>
);
}