From d1e5329d84f83986754045ecf27d242f99f05ed3 Mon Sep 17 00:00:00 2001 From: jack Date: Tue, 19 Mar 2019 11:12:13 -0400 Subject: [PATCH] Return media query value from useMedia on initial render --- src/useMedia.tsx | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/src/useMedia.tsx b/src/useMedia.tsx index 7f4bf99..040fc06 100644 --- a/src/useMedia.tsx +++ b/src/useMedia.tsx @@ -1,37 +1,48 @@ -import { useState, useEffect } from 'react'; +import React from 'react'; import json2mq from 'json2mq'; export function useMedia( query: string | { [key: string]: any }, - defaultMatches = true + defaultMatches: boolean = true ) { - const [matches, setMatches] = useState(defaultMatches); + const mediaQueryList = React.useRef(undefined); - useEffect( + const [matches, setMatches] = React.useState(() => { + if (typeof window !== 'object') { + return defaultMatches; + } + + mediaQueryList.current = window.matchMedia( + typeof query === 'string' ? query : json2mq(query) + ); + + return !!mediaQueryList.current.matches; + }); + + React.useEffect( () => { - const mediaQueryList = window.matchMedia( - typeof query === 'string' ? query : json2mq(query) - ); - let active = true; + // mediaQueryList.current will only be undefined on the server + const currentMediaQueryList = mediaQueryList.current!; + let active = true; const listener = () => { if (!active) { return; } - if (mediaQueryList.matches) { + if (currentMediaQueryList.matches) { setMatches(true); } else { setMatches(false); } }; - mediaQueryList.addListener(listener); - setMatches(mediaQueryList.matches); + currentMediaQueryList.addListener(listener); + setMatches(matches); return () => { active = false; - mediaQueryList.removeListener(listener); + currentMediaQueryList.removeListener(listener); }; }, [query]