diff --git a/snippets/useMediaQuery.md b/snippets/useMediaQuery.md
new file mode 100644
index 000000000..5314eb1e3
--- /dev/null
+++ b/snippets/useMediaQuery.md
@@ -0,0 +1,40 @@
+---
+title: useMediaQuery
+tags: hooks,state,effect,intermediate
+---
+
+A hook that returns a value based on a media query.
+
+- Check if `window` and `window.matchMedia` exist, return `whenFalse` if not.
+- Use `window.matchMedia()` to match the given `query`, cast its `matches` property to a boolean and store in a state variable, `match`, using `React.useState()`.
+- Use `React.useEffect()` to add a listener for changes and to clean up the listeners after the hook is destroyed.
+- Return either `whenTrue` or `whenFalse` based on the value of `match`.
+
+```jsx
+const useMediaQuery = (query, whenTrue, whenFalse) => {
+ if (typeof window === 'undefined' || typeof window.matchMedia === 'undefined') return whenFalse;
+
+ const mediaQuery = window.matchMedia(query);
+ const [match, setMatch] = React.useState(!!mediaQuery.matches);
+
+ React.useEffect(() => {
+ const handler = () => setMatch(!!mediaQuery.matches);
+ mediaQuery.addListener(handler);
+ return () => mediaQuery.removeListener(handler);
+ }, []);
+
+ return match ? whenTrue : whenFalse;
+};
+```
+
+```jsx
+const ResponsiveText = () => {
+ const text = useMediaQuery(
+ '(max-width: 400px)', 'Less than 400px wide', 'More than 400px wide'
+ );
+
+ return {text};
+}
+
+ReactDOM.render(, document.getElementById('root'));
+```