mirror of
https://github.com/arc53/DocsGPT.git
synced 2025-11-29 08:33:20 +00:00
Update index.ts
This commit is contained in:
@@ -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 };
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user