@sendbird/uikit-chat-hooks 2.0.2 → 2.1.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/useGroupChannel.js +33 -0
- package/lib/commonjs/channel/useGroupChannel.js.map +1 -0
- package/lib/commonjs/channel/useGroupChannelMessages/reducer.js +3 -3
- package/lib/commonjs/channel/useGroupChannelMessages/reducer.js.map +1 -1
- package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js +56 -68
- package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js.map +1 -1
- package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js +26 -35
- package/lib/commonjs/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js.map +1 -1
- package/lib/commonjs/common/useAppFeatures.js +4 -4
- package/lib/commonjs/common/useAppFeatures.js.map +1 -1
- package/lib/commonjs/common/useMessageOutgoingStatus.js +1 -1
- package/lib/commonjs/common/useMessageOutgoingStatus.js.map +1 -1
- package/lib/commonjs/common/useUserList.js +25 -7
- package/lib/commonjs/common/useUserList.js.map +1 -1
- package/lib/commonjs/index.js +8 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/types.js.map +1 -1
- package/lib/module/channel/useGroupChannel.js +22 -0
- package/lib/module/channel/useGroupChannel.js.map +1 -0
- package/lib/module/channel/useGroupChannelMessages/reducer.js +3 -3
- package/lib/module/channel/useGroupChannelMessages/reducer.js.map +1 -1
- package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js +57 -68
- package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.js.map +1 -1
- package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js +26 -34
- package/lib/module/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.js.map +1 -1
- package/lib/module/common/useAppFeatures.js +4 -4
- package/lib/module/common/useAppFeatures.js.map +1 -1
- package/lib/module/common/useMessageOutgoingStatus.js +1 -1
- package/lib/module/common/useMessageOutgoingStatus.js.map +1 -1
- package/lib/module/common/useUserList.js +27 -9
- package/lib/module/common/useUserList.js.map +1 -1
- package/lib/module/index.js +1 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/types.js.map +1 -1
- package/lib/typescript/src/channel/useGroupChannel.d.ts +6 -0
- package/lib/typescript/src/common/useUserList.d.ts +2 -2
- package/lib/typescript/src/index.d.ts +2 -1
- package/lib/typescript/src/types.d.ts +13 -6
- package/package.json +3 -3
- package/src/channel/useGroupChannel.ts +21 -0
- package/src/channel/useGroupChannelMessages/reducer.ts +4 -4
- package/src/channel/useGroupChannelMessages/useGroupChannelMessagesWithCollection.ts +70 -76
- package/src/channel/useGroupChannelMessages/useGroupChannelMessagesWithQuery.ts +29 -31
- package/src/common/useAppFeatures.ts +4 -4
- package/src/common/useMessageOutgoingStatus.ts +2 -1
- package/src/common/useUserList.ts +38 -12
- package/src/index.ts +3 -1
- package/src/types.ts +16 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useCallback","useRef","Logger","confirmAndMarkAsRead","isDifferentChannel","useAsyncEffect","useForceUpdate","useChannelHandler","useActiveGroupChannel","useGroupChannelMessagesReducer","createMessageQuery","channel","creator","createPreviousMessageListQuery","limit","reverse","HOOK_NAME","useGroupChannelMessagesWithQuery","sdk","userId","options","queryRef","activeChannel","setActiveChannel","forceUpdate","loading","refreshing","messages","nextMessages","newMessagesFromMembers","updateMessages","updateNextMessages","deleteNextMessages","deleteMessages","updateLoading","updateRefreshing","sortComparator","channelMarkAs","e","warn","init","uid","current","queryCreator","catch","hasNext","list","load","currentUser","url","channelUpdater","isGroupChannel","onMessageReceived","eventChannel","message","onMessageUpdated","onMessageDeleted","messageId","onChannelChanged","onChannelFrozen","onChannelUnfrozen","onChannelHidden","onChannelMemberCountChanged","channels","find","c","onChannelDeleted","channelUrl","onOperatorUpdated","onUserLeft","onUserJoined","onUserUnbanned","onUserMuted","onUserUnmuted","onUserBanned","bannedUser","refresh","prev","next","length","sendUserMessage","params","onPending","Promise","resolve","reject","pendingMessage","isUserMessage","onSucceeded","sentMessage","onFailed","err","sendFileMessage","isFileMessage","updateUserMessage","updatedMessage","updateFileMessage","resendMessage","failedMessage","resendUserMessage","resendFileMessage","deleteMessage","sendingStatus","reqId"],"sources":["useGroupChannelMessagesWithQuery.ts"],"sourcesContent":["import { useCallback, useRef } from 'react';\n\nimport type { SendbirdBaseChannel, SendbirdGroupChannel } from '@sendbird/uikit-utils';\nimport {\n Logger,\n confirmAndMarkAsRead,\n isDifferentChannel,\n useAsyncEffect,\n useForceUpdate,\n} from '@sendbird/uikit-utils';\nimport type { SendbirdPreviousMessageListQuery } from '@sendbird/uikit-utils';\n\nimport { useChannelHandler } from '../../handler/useChannelHandler';\nimport type { UseGroupChannelMessages, UseGroupChannelMessagesOptions } from '../../types';\nimport { useActiveGroupChannel } from '../useActiveGroupChannel';\nimport { useGroupChannelMessagesReducer } from './reducer';\n\nconst createMessageQuery = (\n channel: SendbirdGroupChannel,\n creator?: UseGroupChannelMessagesOptions['queryCreator'],\n) => {\n if (creator) return creator();\n return channel.createPreviousMessageListQuery({\n limit: 100,\n reverse: true,\n });\n};\n\nconst HOOK_NAME = 'useGroupChannelMessagesWithQuery';\nexport const useGroupChannelMessagesWithQuery: UseGroupChannelMessages = (sdk, channel, userId, options) => {\n const queryRef = useRef<SendbirdPreviousMessageListQuery>();\n\n // NOTE: We cannot determine the channel object of Sendbird SDK is stale or not, so force update after setActiveChannel\n const { activeChannel, setActiveChannel } = useActiveGroupChannel(sdk, channel);\n const forceUpdate = useForceUpdate();\n\n const {\n loading,\n refreshing,\n messages,\n nextMessages,\n newMessagesFromMembers,\n updateMessages,\n updateNextMessages,\n deleteNextMessages,\n deleteMessages,\n updateLoading,\n updateRefreshing,\n } = useGroupChannelMessagesReducer(userId, options?.sortComparator);\n\n const channelMarkAs = async () => {\n try {\n await confirmAndMarkAsRead([channel]);\n } catch (e) {\n Logger.warn(`[${HOOK_NAME}/channelMarkAs/Read]`, e);\n }\n };\n\n const init = useCallback(\n async (uid?: string) => {\n if (uid) {\n queryRef.current = createMessageQuery(activeChannel, options?.queryCreator);\n channelMarkAs().catch();\n if (queryRef.current?.hasNext) {\n const list = await queryRef.current?.load();\n updateMessages(list, true, sdk.currentUser.userId);\n }\n updateNextMessages([], true, sdk.currentUser.userId);\n }\n },\n [sdk, activeChannel.url, options?.queryCreator],\n );\n\n const channelUpdater = (channel: SendbirdBaseChannel) => {\n if (channel.isGroupChannel() && !isDifferentChannel(channel, activeChannel)) {\n setActiveChannel(channel);\n forceUpdate();\n }\n };\n\n useChannelHandler(sdk, HOOK_NAME, {\n // Messages\n onMessageReceived(eventChannel, message) {\n if (isDifferentChannel(activeChannel, eventChannel)) return;\n channelMarkAs();\n updateNextMessages([message], false, sdk.currentUser.userId);\n },\n onMessageUpdated(eventChannel, message) {\n if (isDifferentChannel(activeChannel, eventChannel)) return;\n updateMessages([message], false, sdk.currentUser.userId);\n },\n onMessageDeleted(eventChannel, messageId) {\n if (isDifferentChannel(activeChannel, eventChannel)) return;\n deleteMessages([messageId], []);\n deleteNextMessages([messageId], []);\n },\n // Channels\n onChannelChanged: channelUpdater,\n onChannelFrozen: channelUpdater,\n onChannelUnfrozen: channelUpdater,\n onChannelHidden: channelUpdater,\n onChannelMemberCountChanged(channels) {\n const channel = channels.find((c) => !isDifferentChannel(c, activeChannel));\n if (channel) channelUpdater(channel);\n },\n onChannelDeleted(channelUrl: string) {\n if (activeChannel.url === channelUrl) options?.onChannelDeleted?.();\n },\n // Users\n onOperatorUpdated: channelUpdater,\n onUserLeft: channelUpdater,\n // onUserEntered: channelUpdater,\n // onUserExited: channelUpdater,\n onUserJoined: channelUpdater,\n onUserUnbanned: channelUpdater,\n onUserMuted: channelUpdater,\n onUserUnmuted: channelUpdater,\n onUserBanned(eventChannel, bannedUser) {\n if (isDifferentChannel(activeChannel, eventChannel)) return;\n\n if (bannedUser.userId === sdk.currentUser.userId) {\n options?.onChannelDeleted?.();\n } else {\n channelUpdater(eventChannel);\n }\n },\n });\n\n useAsyncEffect(async () => {\n updateLoading(true);\n await init(userId);\n updateLoading(false);\n }, [init, userId]);\n\n const refresh: ReturnType<UseGroupChannelMessages>['refresh'] = useCallback(async () => {\n updateRefreshing(true);\n await init(userId);\n updateRefreshing(false);\n }, [init, userId]);\n\n const prev: ReturnType<UseGroupChannelMessages>['prev'] = useCallback(async () => {\n if (queryRef.current && queryRef.current?.hasNext) {\n const list = await queryRef.current?.load();\n updateMessages(list, false, sdk.currentUser.userId);\n }\n }, []);\n\n const next: ReturnType<UseGroupChannelMessages>['next'] = useCallback(async () => {\n if (nextMessages.length > 0) {\n updateMessages(nextMessages, false, sdk.currentUser.userId);\n updateNextMessages([], true, sdk.currentUser.userId);\n }\n }, [nextMessages.length]);\n\n const sendUserMessage: ReturnType<UseGroupChannelMessages>['sendUserMessage'] = useCallback(\n (params, onPending) => {\n return new Promise((resolve, reject) => {\n activeChannel\n .sendUserMessage(params)\n .onPending((pendingMessage) => {\n if (pendingMessage.isUserMessage()) {\n updateNextMessages([pendingMessage], false, sdk.currentUser.userId);\n onPending?.(pendingMessage);\n }\n })\n .onSucceeded((sentMessage) => {\n if (sentMessage.isUserMessage()) {\n updateNextMessages([sentMessage], false, sdk.currentUser.userId);\n resolve(sentMessage);\n }\n })\n .onFailed((err) => {\n reject(err);\n });\n });\n },\n [activeChannel],\n );\n const sendFileMessage: ReturnType<UseGroupChannelMessages>['sendFileMessage'] = useCallback(\n (params, onPending) => {\n return new Promise((resolve, reject) => {\n activeChannel\n .sendFileMessage(params)\n .onPending((pendingMessage) => {\n if (pendingMessage.isFileMessage()) {\n updateNextMessages([pendingMessage], false, sdk.currentUser.userId);\n onPending?.(pendingMessage);\n }\n })\n .onSucceeded((sentMessage) => {\n if (sentMessage.isFileMessage()) {\n updateNextMessages([sentMessage], false, sdk.currentUser.userId);\n resolve(sentMessage);\n }\n })\n .onFailed((err) => {\n reject(err);\n });\n });\n },\n [activeChannel],\n );\n const updateUserMessage: ReturnType<UseGroupChannelMessages>['updateUserMessage'] = useCallback(\n async (messageId, params) => {\n const updatedMessage = await activeChannel.updateUserMessage(messageId, params);\n updateMessages([updatedMessage], false, sdk.currentUser.userId);\n return updatedMessage;\n },\n [activeChannel],\n );\n const updateFileMessage: ReturnType<UseGroupChannelMessages>['updateFileMessage'] = useCallback(\n async (messageId, params) => {\n const updatedMessage = await activeChannel.updateFileMessage(messageId, params);\n updateMessages([updatedMessage], false, sdk.currentUser.userId);\n return updatedMessage;\n },\n [activeChannel],\n );\n const resendMessage: ReturnType<UseGroupChannelMessages>['resendMessage'] = useCallback(\n async (failedMessage) => {\n const message = await (() => {\n if (failedMessage.isUserMessage()) return activeChannel.resendUserMessage(failedMessage);\n // FIXME: v4 bugs\n // @ts-ignore\n if (failedMessage.isFileMessage()) return activeChannel.resendFileMessage(failedMessage);\n return null;\n })();\n\n if (message) updateNextMessages([message], false, sdk.currentUser.userId);\n },\n [activeChannel],\n );\n const deleteMessage: ReturnType<UseGroupChannelMessages>['deleteMessage'] = useCallback(\n async (message) => {\n if (message.sendingStatus === 'succeeded') {\n if (message.isUserMessage()) await activeChannel.deleteMessage(message);\n if (message.isFileMessage()) await activeChannel.deleteMessage(message);\n } else {\n deleteMessages([message.messageId], [message.reqId]);\n }\n },\n [activeChannel],\n );\n\n return {\n loading,\n refreshing,\n refresh,\n messages,\n nextMessages,\n newMessagesFromMembers,\n next,\n prev,\n sendUserMessage,\n sendFileMessage,\n updateUserMessage,\n updateFileMessage,\n resendMessage,\n deleteMessage,\n activeChannel,\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["useCallback","useRef","Logger","confirmAndMarkAsRead","isDifferentChannel","useAsyncEffect","useForceUpdate","useChannelHandler","useGroupChannelMessagesReducer","createMessageQuery","channel","creator","createPreviousMessageListQuery","limit","reverse","HOOK_NAME","useGroupChannelMessagesWithQuery","sdk","userId","options","queryRef","forceUpdate","loading","refreshing","messages","nextMessages","newMessagesFromMembers","updateMessages","updateNextMessages","deleteNextMessages","deleteMessages","updateLoading","updateRefreshing","sortComparator","channelMarkAs","e","warn","init","uid","current","queryCreator","catch","hasNext","list","load","currentUser","url","channelUpdater","isGroupChannel","onMessageReceived","eventChannel","message","onMessageUpdated","onMessageDeleted","messageId","onChannelChanged","onChannelFrozen","onChannelUnfrozen","onChannelHidden","onChannelMemberCountChanged","channels","foundChannel","find","c","onChannelDeleted","channelUrl","onOperatorUpdated","onUserLeft","onUserJoined","onUserUnbanned","onUserMuted","onUserUnmuted","onUserBanned","bannedUser","refresh","prev","next","length","sendUserMessage","params","onPending","Promise","resolve","reject","pendingMessage","isUserMessage","onSucceeded","sentMessage","onFailed","err","sendFileMessage","isFileMessage","updateUserMessage","updatedMessage","updateFileMessage","resendMessage","failedMessage","resendUserMessage","resendFileMessage","deleteMessage","sendingStatus","reqId"],"sources":["useGroupChannelMessagesWithQuery.ts"],"sourcesContent":["import { useCallback, useRef } from 'react';\n\nimport type {\n SendbirdBaseChannel,\n SendbirdGroupChannel,\n SendbirdPreviousMessageListQuery,\n} from '@sendbird/uikit-utils';\nimport {\n Logger,\n confirmAndMarkAsRead,\n isDifferentChannel,\n useAsyncEffect,\n useForceUpdate,\n} from '@sendbird/uikit-utils';\n\nimport { useChannelHandler } from '../../handler/useChannelHandler';\nimport type { UseGroupChannelMessages, UseGroupChannelMessagesOptions } from '../../types';\nimport { useGroupChannelMessagesReducer } from './reducer';\n\nconst createMessageQuery = (\n channel: SendbirdGroupChannel,\n creator?: UseGroupChannelMessagesOptions['queryCreator'],\n) => {\n if (creator) return creator();\n return channel.createPreviousMessageListQuery({\n limit: 100,\n reverse: true,\n });\n};\n\nconst HOOK_NAME = 'useGroupChannelMessagesWithQuery';\nexport const useGroupChannelMessagesWithQuery: UseGroupChannelMessages = (sdk, channel, userId, options) => {\n const queryRef = useRef<SendbirdPreviousMessageListQuery>();\n\n const forceUpdate = useForceUpdate();\n\n const {\n loading,\n refreshing,\n messages,\n nextMessages,\n newMessagesFromMembers,\n updateMessages,\n updateNextMessages,\n deleteNextMessages,\n deleteMessages,\n updateLoading,\n updateRefreshing,\n } = useGroupChannelMessagesReducer(userId, options?.sortComparator);\n\n const channelMarkAs = async () => {\n try {\n await confirmAndMarkAsRead([channel]);\n } catch (e) {\n Logger.warn(`[${HOOK_NAME}/channelMarkAs/Read]`, e);\n }\n };\n\n const init = useCallback(\n async (uid?: string) => {\n if (uid) {\n queryRef.current = createMessageQuery(channel, options?.queryCreator);\n channelMarkAs().catch();\n if (queryRef.current?.hasNext) {\n const list = await queryRef.current?.load();\n updateMessages(list, true, sdk.currentUser.userId);\n }\n updateNextMessages([], true, sdk.currentUser.userId);\n }\n },\n [sdk, channel.url, options?.queryCreator],\n );\n\n const channelUpdater = (channel: SendbirdBaseChannel) => {\n if (channel.isGroupChannel() && !isDifferentChannel(channel, channel)) {\n forceUpdate();\n }\n };\n\n useChannelHandler(sdk, HOOK_NAME, {\n // Messages\n onMessageReceived(eventChannel, message) {\n if (isDifferentChannel(channel, eventChannel)) return;\n channelMarkAs();\n updateNextMessages([message], false, sdk.currentUser.userId);\n },\n onMessageUpdated(eventChannel, message) {\n if (isDifferentChannel(channel, eventChannel)) return;\n updateMessages([message], false, sdk.currentUser.userId);\n },\n onMessageDeleted(eventChannel, messageId) {\n if (isDifferentChannel(channel, eventChannel)) return;\n deleteMessages([messageId], []);\n deleteNextMessages([messageId], []);\n },\n // Channels\n onChannelChanged: channelUpdater,\n onChannelFrozen: channelUpdater,\n onChannelUnfrozen: channelUpdater,\n onChannelHidden: channelUpdater,\n onChannelMemberCountChanged(channels) {\n const foundChannel = channels.find((c) => !isDifferentChannel(c, channel));\n if (foundChannel) channelUpdater(foundChannel);\n },\n onChannelDeleted(channelUrl: string) {\n if (channel.url === channelUrl) options?.onChannelDeleted?.();\n },\n // Users\n onOperatorUpdated: channelUpdater,\n onUserLeft: channelUpdater,\n // onUserEntered: channelUpdater,\n // onUserExited: channelUpdater,\n onUserJoined: channelUpdater,\n onUserUnbanned: channelUpdater,\n onUserMuted: channelUpdater,\n onUserUnmuted: channelUpdater,\n onUserBanned(eventChannel, bannedUser) {\n if (isDifferentChannel(channel, eventChannel)) return;\n\n if (bannedUser.userId === sdk.currentUser.userId) {\n options?.onChannelDeleted?.();\n } else {\n channelUpdater(eventChannel);\n }\n },\n });\n\n useAsyncEffect(async () => {\n updateLoading(true);\n await init(userId);\n updateLoading(false);\n }, [init, userId]);\n\n const refresh: ReturnType<UseGroupChannelMessages>['refresh'] = useCallback(async () => {\n updateRefreshing(true);\n await init(userId);\n updateRefreshing(false);\n }, [init, userId]);\n\n const prev: ReturnType<UseGroupChannelMessages>['prev'] = useCallback(async () => {\n if (queryRef.current && queryRef.current?.hasNext) {\n const list = await queryRef.current?.load();\n updateMessages(list, false, sdk.currentUser.userId);\n }\n }, []);\n\n const next: ReturnType<UseGroupChannelMessages>['next'] = useCallback(async () => {\n if (nextMessages.length > 0) {\n updateMessages(nextMessages, false, sdk.currentUser.userId);\n updateNextMessages([], true, sdk.currentUser.userId);\n }\n }, [nextMessages.length]);\n\n const sendUserMessage: ReturnType<UseGroupChannelMessages>['sendUserMessage'] = useCallback(\n (params, onPending) => {\n return new Promise((resolve, reject) => {\n channel\n .sendUserMessage(params)\n .onPending((pendingMessage) => {\n if (pendingMessage.isUserMessage()) {\n updateNextMessages([pendingMessage], false, sdk.currentUser.userId);\n onPending?.(pendingMessage);\n }\n })\n .onSucceeded((sentMessage) => {\n if (sentMessage.isUserMessage()) {\n updateNextMessages([sentMessage], false, sdk.currentUser.userId);\n resolve(sentMessage);\n }\n })\n .onFailed((err) => {\n reject(err);\n });\n });\n },\n [channel],\n );\n const sendFileMessage: ReturnType<UseGroupChannelMessages>['sendFileMessage'] = useCallback(\n (params, onPending) => {\n return new Promise((resolve, reject) => {\n channel\n .sendFileMessage(params)\n .onPending((pendingMessage) => {\n if (pendingMessage.isFileMessage()) {\n updateNextMessages([pendingMessage], false, sdk.currentUser.userId);\n onPending?.(pendingMessage);\n }\n })\n .onSucceeded((sentMessage) => {\n if (sentMessage.isFileMessage()) {\n updateNextMessages([sentMessage], false, sdk.currentUser.userId);\n resolve(sentMessage);\n }\n })\n .onFailed((err) => {\n reject(err);\n });\n });\n },\n [channel],\n );\n const updateUserMessage: ReturnType<UseGroupChannelMessages>['updateUserMessage'] = useCallback(\n async (messageId, params) => {\n const updatedMessage = await channel.updateUserMessage(messageId, params);\n updateMessages([updatedMessage], false, sdk.currentUser.userId);\n return updatedMessage;\n },\n [channel],\n );\n const updateFileMessage: ReturnType<UseGroupChannelMessages>['updateFileMessage'] = useCallback(\n async (messageId, params) => {\n const updatedMessage = await channel.updateFileMessage(messageId, params);\n updateMessages([updatedMessage], false, sdk.currentUser.userId);\n return updatedMessage;\n },\n [channel],\n );\n const resendMessage: ReturnType<UseGroupChannelMessages>['resendMessage'] = useCallback(\n async (failedMessage) => {\n const message = await (() => {\n if (failedMessage.isUserMessage()) return channel.resendUserMessage(failedMessage);\n // FIXME: v4 bugs\n // @ts-ignore\n if (failedMessage.isFileMessage()) return channel.resendFileMessage(failedMessage);\n return null;\n })();\n\n if (message) updateNextMessages([message], false, sdk.currentUser.userId);\n },\n [channel],\n );\n const deleteMessage: ReturnType<UseGroupChannelMessages>['deleteMessage'] = useCallback(\n async (message) => {\n if (message.sendingStatus === 'succeeded') {\n if (message.isUserMessage()) await channel.deleteMessage(message);\n if (message.isFileMessage()) await channel.deleteMessage(message);\n } else {\n deleteMessages([message.messageId], [message.reqId]);\n }\n },\n [channel],\n );\n\n return {\n loading,\n refreshing,\n refresh,\n messages,\n nextMessages,\n newMessagesFromMembers,\n next,\n prev,\n sendUserMessage,\n sendFileMessage,\n updateUserMessage,\n updateFileMessage,\n resendMessage,\n deleteMessage,\n };\n};\n"],"mappings":"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"}
|
|
@@ -5,10 +5,10 @@ export const useAppFeatures = sdk => {
|
|
|
5
5
|
applicationAttributes = []
|
|
6
6
|
} = sdk.appInfo ?? {};
|
|
7
7
|
return {
|
|
8
|
-
deliveryReceiptEnabled:
|
|
9
|
-
broadcastChannelEnabled:
|
|
10
|
-
superGroupChannelEnabled:
|
|
11
|
-
reactionEnabled:
|
|
8
|
+
deliveryReceiptEnabled: premiumFeatureList.includes(PremiumFeatures.delivery_receipt),
|
|
9
|
+
broadcastChannelEnabled: applicationAttributes.includes(ApplicationAttributes.allow_broadcast_channel),
|
|
10
|
+
superGroupChannelEnabled: applicationAttributes.includes(ApplicationAttributes.allow_super_group_channel),
|
|
11
|
+
reactionEnabled: applicationAttributes.includes(ApplicationAttributes.reactions)
|
|
12
12
|
};
|
|
13
13
|
};
|
|
14
14
|
//# sourceMappingURL=useAppFeatures.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["ApplicationAttributes","PremiumFeatures","useAppFeatures","sdk","premiumFeatureList","applicationAttributes","appInfo","deliveryReceiptEnabled","
|
|
1
|
+
{"version":3,"names":["ApplicationAttributes","PremiumFeatures","useAppFeatures","sdk","premiumFeatureList","applicationAttributes","appInfo","deliveryReceiptEnabled","includes","delivery_receipt","broadcastChannelEnabled","allow_broadcast_channel","superGroupChannelEnabled","allow_super_group_channel","reactionEnabled","reactions"],"sources":["useAppFeatures.ts"],"sourcesContent":["import { ApplicationAttributes, PremiumFeatures, SendbirdChatSDK } from '@sendbird/uikit-utils';\n\nexport const useAppFeatures = (sdk: SendbirdChatSDK) => {\n const { premiumFeatureList = [], applicationAttributes = [] } = sdk.appInfo ?? {};\n return {\n deliveryReceiptEnabled: premiumFeatureList.includes(PremiumFeatures.delivery_receipt),\n broadcastChannelEnabled: applicationAttributes.includes(ApplicationAttributes.allow_broadcast_channel),\n superGroupChannelEnabled: applicationAttributes.includes(ApplicationAttributes.allow_super_group_channel),\n reactionEnabled: applicationAttributes.includes(ApplicationAttributes.reactions),\n };\n};\n"],"mappings":"AAAA,SAASA,qBAAT,EAAgCC,eAAhC,QAAwE,uBAAxE;AAEA,OAAO,MAAMC,cAAc,GAAIC,GAAD,IAA0B;EACtD,MAAM;IAAEC,kBAAkB,GAAG,EAAvB;IAA2BC,qBAAqB,GAAG;EAAnD,IAA0DF,GAAG,CAACG,OAAJ,IAAe,EAA/E;EACA,OAAO;IACLC,sBAAsB,EAAEH,kBAAkB,CAACI,QAAnB,CAA4BP,eAAe,CAACQ,gBAA5C,CADnB;IAELC,uBAAuB,EAAEL,qBAAqB,CAACG,QAAtB,CAA+BR,qBAAqB,CAACW,uBAArD,CAFpB;IAGLC,wBAAwB,EAAEP,qBAAqB,CAACG,QAAtB,CAA+BR,qBAAqB,CAACa,yBAArD,CAHrB;IAILC,eAAe,EAAET,qBAAqB,CAACG,QAAtB,CAA+BR,qBAAqB,CAACe,SAArD;EAJZ,CAAP;AAMD,CARM"}
|
|
@@ -21,7 +21,6 @@ export const useMessageOutgoingStatus = (sdk, channel, message) => {
|
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
});
|
|
24
|
-
if (channel.isBroadcast || channel.isSuper) return 'NONE';
|
|
25
24
|
if (!message) return 'NONE';
|
|
26
25
|
|
|
27
26
|
if ('sendingStatus' in message) {
|
|
@@ -29,6 +28,7 @@ export const useMessageOutgoingStatus = (sdk, channel, message) => {
|
|
|
29
28
|
if (message.sendingStatus === 'failed') return 'FAILED';
|
|
30
29
|
}
|
|
31
30
|
|
|
31
|
+
if (channel.isBroadcast || channel.isSuper) return 'NONE';
|
|
32
32
|
if (channel.getUnreadMemberCount(message) === 0) return 'READ';
|
|
33
33
|
|
|
34
34
|
if (features.deliveryReceiptEnabled) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["isDifferentChannel","isMyMessage","useForceUpdate","useUniqId","useChannelHandler","useAppFeatures","HOOK_NAME","useMessageOutgoingStatus","sdk","channel","message","features","forceUpdate","currentUser","uniqId","onUndeliveredMemberStatusUpdated","eventChannel","userId","onUnreadMemberStatusUpdated","
|
|
1
|
+
{"version":3,"names":["isDifferentChannel","isMyMessage","useForceUpdate","useUniqId","useChannelHandler","useAppFeatures","HOOK_NAME","useMessageOutgoingStatus","sdk","channel","message","features","forceUpdate","currentUser","uniqId","onUndeliveredMemberStatusUpdated","eventChannel","userId","onUnreadMemberStatusUpdated","sendingStatus","isBroadcast","isSuper","getUnreadMemberCount","deliveryReceiptEnabled","getUndeliveredMemberCount"],"sources":["useMessageOutgoingStatus.ts"],"sourcesContent":["import type { SendbirdChatSDK, SendbirdGroupChannel, SendbirdMessage } from '@sendbird/uikit-utils';\nimport { isDifferentChannel, isMyMessage, useForceUpdate, useUniqId } from '@sendbird/uikit-utils';\n\nimport { useChannelHandler } from '../handler/useChannelHandler';\nimport { useAppFeatures } from './useAppFeatures';\n\nconst HOOK_NAME = 'useMessageOutgoingStatus';\n\nexport type SBUOutgoingStatus = 'NONE' | 'PENDING' | 'FAILED' | 'UNDELIVERED' | 'DELIVERED' | 'UNREAD' | 'READ';\n\nexport const useMessageOutgoingStatus = (\n sdk: SendbirdChatSDK,\n channel: SendbirdGroupChannel,\n message?: SendbirdMessage | null,\n): SBUOutgoingStatus => {\n const features = useAppFeatures(sdk);\n const forceUpdate = useForceUpdate();\n const currentUser = sdk.currentUser;\n\n const uniqId = useUniqId(HOOK_NAME);\n useChannelHandler(sdk, `${HOOK_NAME}_${uniqId}`, {\n onUndeliveredMemberStatusUpdated(eventChannel) {\n if (isDifferentChannel(channel, eventChannel)) return;\n if (!isMyMessage(message, currentUser?.userId)) return;\n\n forceUpdate();\n },\n onUnreadMemberStatusUpdated(eventChannel) {\n if (isDifferentChannel(channel, eventChannel)) return;\n if (!isMyMessage(message, currentUser?.userId)) return;\n\n forceUpdate();\n },\n });\n\n if (!message) return 'NONE';\n\n if ('sendingStatus' in message) {\n if (message.sendingStatus === 'pending') return 'PENDING';\n if (message.sendingStatus === 'failed') return 'FAILED';\n }\n\n if (channel.isBroadcast || channel.isSuper) return 'NONE';\n\n if (channel.getUnreadMemberCount(message) === 0) return 'READ';\n\n if (features.deliveryReceiptEnabled) {\n if (channel.getUndeliveredMemberCount(message) === 0) return 'DELIVERED';\n return 'UNDELIVERED';\n }\n\n return 'UNREAD';\n};\n"],"mappings":"AACA,SAASA,kBAAT,EAA6BC,WAA7B,EAA0CC,cAA1C,EAA0DC,SAA1D,QAA2E,uBAA3E;AAEA,SAASC,iBAAT,QAAkC,8BAAlC;AACA,SAASC,cAAT,QAA+B,kBAA/B;AAEA,MAAMC,SAAS,GAAG,0BAAlB;AAIA,OAAO,MAAMC,wBAAwB,GAAG,CACtCC,GADsC,EAEtCC,OAFsC,EAGtCC,OAHsC,KAIhB;EACtB,MAAMC,QAAQ,GAAGN,cAAc,CAACG,GAAD,CAA/B;EACA,MAAMI,WAAW,GAAGV,cAAc,EAAlC;EACA,MAAMW,WAAW,GAAGL,GAAG,CAACK,WAAxB;EAEA,MAAMC,MAAM,GAAGX,SAAS,CAACG,SAAD,CAAxB;EACAF,iBAAiB,CAACI,GAAD,EAAO,GAAEF,SAAU,IAAGQ,MAAO,EAA7B,EAAgC;IAC/CC,gCAAgC,CAACC,YAAD,EAAe;MAC7C,IAAIhB,kBAAkB,CAACS,OAAD,EAAUO,YAAV,CAAtB,EAA+C;MAC/C,IAAI,CAACf,WAAW,CAACS,OAAD,EAAUG,WAAV,aAAUA,WAAV,uBAAUA,WAAW,CAAEI,MAAvB,CAAhB,EAAgD;MAEhDL,WAAW;IACZ,CAN8C;;IAO/CM,2BAA2B,CAACF,YAAD,EAAe;MACxC,IAAIhB,kBAAkB,CAACS,OAAD,EAAUO,YAAV,CAAtB,EAA+C;MAC/C,IAAI,CAACf,WAAW,CAACS,OAAD,EAAUG,WAAV,aAAUA,WAAV,uBAAUA,WAAW,CAAEI,MAAvB,CAAhB,EAAgD;MAEhDL,WAAW;IACZ;;EAZ8C,CAAhC,CAAjB;EAeA,IAAI,CAACF,OAAL,EAAc,OAAO,MAAP;;EAEd,IAAI,mBAAmBA,OAAvB,EAAgC;IAC9B,IAAIA,OAAO,CAACS,aAAR,KAA0B,SAA9B,EAAyC,OAAO,SAAP;IACzC,IAAIT,OAAO,CAACS,aAAR,KAA0B,QAA9B,EAAwC,OAAO,QAAP;EACzC;;EAED,IAAIV,OAAO,CAACW,WAAR,IAAuBX,OAAO,CAACY,OAAnC,EAA4C,OAAO,MAAP;EAE5C,IAAIZ,OAAO,CAACa,oBAAR,CAA6BZ,OAA7B,MAA0C,CAA9C,EAAiD,OAAO,MAAP;;EAEjD,IAAIC,QAAQ,CAACY,sBAAb,EAAqC;IACnC,IAAId,OAAO,CAACe,yBAAR,CAAkCd,OAAlC,MAA+C,CAAnD,EAAsD,OAAO,WAAP;IACtD,OAAO,aAAP;EACD;;EAED,OAAO,QAAP;AACD,CA1CM"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Logger, SBErrorCode, SBErrorMessage, useAsyncEffect } from '@sendbird/uikit-utils';
|
|
1
|
+
import { useMemo, useRef, useState } from 'react';
|
|
2
|
+
import { Logger, SBErrorCode, SBErrorMessage, useAsyncEffect, useFreshCallback } from '@sendbird/uikit-utils';
|
|
3
3
|
|
|
4
4
|
const createUserQuery = (sdk, queryCreator) => {
|
|
5
5
|
if (queryCreator) return queryCreator(); // In order to use the API, the option must be turned on in the dashboard.
|
|
@@ -39,12 +39,28 @@ export const useUserList = (sdk, options) => {
|
|
|
39
39
|
if (options !== null && options !== void 0 && options.sortComparator) return users.sort(options.sortComparator);
|
|
40
40
|
return users;
|
|
41
41
|
}, [users, options === null || options === void 0 ? void 0 : options.sortComparator]);
|
|
42
|
+
const upsertUser = useFreshCallback(user => {
|
|
43
|
+
setUsers(_ref => {
|
|
44
|
+
let [...draft] = _ref;
|
|
45
|
+
const userIdx = draft.findIndex(it => it.userId === user.userId);
|
|
46
|
+
if (userIdx > -1) draft[userIdx] = user;else draft.push(user);
|
|
47
|
+
return draft;
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
const deleteUser = useFreshCallback(userId => {
|
|
51
|
+
setUsers(_ref2 => {
|
|
52
|
+
let [...draft] = _ref2;
|
|
53
|
+
const userIdx = draft.findIndex(it => it.userId === userId);
|
|
54
|
+
if (userIdx > -1) draft.splice(userIdx, 1);
|
|
55
|
+
return draft;
|
|
56
|
+
});
|
|
57
|
+
});
|
|
42
58
|
|
|
43
59
|
const updateUsers = (users, clearPrev) => {
|
|
44
60
|
if (clearPrev) setUsers(users);else setUsers(prev => prev.concat(users));
|
|
45
61
|
};
|
|
46
62
|
|
|
47
|
-
const init =
|
|
63
|
+
const init = useFreshCallback(async () => {
|
|
48
64
|
var _query$current;
|
|
49
65
|
|
|
50
66
|
query.current = createUserQuery(sdk, options === null || options === void 0 ? void 0 : options.queryCreator);
|
|
@@ -59,7 +75,7 @@ export const useUserList = (sdk, options) => {
|
|
|
59
75
|
}));
|
|
60
76
|
updateUsers(users, true);
|
|
61
77
|
}
|
|
62
|
-
}
|
|
78
|
+
});
|
|
63
79
|
useAsyncEffect(async () => {
|
|
64
80
|
setLoading(true);
|
|
65
81
|
setError(null);
|
|
@@ -71,8 +87,8 @@ export const useUserList = (sdk, options) => {
|
|
|
71
87
|
} finally {
|
|
72
88
|
setLoading(false);
|
|
73
89
|
}
|
|
74
|
-
}, [
|
|
75
|
-
const refresh =
|
|
90
|
+
}, []);
|
|
91
|
+
const refresh = useFreshCallback(async () => {
|
|
76
92
|
setRefreshing(true);
|
|
77
93
|
setError(null);
|
|
78
94
|
|
|
@@ -83,8 +99,8 @@ export const useUserList = (sdk, options) => {
|
|
|
83
99
|
} finally {
|
|
84
100
|
setRefreshing(false);
|
|
85
101
|
}
|
|
86
|
-
}
|
|
87
|
-
const next =
|
|
102
|
+
});
|
|
103
|
+
const next = useFreshCallback(async () => {
|
|
88
104
|
var _query$current3;
|
|
89
105
|
|
|
90
106
|
if (query.current && (_query$current3 = query.current) !== null && _query$current3 !== void 0 && _query$current3.hasNext) {
|
|
@@ -95,11 +111,13 @@ export const useUserList = (sdk, options) => {
|
|
|
95
111
|
});
|
|
96
112
|
updateUsers(nextUsers, false);
|
|
97
113
|
}
|
|
98
|
-
}
|
|
114
|
+
});
|
|
99
115
|
return {
|
|
100
116
|
loading,
|
|
101
117
|
error,
|
|
102
118
|
users: sortedUsers,
|
|
119
|
+
upsertUser,
|
|
120
|
+
deleteUser,
|
|
103
121
|
next,
|
|
104
122
|
refreshing,
|
|
105
123
|
refresh
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["useMemo","useRef","useState","Logger","SBErrorCode","SBErrorMessage","useAsyncEffect","useFreshCallback","createUserQuery","sdk","queryCreator","createApplicationUserListQuery","useUserList","options","query","error","setError","loading","setLoading","refreshing","setRefreshing","users","setUsers","sortedUsers","sortComparator","sort","upsertUser","user","draft","userIdx","findIndex","it","userId","push","deleteUser","splice","updateUsers","clearPrev","prev","concat","init","current","hasNext","next","catch","err","code","NON_AUTHORIZED","warn","ACL","e","refresh","nextUsers"],"sources":["useUserList.ts"],"sourcesContent":["import { useMemo, useRef, useState } from 'react';\n\nimport type { Optional, SendbirdChatSDK, SendbirdUser } from '@sendbird/uikit-utils';\nimport { Logger, SBErrorCode, SBErrorMessage, useAsyncEffect, useFreshCallback } from '@sendbird/uikit-utils';\n\nimport type { CustomQueryInterface, UseUserListOptions, UseUserListReturn, UserStruct } from '../types';\n\nconst createUserQuery = <User extends UserStruct>(\n sdk: SendbirdChatSDK,\n queryCreator?: UseUserListOptions<User>['queryCreator'],\n) => {\n if (queryCreator) return queryCreator();\n // In order to use the API, the option must be turned on in the dashboard.\n return sdk.createApplicationUserListQuery() as unknown as CustomQueryInterface<User>;\n};\n\n/**\n * Get user list from query.\n * default query uses 'instance.createApplicationUserListQuery'\n * The response type of hook is depends on return type of 'query.next()'\n *\n * You can call hook with your custom query using {@link CustomQuery}\n * Or you can create your 'CustomQueryClass' implemented {@link CustomQueryInterface}'\n *\n * ```example\n * const { users } = useUserList(sdk, {\n * queryCreator: () => {\n * const friendQuery = sdk.createFriendListQuery();\n * return new CustomQuery({\n * next: () => friendQuery.next(),\n * isLoading: () => friendQuery.isLoading,\n * hasNext: () => friendQuery.hasMore,\n * });\n * }\n * })\n * ```\n * */\nexport const useUserList = <\n Options extends UseUserListOptions<QueriedUser>,\n QueriedUser extends UserStruct = Options['queryCreator'] extends Optional<\n () => CustomQueryInterface<infer User extends UserStruct>\n >\n ? User\n : SendbirdUser,\n>(\n sdk: SendbirdChatSDK,\n options?: Options,\n): UseUserListReturn<QueriedUser> => {\n const query = useRef<CustomQueryInterface<QueriedUser>>();\n\n const [error, setError] = useState<unknown>(null);\n const [loading, setLoading] = useState(false);\n const [refreshing, setRefreshing] = useState(false);\n\n const [users, setUsers] = useState<QueriedUser[]>([]);\n const sortedUsers = useMemo((): QueriedUser[] => {\n if (options?.sortComparator) return users.sort(options.sortComparator);\n return users;\n }, [users, options?.sortComparator]);\n\n const upsertUser = useFreshCallback((user: QueriedUser) => {\n setUsers(([...draft]) => {\n const userIdx = draft.findIndex((it) => it.userId === user.userId);\n if (userIdx > -1) draft[userIdx] = user;\n else draft.push(user);\n return draft;\n });\n });\n\n const deleteUser = useFreshCallback((userId: QueriedUser['userId']) => {\n setUsers(([...draft]) => {\n const userIdx = draft.findIndex((it) => it.userId === userId);\n if (userIdx > -1) draft.splice(userIdx, 1);\n return draft;\n });\n });\n\n const updateUsers = (users: QueriedUser[], clearPrev: boolean) => {\n if (clearPrev) setUsers(users);\n else setUsers((prev) => prev.concat(users));\n };\n\n const init = useFreshCallback(async () => {\n query.current = createUserQuery<QueriedUser>(sdk, options?.queryCreator);\n if (query.current?.hasNext) {\n const users = await query.current?.next().catch((err) => {\n Logger.error(error);\n if (err.code === SBErrorCode.NON_AUTHORIZED) Logger.warn(SBErrorMessage.ACL);\n throw error;\n });\n updateUsers(users, true);\n }\n });\n\n useAsyncEffect(async () => {\n setLoading(true);\n setError(null);\n try {\n await init();\n } catch (e) {\n setError(e);\n } finally {\n setLoading(false);\n }\n }, []);\n\n const refresh = useFreshCallback(async () => {\n setRefreshing(true);\n setError(null);\n try {\n await init();\n } catch (e) {\n setError(e);\n } finally {\n setRefreshing(false);\n }\n });\n\n const next = useFreshCallback(async () => {\n if (query.current && query.current?.hasNext) {\n const nextUsers = await query.current.next().catch((err) => {\n Logger.error(error);\n if (err.code === SBErrorCode.NON_AUTHORIZED) Logger.warn(SBErrorMessage.ACL);\n throw error;\n });\n updateUsers(nextUsers, false);\n }\n });\n\n return {\n loading,\n error,\n users: sortedUsers,\n upsertUser,\n deleteUser,\n next,\n refreshing,\n refresh,\n };\n};\n"],"mappings":"AAAA,SAASA,OAAT,EAAkBC,MAAlB,EAA0BC,QAA1B,QAA0C,OAA1C;AAGA,SAASC,MAAT,EAAiBC,WAAjB,EAA8BC,cAA9B,EAA8CC,cAA9C,EAA8DC,gBAA9D,QAAsF,uBAAtF;;AAIA,MAAMC,eAAe,GAAG,CACtBC,GADsB,EAEtBC,YAFsB,KAGnB;EACH,IAAIA,YAAJ,EAAkB,OAAOA,YAAY,EAAnB,CADf,CAEH;;EACA,OAAOD,GAAG,CAACE,8BAAJ,EAAP;AACD,CAPD;AASA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,OAAO,MAAMC,WAAW,GAAG,CAQzBH,GARyB,EASzBI,OATyB,KAUU;EACnC,MAAMC,KAAK,GAAGb,MAAM,EAApB;EAEA,MAAM,CAACc,KAAD,EAAQC,QAAR,IAAoBd,QAAQ,CAAU,IAAV,CAAlC;EACA,MAAM,CAACe,OAAD,EAAUC,UAAV,IAAwBhB,QAAQ,CAAC,KAAD,CAAtC;EACA,MAAM,CAACiB,UAAD,EAAaC,aAAb,IAA8BlB,QAAQ,CAAC,KAAD,CAA5C;EAEA,MAAM,CAACmB,KAAD,EAAQC,QAAR,IAAoBpB,QAAQ,CAAgB,EAAhB,CAAlC;EACA,MAAMqB,WAAW,GAAGvB,OAAO,CAAC,MAAqB;IAC/C,IAAIa,OAAJ,aAAIA,OAAJ,eAAIA,OAAO,CAAEW,cAAb,EAA6B,OAAOH,KAAK,CAACI,IAAN,CAAWZ,OAAO,CAACW,cAAnB,CAAP;IAC7B,OAAOH,KAAP;EACD,CAH0B,EAGxB,CAACA,KAAD,EAAQR,OAAR,aAAQA,OAAR,uBAAQA,OAAO,CAAEW,cAAjB,CAHwB,CAA3B;EAKA,MAAME,UAAU,GAAGnB,gBAAgB,CAAEoB,IAAD,IAAuB;IACzDL,QAAQ,CAAC,QAAgB;MAAA,IAAf,CAAC,GAAGM,KAAJ,CAAe;MACvB,MAAMC,OAAO,GAAGD,KAAK,CAACE,SAAN,CAAiBC,EAAD,IAAQA,EAAE,CAACC,MAAH,KAAcL,IAAI,CAACK,MAA3C,CAAhB;MACA,IAAIH,OAAO,GAAG,CAAC,CAAf,EAAkBD,KAAK,CAACC,OAAD,CAAL,GAAiBF,IAAjB,CAAlB,KACKC,KAAK,CAACK,IAAN,CAAWN,IAAX;MACL,OAAOC,KAAP;IACD,CALO,CAAR;EAMD,CAPkC,CAAnC;EASA,MAAMM,UAAU,GAAG3B,gBAAgB,CAAEyB,MAAD,IAAmC;IACrEV,QAAQ,CAAC,SAAgB;MAAA,IAAf,CAAC,GAAGM,KAAJ,CAAe;MACvB,MAAMC,OAAO,GAAGD,KAAK,CAACE,SAAN,CAAiBC,EAAD,IAAQA,EAAE,CAACC,MAAH,KAAcA,MAAtC,CAAhB;MACA,IAAIH,OAAO,GAAG,CAAC,CAAf,EAAkBD,KAAK,CAACO,MAAN,CAAaN,OAAb,EAAsB,CAAtB;MAClB,OAAOD,KAAP;IACD,CAJO,CAAR;EAKD,CANkC,CAAnC;;EAQA,MAAMQ,WAAW,GAAG,CAACf,KAAD,EAAuBgB,SAAvB,KAA8C;IAChE,IAAIA,SAAJ,EAAef,QAAQ,CAACD,KAAD,CAAR,CAAf,KACKC,QAAQ,CAAEgB,IAAD,IAAUA,IAAI,CAACC,MAAL,CAAYlB,KAAZ,CAAX,CAAR;EACN,CAHD;;EAKA,MAAMmB,IAAI,GAAGjC,gBAAgB,CAAC,YAAY;IAAA;;IACxCO,KAAK,CAAC2B,OAAN,GAAgBjC,eAAe,CAAcC,GAAd,EAAmBI,OAAnB,aAAmBA,OAAnB,uBAAmBA,OAAO,CAAEH,YAA5B,CAA/B;;IACA,sBAAII,KAAK,CAAC2B,OAAV,2CAAI,eAAeC,OAAnB,EAA4B;MAAA;;MAC1B,MAAMrB,KAAK,GAAG,0BAAMP,KAAK,CAAC2B,OAAZ,oDAAM,gBAAeE,IAAf,GAAsBC,KAAtB,CAA6BC,GAAD,IAAS;QACvD1C,MAAM,CAACY,KAAP,CAAaA,KAAb;QACA,IAAI8B,GAAG,CAACC,IAAJ,KAAa1C,WAAW,CAAC2C,cAA7B,EAA6C5C,MAAM,CAAC6C,IAAP,CAAY3C,cAAc,CAAC4C,GAA3B;QAC7C,MAAMlC,KAAN;MACD,CAJmB,CAAN,CAAd;MAKAqB,WAAW,CAACf,KAAD,EAAQ,IAAR,CAAX;IACD;EACF,CAV4B,CAA7B;EAYAf,cAAc,CAAC,YAAY;IACzBY,UAAU,CAAC,IAAD,CAAV;IACAF,QAAQ,CAAC,IAAD,CAAR;;IACA,IAAI;MACF,MAAMwB,IAAI,EAAV;IACD,CAFD,CAEE,OAAOU,CAAP,EAAU;MACVlC,QAAQ,CAACkC,CAAD,CAAR;IACD,CAJD,SAIU;MACRhC,UAAU,CAAC,KAAD,CAAV;IACD;EACF,CAVa,EAUX,EAVW,CAAd;EAYA,MAAMiC,OAAO,GAAG5C,gBAAgB,CAAC,YAAY;IAC3Ca,aAAa,CAAC,IAAD,CAAb;IACAJ,QAAQ,CAAC,IAAD,CAAR;;IACA,IAAI;MACF,MAAMwB,IAAI,EAAV;IACD,CAFD,CAEE,OAAOU,CAAP,EAAU;MACVlC,QAAQ,CAACkC,CAAD,CAAR;IACD,CAJD,SAIU;MACR9B,aAAa,CAAC,KAAD,CAAb;IACD;EACF,CAV+B,CAAhC;EAYA,MAAMuB,IAAI,GAAGpC,gBAAgB,CAAC,YAAY;IAAA;;IACxC,IAAIO,KAAK,CAAC2B,OAAN,uBAAiB3B,KAAK,CAAC2B,OAAvB,4CAAiB,gBAAeC,OAApC,EAA6C;MAC3C,MAAMU,SAAS,GAAG,MAAMtC,KAAK,CAAC2B,OAAN,CAAcE,IAAd,GAAqBC,KAArB,CAA4BC,GAAD,IAAS;QAC1D1C,MAAM,CAACY,KAAP,CAAaA,KAAb;QACA,IAAI8B,GAAG,CAACC,IAAJ,KAAa1C,WAAW,CAAC2C,cAA7B,EAA6C5C,MAAM,CAAC6C,IAAP,CAAY3C,cAAc,CAAC4C,GAA3B;QAC7C,MAAMlC,KAAN;MACD,CAJuB,CAAxB;MAKAqB,WAAW,CAACgB,SAAD,EAAY,KAAZ,CAAX;IACD;EACF,CAT4B,CAA7B;EAWA,OAAO;IACLnC,OADK;IAELF,KAFK;IAGLM,KAAK,EAAEE,WAHF;IAILG,UAJK;IAKLQ,UALK;IAMLS,IANK;IAOLxB,UAPK;IAQLgC;EARK,CAAP;AAUD,CAtGM"}
|
package/lib/module/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export { useGroupChannelList } from './channel/useGroupChannelList';
|
|
2
2
|
export { useGroupChannelMessages } from './channel/useGroupChannelMessages';
|
|
3
3
|
export { useActiveGroupChannel } from './channel/useActiveGroupChannel';
|
|
4
|
+
export { useGroupChannel } from './channel/useGroupChannel';
|
|
4
5
|
export { useAppFeatures } from './common/useAppFeatures';
|
|
5
6
|
export { useMessageOutgoingStatus } from './common/useMessageOutgoingStatus';
|
|
6
7
|
export { usePushTrigger } from './common/usePushTrigger';
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useGroupChannelList","useGroupChannelMessages","useActiveGroupChannel","useAppFeatures","useMessageOutgoingStatus","usePushTrigger","useTotalUnreadChannelCount","useTotalUnreadMessageCount","useUserList","useChannelHandler","useConnectionHandler","useUserEventHandler","CustomQuery"],"sources":["index.ts"],"sourcesContent":["export { useGroupChannelList } from './channel/useGroupChannelList';\nexport { useGroupChannelMessages } from './channel/useGroupChannelMessages';\nexport { useActiveGroupChannel } from './channel/useActiveGroupChannel';\n\nexport { useAppFeatures } from './common/useAppFeatures';\nexport { useMessageOutgoingStatus } from './common/useMessageOutgoingStatus';\nexport { usePushTrigger } from './common/usePushTrigger';\nexport { useTotalUnreadChannelCount } from './common/useTotalUnreadChannelCount';\nexport { useTotalUnreadMessageCount } from './common/useTotalUnreadMessageCount';\nexport { useUserList } from './common/useUserList';\n\nexport { useChannelHandler } from './handler/useChannelHandler';\nexport { useConnectionHandler } from './handler/useConnectionHandler';\nexport { useUserEventHandler } from './handler/useUserEventHandler';\n\nexport { CustomQuery } from './model/CustomQuery';\n\nexport type {\n UseGroupChannelList,\n UseGroupChannelListOptions,\n UseGroupChannelMessages,\n
|
|
1
|
+
{"version":3,"names":["useGroupChannelList","useGroupChannelMessages","useActiveGroupChannel","useGroupChannel","useAppFeatures","useMessageOutgoingStatus","usePushTrigger","useTotalUnreadChannelCount","useTotalUnreadMessageCount","useUserList","useChannelHandler","useConnectionHandler","useUserEventHandler","CustomQuery"],"sources":["index.ts"],"sourcesContent":["export { useGroupChannelList } from './channel/useGroupChannelList';\nexport { useGroupChannelMessages } from './channel/useGroupChannelMessages';\nexport { useActiveGroupChannel } from './channel/useActiveGroupChannel';\nexport { useGroupChannel } from './channel/useGroupChannel';\n\nexport { useAppFeatures } from './common/useAppFeatures';\nexport { useMessageOutgoingStatus } from './common/useMessageOutgoingStatus';\nexport { usePushTrigger } from './common/usePushTrigger';\nexport { useTotalUnreadChannelCount } from './common/useTotalUnreadChannelCount';\nexport { useTotalUnreadMessageCount } from './common/useTotalUnreadMessageCount';\nexport { useUserList } from './common/useUserList';\n\nexport { useChannelHandler } from './handler/useChannelHandler';\nexport { useConnectionHandler } from './handler/useConnectionHandler';\nexport { useUserEventHandler } from './handler/useUserEventHandler';\n\nexport { CustomQuery } from './model/CustomQuery';\n\nexport type {\n UseGroupChannelList,\n UseGroupChannelListOptions,\n UseGroupChannelMessages,\n UseGroupChannelMessagesOptions,\n UserStruct,\n UseUserListOptions,\n UseUserListReturn,\n CustomQueryInterface,\n CustomBidirectionalQueryInterface,\n} from './types';\n"],"mappings":"AAAA,SAASA,mBAAT,QAAoC,+BAApC;AACA,SAASC,uBAAT,QAAwC,mCAAxC;AACA,SAASC,qBAAT,QAAsC,iCAAtC;AACA,SAASC,eAAT,QAAgC,2BAAhC;AAEA,SAASC,cAAT,QAA+B,yBAA/B;AACA,SAASC,wBAAT,QAAyC,mCAAzC;AACA,SAASC,cAAT,QAA+B,yBAA/B;AACA,SAASC,0BAAT,QAA2C,qCAA3C;AACA,SAASC,0BAAT,QAA2C,qCAA3C;AACA,SAASC,WAAT,QAA4B,sBAA5B;AAEA,SAASC,iBAAT,QAAkC,6BAAlC;AACA,SAASC,oBAAT,QAAqC,gCAArC;AACA,SAASC,mBAAT,QAAoC,+BAApC;AAEA,SAASC,WAAT,QAA4B,qBAA5B"}
|
package/lib/module/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import type {\n SendbirdChatSDK,\n SendbirdError,\n SendbirdFileMessage,\n SendbirdFileMessageCreateParams,\n SendbirdGroupChannel,\n SendbirdGroupChannelCollection,\n SendbirdGroupChannelListQuery,\n SendbirdMessage,\n SendbirdMessageCollection,\n SendbirdPreviousMessageListQuery,\n SendbirdUserMessage,\n SendbirdUserMessageCreateParams,\n} from '@sendbird/uikit-utils';\n\nexport interface CustomQueryInterface<Data> {\n isLoading: boolean;\n next: () => Promise<Data[]>;\n hasNext: boolean;\n}\nexport interface CustomBidirectionalQueryInterface<Data> {\n isLoading: boolean;\n next: () => Promise<Data[]>;\n hasNext: () => boolean;\n prev: () => Promise<Data[]>;\n hasPrev: () => boolean;\n}\n\n/**\n * @interface UseGroupChannelList\n * @description interface for group channel list hook\n * */\nexport interface UseGroupChannelList {\n (sdk: SendbirdChatSDK, userId?: string, options?: UseGroupChannelListOptions): {\n /**\n * Loading state, only available on first render\n * */\n loading: boolean;\n\n /**\n * Refreshing state, status is changes when the refresh is called.\n * */\n refreshing: boolean;\n\n /**\n * Refresh, clear and reload messages from latest\n * @return {Promise<void>}\n * */\n refresh: () => Promise<void>;\n\n /**\n * Get group channels state\n * */\n groupChannels: SendbirdGroupChannel[];\n\n /**\n * Fetch next channels to state\n * @return {Promise<void>}\n * */\n next: () => Promise<void>;\n };\n}\nexport type UseGroupChannelListOptions = {\n queryCreator?: () => SendbirdGroupChannelListQuery;\n collectionCreator?: () => SendbirdGroupChannelCollection;\n enableCollectionWithoutLocalCache?: boolean;\n};\n\n/**\n * @interface UseGroupChannelMessages\n * @description interface for group channel messages hook\n * - Receive new messages from other users -> append to state(nextMessages)\n * - onTopReached -> prev() -> fetch prev messages and append to state(messages)\n * - onBottomReached -> next() -> nextMessages append to state(messages)\n * */\nexport interface UseGroupChannelMessages {\n (sdk: SendbirdChatSDK, channel: SendbirdGroupChannel, userId?: string, options?: UseGroupChannelMessagesOptions): {\n /**\n * Loading state, only available on first render\n * */\n loading: boolean;\n\n /**\n * Refreshing state, status is changes when the refresh is called.\n * */\n refreshing: boolean;\n\n /**\n * Refresh, clear and reload messages from latest\n * @return {Promise<void>}\n * */\n refresh: () => Promise<void>;\n\n /**\n * Get messages, this state is for render\n * For example, if a user receives a new messages while searching for an old message\n * for this case, new messages will be included here.\n * @return {SendbirdMessage[]}\n * */\n messages: SendbirdMessage[];\n\n /**\n * Fetch prev messages to state\n * @return {Promise<void>}\n * */\n prev: () => Promise<void>;\n\n /**\n * Get messages, this state is for temporary data before render\n * For example, if a user receives a new messages while searching for an old message\n * for this case, new messages will be included here.\n * */\n nextMessages: SendbirdMessage[];\n\n /**\n * Get new messages from nextMessages\n * A new message means a message that meets the below conditions\n * - Not admin message\n * - Not updated message\n * - Not current user's message\n * */\n newMessagesFromMembers: SendbirdMessage[];\n\n /**\n * Fetch next messages to state\n * @return {Promise<void>}\n * */\n next: () => Promise<void>;\n\n /**\n * Send file message\n * @param params file message params\n * @param callback sent message callback\n * @return pending message\n * */\n sendFileMessage: (\n params: SendbirdFileMessageCreateParams,\n onPending?: (message: SendbirdFileMessage, error?: SendbirdError) => void,\n ) => Promise<SendbirdFileMessage>;\n\n /**\n * Send user message\n * @param params user message params\n * @param callback sent message callback\n * @return pending message\n * */\n sendUserMessage: (\n params: SendbirdUserMessageCreateParams,\n onPending?: (message: SendbirdUserMessage, error?: SendbirdError) => void,\n ) => Promise<SendbirdUserMessage>;\n\n /**\n * Update file message\n * @param messageId\n * @param params file message params\n * @return updated message\n * */\n updateFileMessage: (messageId: number, params: SendbirdFileMessageCreateParams) => Promise<SendbirdFileMessage>;\n\n /**\n * Update user message\n * @param messageId\n * @param params user message params\n * @return updated message\n * */\n updateUserMessage: (messageId: number, params: SendbirdUserMessageCreateParams) => Promise<SendbirdUserMessage>;\n\n /**\n * Resend failed message\n * @param failedMessage failed message to resend\n * @return {Promise<void>}\n * */\n resendMessage: (failedMessage: SendbirdFileMessage | SendbirdUserMessage) => Promise<void>;\n\n /**\n * Delete message\n * @param message sent or failed message\n * @return {Promise<void>}\n * */\n deleteMessage: (message: SendbirdFileMessage | SendbirdUserMessage) => Promise<void>;\n
|
|
1
|
+
{"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import type {\n SendbirdChatSDK,\n SendbirdError,\n SendbirdFileMessage,\n SendbirdFileMessageCreateParams,\n SendbirdGroupChannel,\n SendbirdGroupChannelCollection,\n SendbirdGroupChannelListQuery,\n SendbirdMessage,\n SendbirdMessageCollection,\n SendbirdPreviousMessageListQuery,\n SendbirdUserMessage,\n SendbirdUserMessageCreateParams,\n} from '@sendbird/uikit-utils';\n\nexport interface CustomQueryInterface<Data> {\n isLoading: boolean;\n next: () => Promise<Data[]>;\n hasNext: boolean;\n}\nexport interface CustomBidirectionalQueryInterface<Data> {\n isLoading: boolean;\n next: () => Promise<Data[]>;\n hasNext: () => boolean;\n prev: () => Promise<Data[]>;\n hasPrev: () => boolean;\n}\n\n/**\n * @interface UseGroupChannelList\n * @description interface for group channel list hook\n * */\nexport interface UseGroupChannelList {\n (sdk: SendbirdChatSDK, userId?: string, options?: UseGroupChannelListOptions): {\n /**\n * Loading state, only available on first render\n * */\n loading: boolean;\n\n /**\n * Refreshing state, status is changes when the refresh is called.\n * */\n refreshing: boolean;\n\n /**\n * Refresh, clear and reload messages from latest\n * @return {Promise<void>}\n * */\n refresh: () => Promise<void>;\n\n /**\n * Get group channels state\n * */\n groupChannels: SendbirdGroupChannel[];\n\n /**\n * Fetch next channels to state\n * @return {Promise<void>}\n * */\n next: () => Promise<void>;\n };\n}\nexport type UseGroupChannelListOptions = {\n queryCreator?: () => SendbirdGroupChannelListQuery;\n collectionCreator?: () => SendbirdGroupChannelCollection;\n enableCollectionWithoutLocalCache?: boolean;\n};\n\n/**\n * @interface UseGroupChannelMessages\n * @description interface for group channel messages hook\n * - Receive new messages from other users -> append to state(nextMessages)\n * - onTopReached -> prev() -> fetch prev messages and append to state(messages)\n * - onBottomReached -> next() -> nextMessages append to state(messages)\n * */\nexport interface UseGroupChannelMessages {\n (sdk: SendbirdChatSDK, channel: SendbirdGroupChannel, userId?: string, options?: UseGroupChannelMessagesOptions): {\n /**\n * Loading state, only available on first render\n * */\n loading: boolean;\n\n /**\n * Refreshing state, status is changes when the refresh is called.\n * */\n refreshing: boolean;\n\n /**\n * Refresh, clear and reload messages from latest\n * @return {Promise<void>}\n * */\n refresh: () => Promise<void>;\n\n /**\n * Get messages, this state is for render\n * For example, if a user receives a new messages while searching for an old message\n * for this case, new messages will be included here.\n * @return {SendbirdMessage[]}\n * */\n messages: SendbirdMessage[];\n\n /**\n * Fetch prev messages to state\n * @return {Promise<void>}\n * */\n prev: () => Promise<void>;\n\n /**\n * Get messages, this state is for temporary data before render\n * For example, if a user receives a new messages while searching for an old message\n * for this case, new messages will be included here.\n * */\n nextMessages: SendbirdMessage[];\n\n /**\n * Get new messages from nextMessages\n * A new message means a message that meets the below conditions\n * - Not admin message\n * - Not updated message\n * - Not current user's message\n * */\n newMessagesFromMembers: SendbirdMessage[];\n\n /**\n * Fetch next messages to state\n * @return {Promise<void>}\n * */\n next: () => Promise<void>;\n\n /**\n * Send file message\n * @param params file message params\n * @param callback sent message callback\n * @return pending message\n * */\n sendFileMessage: (\n params: SendbirdFileMessageCreateParams,\n onPending?: (message: SendbirdFileMessage, error?: SendbirdError) => void,\n ) => Promise<SendbirdFileMessage>;\n\n /**\n * Send user message\n * @param params user message params\n * @param callback sent message callback\n * @return pending message\n * */\n sendUserMessage: (\n params: SendbirdUserMessageCreateParams,\n onPending?: (message: SendbirdUserMessage, error?: SendbirdError) => void,\n ) => Promise<SendbirdUserMessage>;\n\n /**\n * Update file message\n * @param messageId\n * @param params file message params\n * @return updated message\n * */\n updateFileMessage: (messageId: number, params: SendbirdFileMessageCreateParams) => Promise<SendbirdFileMessage>;\n\n /**\n * Update user message\n * @param messageId\n * @param params user message params\n * @return updated message\n * */\n updateUserMessage: (messageId: number, params: SendbirdUserMessageCreateParams) => Promise<SendbirdUserMessage>;\n\n /**\n * Resend failed message\n * @param failedMessage failed message to resend\n * @return {Promise<void>}\n * */\n resendMessage: (failedMessage: SendbirdFileMessage | SendbirdUserMessage) => Promise<void>;\n\n /**\n * Delete message\n * @param message sent or failed message\n * @return {Promise<void>}\n * */\n deleteMessage: (message: SendbirdFileMessage | SendbirdUserMessage) => Promise<void>;\n };\n}\n\nexport type UseGroupChannelMessagesOptions = {\n sortComparator?: (a: SendbirdMessage, b: SendbirdMessage) => number;\n queryCreator?: () => SendbirdPreviousMessageListQuery;\n collectionCreator?: () => SendbirdMessageCollection;\n enableCollectionWithoutLocalCache?: boolean;\n onChannelDeleted?: () => void;\n};\n\nexport interface UserStruct {\n userId: string;\n}\n\n/**\n * @interface UseUserListReturn\n * @description interface for user list hook return value\n * */\nexport interface UseUserListReturn<User extends UserStruct> {\n /**\n * Loading state, only available on first render\n * */\n loading: boolean;\n\n /**\n * Refreshing state, status is changes when the refresh is called.\n * */\n refreshing: boolean;\n\n /**\n * Error state\n * */\n error: unknown | null;\n\n /**\n * Refresh, clear and reload messages from latest\n * @return {Promise<void>}\n * */\n refresh: () => Promise<void>;\n\n /**\n * Get users state\n * */\n users: User[];\n\n /**\n * Update or Insert user to list\n * */\n upsertUser: (user: User) => void;\n\n /**\n * Delete user from list\n * */\n deleteUser: (userId: User['userId']) => void;\n\n /**\n * Fetch next users to state\n * @return {Promise<void>}\n * */\n next: () => Promise<void>;\n}\n\nexport type UseUserListOptions<User extends UserStruct> = {\n sortComparator?: (a: User, b: User) => number;\n queryCreator?: () => CustomQueryInterface<User>;\n};\n"],"mappings":""}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Optional, SendbirdChatSDK } from '@sendbird/uikit-utils';
|
|
2
|
-
import type { CustomQueryInterface, UseUserListOptions, UseUserListReturn } from '../types';
|
|
2
|
+
import type { CustomQueryInterface, UseUserListOptions, UseUserListReturn, UserStruct } from '../types';
|
|
3
3
|
/**
|
|
4
4
|
* Get user list from query.
|
|
5
5
|
* default query uses 'instance.createApplicationUserListQuery'
|
|
@@ -21,4 +21,4 @@ import type { CustomQueryInterface, UseUserListOptions, UseUserListReturn } from
|
|
|
21
21
|
* })
|
|
22
22
|
* ```
|
|
23
23
|
* */
|
|
24
|
-
export declare const useUserList: <Options extends UseUserListOptions<QueriedUser>, QueriedUser = Options["queryCreator"] extends Optional<() => CustomQueryInterface<infer User>> ? User : import("@sendbird/chat").User>(sdk: SendbirdChatSDK, options?: Options | undefined) => UseUserListReturn<QueriedUser>;
|
|
24
|
+
export declare const useUserList: <Options extends UseUserListOptions<QueriedUser>, QueriedUser extends UserStruct = Options["queryCreator"] extends Optional<() => CustomQueryInterface<infer User extends UserStruct>> ? User : import("@sendbird/chat").User>(sdk: SendbirdChatSDK, options?: Options | undefined) => UseUserListReturn<QueriedUser>;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export { useGroupChannelList } from './channel/useGroupChannelList';
|
|
2
2
|
export { useGroupChannelMessages } from './channel/useGroupChannelMessages';
|
|
3
3
|
export { useActiveGroupChannel } from './channel/useActiveGroupChannel';
|
|
4
|
+
export { useGroupChannel } from './channel/useGroupChannel';
|
|
4
5
|
export { useAppFeatures } from './common/useAppFeatures';
|
|
5
6
|
export { useMessageOutgoingStatus } from './common/useMessageOutgoingStatus';
|
|
6
7
|
export { usePushTrigger } from './common/usePushTrigger';
|
|
@@ -11,4 +12,4 @@ export { useChannelHandler } from './handler/useChannelHandler';
|
|
|
11
12
|
export { useConnectionHandler } from './handler/useConnectionHandler';
|
|
12
13
|
export { useUserEventHandler } from './handler/useUserEventHandler';
|
|
13
14
|
export { CustomQuery } from './model/CustomQuery';
|
|
14
|
-
export type { UseGroupChannelList, UseGroupChannelListOptions, UseGroupChannelMessages,
|
|
15
|
+
export type { UseGroupChannelList, UseGroupChannelListOptions, UseGroupChannelMessages, UseGroupChannelMessagesOptions, UserStruct, UseUserListOptions, UseUserListReturn, CustomQueryInterface, CustomBidirectionalQueryInterface, } from './types';
|
|
@@ -139,10 +139,6 @@ export interface UseGroupChannelMessages {
|
|
|
139
139
|
* @return {Promise<void>}
|
|
140
140
|
* */
|
|
141
141
|
deleteMessage: (message: SendbirdFileMessage | SendbirdUserMessage) => Promise<void>;
|
|
142
|
-
/**
|
|
143
|
-
* Activated channel
|
|
144
|
-
* */
|
|
145
|
-
activeChannel: SendbirdGroupChannel;
|
|
146
142
|
};
|
|
147
143
|
}
|
|
148
144
|
export declare type UseGroupChannelMessagesOptions = {
|
|
@@ -152,11 +148,14 @@ export declare type UseGroupChannelMessagesOptions = {
|
|
|
152
148
|
enableCollectionWithoutLocalCache?: boolean;
|
|
153
149
|
onChannelDeleted?: () => void;
|
|
154
150
|
};
|
|
151
|
+
export interface UserStruct {
|
|
152
|
+
userId: string;
|
|
153
|
+
}
|
|
155
154
|
/**
|
|
156
155
|
* @interface UseUserListReturn
|
|
157
156
|
* @description interface for user list hook return value
|
|
158
157
|
* */
|
|
159
|
-
export interface UseUserListReturn<User> {
|
|
158
|
+
export interface UseUserListReturn<User extends UserStruct> {
|
|
160
159
|
/**
|
|
161
160
|
* Loading state, only available on first render
|
|
162
161
|
* */
|
|
@@ -178,13 +177,21 @@ export interface UseUserListReturn<User> {
|
|
|
178
177
|
* Get users state
|
|
179
178
|
* */
|
|
180
179
|
users: User[];
|
|
180
|
+
/**
|
|
181
|
+
* Update or Insert user to list
|
|
182
|
+
* */
|
|
183
|
+
upsertUser: (user: User) => void;
|
|
184
|
+
/**
|
|
185
|
+
* Delete user from list
|
|
186
|
+
* */
|
|
187
|
+
deleteUser: (userId: User['userId']) => void;
|
|
181
188
|
/**
|
|
182
189
|
* Fetch next users to state
|
|
183
190
|
* @return {Promise<void>}
|
|
184
191
|
* */
|
|
185
192
|
next: () => Promise<void>;
|
|
186
193
|
}
|
|
187
|
-
export declare type UseUserListOptions<User> = {
|
|
194
|
+
export declare type UseUserListOptions<User extends UserStruct> = {
|
|
188
195
|
sortComparator?: (a: User, b: User) => number;
|
|
189
196
|
queryCreator?: () => CustomQueryInterface<User>;
|
|
190
197
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sendbird/uikit-chat-hooks",
|
|
3
|
-
"version": "2.0
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"description": "React hooks that built with SendbirdChat SDK",
|
|
5
5
|
"main": "lib/commonjs/index",
|
|
6
6
|
"module": "lib/module/index",
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"access": "public"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@sendbird/uikit-utils": "2.0
|
|
41
|
+
"@sendbird/uikit-utils": "2.1.0"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@types/react": "*",
|
|
@@ -69,5 +69,5 @@
|
|
|
69
69
|
"readmeFile": "./README.md",
|
|
70
70
|
"displayName": "@sendbird/uikit-chat-hooks"
|
|
71
71
|
},
|
|
72
|
-
"gitHead": "
|
|
72
|
+
"gitHead": "c778a84a632487047fe532db188b32dfa6e93a7f"
|
|
73
73
|
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { useState } from 'react';
|
|
2
|
+
|
|
3
|
+
import { SendbirdChatSDK, SendbirdGroupChannel, useAsyncEffect } from '@sendbird/uikit-utils';
|
|
4
|
+
|
|
5
|
+
export const useGroupChannel = (sdk: SendbirdChatSDK, channelUrl: string) => {
|
|
6
|
+
const [channel, setChannel] = useState<SendbirdGroupChannel>();
|
|
7
|
+
const [loading, setLoading] = useState(true);
|
|
8
|
+
const [error, setError] = useState<unknown>();
|
|
9
|
+
|
|
10
|
+
useAsyncEffect(async () => {
|
|
11
|
+
try {
|
|
12
|
+
setChannel(await sdk.groupChannel.getChannel(channelUrl));
|
|
13
|
+
} catch (e) {
|
|
14
|
+
setError(e);
|
|
15
|
+
} finally {
|
|
16
|
+
setLoading(false);
|
|
17
|
+
}
|
|
18
|
+
}, []);
|
|
19
|
+
|
|
20
|
+
return { channel, loading, error };
|
|
21
|
+
};
|
|
@@ -37,12 +37,12 @@ const defaultReducer = ({ ...draft }: State, action: Action) => {
|
|
|
37
37
|
}
|
|
38
38
|
case 'update_messages':
|
|
39
39
|
case 'update_next_messages': {
|
|
40
|
-
const key = action.type === 'update_messages' ? 'messageMap' :
|
|
41
|
-
const
|
|
40
|
+
const key = action.type === 'update_messages' ? 'messageMap' : 'nextMessageMap';
|
|
41
|
+
const receivedMessagesAsMap = arrayToMapWithGetter(action.value.messages, getMessageUniqId);
|
|
42
42
|
if (action.value.clearPrev) {
|
|
43
|
-
draft[key] =
|
|
43
|
+
draft[key] = receivedMessagesAsMap;
|
|
44
44
|
} else {
|
|
45
|
-
draft[key] = { ...draft[key], ...
|
|
45
|
+
draft[key] = { ...draft[key], ...receivedMessagesAsMap };
|
|
46
46
|
|
|
47
47
|
// NOTE: Replace pending message to succeeded message
|
|
48
48
|
action.value.messages
|