Next.js Discord

Discord Forum

Problem with image caching

Unanswered
𝓑𝓸𝓫𝓩 posted this in #help-forum
Open in Discord
So I made a Navbar component with a Dark Mode button myself and came across an issue: due to the default caching behavior, when I load the website for the first time, the wrong default image and button are shown. I found a solution by setting a mount value so that it gets rendered later, but this made it feel like it's loading too slowly. Does anyone have any tips or help on how to resolve this problem more effectively?

export default function Navbar(){

const {setTheme,resolvedTheme} = useTheme();
const [mounted, setMounted] = useState(false);

useEffect(() => {
setMounted(true);
}, []);

interface NavbarProps {
initialTheme: string;
}


const handleThemeToggle = () => {
setTheme(resolvedTheme === "dark" ? "light" : "dark");
};
if(!mounted){
return
}

return(
#Unknown Channel
<nav className="navbar">
<div className="navbar-item-container">
<ul className="navbar-ul">
<Link href="/profile" className="navbar-item">Profile <Image src={resolvedTheme === "dark" ? pbImgdark : pbImg} alt="profile image"/></Link>
<Link href="/projects" className="navbar-item">Projects</Link>
<Link href="/dashboard" className="navbar-item">Dashboard</Link>
</ul>
</div>
<button onClick={handleThemeToggle}>
<Image src={ resolvedTheme === "dark" ? dark : light} height={32} alt="lightmode logo"/>
</button>
<button>Logout</button>
</nav>
</>
);
}

6 Replies

Thank you i will try it πŸ™‚
@Plague This might help you - https://nextjs.org/docs/app/api-reference/components/image#theme-detection-css
that its sadly not the direction i want to go i works based on the system settings but not on theme set by the use ty for your help anyway πŸ™‚
user*
for now i managed to fix the problem like this :
export default function Navbar(){
const {setTheme,resolvedTheme} = useTheme();
const [lightHidden,setLightHidden] = useState(true);
const [darkHidden,setDarkHidden] = useState(true);

const handleThemeToggle = () => {
if(resolvedTheme === "dark"){
setLightHidden(false);
setDarkHidden(true);
setTheme("light");
}
if(resolvedTheme === "light"){
setDarkHidden(true);
setLightHidden(false);
setTheme("dark");
}
};
useEffect(()=>{
if(!resolvedTheme){
setDarkHidden(false);
setLightHidden(true);
}
else if(resolvedTheme === "light"){
setDarkHidden(true);
setLightHidden(false);
}else if(resolvedTheme === "dark"){
setLightHidden(true);
setDarkHidden(false);
}
},[handleThemeToggle]);

return(
<Link href="/profile" className="navbar-item">Profile
<Image hidden={darkHidden} src={pbDark} alt="profile image" height={40}/>
<Image hidden={lightHidden} src={pbLight} alt="profile image" height={40}/>
</Link>
<button onClick={handleThemeToggle}>
<Image hidden={darkHidden} src={darkMode} alt="profile image" height={30}/>
<Image hidden={lightHidden} src={lightMode} alt="profile image" height={30}/>
</button>

);
}
If anyone finds a better way of solving this problem i am open for any advise πŸ™‚