diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0d4e554..5a9a60b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+# [1.3.0](https://github.com/streamich/use-media/compare/v1.2.0...v1.3.0) (2019-03-13)
+
+
+### Features
+
+* add useMediaLayout hook ([6b04735](https://github.com/streamich/use-media/commit/6b04735))
+
# [1.2.0](https://github.com/streamich/use-media/compare/v1.1.0...v1.2.0) (2019-02-18)
diff --git a/README.md b/README.md
index 2d9a2ac..2b9d1d4 100644
--- a/README.md
+++ b/README.md
@@ -5,6 +5,8 @@
## Usage
+With `useEffect`
+
```jsx
import {useMedia} from 'use-media';
@@ -21,3 +23,22 @@ const Demo = () => {
);
};
```
+
+With `useLayoutEffect`
+
+```jsx
+import {useMediaLayout} from 'use-media';
+
+const Demo = () => {
+ // Accepts an object of features to test
+ const isWide = useMediaLayout({ minWidth: 1000 });
+ // Or a regular media query string
+ const reduceMotion = useMediaLayout('(prefers-reduced-motion: reduce)');
+
+ return (
+
+ Screen is wide: {isWide ? '😃' : '😢'}
+
+ );
+};
+```
diff --git a/package.json b/package.json
index b56b127..b0b44db 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "use-media",
- "version": "1.2.0",
+ "version": "1.3.0",
"description": "useMedia React hook",
"main": "lib/index.js",
"files": [
diff --git a/src/index.ts b/src/index.ts
index 7ec3915..2d4bb4e 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,6 +1,7 @@
+import { DependencyList, EffectCallback } from 'react';
import * as React from 'react';
-const { useState, useEffect } = React;
+const { useState, useEffect, useLayoutEffect } = React;
type MediaQueryObject = { [key: string]: string | number | boolean };
@@ -23,13 +24,14 @@ const objectToString = (query: string | MediaQueryObject) => {
.join(' and ');
};
-export const useMedia = (
+type Effect = (effect: EffectCallback, deps?: DependencyList) => void;
+const createUseMedia = (effect: Effect) => (
rawQuery: string | MediaQueryObject,
defaultState: boolean = false
) => {
const [state, setState] = useState(defaultState);
const query = objectToString(rawQuery);
- useEffect(() => {
+ effect(() => {
let mounted = true;
const mql = window.matchMedia(query);
const onChange = () => {
@@ -49,4 +51,8 @@ export const useMedia = (
return state;
};
+
+export const useMedia = createUseMedia(useEffect);
+export const useMediaLayout = createUseMedia(useLayoutEffect);
+
export default useMedia;