@sendbird/uikit-chat-hooks 2.4.2 → 2.5.0-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/commonjs/channel/{useGroupChannelMessages/reducer.js → useChannelMessagesReducer.js} +39 -30
- package/lib/commonjs/channel/useChannelMessagesReducer.js.map +1 -0
- package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js +169 -99
- package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js.map +1 -1
- package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js +56 -25
- package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js.map +1 -1
- package/lib/commonjs/channel/useOpenChannelList/useOpenChannelListWithQuery.js +0 -4
- package/lib/commonjs/channel/useOpenChannelList/useOpenChannelListWithQuery.js.map +1 -1
- package/lib/commonjs/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js +128 -28
- package/lib/commonjs/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js.map +1 -1
- package/lib/commonjs/common/useUserList.js +2 -2
- package/lib/commonjs/common/useUserList.js.map +1 -1
- package/lib/commonjs/types.js.map +1 -1
- package/lib/module/channel/{useGroupChannelMessages/reducer.js → useChannelMessagesReducer.js} +38 -29
- package/lib/module/channel/useChannelMessagesReducer.js.map +1 -0
- package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js +170 -100
- package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js.map +1 -1
- package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js +57 -26
- package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js.map +1 -1
- package/lib/module/channel/useOpenChannelList/useOpenChannelListWithQuery.js +0 -4
- package/lib/module/channel/useOpenChannelList/useOpenChannelListWithQuery.js.map +1 -1
- package/lib/module/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js +129 -29
- package/lib/module/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.js.map +1 -1
- package/lib/module/common/useUserList.js +2 -2
- package/lib/module/common/useUserList.js.map +1 -1
- package/lib/module/types.js.map +1 -1
- package/lib/typescript/src/channel/useChannelMessagesReducer.d.ts +18 -0
- package/lib/typescript/src/types.d.ts +51 -20
- package/package.json +4 -5
- package/src/channel/useChannelMessagesReducer.ts +143 -0
- package/src/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.ts +168 -96
- package/src/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.ts +62 -25
- package/src/channel/useOpenChannelList/useOpenChannelListWithQuery.ts +0 -4
- package/src/channel/useOpenChannelMessages/useOpenChannelMessagesWithQuery.ts +142 -25
- package/src/common/useUserList.ts +2 -2
- package/src/types.ts +58 -20
- package/lib/commonjs/channel/useGroupChannelMessages/reducer.js.map +0 -1
- package/lib/commonjs/channel/useOpenChannelMessages/reducer.js +0 -144
- package/lib/commonjs/channel/useOpenChannelMessages/reducer.js.map +0 -1
- package/lib/module/channel/useGroupChannelMessages/reducer.js.map +0 -1
- package/lib/module/channel/useOpenChannelMessages/reducer.js +0 -137
- package/lib/module/channel/useOpenChannelMessages/reducer.js.map +0 -1
- package/lib/typescript/src/channel/useGroupChannelMessages/reducer.d.ts +0 -15
- package/lib/typescript/src/channel/useOpenChannelMessages/reducer.d.ts +0 -15
- package/src/channel/useGroupChannelMessages/reducer.ts +0 -126
- package/src/channel/useOpenChannelMessages/reducer.ts +0 -126
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["useReducer","arrayToMapWithGetter","getMessageUniqId","isMyMessage","isNewMessage","useIIFE","defaultReducer","_ref","action","draft","type","value","status","key","receivedMessagesAsMap","messages","clearBeforeAction","filter","m","isFileMessage","isUserMessage","Boolean","reqId","sendingStatus","currentUserId","forEach","messageIds","msgId","reqIds","useGroupChannelMessagesReducer","userId","sortComparator","loading","refreshing","messageMap","nextMessageMap","dispatch","updateMessages","deleteMessages","updateNextMessages","deleteNextMessages","updateLoading","updateRefreshing","Object","values","sort","nextMessages","newMessagesFromMembers","msg"],"sources":["reducer.ts"],"sourcesContent":["import { useReducer } from 'react';\n\nimport type { SendbirdBaseMessage, SendbirdFileMessage, SendbirdUserMessage } from '@sendbird/uikit-utils';\nimport { arrayToMapWithGetter, getMessageUniqId, isMyMessage, isNewMessage, useIIFE } from '@sendbird/uikit-utils';\n\nimport type { UseGroupChannelMessagesOptions } from '../../types';\n\ntype Action =\n | {\n type: 'update_loading' | 'update_refreshing';\n value: { status: boolean };\n }\n | {\n type: 'update_messages' | 'update_next_messages';\n value: { messages: SendbirdBaseMessage[]; clearBeforeAction: boolean; currentUserId?: string };\n }\n | {\n type: 'delete_messages' | 'delete_next_messages';\n value: { messageIds: number[]; reqIds: string[] };\n };\n\ntype State = {\n loading: boolean;\n refreshing: boolean;\n messageMap: Record<string, SendbirdBaseMessage>;\n nextMessageMap: Record<string, SendbirdBaseMessage>;\n};\n\nconst defaultReducer = ({ ...draft }: State, action: Action) => {\n switch (action.type) {\n case 'update_refreshing': {\n draft['refreshing'] = action.value.status;\n return draft;\n }\n case 'update_loading': {\n draft['loading'] = action.value.status;\n return draft;\n }\n case 'update_messages':\n case 'update_next_messages': {\n const key = action.type === 'update_messages' ? 'messageMap' : 'nextMessageMap';\n const receivedMessagesAsMap = arrayToMapWithGetter(action.value.messages, getMessageUniqId);\n if (action.value.clearBeforeAction) {\n draft[key] = receivedMessagesAsMap;\n } else {\n draft[key] = { ...draft[key], ...receivedMessagesAsMap };\n\n // NOTE: Replace pending message to succeeded message\n action.value.messages\n .filter((m): m is SendbirdUserMessage | SendbirdFileMessage => {\n return (\n (m.isFileMessage() || m.isUserMessage()) &&\n Boolean(draft[key][m.reqId]) &&\n m.sendingStatus === 'succeeded' &&\n isMyMessage(m, action.value.currentUserId)\n );\n })\n .forEach((m) => delete draft[key][m.reqId]);\n }\n\n return draft;\n }\n case 'delete_messages':\n case 'delete_next_messages': {\n const key = action.type === 'delete_messages' ? 'messageMap' : 'nextMessageMap';\n draft[key] = { ...draft[key] };\n action.value.messageIds.forEach((msgId) => delete draft[key][msgId]);\n action.value.reqIds.forEach((reqId) => delete draft[key][reqId]);\n\n return draft;\n }\n }\n};\n\nexport const useGroupChannelMessagesReducer = (\n userId?: string,\n sortComparator?: UseGroupChannelMessagesOptions['sortComparator'],\n) => {\n const [{ loading, refreshing, messageMap, nextMessageMap }, dispatch] = useReducer(defaultReducer, {\n loading: true,\n refreshing: false,\n messageMap: {},\n nextMessageMap: {},\n });\n\n const updateMessages = (messages: SendbirdBaseMessage[], clearBeforeAction: boolean, currentUserId?: string) => {\n dispatch({ type: 'update_messages', value: { messages, clearBeforeAction, currentUserId } });\n };\n const deleteMessages = (messageIds: number[], reqIds: string[]) => {\n dispatch({ type: 'delete_messages', value: { messageIds, reqIds } });\n };\n const updateNextMessages = (messages: SendbirdBaseMessage[], clearBeforeAction: boolean, currentUserId?: string) => {\n dispatch({ type: 'update_next_messages', value: { messages, clearBeforeAction, currentUserId } });\n };\n const deleteNextMessages = (messageIds: number[], reqIds: string[]) => {\n dispatch({ type: 'delete_next_messages', value: { messageIds, reqIds } });\n };\n const updateLoading = (status: boolean) => {\n dispatch({ type: 'update_loading', value: { status } });\n };\n const updateRefreshing = (status: boolean) => {\n dispatch({ type: 'update_refreshing', value: { status } });\n };\n\n const messages = useIIFE(() => {\n if (sortComparator) return Object.values(messageMap).sort(sortComparator);\n return Object.values(messageMap);\n });\n const nextMessages = Object.values(nextMessageMap);\n const newMessagesFromMembers = nextMessages.filter((msg) => isNewMessage(msg, userId));\n\n return {\n updateLoading,\n updateRefreshing,\n updateMessages,\n updateNextMessages,\n deleteMessages,\n deleteNextMessages,\n\n loading,\n refreshing,\n messages,\n nextMessages,\n newMessagesFromMembers,\n };\n};\n"],"mappings":"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"}
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
import { useReducer } from 'react';
|
|
2
|
-
import { arrayToMapWithGetter, getMessageUniqId, isMyMessage, isNewMessage, useIIFE } from '@sendbird/uikit-utils';
|
|
3
|
-
const defaultReducer = (_ref, action) => {
|
|
4
|
-
let {
|
|
5
|
-
...draft
|
|
6
|
-
} = _ref;
|
|
7
|
-
switch (action.type) {
|
|
8
|
-
case 'update_refreshing':
|
|
9
|
-
{
|
|
10
|
-
draft['refreshing'] = action.value.status;
|
|
11
|
-
return draft;
|
|
12
|
-
}
|
|
13
|
-
case 'update_loading':
|
|
14
|
-
{
|
|
15
|
-
draft['loading'] = action.value.status;
|
|
16
|
-
return draft;
|
|
17
|
-
}
|
|
18
|
-
case 'update_messages':
|
|
19
|
-
case 'update_next_messages':
|
|
20
|
-
{
|
|
21
|
-
const key = action.type === 'update_messages' ? 'messageMap' : 'nextMessageMap';
|
|
22
|
-
const receivedMessagesAsMap = arrayToMapWithGetter(action.value.messages, getMessageUniqId);
|
|
23
|
-
if (action.value.clearBeforeAction) {
|
|
24
|
-
draft[key] = receivedMessagesAsMap;
|
|
25
|
-
} else {
|
|
26
|
-
draft[key] = {
|
|
27
|
-
...draft[key],
|
|
28
|
-
...receivedMessagesAsMap
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
// NOTE: Replace pending message to succeeded message
|
|
32
|
-
action.value.messages.filter(m => {
|
|
33
|
-
return (m.isFileMessage() || m.isUserMessage()) && Boolean(draft[key][m.reqId]) && m.sendingStatus === 'succeeded' && isMyMessage(m, action.value.currentUserId);
|
|
34
|
-
}).forEach(m => delete draft[key][m.reqId]);
|
|
35
|
-
}
|
|
36
|
-
return draft;
|
|
37
|
-
}
|
|
38
|
-
case 'delete_messages':
|
|
39
|
-
case 'delete_next_messages':
|
|
40
|
-
{
|
|
41
|
-
const key = action.type === 'delete_messages' ? 'messageMap' : 'nextMessageMap';
|
|
42
|
-
draft[key] = {
|
|
43
|
-
...draft[key]
|
|
44
|
-
};
|
|
45
|
-
action.value.messageIds.forEach(msgId => delete draft[key][msgId]);
|
|
46
|
-
action.value.reqIds.forEach(reqId => delete draft[key][reqId]);
|
|
47
|
-
return draft;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
};
|
|
51
|
-
export const useOpenChannelMessagesReducer = (userId, sortComparator) => {
|
|
52
|
-
const [{
|
|
53
|
-
loading,
|
|
54
|
-
refreshing,
|
|
55
|
-
messageMap,
|
|
56
|
-
nextMessageMap
|
|
57
|
-
}, dispatch] = useReducer(defaultReducer, {
|
|
58
|
-
loading: true,
|
|
59
|
-
refreshing: false,
|
|
60
|
-
messageMap: {},
|
|
61
|
-
nextMessageMap: {}
|
|
62
|
-
});
|
|
63
|
-
const updateMessages = (messages, clearBeforeAction, currentUserId) => {
|
|
64
|
-
dispatch({
|
|
65
|
-
type: 'update_messages',
|
|
66
|
-
value: {
|
|
67
|
-
messages,
|
|
68
|
-
clearBeforeAction,
|
|
69
|
-
currentUserId
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
};
|
|
73
|
-
const deleteMessages = (messageIds, reqIds) => {
|
|
74
|
-
dispatch({
|
|
75
|
-
type: 'delete_messages',
|
|
76
|
-
value: {
|
|
77
|
-
messageIds,
|
|
78
|
-
reqIds
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
};
|
|
82
|
-
const updateNextMessages = (messages, clearBeforeAction, currentUserId) => {
|
|
83
|
-
dispatch({
|
|
84
|
-
type: 'update_next_messages',
|
|
85
|
-
value: {
|
|
86
|
-
messages,
|
|
87
|
-
clearBeforeAction,
|
|
88
|
-
currentUserId
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
};
|
|
92
|
-
const deleteNextMessages = (messageIds, reqIds) => {
|
|
93
|
-
dispatch({
|
|
94
|
-
type: 'delete_next_messages',
|
|
95
|
-
value: {
|
|
96
|
-
messageIds,
|
|
97
|
-
reqIds
|
|
98
|
-
}
|
|
99
|
-
});
|
|
100
|
-
};
|
|
101
|
-
const updateLoading = status => {
|
|
102
|
-
dispatch({
|
|
103
|
-
type: 'update_loading',
|
|
104
|
-
value: {
|
|
105
|
-
status
|
|
106
|
-
}
|
|
107
|
-
});
|
|
108
|
-
};
|
|
109
|
-
const updateRefreshing = status => {
|
|
110
|
-
dispatch({
|
|
111
|
-
type: 'update_refreshing',
|
|
112
|
-
value: {
|
|
113
|
-
status
|
|
114
|
-
}
|
|
115
|
-
});
|
|
116
|
-
};
|
|
117
|
-
const messages = useIIFE(() => {
|
|
118
|
-
if (sortComparator) return Object.values(messageMap).sort(sortComparator);
|
|
119
|
-
return Object.values(messageMap);
|
|
120
|
-
});
|
|
121
|
-
const nextMessages = Object.values(nextMessageMap);
|
|
122
|
-
const newMessagesFromMembers = nextMessages.filter(msg => isNewMessage(msg, userId));
|
|
123
|
-
return {
|
|
124
|
-
updateLoading,
|
|
125
|
-
updateRefreshing,
|
|
126
|
-
updateMessages,
|
|
127
|
-
updateNextMessages,
|
|
128
|
-
deleteMessages,
|
|
129
|
-
deleteNextMessages,
|
|
130
|
-
loading,
|
|
131
|
-
refreshing,
|
|
132
|
-
messages,
|
|
133
|
-
nextMessages,
|
|
134
|
-
newMessagesFromMembers
|
|
135
|
-
};
|
|
136
|
-
};
|
|
137
|
-
//# sourceMappingURL=reducer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["useReducer","arrayToMapWithGetter","getMessageUniqId","isMyMessage","isNewMessage","useIIFE","defaultReducer","_ref","action","draft","type","value","status","key","receivedMessagesAsMap","messages","clearBeforeAction","filter","m","isFileMessage","isUserMessage","Boolean","reqId","sendingStatus","currentUserId","forEach","messageIds","msgId","reqIds","useOpenChannelMessagesReducer","userId","sortComparator","loading","refreshing","messageMap","nextMessageMap","dispatch","updateMessages","deleteMessages","updateNextMessages","deleteNextMessages","updateLoading","updateRefreshing","Object","values","sort","nextMessages","newMessagesFromMembers","msg"],"sources":["reducer.ts"],"sourcesContent":["import { useReducer } from 'react';\n\nimport type { SendbirdBaseMessage, SendbirdFileMessage, SendbirdUserMessage } from '@sendbird/uikit-utils';\nimport { arrayToMapWithGetter, getMessageUniqId, isMyMessage, isNewMessage, useIIFE } from '@sendbird/uikit-utils';\n\nimport type { UseOpenChannelMessagesOptions } from '../../types';\n\ntype Action =\n | {\n type: 'update_loading' | 'update_refreshing';\n value: { status: boolean };\n }\n | {\n type: 'update_messages' | 'update_next_messages';\n value: { messages: SendbirdBaseMessage[]; clearBeforeAction: boolean; currentUserId?: string };\n }\n | {\n type: 'delete_messages' | 'delete_next_messages';\n value: { messageIds: number[]; reqIds: string[] };\n };\n\ntype State = {\n loading: boolean;\n refreshing: boolean;\n messageMap: Record<string, SendbirdBaseMessage>;\n nextMessageMap: Record<string, SendbirdBaseMessage>;\n};\n\nconst defaultReducer = ({ ...draft }: State, action: Action) => {\n switch (action.type) {\n case 'update_refreshing': {\n draft['refreshing'] = action.value.status;\n return draft;\n }\n case 'update_loading': {\n draft['loading'] = action.value.status;\n return draft;\n }\n case 'update_messages':\n case 'update_next_messages': {\n const key = action.type === 'update_messages' ? 'messageMap' : 'nextMessageMap';\n const receivedMessagesAsMap = arrayToMapWithGetter(action.value.messages, getMessageUniqId);\n if (action.value.clearBeforeAction) {\n draft[key] = receivedMessagesAsMap;\n } else {\n draft[key] = { ...draft[key], ...receivedMessagesAsMap };\n\n // NOTE: Replace pending message to succeeded message\n action.value.messages\n .filter((m): m is SendbirdUserMessage | SendbirdFileMessage => {\n return (\n (m.isFileMessage() || m.isUserMessage()) &&\n Boolean(draft[key][m.reqId]) &&\n m.sendingStatus === 'succeeded' &&\n isMyMessage(m, action.value.currentUserId)\n );\n })\n .forEach((m) => delete draft[key][m.reqId]);\n }\n\n return draft;\n }\n case 'delete_messages':\n case 'delete_next_messages': {\n const key = action.type === 'delete_messages' ? 'messageMap' : 'nextMessageMap';\n draft[key] = { ...draft[key] };\n action.value.messageIds.forEach((msgId) => delete draft[key][msgId]);\n action.value.reqIds.forEach((reqId) => delete draft[key][reqId]);\n\n return draft;\n }\n }\n};\n\nexport const useOpenChannelMessagesReducer = (\n userId?: string,\n sortComparator?: UseOpenChannelMessagesOptions['sortComparator'],\n) => {\n const [{ loading, refreshing, messageMap, nextMessageMap }, dispatch] = useReducer(defaultReducer, {\n loading: true,\n refreshing: false,\n messageMap: {},\n nextMessageMap: {},\n });\n\n const updateMessages = (messages: SendbirdBaseMessage[], clearBeforeAction: boolean, currentUserId?: string) => {\n dispatch({ type: 'update_messages', value: { messages, clearBeforeAction, currentUserId } });\n };\n const deleteMessages = (messageIds: number[], reqIds: string[]) => {\n dispatch({ type: 'delete_messages', value: { messageIds, reqIds } });\n };\n const updateNextMessages = (messages: SendbirdBaseMessage[], clearBeforeAction: boolean, currentUserId?: string) => {\n dispatch({ type: 'update_next_messages', value: { messages, clearBeforeAction, currentUserId } });\n };\n const deleteNextMessages = (messageIds: number[], reqIds: string[]) => {\n dispatch({ type: 'delete_next_messages', value: { messageIds, reqIds } });\n };\n const updateLoading = (status: boolean) => {\n dispatch({ type: 'update_loading', value: { status } });\n };\n const updateRefreshing = (status: boolean) => {\n dispatch({ type: 'update_refreshing', value: { status } });\n };\n\n const messages = useIIFE(() => {\n if (sortComparator) return Object.values(messageMap).sort(sortComparator);\n return Object.values(messageMap);\n });\n const nextMessages = Object.values(nextMessageMap);\n const newMessagesFromMembers = nextMessages.filter((msg) => isNewMessage(msg, userId));\n\n return {\n updateLoading,\n updateRefreshing,\n updateMessages,\n updateNextMessages,\n deleteMessages,\n deleteNextMessages,\n\n loading,\n refreshing,\n messages,\n nextMessages,\n newMessagesFromMembers,\n };\n};\n"],"mappings":"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"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { SendbirdBaseMessage } from '@sendbird/uikit-utils';
|
|
2
|
-
import type { UseGroupChannelMessagesOptions } from '../../types';
|
|
3
|
-
export declare const useGroupChannelMessagesReducer: (userId?: string, sortComparator?: UseGroupChannelMessagesOptions['sortComparator']) => {
|
|
4
|
-
updateLoading: (status: boolean) => void;
|
|
5
|
-
updateRefreshing: (status: boolean) => void;
|
|
6
|
-
updateMessages: (messages: SendbirdBaseMessage[], clearBeforeAction: boolean, currentUserId?: string) => void;
|
|
7
|
-
updateNextMessages: (messages: SendbirdBaseMessage[], clearBeforeAction: boolean, currentUserId?: string) => void;
|
|
8
|
-
deleteMessages: (messageIds: number[], reqIds: string[]) => void;
|
|
9
|
-
deleteNextMessages: (messageIds: number[], reqIds: string[]) => void;
|
|
10
|
-
loading: boolean;
|
|
11
|
-
refreshing: boolean;
|
|
12
|
-
messages: import("@sendbird/chat/message").BaseMessage[];
|
|
13
|
-
nextMessages: import("@sendbird/chat/message").BaseMessage[];
|
|
14
|
-
newMessagesFromMembers: import("@sendbird/chat/message").BaseMessage[];
|
|
15
|
-
};
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { SendbirdBaseMessage } from '@sendbird/uikit-utils';
|
|
2
|
-
import type { UseOpenChannelMessagesOptions } from '../../types';
|
|
3
|
-
export declare const useOpenChannelMessagesReducer: (userId?: string, sortComparator?: UseOpenChannelMessagesOptions['sortComparator']) => {
|
|
4
|
-
updateLoading: (status: boolean) => void;
|
|
5
|
-
updateRefreshing: (status: boolean) => void;
|
|
6
|
-
updateMessages: (messages: SendbirdBaseMessage[], clearBeforeAction: boolean, currentUserId?: string) => void;
|
|
7
|
-
updateNextMessages: (messages: SendbirdBaseMessage[], clearBeforeAction: boolean, currentUserId?: string) => void;
|
|
8
|
-
deleteMessages: (messageIds: number[], reqIds: string[]) => void;
|
|
9
|
-
deleteNextMessages: (messageIds: number[], reqIds: string[]) => void;
|
|
10
|
-
loading: boolean;
|
|
11
|
-
refreshing: boolean;
|
|
12
|
-
messages: import("@sendbird/chat/message").BaseMessage[];
|
|
13
|
-
nextMessages: import("@sendbird/chat/message").BaseMessage[];
|
|
14
|
-
newMessagesFromMembers: import("@sendbird/chat/message").BaseMessage[];
|
|
15
|
-
};
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
import { useReducer } from 'react';
|
|
2
|
-
|
|
3
|
-
import type { SendbirdBaseMessage, SendbirdFileMessage, SendbirdUserMessage } from '@sendbird/uikit-utils';
|
|
4
|
-
import { arrayToMapWithGetter, getMessageUniqId, isMyMessage, isNewMessage, useIIFE } from '@sendbird/uikit-utils';
|
|
5
|
-
|
|
6
|
-
import type { UseGroupChannelMessagesOptions } from '../../types';
|
|
7
|
-
|
|
8
|
-
type Action =
|
|
9
|
-
| {
|
|
10
|
-
type: 'update_loading' | 'update_refreshing';
|
|
11
|
-
value: { status: boolean };
|
|
12
|
-
}
|
|
13
|
-
| {
|
|
14
|
-
type: 'update_messages' | 'update_next_messages';
|
|
15
|
-
value: { messages: SendbirdBaseMessage[]; clearBeforeAction: boolean; currentUserId?: string };
|
|
16
|
-
}
|
|
17
|
-
| {
|
|
18
|
-
type: 'delete_messages' | 'delete_next_messages';
|
|
19
|
-
value: { messageIds: number[]; reqIds: string[] };
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
type State = {
|
|
23
|
-
loading: boolean;
|
|
24
|
-
refreshing: boolean;
|
|
25
|
-
messageMap: Record<string, SendbirdBaseMessage>;
|
|
26
|
-
nextMessageMap: Record<string, SendbirdBaseMessage>;
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
const defaultReducer = ({ ...draft }: State, action: Action) => {
|
|
30
|
-
switch (action.type) {
|
|
31
|
-
case 'update_refreshing': {
|
|
32
|
-
draft['refreshing'] = action.value.status;
|
|
33
|
-
return draft;
|
|
34
|
-
}
|
|
35
|
-
case 'update_loading': {
|
|
36
|
-
draft['loading'] = action.value.status;
|
|
37
|
-
return draft;
|
|
38
|
-
}
|
|
39
|
-
case 'update_messages':
|
|
40
|
-
case 'update_next_messages': {
|
|
41
|
-
const key = action.type === 'update_messages' ? 'messageMap' : 'nextMessageMap';
|
|
42
|
-
const receivedMessagesAsMap = arrayToMapWithGetter(action.value.messages, getMessageUniqId);
|
|
43
|
-
if (action.value.clearBeforeAction) {
|
|
44
|
-
draft[key] = receivedMessagesAsMap;
|
|
45
|
-
} else {
|
|
46
|
-
draft[key] = { ...draft[key], ...receivedMessagesAsMap };
|
|
47
|
-
|
|
48
|
-
// NOTE: Replace pending message to succeeded message
|
|
49
|
-
action.value.messages
|
|
50
|
-
.filter((m): m is SendbirdUserMessage | SendbirdFileMessage => {
|
|
51
|
-
return (
|
|
52
|
-
(m.isFileMessage() || m.isUserMessage()) &&
|
|
53
|
-
Boolean(draft[key][m.reqId]) &&
|
|
54
|
-
m.sendingStatus === 'succeeded' &&
|
|
55
|
-
isMyMessage(m, action.value.currentUserId)
|
|
56
|
-
);
|
|
57
|
-
})
|
|
58
|
-
.forEach((m) => delete draft[key][m.reqId]);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
return draft;
|
|
62
|
-
}
|
|
63
|
-
case 'delete_messages':
|
|
64
|
-
case 'delete_next_messages': {
|
|
65
|
-
const key = action.type === 'delete_messages' ? 'messageMap' : 'nextMessageMap';
|
|
66
|
-
draft[key] = { ...draft[key] };
|
|
67
|
-
action.value.messageIds.forEach((msgId) => delete draft[key][msgId]);
|
|
68
|
-
action.value.reqIds.forEach((reqId) => delete draft[key][reqId]);
|
|
69
|
-
|
|
70
|
-
return draft;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
export const useGroupChannelMessagesReducer = (
|
|
76
|
-
userId?: string,
|
|
77
|
-
sortComparator?: UseGroupChannelMessagesOptions['sortComparator'],
|
|
78
|
-
) => {
|
|
79
|
-
const [{ loading, refreshing, messageMap, nextMessageMap }, dispatch] = useReducer(defaultReducer, {
|
|
80
|
-
loading: true,
|
|
81
|
-
refreshing: false,
|
|
82
|
-
messageMap: {},
|
|
83
|
-
nextMessageMap: {},
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
const updateMessages = (messages: SendbirdBaseMessage[], clearBeforeAction: boolean, currentUserId?: string) => {
|
|
87
|
-
dispatch({ type: 'update_messages', value: { messages, clearBeforeAction, currentUserId } });
|
|
88
|
-
};
|
|
89
|
-
const deleteMessages = (messageIds: number[], reqIds: string[]) => {
|
|
90
|
-
dispatch({ type: 'delete_messages', value: { messageIds, reqIds } });
|
|
91
|
-
};
|
|
92
|
-
const updateNextMessages = (messages: SendbirdBaseMessage[], clearBeforeAction: boolean, currentUserId?: string) => {
|
|
93
|
-
dispatch({ type: 'update_next_messages', value: { messages, clearBeforeAction, currentUserId } });
|
|
94
|
-
};
|
|
95
|
-
const deleteNextMessages = (messageIds: number[], reqIds: string[]) => {
|
|
96
|
-
dispatch({ type: 'delete_next_messages', value: { messageIds, reqIds } });
|
|
97
|
-
};
|
|
98
|
-
const updateLoading = (status: boolean) => {
|
|
99
|
-
dispatch({ type: 'update_loading', value: { status } });
|
|
100
|
-
};
|
|
101
|
-
const updateRefreshing = (status: boolean) => {
|
|
102
|
-
dispatch({ type: 'update_refreshing', value: { status } });
|
|
103
|
-
};
|
|
104
|
-
|
|
105
|
-
const messages = useIIFE(() => {
|
|
106
|
-
if (sortComparator) return Object.values(messageMap).sort(sortComparator);
|
|
107
|
-
return Object.values(messageMap);
|
|
108
|
-
});
|
|
109
|
-
const nextMessages = Object.values(nextMessageMap);
|
|
110
|
-
const newMessagesFromMembers = nextMessages.filter((msg) => isNewMessage(msg, userId));
|
|
111
|
-
|
|
112
|
-
return {
|
|
113
|
-
updateLoading,
|
|
114
|
-
updateRefreshing,
|
|
115
|
-
updateMessages,
|
|
116
|
-
updateNextMessages,
|
|
117
|
-
deleteMessages,
|
|
118
|
-
deleteNextMessages,
|
|
119
|
-
|
|
120
|
-
loading,
|
|
121
|
-
refreshing,
|
|
122
|
-
messages,
|
|
123
|
-
nextMessages,
|
|
124
|
-
newMessagesFromMembers,
|
|
125
|
-
};
|
|
126
|
-
};
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
import { useReducer } from 'react';
|
|
2
|
-
|
|
3
|
-
import type { SendbirdBaseMessage, SendbirdFileMessage, SendbirdUserMessage } from '@sendbird/uikit-utils';
|
|
4
|
-
import { arrayToMapWithGetter, getMessageUniqId, isMyMessage, isNewMessage, useIIFE } from '@sendbird/uikit-utils';
|
|
5
|
-
|
|
6
|
-
import type { UseOpenChannelMessagesOptions } from '../../types';
|
|
7
|
-
|
|
8
|
-
type Action =
|
|
9
|
-
| {
|
|
10
|
-
type: 'update_loading' | 'update_refreshing';
|
|
11
|
-
value: { status: boolean };
|
|
12
|
-
}
|
|
13
|
-
| {
|
|
14
|
-
type: 'update_messages' | 'update_next_messages';
|
|
15
|
-
value: { messages: SendbirdBaseMessage[]; clearBeforeAction: boolean; currentUserId?: string };
|
|
16
|
-
}
|
|
17
|
-
| {
|
|
18
|
-
type: 'delete_messages' | 'delete_next_messages';
|
|
19
|
-
value: { messageIds: number[]; reqIds: string[] };
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
type State = {
|
|
23
|
-
loading: boolean;
|
|
24
|
-
refreshing: boolean;
|
|
25
|
-
messageMap: Record<string, SendbirdBaseMessage>;
|
|
26
|
-
nextMessageMap: Record<string, SendbirdBaseMessage>;
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
const defaultReducer = ({ ...draft }: State, action: Action) => {
|
|
30
|
-
switch (action.type) {
|
|
31
|
-
case 'update_refreshing': {
|
|
32
|
-
draft['refreshing'] = action.value.status;
|
|
33
|
-
return draft;
|
|
34
|
-
}
|
|
35
|
-
case 'update_loading': {
|
|
36
|
-
draft['loading'] = action.value.status;
|
|
37
|
-
return draft;
|
|
38
|
-
}
|
|
39
|
-
case 'update_messages':
|
|
40
|
-
case 'update_next_messages': {
|
|
41
|
-
const key = action.type === 'update_messages' ? 'messageMap' : 'nextMessageMap';
|
|
42
|
-
const receivedMessagesAsMap = arrayToMapWithGetter(action.value.messages, getMessageUniqId);
|
|
43
|
-
if (action.value.clearBeforeAction) {
|
|
44
|
-
draft[key] = receivedMessagesAsMap;
|
|
45
|
-
} else {
|
|
46
|
-
draft[key] = { ...draft[key], ...receivedMessagesAsMap };
|
|
47
|
-
|
|
48
|
-
// NOTE: Replace pending message to succeeded message
|
|
49
|
-
action.value.messages
|
|
50
|
-
.filter((m): m is SendbirdUserMessage | SendbirdFileMessage => {
|
|
51
|
-
return (
|
|
52
|
-
(m.isFileMessage() || m.isUserMessage()) &&
|
|
53
|
-
Boolean(draft[key][m.reqId]) &&
|
|
54
|
-
m.sendingStatus === 'succeeded' &&
|
|
55
|
-
isMyMessage(m, action.value.currentUserId)
|
|
56
|
-
);
|
|
57
|
-
})
|
|
58
|
-
.forEach((m) => delete draft[key][m.reqId]);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
return draft;
|
|
62
|
-
}
|
|
63
|
-
case 'delete_messages':
|
|
64
|
-
case 'delete_next_messages': {
|
|
65
|
-
const key = action.type === 'delete_messages' ? 'messageMap' : 'nextMessageMap';
|
|
66
|
-
draft[key] = { ...draft[key] };
|
|
67
|
-
action.value.messageIds.forEach((msgId) => delete draft[key][msgId]);
|
|
68
|
-
action.value.reqIds.forEach((reqId) => delete draft[key][reqId]);
|
|
69
|
-
|
|
70
|
-
return draft;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
export const useOpenChannelMessagesReducer = (
|
|
76
|
-
userId?: string,
|
|
77
|
-
sortComparator?: UseOpenChannelMessagesOptions['sortComparator'],
|
|
78
|
-
) => {
|
|
79
|
-
const [{ loading, refreshing, messageMap, nextMessageMap }, dispatch] = useReducer(defaultReducer, {
|
|
80
|
-
loading: true,
|
|
81
|
-
refreshing: false,
|
|
82
|
-
messageMap: {},
|
|
83
|
-
nextMessageMap: {},
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
const updateMessages = (messages: SendbirdBaseMessage[], clearBeforeAction: boolean, currentUserId?: string) => {
|
|
87
|
-
dispatch({ type: 'update_messages', value: { messages, clearBeforeAction, currentUserId } });
|
|
88
|
-
};
|
|
89
|
-
const deleteMessages = (messageIds: number[], reqIds: string[]) => {
|
|
90
|
-
dispatch({ type: 'delete_messages', value: { messageIds, reqIds } });
|
|
91
|
-
};
|
|
92
|
-
const updateNextMessages = (messages: SendbirdBaseMessage[], clearBeforeAction: boolean, currentUserId?: string) => {
|
|
93
|
-
dispatch({ type: 'update_next_messages', value: { messages, clearBeforeAction, currentUserId } });
|
|
94
|
-
};
|
|
95
|
-
const deleteNextMessages = (messageIds: number[], reqIds: string[]) => {
|
|
96
|
-
dispatch({ type: 'delete_next_messages', value: { messageIds, reqIds } });
|
|
97
|
-
};
|
|
98
|
-
const updateLoading = (status: boolean) => {
|
|
99
|
-
dispatch({ type: 'update_loading', value: { status } });
|
|
100
|
-
};
|
|
101
|
-
const updateRefreshing = (status: boolean) => {
|
|
102
|
-
dispatch({ type: 'update_refreshing', value: { status } });
|
|
103
|
-
};
|
|
104
|
-
|
|
105
|
-
const messages = useIIFE(() => {
|
|
106
|
-
if (sortComparator) return Object.values(messageMap).sort(sortComparator);
|
|
107
|
-
return Object.values(messageMap);
|
|
108
|
-
});
|
|
109
|
-
const nextMessages = Object.values(nextMessageMap);
|
|
110
|
-
const newMessagesFromMembers = nextMessages.filter((msg) => isNewMessage(msg, userId));
|
|
111
|
-
|
|
112
|
-
return {
|
|
113
|
-
updateLoading,
|
|
114
|
-
updateRefreshing,
|
|
115
|
-
updateMessages,
|
|
116
|
-
updateNextMessages,
|
|
117
|
-
deleteMessages,
|
|
118
|
-
deleteNextMessages,
|
|
119
|
-
|
|
120
|
-
loading,
|
|
121
|
-
refreshing,
|
|
122
|
-
messages,
|
|
123
|
-
nextMessages,
|
|
124
|
-
newMessagesFromMembers,
|
|
125
|
-
};
|
|
126
|
-
};
|