Skip to content

Commit 3a96fc4

Browse files
committed
chore: apply lint and fix type errors
1 parent 77d5ce5 commit 3a96fc4

File tree

5 files changed

+43
-28
lines changed

5 files changed

+43
-28
lines changed

packages/uikit-chat-hooks/src/__tests__/common/useUserList.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ describe('useUserList', () => {
8585
{ userId: 'user2', nickname: 'Bob' },
8686
];
8787
const query = { hasNext: true, next: jest.fn().mockResolvedValue(users) };
88-
const queryCreator: () => CustomQueryInterface<typeof users[0]> = jest.fn().mockReturnValue(query);
88+
const queryCreator: () => CustomQueryInterface<(typeof users)[0]> = jest.fn().mockReturnValue(query);
8989

9090
const { result } = renderHook(() => {
9191
return useUserList(sdk, {

packages/uikit-chat-hooks/src/__tests__/handler/useChannelHandler.test.ts

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { renderHook } from '@testing-library/react-native';
1+
import { act, renderHook } from '@testing-library/react-native';
22

33
import { createMockSendbirdChat } from '@sendbird/uikit-testing-tools';
44

@@ -75,4 +75,34 @@ describe('useChannelHandler', () => {
7575
sdk.__emit('channel', 'open_onMessageReceived');
7676
expect(handler.onMessageReceived).toHaveBeenCalledTimes(2);
7777
});
78+
79+
it('should channel handler functions updated when re-rendered', () => {
80+
const sdk = createMockSendbirdChat();
81+
const handlerId = 'test-handler-id';
82+
const handlerBefore = { onMessageReceived: jest.fn() };
83+
const handlerAfter = { onMessageReceived: jest.fn() };
84+
85+
const { rerender } = renderHook(({ handler }) => useChannelHandler(sdk, handlerId, handler, 'group'), {
86+
initialProps: {
87+
handler: handlerBefore,
88+
},
89+
});
90+
expect(handlerBefore.onMessageReceived).toHaveBeenCalledTimes(0);
91+
sdk.__emit('channel', 'group_onMessageReceived');
92+
expect(handlerBefore.onMessageReceived).toHaveBeenCalledTimes(1);
93+
sdk.__emit('channel', 'group_onMessageReceived');
94+
expect(handlerBefore.onMessageReceived).toHaveBeenCalledTimes(2);
95+
96+
act(() => {
97+
rerender({ handler: handlerAfter });
98+
});
99+
100+
expect(handlerAfter.onMessageReceived).toHaveBeenCalledTimes(0);
101+
sdk.__emit('channel', 'group_onMessageReceived');
102+
expect(handlerAfter.onMessageReceived).toHaveBeenCalledTimes(1);
103+
sdk.__emit('channel', 'group_onMessageReceived');
104+
expect(handlerAfter.onMessageReceived).toHaveBeenCalledTimes(2);
105+
106+
expect(handlerBefore.onMessageReceived).toHaveBeenCalledTimes(2);
107+
});
78108
});

packages/uikit-chat-hooks/src/handler/useChannelHandler.ts

Lines changed: 11 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,48 +2,35 @@ import { useEffect, useLayoutEffect, useRef } from 'react';
22

33
import { GroupChannelHandler } from '@sendbird/chat/groupChannel';
44
import { OpenChannelHandler } from '@sendbird/chat/openChannel';
5-
import { Logger, SendbirdChatSDK } from '@sendbird/uikit-utils';
5+
import type { SendbirdChatSDK } from '@sendbird/uikit-utils';
66

77
type ChannelType = 'open' | 'group';
88

9-
function getChannelHandler(type: ChannelType) {
10-
switch (type) {
11-
case 'open': {
12-
return new OpenChannelHandler();
13-
}
14-
case 'group':
15-
default: {
16-
return new GroupChannelHandler();
17-
}
18-
}
19-
}
209
export const useChannelHandler = <T extends ChannelType = 'group'>(
2110
sdk: SendbirdChatSDK,
2211
handlerId: string,
2312
hookHandler: Partial<T extends 'group' ? GroupChannelHandler : OpenChannelHandler>,
24-
type = 'group' as T,
13+
type: T = 'group' as T,
2514
) => {
2615
const handlerRef = useRef(hookHandler);
2716
useLayoutEffect(() => {
2817
handlerRef.current = hookHandler;
2918
});
3019

3120
useEffect(() => {
32-
Logger.debug('[useChannelHandler] hook called by', handlerId);
33-
34-
const handler = getChannelHandler(type);
35-
const handlerKeys = Object.keys(handler) as (keyof typeof handler)[];
36-
handlerKeys.forEach((key) => {
37-
handler[key] = (...args: unknown[]) => {
21+
const handlerMapper = <T extends GroupChannelHandler | OpenChannelHandler>(handler: T): T => {
22+
const handlerKeys = Object.keys(handler) as (keyof T)[];
23+
handlerKeys.forEach((key) => {
3824
// @ts-ignore
39-
handlerRef.current[key]?.(...args);
40-
};
41-
});
25+
handler[key] = (...args: unknown[]) => handlerRef.current?.[key]?.(...args);
26+
});
27+
return handler;
28+
};
4229

4330
if (type === 'group') {
44-
sdk.groupChannel.addGroupChannelHandler(handlerId, handler);
31+
sdk.groupChannel.addGroupChannelHandler(handlerId, handlerMapper(new GroupChannelHandler()));
4532
} else if (type === 'open') {
46-
sdk.openChannel.addOpenChannelHandler(handlerId, handler);
33+
sdk.openChannel.addOpenChannelHandler(handlerId, handlerMapper(new OpenChannelHandler()));
4734
}
4835

4936
return () => {

packages/uikit-react-native/src/domain/groupChannel/component/GroupChannelMessageList.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,6 @@ const GroupChannelMessageList = ({
110110
onLeaveScrollBottom={onLeaveScrollBottom}
111111
currentUserId={currentUserId}
112112
{...flatListProps}
113-
listKey={`group-channel-messages-${channel.url}`}
114113
ref={scrollRef}
115114
data={messages}
116115
renderItem={renderItem}

packages/uikit-react-native/src/domain/openChannel/component/OpenChannelMessageList.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,6 @@ const OpenChannelMessageList = ({
106106
onLeaveScrollBottom={onLeaveScrollBottom}
107107
currentUserId={currentUserId}
108108
{...flatListProps}
109-
listKey={`open-channel-messages-${channel.url}`}
110109
ref={scrollRef}
111110
data={messages}
112111
renderItem={renderItem}

0 commit comments

Comments
 (0)