From 0636cd87f47bf8b9a16ef4461a3d47a526e7f10d Mon Sep 17 00:00:00 2001 From: xobotyi Date: Sun, 31 Jan 2021 11:28:36 +0300 Subject: [PATCH 1/3] chore(useUpdate): improve `useUpdate` test suite --- src/misc/util.ts | 1 + src/useUpdate.ts | 7 ++-- tests/useUpdate.test.ts | 81 +++++++++++++++++++++++++++++------------ 3 files changed, 62 insertions(+), 27 deletions(-) diff --git a/src/misc/util.ts b/src/misc/util.ts index f47f433127..34fa42c206 100644 --- a/src/misc/util.ts +++ b/src/misc/util.ts @@ -19,4 +19,5 @@ export function off( } export const isBrowser = typeof window !== 'undefined'; + export const isNavigator = typeof navigator !== 'undefined'; diff --git a/src/useUpdate.ts b/src/useUpdate.ts index bcc4511ae3..2646739639 100644 --- a/src/useUpdate.ts +++ b/src/useUpdate.ts @@ -2,9 +2,8 @@ import { useReducer } from 'react'; const updateReducer = (num: number): number => (num + 1) % 1_000_000; -const useUpdate = () => { +export default function useUpdate(): () => void { const [, update] = useReducer(updateReducer, 0); - return update as () => void; -}; -export default useUpdate; + return update; +} diff --git a/tests/useUpdate.test.ts b/tests/useUpdate.test.ts index aecf39bee3..6dd8752c97 100644 --- a/tests/useUpdate.test.ts +++ b/tests/useUpdate.test.ts @@ -1,35 +1,70 @@ import { act, renderHook } from '@testing-library/react-hooks'; import useUpdate from '../src/useUpdate'; -it('should init update function', () => { - const { result } = renderHook(() => useUpdate()); - const update = result.current; +describe('useUpdate', () => { + it('should be defined', () => { + expect(useUpdate).toBeDefined(); + }); - expect(update).toBeInstanceOf(Function); -}); + it('should return a function', () => { + const { result } = renderHook(() => useUpdate()); -it('should forces a re-render every time update function is called', () => { - let renderCount = 0; - const { result } = renderHook(() => { - renderCount++; - return useUpdate(); - }); - const update = result.current; + expect(typeof result.current).toBe('function'); + }) - expect(renderCount).toBe(1); + it('should re-render component each time returned function is called', () => { + let renders = 0; + const { result: { current: update } } = renderHook(() => { + renders++; + return useUpdate(); + }); - act(() => update()); - expect(renderCount).toBe(2); + expect(renders).toBe(1); - act(() => update()); - expect(renderCount).toBe(3); -}); + act(() => update()); + expect(renders).toBe(2); + + act(() => update()); + expect(renders).toBe(3); + }) + + it('should return exact same function in between renders', () => { + let renders = 0; + const { result } = renderHook(() => { + renders++; + return useUpdate(); + }); + let initialUpdateFn = result.current; + + expect(renders).toBe(1); + + act(() => result.current()); + expect(renders).toBe(2); + expect(initialUpdateFn).toBe(result.current); + + act(() => result.current()); + expect(renders).toBe(3); + expect(initialUpdateFn).toBe(result.current); + }) + + it('passing the argument to returned function should not affect the use', () => { + let renders = 0; + const { result } = renderHook(() => { + renders++; + return useUpdate(); + }); + let initialUpdateFn = result.current; -it('should return same update function instance on each update', () => { - const { result, rerender } = renderHook(() => useUpdate()); - const { current: updateCb } = result; + expect(renders).toBe(1); - rerender(); + /* @ts-expect-error */ + act(() => result.current(1)); + expect(renders).toBe(2); + expect(initialUpdateFn).toBe(result.current); - expect(Object.is(result.current, updateCb)).toBe(true); + /* @ts-expect-error */ + act(() => result.current(1)); + expect(renders).toBe(3); + expect(initialUpdateFn).toBe(result.current); + }) }); From 1461527ffc55b2a1e3c9dc6a0efc2572b66e5381 Mon Sep 17 00:00:00 2001 From: meowtec Date: Sun, 31 Jan 2021 17:51:07 +0800 Subject: [PATCH 2/3] fix: proper definition for `useMeasure` --- src/useMeasure.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/useMeasure.ts b/src/useMeasure.ts index 56679b2bbc..b51e88707b 100644 --- a/src/useMeasure.ts +++ b/src/useMeasure.ts @@ -48,4 +48,4 @@ function useMeasure(): UseMeasureResult export default isBrowser && typeof (window as any).ResizeObserver !== 'undefined' ? useMeasure - : () => [noop, defaultState]; + : (() => [noop, defaultState]) as typeof useMeasure; From 3590a0eb27105260f93be42b4bd457d1227fcb44 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 1 Feb 2021 11:17:27 +0000 Subject: [PATCH 3/3] chore(release): 17.0.2 [skip ci] ## [17.0.2](https://github.com/streamich/react-use/compare/v17.0.1...v17.0.2) (2021-02-01) ### Bug Fixes * proper definition for `useMeasure` ([1461527](https://github.com/streamich/react-use/commit/1461527ffc55b2a1e3c9dc6a0efc2572b66e5381)) --- CHANGELOG.md | 7 +++++++ package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4cc0c96ba1..7f3f10a82d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [17.0.2](https://github.com/streamich/react-use/compare/v17.0.1...v17.0.2) (2021-02-01) + + +### Bug Fixes + +* proper definition for `useMeasure` ([1461527](https://github.com/streamich/react-use/commit/1461527ffc55b2a1e3c9dc6a0efc2572b66e5381)) + ## [17.0.1](https://github.com/streamich/react-use/compare/v17.0.0...v17.0.1) (2021-01-31) diff --git a/package.json b/package.json index bc12e9172d..d05f827143 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-use", - "version": "17.0.1", + "version": "17.0.2", "description": "Collection of React Hooks", "main": "lib/index.js", "module": "esm/index.js",