Problem with image caching
Unanswered
π‘πΈπ«π© posted this in #help-forum
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>
</>
);
}
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
This might help you - https://nextjs.org/docs/app/api-reference/components/image#theme-detection-css
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>
);
}
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 π