Extract theme color logic to custom hook

This commit is contained in:
Sam Becker 2024-02-22 09:12:39 -06:00
parent 92d13d586c
commit 272c097c31
2 changed files with 31 additions and 14 deletions

View File

@ -1,6 +1,6 @@
'use client';
import { ReactNode, useEffect, useLayoutEffect, useRef, useState } from 'react';
import { ReactNode, useEffect, useRef, useState } from 'react';
import { motion } from 'framer-motion';
import { clsx } from 'clsx/lite';
import useClickInsideOutside from '@/utility/useClickInsideOutside';
@ -8,7 +8,7 @@ import { useRouter } from 'next/navigation';
import AnimateItems from './AnimateItems';
import { PATH_ROOT } from '@/site/paths';
import usePrefersReducedMotion from '@/utility/usePrefersReducedMotion';
import { useTheme } from 'next-themes';
import useMetaThemeColor from '@/site/useMetaThemeColor';
export default function Modal({
onClosePath,
@ -39,18 +39,7 @@ export default function Modal({
}
}, []);
const { resolvedTheme } = useTheme();
useLayoutEffect(() => {
if (resolvedTheme === 'light') {
// Temporarily create meta tag for overlays in light mode,
// which prevents stale headers on theme changes
const meta = document.createElement('meta');
meta.name = 'theme-color';
meta.content = '#333';
document.getElementsByTagName('head')[0]?.appendChild(meta);
return () => meta.remove();
}
}, [resolvedTheme]);
useMetaThemeColor({ colorLight: '#333' });
useClickInsideOutside({
htmlElements,

View File

@ -0,0 +1,28 @@
import { useTheme } from 'next-themes';
import { useEffect } from 'react';
export default function useMetaThemeColor({
colorLight,
colorDark,
}: {
colorLight?: string
colorDark?: string
}) {
const { resolvedTheme } = useTheme();
const preferredThemeColor = resolvedTheme === 'light'
? colorLight
: colorDark;
useEffect(() => {
if (preferredThemeColor) {
// Temporarily create meta tag for overlays,
// which prevents stale headers on theme changes
const meta = document.createElement('meta');
meta.name = 'theme-color';
meta.content = preferredThemeColor;
document.getElementsByTagName('head')[0]?.appendChild(meta);
return () => meta.remove();
}
}, [preferredThemeColor]);
}