nx/nx-dev/ui-common/src/lib/image-theme.tsx
Jack Hsu 458f2cc1e8
feat(nx-dev): add nx blog (#22828)
Co-authored-by: Juri <juri.strumpflohner@gmail.com>
Co-authored-by: Nicholas Cunningham <ndcunningham@gmail.com>
Co-authored-by: Benjamin Cabanes <3447705+bcabanes@users.noreply.github.com>
2024-04-29 17:04:37 -04:00

47 lines
1.2 KiB
TypeScript

import Image from 'next/image';
import { useEffect, useState } from 'react';
export interface ImageThemeProps {
lightSrc: string;
darkSrc: string;
alt?: string;
[key: string]: any;
}
export function ImageTheme({
lightSrc,
darkSrc,
alt,
...props
}: ImageThemeProps) {
const [src, setSrc] = useState(lightSrc);
// Listen for theme change and update the image
useEffect(() => {
const updateImageSource = () => {
const isDarkMode = document.documentElement.classList.contains('dark');
setSrc(isDarkMode ? darkSrc : lightSrc);
};
updateImageSource();
// Event listener for changes in system theme
const themeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
themeMediaQuery.addEventListener('change', updateImageSource);
const observer = new MutationObserver(updateImageSource);
observer.observe(document.documentElement, {
attributes: true,
attributeFilter: ['class'],
});
// Cleanup function to remove event listener and observer on component unmount
return () => {
themeMediaQuery.removeEventListener('change', updateImageSource);
observer.disconnect();
};
}, []);
return <Image src={src} alt={alt ?? ''} {...props} />;
}