Skip to content

Commit 9ac8af2

Browse files
authored
feat: update useAnalyticsPageView parameter (#180)
* enhance: update useAnalyticsPageView to be called only once * enhance: update useAnalyticsPageView to accept callback - 이제 callback 함수를 입력 받을 수 있습니다. - regular function으로 변경하고 overloading을 추가했습니다. * test: add useAnalyticsPageView test * test: remove waiting time in useAnalyticsPageView tests 100ms -> 0mx * chore: fix typo * test: add waitForAsync for remove duplicates 비동기 대기 인라인 코드를 함수로 만들어 중복을 제거했습니다. * test: mute logs console.info를 mocking하여 불필요한 log 발생을 없앴습니다. resolve #171
1 parent 3c3e1aa commit 9ac8af2

File tree

2 files changed

+82
-4
lines changed

2 files changed

+82
-4
lines changed

src/hooks/useAnalyticsPageView.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,19 @@ import React from 'react';
22
import {useAnalyticsContext} from '../contexts/useAnalyticsContext';
33
import {UnknownRecord} from '../types/common';
44

5-
export const useAnalyticsPageView = (params: UnknownRecord) => {
5+
export function useAnalyticsPageView(params: UnknownRecord): void;
6+
export function useAnalyticsPageView(callback: () => UnknownRecord): void;
7+
export function useAnalyticsPageView(callback: () => Promise<UnknownRecord>): void;
8+
export function useAnalyticsPageView(paramsOrCallback: UnknownRecord | (() => Promise<UnknownRecord> | UnknownRecord)) {
69
const analytics = useAnalyticsContext();
710

8-
React.useEffect(() => {
11+
const pageView = async () => {
12+
const params = typeof paramsOrCallback === 'function' ? await paramsOrCallback() : paramsOrCallback;
913
analytics.onPageView(params);
10-
}, [analytics, params]);
11-
};
14+
};
15+
16+
React.useEffect(() => {
17+
pageView();
18+
// eslint-disable-next-line react-hooks/exhaustive-deps
19+
}, [analytics]);
20+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import React from 'react';
2+
import * as faker from 'faker';
3+
4+
import * as contextModule from '../../src/contexts/useAnalyticsContext';
5+
import {useAnalyticsPageView} from '../../src/hooks/useAnalyticsPageView';
6+
7+
describe('useAnalyticsPageView', () => {
8+
const setUp = () => {
9+
const params = {value: faker.lorem.word()};
10+
const callback = () => params;
11+
const asyncCallback = async () => params;
12+
13+
const onPageView = jest.fn();
14+
15+
const useEffectSpy = jest.spyOn(React, 'useEffect').mockImplementationOnce(cb => cb());
16+
const useContextSpy = jest.spyOn(contextModule, 'useAnalyticsContext').mockImplementationOnce(
17+
() =>
18+
({
19+
onPageView,
20+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
21+
} as any),
22+
);
23+
jest.spyOn(console, 'info').mockImplementation(() => null);
24+
25+
return {
26+
params,
27+
callback,
28+
asyncCallback,
29+
onPageView,
30+
useEffectSpy,
31+
useContextSpy,
32+
};
33+
};
34+
35+
const waitForAsync = () => new Promise(resolve => setTimeout(resolve, 0));
36+
37+
test('should call analytics.onPageView with params', async () => {
38+
const {params, onPageView, useContextSpy, useEffectSpy} = setUp();
39+
40+
useAnalyticsPageView(params);
41+
await waitForAsync();
42+
43+
expect(useContextSpy).toHaveBeenCalled();
44+
expect(useEffectSpy).toHaveBeenCalled();
45+
expect(onPageView).toHaveBeenCalledWith(params);
46+
});
47+
48+
test('should call analytics.onPageView with callback', async () => {
49+
const {params, callback, onPageView, useContextSpy, useEffectSpy} = setUp();
50+
51+
useAnalyticsPageView(callback);
52+
await waitForAsync();
53+
54+
expect(useContextSpy).toHaveBeenCalled();
55+
expect(useEffectSpy).toHaveBeenCalled();
56+
expect(onPageView).toHaveBeenCalledWith(params);
57+
});
58+
59+
test('should call analytics.onPageView with asyncCallback', async () => {
60+
const {params, asyncCallback, onPageView, useContextSpy, useEffectSpy} = setUp();
61+
62+
useAnalyticsPageView(asyncCallback);
63+
await waitForAsync();
64+
65+
expect(useContextSpy).toHaveBeenCalled();
66+
expect(useEffectSpy).toHaveBeenCalled();
67+
expect(onPageView).toHaveBeenCalledWith(params);
68+
});
69+
});

0 commit comments

Comments
 (0)