Update index.ts

pull/654/head
Adarsh Jha 9 months ago committed by GitHub
parent 641e75b8a8
commit 78b8d3e41d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -4,42 +4,63 @@ export function useOutsideAlerter<T extends HTMLElement>(
ref: RefObject<T>, ref: RefObject<T>,
handler: () => void, handler: () => void,
additionalDeps: unknown[], additionalDeps: unknown[],
handleEscapeKey?: boolean,
) { ) {
useEffect(() => { useEffect(() => {
function handleClickOutside(this: Document, event: MouseEvent) { function handleClickOutside(event: MouseEvent) {
if (ref.current && !ref.current.contains(event.target as Node)) { if (ref.current && !ref.current.contains(event.target as Node)) {
handler(); handler();
} }
} }
function handleEscape(event: KeyboardEvent) {
if (event.key === 'Escape') {
handler();
}
}
document.addEventListener('mousedown', handleClickOutside); document.addEventListener('mousedown', handleClickOutside);
if (handleEscapeKey) {
document.addEventListener('keydown', handleEscape);
}
return () => { return () => {
document.removeEventListener('mousedown', handleClickOutside); document.removeEventListener('mousedown', handleClickOutside);
if (handleEscapeKey) {
document.removeEventListener('keydown', handleEscape);
}
}; };
}, [ref, ...additionalDeps]); }, [ref, ...additionalDeps]);
} }
// Use isMobile for checking if the width is in the expected mobile range (less than 768px)
// use IsDesktop for effects you explicitly only want when width is wider than 960px.
export function useMediaQuery() { export function useMediaQuery() {
const mobileQuery = '(max-width: 768px)'; const mobileQuery = '(max-width: 768px)';
const darkModeQuery = '(prefers-color-scheme: dark)'; // Detect dark mode
const desktopQuery = '(min-width: 960px)'; const desktopQuery = '(min-width: 960px)';
const [isMobile, setIsMobile] = useState(false); const [isMobile, setIsMobile] = useState(false);
const [isDesktop, setIsDesktop] = useState(false); const [isDesktop, setIsDesktop] = useState(false);
const [isDarkMode, setIsDarkMode] = useState(false);
useEffect(() => { useEffect(() => {
const mobileMedia = window.matchMedia(mobileQuery); const mobileMedia = window.matchMedia(mobileQuery);
const desktopMedia = window.matchMedia(desktopQuery); const desktopMedia = window.matchMedia(desktopQuery);
const darkModeMedia = window.matchMedia(darkModeQuery);
const updateMediaQueries = () => { const updateMediaQueries = () => {
setIsMobile(mobileMedia.matches); setIsMobile(mobileMedia.matches);
setIsDesktop(desktopMedia.matches); setIsDesktop(desktopMedia.matches);
setIsDarkMode(darkModeMedia.matches);
}; };
updateMediaQueries(); updateMediaQueries();
const listener = () => updateMediaQueries(); const listener = () => updateMediaQueries();
window.addEventListener('resize', listener); window.addEventListener('resize', listener);
return () => { return () => {
window.removeEventListener('resize', listener); window.removeEventListener('resize', listener);
}; };
}, [mobileQuery, desktopQuery]); }, [mobileQuery, desktopQuery, darkModeQuery]);
return { isMobile, isDesktop }; return { isMobile, isDesktop, isDarkMode };
} }

Loading…
Cancel
Save