Skip to content

Commit dc251d6

Browse files
committed
[IMPL] useDocumentVisibility hook
1 parent 0d1b2c4 commit dc251d6

9 files changed

Lines changed: 54 additions & 7 deletions

File tree

apps/react-tools-demo/scripts/generateMarkdown.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,8 @@ function buildHooksUtilsMarkdownObject(file) {
247247
if(depuratedLine.startsWith("__") || depuratedLine.startsWith("**")) {
248248
const titleDescription = depuratedLine.split(":");
249249
obj.title = titleDescription[0].substring(3, titleDescription[0].length-3);
250-
obj.description = titleDescription[1].trim();
250+
titleDescription.shift();
251+
obj.description = titleDescription.join(":").trim();
251252
obj.description = obj.description.charAt(0).toUpperCase() + obj.description.substring(1);
252253
}
253254
});
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { useEffect, useState } from "react";
2+
import { useDocumentVisibility } from "../../../../../../packages/react-tools/src"
3+
4+
/**
5+
The component tracks every document visibility status change and display them on screen with date they taking place. Minimize window or change tab to show them.
6+
*/
7+
export const UseDocumentVisibility = () => {
8+
const status = useDocumentVisibility();
9+
const [messages, setMessages] = useState <{ status: DocumentVisibilityState, date: string }[]>([]);
10+
11+
useEffect(() => {
12+
setMessages(m => ([...m, {status: status, date: new Date().toLocaleTimeString()}]))
13+
}, [status])
14+
15+
return (<div>
16+
<h3>Status:</h3>
17+
{
18+
messages.map(el => (
19+
<p key={el.date}>{el.date}: {el.status}</p>
20+
))
21+
}
22+
</div>);
23+
}

apps/react-tools-demo/src/constants/components.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ export const COMPONENTS = [
5454
"useActiveElement",
5555
"useTimeout",
5656
"useInterval",
57-
"useTextSelection"
57+
"useTextSelection",
58+
"useDocumentVisibility"
5859
]
5960
],
6061
//UTILS

apps/react-tools-demo/src/markdown/useTextSelection.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# useTextSelection
2-
Hook to track text selection and its size.
2+
Hook to track text selection. Refers to [Selection API](https://developer.mozilla.org/en-US/docs/Web/API/Selection).
33

44
## Usage
55

packages/react-tools/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565
- [x] useTimeout
6666
- [x] useInterval
6767
- [x] useTextSelection
68-
- [ ] useDocumentVisibility
68+
- [x] useDocumentVisibility
6969
- [ ] useCoptyToClipboard
7070
- [ ] useColorScheme
7171
- [ ] useTitle (change document.title but also document.head.title nodeElement)

packages/react-tools/src/hooks/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,5 @@ export { useThrottle } from './useThrottle';
3535
export { useActiveElement } from './useActiveElement';
3636
export { useTimeout } from './useTimeout';
3737
export { useInterval } from './useInterval';
38-
export { useTextSelection } from './useTextSelection';
38+
export { useTextSelection } from './useTextSelection';
39+
export { useDocumentVisibility } from './useDocumentVisibility';
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { useCallback } from "react";
2+
import { useSyncExternalStore } from "."
3+
4+
/**
5+
* **`useDocumentVisibility`**: Hook to track document visibility. Refers to [Document VisibilityState](https://developer.mozilla.org/en-US/docs/Web/API/Document/visibilityState).
6+
* @returns {DocumentVisibilityState} documentVisibility
7+
*/
8+
export const useDocumentVisibility = (): DocumentVisibilityState => {
9+
return useSyncExternalStore(
10+
useCallback(notif => {
11+
document.addEventListener("visibilitychange", notif);
12+
return () => {
13+
document.removeEventListener("visibilitychange", notif);
14+
}
15+
}, []),
16+
useCallback(() => {
17+
return document.visibilityState;
18+
}, [])
19+
);
20+
}

packages/react-tools/src/hooks/useTextSelection.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { TextSelection } from "../models";
33
import { isDeepEqual, useSyncExternalStore } from "..";
44

55
/**
6-
* **`useTextSelection`**: Hook to track text selection and its size.
6+
* **`useTextSelection`**: Hook to track text selection. Refers to [Selection API](https://developer.mozilla.org/en-US/docs/Web/API/Selection).
77
* @param {Object} param - object with selection properties
88
* @param {RefObject<HTMLElement> | HTMLElement} [param.target] - element in which allow selection. Default is _document.body_.
99
* @param {(evt: Event) => void} [param.onStart] - function to execute when selection starts.

packages/react-tools/src/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ export {
4444
useActiveElement,
4545
useTimeout,
4646
useInterval,
47-
useTextSelection
47+
useTextSelection,
48+
useDocumentVisibility
4849
} from './hooks'
4950

5051
export {

0 commit comments

Comments
 (0)