diff options
| author | Sebastien Castiel <sebastien@castiel.me> | 2024-01-09 08:53:51 -0500 |
|---|---|---|
| committer | Sebastien Castiel <sebastien@castiel.me> | 2024-01-09 08:53:51 -0500 |
| commit | 1b9e624004cfb64135b744f877e5fa87e5810abd (patch) | |
| tree | f1994b7c10d98410bdc73ca323d2c32e6e019bac /src/lib | |
| parent | 6bd3299331265ea2a0c800e3c3199ad4e32ce8de (diff) | |
Ask the user who they are when opening a group for the first time (#7)
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/hooks.ts | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/lib/hooks.ts b/src/lib/hooks.ts new file mode 100644 index 0000000..02e2543 --- /dev/null +++ b/src/lib/hooks.ts @@ -0,0 +1,42 @@ +import { useEffect, useState } from 'react' + +export function useMediaQuery(query: string): boolean { + const getMatches = (query: string): boolean => { + // Prevents SSR issues + if (typeof window !== 'undefined') { + return window.matchMedia(query).matches + } + return false + } + + const [matches, setMatches] = useState<boolean>(getMatches(query)) + + function handleChange() { + setMatches(getMatches(query)) + } + + useEffect(() => { + const matchMedia = window.matchMedia(query) + + // Triggered at the first client-side load and if query changes + handleChange() + + // Listen matchMedia + if (matchMedia.addListener) { + matchMedia.addListener(handleChange) + } else { + matchMedia.addEventListener('change', handleChange) + } + + return () => { + if (matchMedia.removeListener) { + matchMedia.removeListener(handleChange) + } else { + matchMedia.removeEventListener('change', handleChange) + } + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [query]) + + return matches +} |
