diff --git a/react-advanced-tag1/src/components/exercises/UserOverview.tsx b/react-advanced-tag1/src/components/exercises/UserOverview.tsx index e6c828c..1cd08d2 100644 --- a/react-advanced-tag1/src/components/exercises/UserOverview.tsx +++ b/react-advanced-tag1/src/components/exercises/UserOverview.tsx @@ -1,8 +1,13 @@ import { useFetch } from "../../hooks/useFetch"; +import { useMediaQuery } from "../../hooks/useMediaQuery"; export function UserOverview() { const {data, loading, error} = useFetch("https://jsonplaceholder.typicode.com/users"); + const isMobile = useMediaQuery('(max-width: 600px)'); + + console.log("isMobile", isMobile); + if (error) { return

Error: {error}

; } @@ -18,7 +23,7 @@ export function UserOverview() { diff --git a/react-advanced-tag1/src/hooks/useMediaQuery.ts b/react-advanced-tag1/src/hooks/useMediaQuery.ts new file mode 100644 index 0000000..f234bef --- /dev/null +++ b/react-advanced-tag1/src/hooks/useMediaQuery.ts @@ -0,0 +1,31 @@ +import { useEffect, useState } from "react"; + + +/** + * Custom hook to check if a media query matches the current viewport. + * @param query - The media query string (e.g., '(max-width: 600px)') + * @returns A boolean indicating whether the media query matches. + */ +export function useMediaQuery(query: string) { + const [matches, setMatches] = useState(false); + + useEffect(() => { + const mediaQueryList = window.matchMedia(query); + const handleChange = (event: MediaQueryListEvent) => { + setMatches(event.matches); + }; + + // Set the initial value + setMatches(mediaQueryList.matches); + + // Add event listener + mediaQueryList.addEventListener('change', handleChange); + + // Cleanup function to remove the event listener + return () => { + mediaQueryList.removeEventListener('change', handleChange); + }; + }, [query]); + + return matches; +} \ No newline at end of file