Skip to content

Commit 59ae517

Browse files
author
Douglas Fabris
authored
feat: usePrefersReducedData hook (#340)
1 parent 475ae34 commit 59ae517

7 files changed

+126
-0
lines changed

packages/fuselage-hooks/README.md

+7
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ yarn add @rocket.chat/fuselage-hooks
6666
- [Parameters](#parameters-10)
6767
- [usePosition](#useposition)
6868
- [Parameters](#parameters-11)
69+
- [usePrefersReducedData](#useprefersreduceddata)
6970
- [usePrefersReducedMotion](#useprefersreducedmotion)
7071
- [useResizeObserver](#useresizeobserver)
7172
- [Parameters](#parameters-12)
@@ -227,6 +228,12 @@ Hook to deal and position an element using an anchor
227228

228229
Returns **PositionResult** The style containing top and left position
229230

231+
### usePrefersReducedData
232+
233+
Hook to get the prefers-reduce-data value.
234+
235+
Returns **[boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** `true` if the prefers-reduce-data is set reduce in the media queries that matches
236+
230237
### usePrefersReducedMotion
231238

232239
Hook to get the prefers-reduce-motion value.

packages/fuselage-hooks/docs/fuselage-hooks.md

+1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
| [useMergedRefs](./fuselage-hooks.usemergedrefs.md) | Hook to merge refs and callbacks refs into a single callback ref. Useful when your component need a internal ref while receiving a forwared ref. |
3535
| [useMutableCallback](./fuselage-hooks.usemutablecallback.md) | Hook to create a stable callback from a mutable one. |
3636
| [usePosition](./fuselage-hooks.useposition.md) | Hook to deal and position an element using an anchor |
37+
| [usePrefersReducedData](./fuselage-hooks.useprefersreduceddata.md) | Hook to get the prefers-reduce-data value. |
3738
| [usePrefersReducedMotion](./fuselage-hooks.useprefersreducedmotion.md) | Hook to get the prefers-reduce-motion value. |
3839
| [useResizeObserver](./fuselage-hooks.useresizeobserver.md) | Hook to track dimension changes in a DOM element using the ResizeObserver API. |
3940
| [useSafely](./fuselage-hooks.usesafely.md) | Hook that wraps pairs of state and dispatcher to provide a new dispatcher which can be safe and asynchronically called even after the component unmounted. |
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
2+
3+
[Home](./index.md) &gt; [@rocket.chat/fuselage-hooks](./fuselage-hooks.md) &gt; [usePrefersReducedData](./fuselage-hooks.useprefersreduceddata.md)
4+
5+
## usePrefersReducedData variable
6+
7+
Hook to get the prefers-reduce-data value.
8+
9+
<b>Signature:</b>
10+
11+
```typescript
12+
usePrefersReducedData: () => boolean
13+
```

packages/fuselage-hooks/src/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export * from './useMediaQuery';
1212
export * from './useMergedRefs';
1313
export * from './useMutableCallback';
1414
export * from './usePosition';
15+
export * from './usePrefersReducedData';
1516
export * from './usePrefersReducedMotion';
1617
export * from './useResizeObserver';
1718
export * from './useSafely';
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/**
2+
* @jest-environment node
3+
*/
4+
5+
import { FunctionComponent, createElement, StrictMode } from 'react';
6+
import { renderToString } from 'react-dom/server';
7+
8+
import { usePrefersReducedData } from '.';
9+
10+
describe('usePrefersReducedData hook on server', () => {
11+
it('should return false without matchMedia mocked', () => {
12+
let matches: boolean;
13+
const TestComponent: FunctionComponent = () => {
14+
matches = usePrefersReducedData();
15+
return null;
16+
};
17+
18+
renderToString(createElement(StrictMode, {}, createElement(TestComponent)));
19+
20+
expect(matches).toBe(false);
21+
});
22+
23+
it('should return false with matchMedia mocked', () => {
24+
let matches: boolean;
25+
const TestComponent: FunctionComponent = () => {
26+
matches = usePrefersReducedData();
27+
return null;
28+
};
29+
30+
renderToString(createElement(StrictMode, {}, createElement(TestComponent)));
31+
32+
expect(matches).toBe(false);
33+
});
34+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import { createElement, FunctionComponent, StrictMode } from 'react';
2+
import { render } from 'react-dom';
3+
import { act } from 'react-dom/test-utils';
4+
5+
import { usePrefersReducedData } from '.';
6+
import matchMediaMock from './__mocks__/matchMedia';
7+
8+
describe('usePrefersReducedData hook', () => {
9+
let container: HTMLDivElement;
10+
11+
beforeEach(() => {
12+
container = document.createElement('div');
13+
document.body.appendChild(container);
14+
});
15+
16+
afterEach(() => {
17+
container.remove();
18+
container = null;
19+
});
20+
21+
it('should return false on the initial call', () => {
22+
let matches: boolean;
23+
24+
const TestComponent: FunctionComponent = () => {
25+
matches = usePrefersReducedData();
26+
return null;
27+
};
28+
29+
act(() => {
30+
render(
31+
createElement(StrictMode, {}, createElement(TestComponent)),
32+
container
33+
);
34+
});
35+
36+
expect(matches).toBe(false);
37+
});
38+
39+
it('should returns true with matchMedia mocked', () => {
40+
window.matchMedia = jest.fn((media) =>
41+
matchMediaMock(media, '(prefers-reduced-data: reduce)')
42+
);
43+
44+
let matches: boolean;
45+
const TestComponent: FunctionComponent = () => {
46+
matches = usePrefersReducedData();
47+
return null;
48+
};
49+
50+
act(() => {
51+
render(
52+
createElement(StrictMode, {}, createElement(TestComponent)),
53+
document.createElement('div')
54+
);
55+
});
56+
57+
expect(matches).toBe(true);
58+
});
59+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { useMediaQuery } from '.';
2+
3+
/**
4+
* Hook to get the prefers-reduce-data value.
5+
*
6+
* @returns `true` if the prefers-reduce-data is set reduce in the media queries that matches
7+
* @public
8+
*/
9+
10+
export const usePrefersReducedData = (): boolean =>
11+
useMediaQuery('(prefers-reduced-data: reduce)');

0 commit comments

Comments
 (0)