Skip to content

Commit 74702f6

Browse files
committed
Merge messageActions into groupchannel actions
1 parent bd41304 commit 74702f6

File tree

5 files changed

+80
-81
lines changed

5 files changed

+80
-81
lines changed

src/modules/GroupChannel/components/Message/index.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,16 @@ export const Message = (props: MessageProps): React.ReactElement => {
2727
onReplyInThreadClick,
2828
onMessageAnimated,
2929
onBeforeDownloadFileMessage,
30-
updateUserMessage,
31-
sendUserMessage,
32-
resendMessage,
3330
messages,
3431
},
3532
actions: {
3633
toggleReaction,
3734
setQuoteMessage,
3835
setAnimatedMessageId,
3936
scrollToMessage,
37+
updateUserMessage,
38+
sendUserMessage,
39+
resendMessage,
4040
deleteMessage,
4141
},
4242
} = useGroupChannel();

src/modules/GroupChannel/context/GroupChannelProvider.tsx

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import {
1414
import { UserProfileProvider } from '../../../lib/UserProfileContext';
1515
import useSendbirdStateContext from '../../../hooks/useSendbirdStateContext';
1616
import { useMessageListScroll } from './hooks/useMessageListScroll';
17-
import { useMessageActions } from './hooks/useMessageActions';
1817
import { getIsReactionEnabled } from '../../../utils/getIsReactionEnabled';
1918
import {
2019
getCaseResolvedReplyType,
@@ -161,15 +160,6 @@ const GroupChannelManager :React.FC<React.PropsWithChildren<GroupChannelProvider
161160
logger: logger as any,
162161
});
163162

164-
// Message actions initialization
165-
const messageActions = useMessageActions({
166-
...props,
167-
...messageDataSource,
168-
scrollToBottom: actions.scrollToBottom,
169-
quoteMessage: state.quoteMessage,
170-
replyType: resolvedReplyType,
171-
});
172-
173163
// Channel initialization
174164
useAsyncEffect(async () => {
175165
if (sdkStore.initialized && channelUrl) {
@@ -300,12 +290,13 @@ const GroupChannelManager :React.FC<React.PropsWithChildren<GroupChannelProvider
300290

301291
// Message data source & actions
302292
...messageDataSource,
303-
...messageActions,
304293
});
305294
}, [
306295
channelUrl,
307-
state.currentChannel?.url,
308-
messageDataSource.messages?.map((it) => it?.messageId).join(),
296+
state.currentChannel,
297+
messageDataSource.initialized,
298+
messageDataSource.loading,
299+
messageDataSource.messages,
309300
configurations,
310301
scrollState,
311302
eventHandlers,

src/modules/GroupChannel/context/hooks/useGroupChannel.ts

Lines changed: 60 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,39 @@ import type { GroupChannel } from '@sendbird/chat/groupChannel';
33
import type { SendbirdError } from '@sendbird/chat';
44
import { useSyncExternalStore } from 'use-sync-external-store/shim';
55

6+
import type {
7+
FileMessage,
8+
FileMessageCreateParams,
9+
MultipleFilesMessage,
10+
MultipleFilesMessageCreateParams,
11+
UserMessage,
12+
UserMessageCreateParams,
13+
UserMessageUpdateParams,
14+
} from '@sendbird/chat/message';
15+
616
import { SendableMessageType } from '../../../../utils';
717
import { getMessageTopOffset } from '../utils';
818
import useSendbirdStateContext from '../../../../hooks/useSendbirdStateContext';
919
import { GroupChannelContext } from '../GroupChannelProvider';
10-
import type { GroupChannelState } from '../types';
20+
import type { GroupChannelState, MessageActions } from '../types';
21+
import { useMessageActions } from './useMessageActions';
1122

12-
export interface GroupChannelActions {
23+
export interface GroupChannelActions extends MessageActions {
1324
// Channel actions
1425
setCurrentChannel: (channel: GroupChannel) => void;
1526
handleChannelError: (error: SendbirdError) => void;
1627

28+
// Message actions
29+
sendUserMessage: (params: UserMessageCreateParams) => Promise<UserMessage>;
30+
sendFileMessage: (params: FileMessageCreateParams) => Promise<FileMessage>;
31+
sendMultipleFilesMessage: (params: MultipleFilesMessageCreateParams) => Promise<MultipleFilesMessage>;
32+
updateUserMessage: (messageId: number, params: UserMessageUpdateParams) => Promise<UserMessage>;
33+
1734
// UI actions
1835
setQuoteMessage: (message: SendableMessageType | null) => void;
1936
setAnimatedMessageId: (messageId: number | null) => void;
2037
setIsScrollBottomReached: (isReached: boolean) => void;
2138

22-
// Message actions
23-
updateMessage: (message: SendableMessageType, updatedMessage: SendableMessageType) => Promise<void>;
24-
deleteMessage: (message: SendableMessageType) => Promise<void>;
25-
2639
// Scroll actions
2740
scrollToBottom: (animated?: boolean) => Promise<void>;
2841
scrollToMessage: (
@@ -44,6 +57,41 @@ export const useGroupChannel = () => {
4457
const { markAsReadScheduler } = config;
4558
const state: GroupChannelState = useSyncExternalStore(store.subscribe, store.getState);
4659

60+
const flagActions = {
61+
setAnimatedMessageId: (messageId: number | null) => {
62+
store.setState(state => ({ ...state, animatedMessageId: messageId }));
63+
},
64+
65+
setIsScrollBottomReached: (isReached: boolean) => {
66+
store.setState(state => ({ ...state, isScrollBottomReached: isReached }));
67+
},
68+
};
69+
70+
const scrollToBottom = async (animated?: boolean) => {
71+
if (!state.scrollRef.current) return;
72+
73+
flagActions.setAnimatedMessageId(null);
74+
flagActions.setIsScrollBottomReached(true);
75+
76+
if (config.isOnline && state.hasNext()) {
77+
await state.resetWithStartingPoint(Number.MAX_SAFE_INTEGER);
78+
state.scrollPubSub.publish('scrollToBottom', { animated });
79+
} else {
80+
state.scrollPubSub.publish('scrollToBottom', { animated });
81+
}
82+
83+
if (state.currentChannel && !state.hasNext()) {
84+
state.resetNewMessages();
85+
if (!state.disableMarkAsRead) {
86+
markAsReadScheduler.push(state.currentChannel);
87+
}
88+
}
89+
};
90+
const messageActions = useMessageActions({
91+
...state,
92+
scrollToBottom,
93+
});
94+
4795
const actions: GroupChannelActions = useMemo(() => ({
4896
setCurrentChannel: (channel: GroupChannel) => {
4997
store.setState(state => ({
@@ -68,54 +116,11 @@ export const useGroupChannel = () => {
68116
}));
69117
},
70118

71-
updateMessage: async (message: SendableMessageType, updatedMessage: SendableMessageType) => {
72-
store.setState(state => ({
73-
...state,
74-
messages: state.messages.map(msg => msg.messageId === message.messageId ? updatedMessage : msg,
75-
),
76-
}));
77-
},
78-
79-
deleteMessage: async (message: SendableMessageType) => {
80-
store.setState(state => ({
81-
...state,
82-
messages: state.messages.filter(msg => msg.messageId !== message.messageId),
83-
}));
84-
},
85-
86119
setQuoteMessage: (message: SendableMessageType | null) => {
87120
store.setState(state => ({ ...state, quoteMessage: message }));
88121
},
89122

90-
setAnimatedMessageId: (messageId: number | null) => {
91-
store.setState(state => ({ ...state, animatedMessageId: messageId }));
92-
},
93-
94-
setIsScrollBottomReached: (isReached: boolean) => {
95-
store.setState(state => ({ ...state, isScrollBottomReached: isReached }));
96-
},
97-
98-
scrollToBottom: async (animated?: boolean) => {
99-
if (!state.scrollRef.current) return;
100-
101-
actions.setAnimatedMessageId(null);
102-
actions.setIsScrollBottomReached(true);
103-
104-
if (config.isOnline && state.hasNext()) {
105-
await state.resetWithStartingPoint(Number.MAX_SAFE_INTEGER);
106-
state.scrollPubSub.publish('scrollToBottom', { animated });
107-
} else {
108-
state.scrollPubSub.publish('scrollToBottom', { animated });
109-
}
110-
111-
if (state.currentChannel && !state.hasNext()) {
112-
state.resetNewMessages();
113-
if (!state.disableMarkAsRead) {
114-
markAsReadScheduler.push(state.currentChannel);
115-
}
116-
}
117-
},
118-
123+
scrollToBottom,
119124
scrollToMessage: async (
120125
createdAt: number,
121126
messageId: number,
@@ -139,15 +144,15 @@ export const useGroupChannel = () => {
139144

140145
clickHandler.deactivate();
141146

142-
actions.setAnimatedMessageId(null);
147+
flagActions.setAnimatedMessageId(null);
143148
const message = state.messages.find(
144149
(it) => it.messageId === messageId || it.createdAt === createdAt,
145150
);
146151

147152
if (message) {
148153
const topOffset = getMessageTopOffset(message.createdAt);
149154
if (topOffset) state.scrollPubSub.publish('scroll', { top: topOffset, animated: scrollAnimated });
150-
if (messageFocusAnimated ?? true) actions.setAnimatedMessageId(messageId);
155+
if (messageFocusAnimated ?? true) flagActions.setAnimatedMessageId(messageId);
151156
} else {
152157
await state.resetWithStartingPoint(createdAt);
153158
setTimeout(() => {
@@ -159,7 +164,7 @@ export const useGroupChannel = () => {
159164
animated: scrollAnimated,
160165
});
161166
}
162-
if (messageFocusAnimated ?? true) actions.setAnimatedMessageId(messageId);
167+
if (messageFocusAnimated ?? true) flagActions.setAnimatedMessageId(messageId);
163168
});
164169
}
165170

@@ -181,6 +186,8 @@ export const useGroupChannel = () => {
181186
});
182187
}
183188
},
189+
...flagActions,
190+
...messageActions,
184191
}), [store, state, config.isOnline, markAsReadScheduler]);
185192

186193
return { state, actions };

src/modules/GroupChannel/context/hooks/useMessageActions.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,7 @@ import {
1919
VOICE_MESSAGE_FILE_NAME,
2020
VOICE_MESSAGE_MIME_TYPE,
2121
} from '../../../../utils/consts';
22-
import type { SendableMessageType } from '../../../../utils';
23-
import type { ReplyType } from '../../../../types';
24-
import type { GroupChannelProviderProps } from '../types';
22+
import type { GroupChannelState } from '../types';
2523

2624
type MessageListDataSource = ReturnType<typeof useGroupChannelMessages>;
2725
type MessageActions = {
@@ -30,12 +28,10 @@ type MessageActions = {
3028
sendVoiceMessage: (params: FileMessageCreateParams, duration: number) => Promise<FileMessage>;
3129
sendMultipleFilesMessage: (params: MultipleFilesMessageCreateParams) => Promise<MultipleFilesMessage>;
3230
updateUserMessage: (messageId: number, params: UserMessageUpdateParams) => Promise<UserMessage>;
33-
};
31+
} & Partial<MessageListDataSource>;
3432

35-
interface Params extends GroupChannelProviderProps, MessageListDataSource {
33+
interface Params extends GroupChannelState {
3634
scrollToBottom(animated?: boolean): Promise<void>;
37-
quoteMessage?: SendableMessageType | null;
38-
replyType: ReplyType;
3935
}
4036

4137
const pass = <T>(value: T) => value;
@@ -55,6 +51,10 @@ export function useMessageActions(params: Params): MessageActions {
5551
sendMultipleFilesMessage,
5652
sendUserMessage,
5753
updateUserMessage,
54+
updateFileMessage,
55+
resendMessage,
56+
deleteMessage,
57+
resetNewMessages,
5858

5959
scrollToBottom,
6060
quoteMessage,
@@ -144,5 +144,9 @@ export function useMessageActions(params: Params): MessageActions {
144144
},
145145
[buildInternalMessageParams, updateUserMessage],
146146
),
147+
updateFileMessage,
148+
resendMessage,
149+
deleteMessage,
150+
resetNewMessages,
147151
};
148152
}

src/modules/GroupChannel/context/types.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,7 @@ import { ThreadReplySelectType } from './const';
1919

2020
// Message data source types
2121
type MessageDataSource = ReturnType<typeof useGroupChannelMessages>;
22-
type MessageActions = ReturnType<typeof useMessageActions>;
23-
type MessageListDataSourceWithoutActions =
24-
Omit<MessageDataSource, keyof MessageActions | `_dangerous_${string}`>;
22+
export type MessageActions = ReturnType<typeof useMessageActions>;
2523
export type MessageListQueryParamsType = Omit<MessageCollectionParams, 'filter'> & MessageFilterParams;
2624

2725
// Handler types
@@ -36,8 +34,7 @@ export interface GroupChannelState extends GroupChannelProviderProps,
3634
Omit<InternalGroupChannelState, keyof GroupChannelProviderProps> {
3735
}
3836
// Only include the states
39-
interface InternalGroupChannelState extends
40-
MessageListDataSourceWithoutActions, MessageActions {
37+
interface InternalGroupChannelState extends MessageDataSource {
4138
// Channel state
4239
currentChannel: GroupChannel | null;
4340
channelUrl: string;

0 commit comments

Comments
 (0)