Skip to content

Commit 4a00b4b

Browse files
committed
[IMPL] useLogger hook
1 parent cb2a7a5 commit 4a00b4b

7 files changed

Lines changed: 110 additions & 3 deletions

File tree

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { useState } from "react";
2+
import { useLogger } from "../../../../../../packages/react-tools/src";
3+
4+
/**
5+
The component uses _useLogger_ hook to trace component state in lifecycle events.
6+
*/
7+
const Counter = (props: {init: number}) => {
8+
const [state, setState] = useState<number>(props.init);
9+
useLogger("Counter", { state, props });
10+
11+
return (<>
12+
<p>Counter is: {state}</p>
13+
<button type="button" onClick={() => setState(t => t + 1)}>Increment</button>
14+
<button type="button" onClick={() => setState(t => t - 1)}>Decrement</button>
15+
</>);
16+
}
17+
export const UseLogger = () => {
18+
const [state, setState] = useState(0);
19+
return <>
20+
<button type="button" onClick={() => setState(t => t + 1)}>Increment</button>
21+
<br/>
22+
<Counter init={state}/>
23+
</>
24+
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ export const COMPONENTS = [
2828
"useLayoutEffectDeepCompare",
2929
"useLayoutEffectOnce",
3030
"useRerender",
31-
"useIsMounted"
31+
"useIsMounted",
32+
"useLogger"
3233
],
3334
//PERFORMANCE
3435
[
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# useLogger
2+
Hook to log componet details during Lifecycle events.
3+
4+
## Usage
5+
6+
```tsx
7+
const Counter = (props: {init: number}) => {
8+
const [state, setState] = useState<number>(props.init);
9+
useLogger("Counter", { state, props });
10+
11+
return (<>
12+
<p>Counter is: {state}</p>
13+
<button type="button" onClick={() => setState(t => t + 1)}>Increment</button>
14+
<button type="button" onClick={() => setState(t => t - 1)}>Decrement</button>
15+
</>);
16+
}
17+
export const UseLogger = () => {
18+
const [state, setState] = useState(0);
19+
return <>
20+
<button type="button" onClick={() => setState(t => t + 1)}>Increment</button>
21+
<br/>
22+
<Counter init={state}/>
23+
</>
24+
}
25+
```
26+
27+
> The component uses _useLogger_ hook to trace component state in lifecycle events.
28+
29+
30+
## API
31+
32+
```tsx
33+
useLogger (name: string, props: object)
34+
```
35+
36+
> ### Params
37+
>
38+
> - __name__: _string_
39+
component name.
40+
> - __props__: _object_
41+
props object to track.
42+
>
43+
44+
> ### Returns
45+
>
46+
>
47+
>
48+
>

packages/react-tools/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
- [x] useIsMounted
3333
- [ ] useInsertionEffect (polyfill???)
3434
- [ ] useDeferredValue (polyfill - an idea can be use setTimeout inside useEffect or this https://lilibraries.github.io/hooks/useDelayedValue/)
35-
- [ ] useLogger
35+
- [x] useLogger
3636

3737
- __PERFORMANCE__
3838
- [x] useCallbackCompare

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,4 @@ export { useScreen } from './useScreen';
7171
export { useMergedRef } from './useMergedRef';
7272
export { useHotKeys } from './useHotKeys';
7373
export { usePinchZoom } from './usePinchZoom';
74+
export { useLogger } from './useLogger';
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { useEffect, useRef } from "react"
2+
3+
/**
4+
* **`useLogger`**: Hook to log componet details during Lifecycle events.
5+
* @param {string} name - component name.
6+
* @param {object} props - props object to track.
7+
*/
8+
export const useLogger = (name: string, props: object) => {
9+
const prevProps = useRef<object>();
10+
11+
useEffect(() => {
12+
if (!prevProps.current) {
13+
prevProps.current = props;
14+
} else {
15+
const keys = Reflect.ownKeys(props);
16+
for (const key of keys) {
17+
if (Reflect.get(props, key) !== Reflect.get(prevProps.current, key)) {
18+
console.log(name + " component updated", prevProps, props);
19+
}
20+
}
21+
}
22+
}, [name, props]);
23+
24+
useEffect(() => {
25+
console.log(name + " component mounted");
26+
27+
return () => {
28+
console.log(name + " component unmounted");
29+
}
30+
// eslint-disable-next-line react-hooks/exhaustive-deps
31+
}, []);
32+
}

packages/react-tools/src/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,8 @@ export {
8989
useScreen,
9090
useMergedRef,
9191
useHotKeys,
92-
usePinchZoom
92+
usePinchZoom,
93+
useLogger
9394
} from './hooks'
9495

9596
export {

0 commit comments

Comments
 (0)