stream-chat-react-native-core 4.9.0 → 4.10.0-beta.1
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/components/ChannelPreview/ChannelPreview.js +7 -3
- package/lib/commonjs/components/ChannelPreview/ChannelPreview.js.map +1 -1
- package/lib/commonjs/components/ChannelPreview/hooks/useLatestMessagePreview.js +2 -1
- package/lib/commonjs/components/ChannelPreview/hooks/useLatestMessagePreview.js.map +1 -1
- package/lib/commonjs/components/Chat/Chat.js +9 -5
- package/lib/commonjs/components/Chat/Chat.js.map +1 -1
- package/lib/commonjs/components/ImageGallery/ImageGallery.js +25 -22
- package/lib/commonjs/components/ImageGallery/ImageGallery.js.map +1 -1
- package/lib/commonjs/components/ImageGallery/components/ImageGalleryFooter.js +15 -15
- package/lib/commonjs/components/ImageGallery/components/ImageGalleryFooter.js.map +1 -1
- package/lib/commonjs/components/Message/Message.js +12 -8
- package/lib/commonjs/components/Message/Message.js.map +1 -1
- package/lib/commonjs/components/Message/MessageSimple/MessageTextContainer.js +7 -4
- package/lib/commonjs/components/Message/MessageSimple/MessageTextContainer.js.map +1 -1
- package/lib/commonjs/contexts/messageInputContext/MessageInputContext.js +16 -10
- package/lib/commonjs/contexts/messageInputContext/MessageInputContext.js.map +1 -1
- package/lib/commonjs/contexts/messageOverlayContext/MessageOverlayContext.js +2 -2
- package/lib/commonjs/contexts/messageOverlayContext/MessageOverlayContext.js.map +1 -1
- package/lib/commonjs/contexts/overlayContext/OverlayProvider.js +15 -13
- package/lib/commonjs/contexts/overlayContext/OverlayProvider.js.map +1 -1
- package/lib/commonjs/contexts/translationContext/TranslationContext.js +8 -4
- package/lib/commonjs/contexts/translationContext/TranslationContext.js.map +1 -1
- package/lib/commonjs/hooks/useStreami18n.js.map +1 -1
- package/lib/commonjs/hooks/useTranslatedMessage.js +34 -0
- package/lib/commonjs/hooks/useTranslatedMessage.js.map +1 -0
- package/lib/commonjs/mock-builders/api/getOrCreateChannel.js.map +1 -1
- package/lib/commonjs/mock-builders/generator/channel.js +8 -4
- package/lib/commonjs/mock-builders/generator/channel.js.map +1 -1
- package/lib/commonjs/version.json +1 -1
- package/lib/module/components/ChannelPreview/ChannelPreview.js +7 -3
- package/lib/module/components/ChannelPreview/ChannelPreview.js.map +1 -1
- package/lib/module/components/ChannelPreview/hooks/useLatestMessagePreview.js +2 -1
- package/lib/module/components/ChannelPreview/hooks/useLatestMessagePreview.js.map +1 -1
- package/lib/module/components/Chat/Chat.js +9 -5
- package/lib/module/components/Chat/Chat.js.map +1 -1
- package/lib/module/components/ImageGallery/ImageGallery.js +25 -22
- package/lib/module/components/ImageGallery/ImageGallery.js.map +1 -1
- package/lib/module/components/ImageGallery/components/ImageGalleryFooter.js +15 -15
- package/lib/module/components/ImageGallery/components/ImageGalleryFooter.js.map +1 -1
- package/lib/module/components/Message/Message.js +12 -8
- package/lib/module/components/Message/Message.js.map +1 -1
- package/lib/module/components/Message/MessageSimple/MessageTextContainer.js +7 -4
- package/lib/module/components/Message/MessageSimple/MessageTextContainer.js.map +1 -1
- package/lib/module/contexts/messageInputContext/MessageInputContext.js +16 -10
- package/lib/module/contexts/messageInputContext/MessageInputContext.js.map +1 -1
- package/lib/module/contexts/messageOverlayContext/MessageOverlayContext.js +2 -2
- package/lib/module/contexts/messageOverlayContext/MessageOverlayContext.js.map +1 -1
- package/lib/module/contexts/overlayContext/OverlayProvider.js +15 -13
- package/lib/module/contexts/overlayContext/OverlayProvider.js.map +1 -1
- package/lib/module/contexts/translationContext/TranslationContext.js +8 -4
- package/lib/module/contexts/translationContext/TranslationContext.js.map +1 -1
- package/lib/module/hooks/useStreami18n.js.map +1 -1
- package/lib/module/hooks/useTranslatedMessage.js +34 -0
- package/lib/module/hooks/useTranslatedMessage.js.map +1 -0
- package/lib/module/mock-builders/api/getOrCreateChannel.js.map +1 -1
- package/lib/module/mock-builders/generator/channel.js +8 -4
- package/lib/module/mock-builders/generator/channel.js.map +1 -1
- package/lib/module/version.json +1 -1
- package/lib/typescript/components/ChannelPreview/__tests__/ChannelPreview.test.d.ts +1 -0
- package/lib/typescript/components/Message/MessageSimple/__tests__/MessageTextContainer.test.d.ts +1 -0
- package/lib/typescript/contexts/messageOverlayContext/MessageOverlayContext.d.ts +2 -1
- package/lib/typescript/contexts/translationContext/TranslationContext.d.ts +7 -2
- package/lib/typescript/hooks/__tests__/useTranslatedMessage.test.d.ts +1 -0
- package/lib/typescript/hooks/useStreami18n.d.ts +2 -2
- package/lib/typescript/hooks/useTranslatedMessage.d.ts +3 -0
- package/lib/typescript/mock-builders/api/getOrCreateChannel.d.ts +13 -1
- package/lib/typescript/mock-builders/event/messageNew.d.ts +2 -0
- package/lib/typescript/mock-builders/event/messageRead.d.ts +8 -0
- package/lib/typescript/mock-builders/generator/channel.d.ts +19 -15
- package/package.json +3 -3
- package/src/components/ChannelPreview/ChannelPreview.tsx +7 -1
- package/src/components/ChannelPreview/__tests__/{ChannelPreview.test.js → ChannelPreview.test.tsx} +79 -41
- package/src/components/ChannelPreview/hooks/__tests__/useLatestMessagePreview.test.tsx +56 -21
- package/src/components/ChannelPreview/hooks/useLatestMessagePreview.ts +4 -1
- package/src/components/Chat/Chat.tsx +6 -3
- package/src/components/ImageGallery/ImageGallery.tsx +10 -6
- package/src/components/ImageGallery/components/ImageGalleryFooter.tsx +2 -1
- package/src/components/Message/Message.tsx +3 -0
- package/src/components/Message/MessageSimple/MessageTextContainer.tsx +7 -1
- package/src/components/Message/MessageSimple/__tests__/MessageTextContainer.test.tsx +108 -0
- package/src/components/Message/MessageSimple/__tests__/__snapshots__/{MessageTextContainer.test.js.snap → MessageTextContainer.test.tsx.snap} +0 -0
- package/src/contexts/messageInputContext/MessageInputContext.tsx +7 -0
- package/src/contexts/messageInputContext/__tests__/__snapshots__/sendMessage.test.tsx.snap +4 -0
- package/src/contexts/messageOverlayContext/MessageOverlayContext.tsx +2 -1
- package/src/contexts/overlayContext/OverlayProvider.tsx +4 -3
- package/src/contexts/translationContext/TranslationContext.tsx +10 -1
- package/src/hooks/__tests__/useTranslatedMessage.test.tsx +106 -0
- package/src/hooks/useStreami18n.ts +2 -2
- package/src/hooks/useTranslatedMessage.ts +30 -0
- package/src/mock-builders/api/{getOrCreateChannel.js → getOrCreateChannel.ts} +8 -1
- package/src/mock-builders/generator/{channel.js → channel.ts} +19 -10
- package/src/version.json +1 -1
- package/src/components/Message/MessageSimple/__tests__/MessageTextContainer.test.js +0 -65
|
@@ -19,6 +19,8 @@ var _ChannelsContext = require("../../contexts/channelsContext/ChannelsContext")
|
|
|
19
19
|
|
|
20
20
|
var _ChatContext = require("../../contexts/chatContext/ChatContext");
|
|
21
21
|
|
|
22
|
+
var _useTranslatedMessage = require("../../hooks/useTranslatedMessage");
|
|
23
|
+
|
|
22
24
|
var _this = this,
|
|
23
25
|
_jsxFileName = "/home/runner/work/stream-chat-react-native/stream-chat-react-native/package/src/components/ChannelPreview/ChannelPreview.tsx";
|
|
24
26
|
|
|
@@ -36,6 +38,8 @@ var ChannelPreviewWithContext = function ChannelPreviewWithContext(props) {
|
|
|
36
38
|
lastMessage = _useState2[0],
|
|
37
39
|
setLastMessage = _useState2[1];
|
|
38
40
|
|
|
41
|
+
var translatedLastMessage = (0, _useTranslatedMessage.useTranslatedMessage)(lastMessage || {});
|
|
42
|
+
|
|
39
43
|
var _useState3 = (0, _react.useState)(0),
|
|
40
44
|
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
|
|
41
45
|
forceUpdate = _useState4[0],
|
|
@@ -46,7 +50,7 @@ var ChannelPreviewWithContext = function ChannelPreviewWithContext(props) {
|
|
|
46
50
|
unread = _useState6[0],
|
|
47
51
|
setUnread = _useState6[1];
|
|
48
52
|
|
|
49
|
-
var latestMessagePreview = (0, _useLatestMessagePreview.useLatestMessagePreview)(channel, forceUpdate,
|
|
53
|
+
var latestMessagePreview = (0, _useLatestMessagePreview.useLatestMessagePreview)(channel, forceUpdate, translatedLastMessage);
|
|
50
54
|
var channelLastMessage = channel.lastMessage();
|
|
51
55
|
var channelLastMessageString = "" + (channelLastMessage == null ? void 0 : channelLastMessage.id) + (channelLastMessage == null ? void 0 : channelLastMessage.updated_at);
|
|
52
56
|
(0, _react.useEffect)(function () {
|
|
@@ -105,7 +109,7 @@ var ChannelPreviewWithContext = function ChannelPreviewWithContext(props) {
|
|
|
105
109
|
__self: _this,
|
|
106
110
|
__source: {
|
|
107
111
|
fileName: _jsxFileName,
|
|
108
|
-
lineNumber:
|
|
112
|
+
lineNumber: 106,
|
|
109
113
|
columnNumber: 10
|
|
110
114
|
}
|
|
111
115
|
});
|
|
@@ -125,7 +129,7 @@ var ChannelPreview = function ChannelPreview(props) {
|
|
|
125
129
|
__self: _this,
|
|
126
130
|
__source: {
|
|
127
131
|
fileName: _jsxFileName,
|
|
128
|
-
lineNumber:
|
|
132
|
+
lineNumber: 122,
|
|
129
133
|
columnNumber: 10
|
|
130
134
|
}
|
|
131
135
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["ChannelPreview.tsx"],"names":["ChannelPreviewWithContext","props","channel","client","Preview","state","messages","length","lastMessage","setLastMessage","forceUpdate","setForceUpdate","countUnread","unread","setUnread","latestMessagePreview","channelLastMessage","channelLastMessageString","id","updated_at","newUnreadCount","handleEvent","event","message","type","on","off","handleReadEvent","user","userID","prev","ChannelPreview"],"mappings":";;;;;;;;;;;;;AAAA;;AAIA;;AAEA;;AAIA;;;;;;;;;
|
|
1
|
+
{"version":3,"sources":["ChannelPreview.tsx"],"names":["ChannelPreviewWithContext","props","channel","client","Preview","state","messages","length","lastMessage","setLastMessage","translatedLastMessage","forceUpdate","setForceUpdate","countUnread","unread","setUnread","latestMessagePreview","channelLastMessage","channelLastMessageString","id","updated_at","newUnreadCount","handleEvent","event","message","type","on","off","handleReadEvent","user","userID","prev","ChannelPreview"],"mappings":"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","sourcesContent":["import React, { useEffect, useState } from 'react';\n\nimport type { Channel, ChannelState, Event, MessageResponse } from 'stream-chat';\n\nimport { useLatestMessagePreview } from './hooks/useLatestMessagePreview';\n\nimport {\n ChannelsContextValue,\n useChannelsContext,\n} from '../../contexts/channelsContext/ChannelsContext';\nimport { ChatContextValue, useChatContext } from '../../contexts/chatContext/ChatContext';\n\nimport { useTranslatedMessage } from '../../hooks/useTranslatedMessage';\nimport type { DefaultStreamChatGenerics } from '../../types/types';\n\nexport type ChannelPreviewPropsWithContext<\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n> = Pick<ChatContextValue<StreamChatGenerics>, 'client'> &\n Pick<ChannelsContextValue<StreamChatGenerics>, 'Preview'> & {\n /**\n * The previewed channel\n */\n channel: Channel<StreamChatGenerics>;\n };\n\n/**\n * This component manages state for the ChannelPreviewMessenger UI component and receives\n * all props from the ChannelListMessenger component.\n */\nconst ChannelPreviewWithContext = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n props: ChannelPreviewPropsWithContext<StreamChatGenerics>,\n) => {\n const { channel, client, Preview } = props;\n\n const [lastMessage, setLastMessage] = useState<\n | ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>\n | MessageResponse<StreamChatGenerics>\n | undefined\n >(channel.state.messages[channel.state.messages.length - 1]);\n\n const translatedLastMessage = useTranslatedMessage<StreamChatGenerics>(\n lastMessage || ({} as MessageResponse<StreamChatGenerics>),\n );\n\n const [forceUpdate, setForceUpdate] = useState(0);\n const [unread, setUnread] = useState(channel.countUnread());\n\n const latestMessagePreview = useLatestMessagePreview(channel, forceUpdate, translatedLastMessage);\n\n const channelLastMessage = channel.lastMessage();\n const channelLastMessageString = `${channelLastMessage?.id}${channelLastMessage?.updated_at}`;\n\n useEffect(() => {\n if (\n channelLastMessage &&\n (channelLastMessage.id !== lastMessage?.id ||\n channelLastMessage.updated_at !== lastMessage?.updated_at)\n ) {\n setLastMessage(channelLastMessage);\n }\n\n const newUnreadCount = channel.countUnread();\n\n if (newUnreadCount !== unread) {\n setUnread(newUnreadCount);\n }\n }, [channelLastMessageString]);\n\n useEffect(() => {\n const handleEvent = (event: Event<StreamChatGenerics>) => {\n if (event.message) {\n setLastMessage(event.message);\n }\n\n if (event.type === 'message.new') {\n setUnread(channel.countUnread());\n }\n };\n\n channel.on('message.new', handleEvent);\n channel.on('message.updated', handleEvent);\n channel.on('message.deleted', handleEvent);\n\n return () => {\n channel.off('message.new', handleEvent);\n channel.off('message.updated', handleEvent);\n channel.off('message.deleted', handleEvent);\n };\n }, []);\n\n useEffect(() => {\n const handleReadEvent = (event: Event<StreamChatGenerics>) => {\n if (event.user?.id === client.userID) {\n setUnread(0);\n } else if (event.user?.id) {\n setForceUpdate((prev) => prev + 1);\n }\n };\n\n channel.on('message.read', handleReadEvent);\n return () => channel.off('message.read', handleReadEvent);\n }, []);\n\n return <Preview channel={channel} latestMessagePreview={latestMessagePreview} unread={unread} />;\n};\n\nexport type ChannelPreviewProps<\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n> = Partial<Omit<ChannelPreviewPropsWithContext<StreamChatGenerics>, 'channel'>> &\n Pick<ChannelPreviewPropsWithContext<StreamChatGenerics>, 'channel'>;\n\nexport const ChannelPreview = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n props: ChannelPreviewProps<StreamChatGenerics>,\n) => {\n const { client } = useChatContext<StreamChatGenerics>();\n const { Preview } = useChannelsContext<StreamChatGenerics>();\n\n return <ChannelPreviewWithContext {...{ client, Preview }} {...props} />;\n};\n"]}
|
|
@@ -190,7 +190,8 @@ var getLatestMessagePreview = function getLatestMessagePreview(params) {
|
|
|
190
190
|
};
|
|
191
191
|
}
|
|
192
192
|
|
|
193
|
-
var
|
|
193
|
+
var channelStateLastMessage = messages.length ? messages[messages.length - 1] : undefined;
|
|
194
|
+
var message = lastMessage !== undefined ? lastMessage : channelStateLastMessage;
|
|
194
195
|
return {
|
|
195
196
|
created_at: getLatestMessageDisplayDate(message, tDateTimeParser),
|
|
196
197
|
messageObject: message,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useLatestMessagePreview.ts"],"names":["getMessageSenderName","message","currentUserId","t","membersLength","user","id","name","username","getMentionUsers","mentionedUser","Array","isArray","mentionUserString","reduce","acc","cur","userName","length","getLatestMessageDisplayText","channel","client","bold","text","isMessageTypeDeleted","type","userID","members","Object","keys","state","messageSender","messageSenderText","boldOwner","includes","shortenedText","substring","replace","mentionedUsers","mentioned_users","regEx","RegExp","split","index","test","push","command","attachments","getLatestMessageDisplayDate","tDateTimeParser","parserOutput","created_at","isSame","Date","format","MessageReadStatus","getLatestMessageReadStatus","readEvents","NOT_SENT_BY_CURRENT_USER","readList","read","messageUpdatedAt","updated_at","undefined","values","some","last_read","READ","UNREAD","getLatestMessagePreview","params","lastMessage","messages","messageObject","previews","status","useLatestMessagePreview","forceUpdate","channelConfigExists","getConfig","channelLastMessageString","setReadEvents","latestMessagePreview","setLatestMessagePreview","readStatus","read_events"],"mappings":"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","sourcesContent":["import { useEffect, useState } from 'react';\n\nimport type { Channel, ChannelState, MessageResponse, StreamChat, UserResponse } from 'stream-chat';\n\nimport { useChatContext } from '../../../contexts/chatContext/ChatContext';\nimport {\n isDayOrMoment,\n TDateTimeParser,\n useTranslationContext,\n} from '../../../contexts/translationContext/TranslationContext';\n\nimport type { DefaultStreamChatGenerics } from '../../../types/types';\n\ntype LatestMessage<\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n> =\n | ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>\n | MessageResponse<StreamChatGenerics>;\n\nexport type LatestMessagePreview<\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n> = {\n created_at: string | number | Date;\n messageObject: LatestMessage<StreamChatGenerics> | undefined;\n previews: {\n bold: boolean;\n text: string;\n }[];\n status: number;\n};\n\nconst getMessageSenderName = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n message: LatestMessage<StreamChatGenerics> | undefined,\n currentUserId: string | undefined,\n t: (key: string) => string,\n membersLength: number,\n) => {\n if (message?.user?.id === currentUserId) {\n return t('You');\n }\n\n if (membersLength > 2) {\n return message?.user?.name || message?.user?.username || message?.user?.id || '';\n }\n\n return '';\n};\n\nconst getMentionUsers = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n mentionedUser: UserResponse<StreamChatGenerics>[] | undefined,\n) => {\n if (Array.isArray(mentionedUser)) {\n const mentionUserString = mentionedUser.reduce((acc, cur) => {\n const userName = cur.name || cur.id || '';\n if (userName) {\n acc += `${acc.length ? '|' : ''}@${userName}`;\n }\n return acc;\n }, '');\n return mentionUserString;\n }\n return '';\n};\n\nconst getLatestMessageDisplayText = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n channel: Channel<StreamChatGenerics>,\n client: StreamChat<StreamChatGenerics>,\n message: LatestMessage<StreamChatGenerics> | undefined,\n t: (key: string) => string,\n) => {\n if (!message) return [{ bold: false, text: t('Nothing yet...') }];\n const isMessageTypeDeleted = message.type === 'deleted';\n if (isMessageTypeDeleted) return [{ bold: false, text: t('Message deleted') }];\n const currentUserId = client?.userID;\n const members = Object.keys(channel.state.members);\n\n const messageSender = getMessageSenderName(message, currentUserId, t, members.length);\n const messageSenderText = messageSender\n ? `${messageSender === t('You') ? '' : '@'}${messageSender}: `\n : '';\n const boldOwner = messageSenderText.includes('@');\n if (message.text) {\n // rough guess optimization to limit string preview to max 100 characters\n const shortenedText = message.text.substring(0, 100).replace(/\\n/g, ' ');\n const mentionedUsers = getMentionUsers(message.mentioned_users);\n const regEx = new RegExp(`^(${mentionedUsers})`);\n return [\n { bold: boldOwner, text: messageSenderText },\n ...shortenedText.split('').reduce(\n (acc, cur, index) => {\n if (cur === '@' && mentionedUsers && regEx.test(shortenedText.substring(index))) {\n acc.push({ bold: true, text: cur });\n } else if (mentionedUsers && regEx.test(acc[acc.length - 1].text)) {\n acc.push({ bold: false, text: cur });\n } else {\n acc[acc.length - 1].text += cur;\n }\n return acc;\n },\n [{ bold: false, text: '' }],\n ),\n ];\n }\n if (message.command) {\n return [\n { bold: boldOwner, text: messageSenderText },\n { bold: false, text: `/${message.command}` },\n ];\n }\n if (message.attachments?.length) {\n return [\n { bold: boldOwner, text: messageSenderText },\n { bold: false, text: t('🏙 Attachment...') },\n ];\n }\n return [\n { bold: boldOwner, text: messageSenderText },\n { bold: false, text: t('Empty message...') },\n ];\n};\n\nconst getLatestMessageDisplayDate = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n message: LatestMessage<StreamChatGenerics> | undefined,\n tDateTimeParser: TDateTimeParser,\n) => {\n const parserOutput = tDateTimeParser(message?.created_at);\n if (isDayOrMoment(parserOutput)) {\n if (parserOutput.isSame(new Date(), 'day')) {\n return parserOutput.format('LT');\n }\n return parserOutput.format('L');\n }\n return parserOutput;\n};\n\nexport enum MessageReadStatus {\n NOT_SENT_BY_CURRENT_USER = 0,\n UNREAD = 1,\n READ = 2,\n}\n\nconst getLatestMessageReadStatus = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n channel: Channel<StreamChatGenerics>,\n client: StreamChat<StreamChatGenerics>,\n message: LatestMessage<StreamChatGenerics> | undefined,\n readEvents: boolean,\n): MessageReadStatus => {\n const currentUserId = client.userID;\n if (!message || currentUserId !== message.user?.id || readEvents === false) {\n return MessageReadStatus.NOT_SENT_BY_CURRENT_USER;\n }\n\n const readList = channel.state.read;\n if (currentUserId) {\n delete readList[currentUserId];\n }\n\n const messageUpdatedAt = message.updated_at\n ? typeof message.updated_at === 'string'\n ? new Date(message.updated_at)\n : message.updated_at\n : undefined;\n\n return Object.values(readList).some(\n ({ last_read }) => messageUpdatedAt && messageUpdatedAt < last_read,\n )\n ? MessageReadStatus.READ\n : MessageReadStatus.UNREAD;\n};\n\nconst getLatestMessagePreview = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(params: {\n channel: Channel<StreamChatGenerics>;\n client: StreamChat<StreamChatGenerics>;\n readEvents: boolean;\n t: (key: string) => string;\n tDateTimeParser: TDateTimeParser;\n lastMessage?:\n | ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>\n | MessageResponse<StreamChatGenerics>;\n}) => {\n const { channel, client, lastMessage, readEvents, t, tDateTimeParser } = params;\n\n const messages = channel.state.messages;\n\n if (!messages.length && !lastMessage) {\n return {\n created_at: '',\n messageObject: undefined,\n previews: [\n {\n bold: false,\n text: t('Nothing yet...'),\n },\n ],\n status: MessageReadStatus.NOT_SENT_BY_CURRENT_USER,\n };\n }\n const message = lastMessage || messages.length ? messages[messages.length - 1] : undefined;\n\n return {\n created_at: getLatestMessageDisplayDate(message, tDateTimeParser),\n messageObject: message,\n previews: getLatestMessageDisplayText(channel, client, message, t),\n status: getLatestMessageReadStatus(channel, client, message, readEvents),\n };\n};\n\n/**\n * Hook to set the display preview for latest message on channel.\n *\n * @param {*} channel Channel object\n *\n * @returns {object} latest message preview e.g.. { text: 'this was last message ...', created_at: '11/12/2020', messageObject: { originalMessageObject } }\n */\nexport const useLatestMessagePreview = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n channel: Channel<StreamChatGenerics>,\n forceUpdate: number,\n lastMessage?:\n | ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>\n | MessageResponse<StreamChatGenerics>,\n) => {\n const { client } = useChatContext<StreamChatGenerics>();\n const { t, tDateTimeParser } = useTranslationContext();\n\n const channelConfigExists = typeof channel?.getConfig === 'function';\n\n const messages = channel.state.messages;\n const message = messages.length ? messages[messages.length - 1] : undefined;\n\n const channelLastMessageString = `${lastMessage?.id || message?.id}${\n lastMessage?.updated_at || message?.updated_at\n }`;\n\n const [readEvents, setReadEvents] = useState(true);\n const [latestMessagePreview, setLatestMessagePreview] = useState<\n LatestMessagePreview<StreamChatGenerics>\n >({\n created_at: '',\n messageObject: undefined,\n previews: [\n {\n bold: false,\n text: '',\n },\n ],\n status: MessageReadStatus.NOT_SENT_BY_CURRENT_USER,\n });\n\n const readStatus = getLatestMessageReadStatus(\n channel,\n client,\n lastMessage || message,\n readEvents,\n );\n\n useEffect(() => {\n if (channelConfigExists) {\n const read_events = channel.getConfig()?.read_events;\n if (typeof read_events === 'boolean') {\n setReadEvents(read_events);\n }\n }\n }, [channelConfigExists]);\n\n useEffect(\n () =>\n setLatestMessagePreview(\n getLatestMessagePreview({\n channel,\n client,\n lastMessage,\n readEvents,\n t,\n tDateTimeParser,\n }),\n ),\n [channelLastMessageString, forceUpdate, readEvents, readStatus],\n );\n\n return latestMessagePreview;\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["useLatestMessagePreview.ts"],"names":["getMessageSenderName","message","currentUserId","t","membersLength","user","id","name","username","getMentionUsers","mentionedUser","Array","isArray","mentionUserString","reduce","acc","cur","userName","length","getLatestMessageDisplayText","channel","client","bold","text","isMessageTypeDeleted","type","userID","members","Object","keys","state","messageSender","messageSenderText","boldOwner","includes","shortenedText","substring","replace","mentionedUsers","mentioned_users","regEx","RegExp","split","index","test","push","command","attachments","getLatestMessageDisplayDate","tDateTimeParser","parserOutput","created_at","isSame","Date","format","MessageReadStatus","getLatestMessageReadStatus","readEvents","NOT_SENT_BY_CURRENT_USER","readList","read","messageUpdatedAt","updated_at","undefined","values","some","last_read","READ","UNREAD","getLatestMessagePreview","params","lastMessage","messages","messageObject","previews","status","channelStateLastMessage","useLatestMessagePreview","forceUpdate","channelConfigExists","getConfig","channelLastMessageString","setReadEvents","latestMessagePreview","setLatestMessagePreview","readStatus","read_events"],"mappings":"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","sourcesContent":["import { useEffect, useState } from 'react';\n\nimport type { Channel, ChannelState, MessageResponse, StreamChat, UserResponse } from 'stream-chat';\n\nimport { useChatContext } from '../../../contexts/chatContext/ChatContext';\nimport {\n isDayOrMoment,\n TDateTimeParser,\n useTranslationContext,\n} from '../../../contexts/translationContext/TranslationContext';\n\nimport type { DefaultStreamChatGenerics } from '../../../types/types';\n\ntype LatestMessage<\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n> =\n | ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>\n | MessageResponse<StreamChatGenerics>;\n\nexport type LatestMessagePreview<\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n> = {\n created_at: string | number | Date;\n messageObject: LatestMessage<StreamChatGenerics> | undefined;\n previews: {\n bold: boolean;\n text: string;\n }[];\n status: number;\n};\n\nconst getMessageSenderName = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n message: LatestMessage<StreamChatGenerics> | undefined,\n currentUserId: string | undefined,\n t: (key: string) => string,\n membersLength: number,\n) => {\n if (message?.user?.id === currentUserId) {\n return t('You');\n }\n\n if (membersLength > 2) {\n return message?.user?.name || message?.user?.username || message?.user?.id || '';\n }\n\n return '';\n};\n\nconst getMentionUsers = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n mentionedUser: UserResponse<StreamChatGenerics>[] | undefined,\n) => {\n if (Array.isArray(mentionedUser)) {\n const mentionUserString = mentionedUser.reduce((acc, cur) => {\n const userName = cur.name || cur.id || '';\n if (userName) {\n acc += `${acc.length ? '|' : ''}@${userName}`;\n }\n return acc;\n }, '');\n return mentionUserString;\n }\n return '';\n};\n\nconst getLatestMessageDisplayText = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n channel: Channel<StreamChatGenerics>,\n client: StreamChat<StreamChatGenerics>,\n message: LatestMessage<StreamChatGenerics> | undefined,\n t: (key: string) => string,\n) => {\n if (!message) return [{ bold: false, text: t('Nothing yet...') }];\n const isMessageTypeDeleted = message.type === 'deleted';\n if (isMessageTypeDeleted) return [{ bold: false, text: t('Message deleted') }];\n const currentUserId = client?.userID;\n const members = Object.keys(channel.state.members);\n\n const messageSender = getMessageSenderName(message, currentUserId, t, members.length);\n const messageSenderText = messageSender\n ? `${messageSender === t('You') ? '' : '@'}${messageSender}: `\n : '';\n const boldOwner = messageSenderText.includes('@');\n if (message.text) {\n // rough guess optimization to limit string preview to max 100 characters\n const shortenedText = message.text.substring(0, 100).replace(/\\n/g, ' ');\n const mentionedUsers = getMentionUsers(message.mentioned_users);\n const regEx = new RegExp(`^(${mentionedUsers})`);\n return [\n { bold: boldOwner, text: messageSenderText },\n ...shortenedText.split('').reduce(\n (acc, cur, index) => {\n if (cur === '@' && mentionedUsers && regEx.test(shortenedText.substring(index))) {\n acc.push({ bold: true, text: cur });\n } else if (mentionedUsers && regEx.test(acc[acc.length - 1].text)) {\n acc.push({ bold: false, text: cur });\n } else {\n acc[acc.length - 1].text += cur;\n }\n return acc;\n },\n [{ bold: false, text: '' }],\n ),\n ];\n }\n if (message.command) {\n return [\n { bold: boldOwner, text: messageSenderText },\n { bold: false, text: `/${message.command}` },\n ];\n }\n if (message.attachments?.length) {\n return [\n { bold: boldOwner, text: messageSenderText },\n { bold: false, text: t('🏙 Attachment...') },\n ];\n }\n return [\n { bold: boldOwner, text: messageSenderText },\n { bold: false, text: t('Empty message...') },\n ];\n};\n\nconst getLatestMessageDisplayDate = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n message: LatestMessage<StreamChatGenerics> | undefined,\n tDateTimeParser: TDateTimeParser,\n) => {\n const parserOutput = tDateTimeParser(message?.created_at);\n if (isDayOrMoment(parserOutput)) {\n if (parserOutput.isSame(new Date(), 'day')) {\n return parserOutput.format('LT');\n }\n return parserOutput.format('L');\n }\n return parserOutput;\n};\n\nexport enum MessageReadStatus {\n NOT_SENT_BY_CURRENT_USER = 0,\n UNREAD = 1,\n READ = 2,\n}\n\nconst getLatestMessageReadStatus = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n channel: Channel<StreamChatGenerics>,\n client: StreamChat<StreamChatGenerics>,\n message: LatestMessage<StreamChatGenerics> | undefined,\n readEvents: boolean,\n): MessageReadStatus => {\n const currentUserId = client.userID;\n if (!message || currentUserId !== message.user?.id || readEvents === false) {\n return MessageReadStatus.NOT_SENT_BY_CURRENT_USER;\n }\n\n const readList = channel.state.read;\n if (currentUserId) {\n delete readList[currentUserId];\n }\n\n const messageUpdatedAt = message.updated_at\n ? typeof message.updated_at === 'string'\n ? new Date(message.updated_at)\n : message.updated_at\n : undefined;\n\n return Object.values(readList).some(\n ({ last_read }) => messageUpdatedAt && messageUpdatedAt < last_read,\n )\n ? MessageReadStatus.READ\n : MessageReadStatus.UNREAD;\n};\n\nconst getLatestMessagePreview = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(params: {\n channel: Channel<StreamChatGenerics>;\n client: StreamChat<StreamChatGenerics>;\n readEvents: boolean;\n t: (key: string) => string;\n tDateTimeParser: TDateTimeParser;\n lastMessage?:\n | ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>\n | MessageResponse<StreamChatGenerics>;\n}) => {\n const { channel, client, lastMessage, readEvents, t, tDateTimeParser } = params;\n\n const messages = channel.state.messages;\n\n if (!messages.length && !lastMessage) {\n return {\n created_at: '',\n messageObject: undefined,\n previews: [\n {\n bold: false,\n text: t('Nothing yet...'),\n },\n ],\n status: MessageReadStatus.NOT_SENT_BY_CURRENT_USER,\n };\n }\n\n const channelStateLastMessage = messages.length ? messages[messages.length - 1] : undefined;\n\n const message = lastMessage !== undefined ? lastMessage : channelStateLastMessage;\n\n return {\n created_at: getLatestMessageDisplayDate(message, tDateTimeParser),\n messageObject: message,\n previews: getLatestMessageDisplayText(channel, client, message, t),\n status: getLatestMessageReadStatus(channel, client, message, readEvents),\n };\n};\n\n/**\n * Hook to set the display preview for latest message on channel.\n *\n * @param {*} channel Channel object\n *\n * @returns {object} latest message preview e.g.. { text: 'this was last message ...', created_at: '11/12/2020', messageObject: { originalMessageObject } }\n */\nexport const useLatestMessagePreview = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n channel: Channel<StreamChatGenerics>,\n forceUpdate: number,\n lastMessage?:\n | ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>\n | MessageResponse<StreamChatGenerics>,\n) => {\n const { client } = useChatContext<StreamChatGenerics>();\n const { t, tDateTimeParser } = useTranslationContext();\n\n const channelConfigExists = typeof channel?.getConfig === 'function';\n\n const messages = channel.state.messages;\n const message = messages.length ? messages[messages.length - 1] : undefined;\n\n const channelLastMessageString = `${lastMessage?.id || message?.id}${\n lastMessage?.updated_at || message?.updated_at\n }`;\n\n const [readEvents, setReadEvents] = useState(true);\n const [latestMessagePreview, setLatestMessagePreview] = useState<\n LatestMessagePreview<StreamChatGenerics>\n >({\n created_at: '',\n messageObject: undefined,\n previews: [\n {\n bold: false,\n text: '',\n },\n ],\n status: MessageReadStatus.NOT_SENT_BY_CURRENT_USER,\n });\n\n const readStatus = getLatestMessageReadStatus(\n channel,\n client,\n lastMessage || message,\n readEvents,\n );\n\n useEffect(() => {\n if (channelConfigExists) {\n const read_events = channel.getConfig()?.read_events;\n if (typeof read_events === 'boolean') {\n setReadEvents(read_events);\n }\n }\n }, [channelConfigExists]);\n\n useEffect(\n () =>\n setLatestMessagePreview(\n getLatestMessagePreview({\n channel,\n client,\n lastMessage,\n readEvents,\n t,\n tDateTimeParser,\n }),\n ),\n [channelLastMessageString, forceUpdate, readEvents, readStatus],\n );\n\n return latestMessagePreview;\n};\n"]}
|
|
@@ -51,6 +51,8 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
|
|
|
51
51
|
(0, _init["default"])();
|
|
52
52
|
|
|
53
53
|
var ChatWithContext = function ChatWithContext(props) {
|
|
54
|
+
var _client$user;
|
|
55
|
+
|
|
54
56
|
var children = props.children,
|
|
55
57
|
client = props.client,
|
|
56
58
|
_props$closeConnectio = props.closeConnectionOnBackground,
|
|
@@ -112,15 +114,17 @@ var ChatWithContext = function ChatWithContext(props) {
|
|
|
112
114
|
__self: _this,
|
|
113
115
|
__source: {
|
|
114
116
|
fileName: _jsxFileName,
|
|
115
|
-
lineNumber:
|
|
117
|
+
lineNumber: 181,
|
|
116
118
|
columnNumber: 5
|
|
117
119
|
}
|
|
118
120
|
}, _react["default"].createElement(_TranslationContext.TranslationProvider, {
|
|
119
|
-
value: translators,
|
|
121
|
+
value: (0, _extends2["default"])({}, translators, {
|
|
122
|
+
userLanguage: ((_client$user = client.user) == null ? void 0 : _client$user.language) || _TranslationContext.DEFAULT_USER_LANGUAGE
|
|
123
|
+
}),
|
|
120
124
|
__self: _this,
|
|
121
125
|
__source: {
|
|
122
126
|
fileName: _jsxFileName,
|
|
123
|
-
lineNumber:
|
|
127
|
+
lineNumber: 182,
|
|
124
128
|
columnNumber: 7
|
|
125
129
|
}
|
|
126
130
|
}, _react["default"].createElement(_ThemeContext.ThemeProvider, {
|
|
@@ -128,7 +132,7 @@ var ChatWithContext = function ChatWithContext(props) {
|
|
|
128
132
|
__self: _this,
|
|
129
133
|
__source: {
|
|
130
134
|
fileName: _jsxFileName,
|
|
131
|
-
lineNumber:
|
|
135
|
+
lineNumber: 185,
|
|
132
136
|
columnNumber: 9
|
|
133
137
|
}
|
|
134
138
|
}, children)));
|
|
@@ -144,7 +148,7 @@ var Chat = function Chat(props) {
|
|
|
144
148
|
__self: _this,
|
|
145
149
|
__source: {
|
|
146
150
|
fileName: _jsxFileName,
|
|
147
|
-
lineNumber:
|
|
151
|
+
lineNumber: 219,
|
|
148
152
|
columnNumber: 10
|
|
149
153
|
}
|
|
150
154
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["Chat.tsx"],"names":["ChatWithContext","props","children","client","closeConnectionOnBackground","i18nInstance","style","channel","setChannel","t","key","tDateTimeParser","input","translators","setTranslators","loadingTranslators","connectionRecovering","isOnline","mutedUsers","setUserAgent","SDK","Platform","OS","version","recoverStateOnReconnect","setActiveChannel","newChannel","appSettings","chatContext","Chat"],"mappings":"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","sourcesContent":["import React, { PropsWithChildren, useEffect, useState } from 'react';\nimport { Platform } from 'react-native';\n\nimport Dayjs from 'dayjs';\n\nimport type { Channel } from 'stream-chat';\n\nimport { useAppSettings } from './hooks/useAppSettings';\nimport { useCreateChatContext } from './hooks/useCreateChatContext';\nimport { useIsOnline } from './hooks/useIsOnline';\nimport { useMutedUsers } from './hooks/useMutedUsers';\n\nimport { ChatContextValue, ChatProvider } from '../../contexts/chatContext/ChatContext';\nimport { useOverlayContext } from '../../contexts/overlayContext/OverlayContext';\nimport { DeepPartial, ThemeProvider } from '../../contexts/themeContext/ThemeContext';\nimport type { Theme } from '../../contexts/themeContext/utils/theme';\nimport {\n TranslationContextValue,\n TranslationProvider,\n} from '../../contexts/translationContext/TranslationContext';\nimport { useStreami18n } from '../../hooks/useStreami18n';\nimport init from '../../init';\n\nimport { SDK } from '../../native';\nimport type { DefaultStreamChatGenerics } from '../../types/types';\nimport type { Streami18n } from '../../utils/Streami18n';\nimport { version } from '../../version.json';\n\ninit();\n\nexport type ChatProps<\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n> = Pick<ChatContextValue<StreamChatGenerics>, 'client'> & {\n /**\n * When false, ws connection won't be disconnection upon backgrounding the app.\n * To receive push notifications, its necessary that user doesn't have active\n * websocket connection. So by default, we disconnect websocket connection when\n * app goes to background, and reconnect when app comes to foreground.\n */\n closeConnectionOnBackground?: boolean;\n /**\n * Instance of Streami18n class should be provided to Chat component to enable internationalization.\n *\n * Stream provides following list of in-built translations:\n * 1. English (en)\n * 2. Dutch (nl)\n * 3. ...\n * 4. ...\n *\n * Simplest way to start using chat components in one of the in-built languages would be following:\n *\n * ```\n * const i18n = new Streami18n('nl');\n * <Chat client={chatClient} i18nInstance={i18n}>\n * ...\n * </Chat>\n * ```\n *\n * If you would like to override certain keys in in-built translation.\n * UI will be automatically updated in this case.\n *\n * ```\n * const i18n = new Streami18n('nl');\n *\n * i18n.registerTranslation('nl', {\n * 'Nothing yet...': 'Nog Niet ...',\n * '{{ firstUser }} and {{ secondUser }} are typing...': '{{ firstUser }} en {{ secondUser }} zijn aan het typen...',\n * });\n *\n * <Chat client={chatClient} i18nInstance={i18n}>\n * ...\n * </Chat>\n * ```\n *\n * You can use the same function to add whole new language.\n *\n * ```\n * const i18n = new Streami18n('it');\n *\n * i18n.registerTranslation('it', {\n * 'Nothing yet...': 'Non ancora ...',\n * '{{ firstUser }} and {{ secondUser }} are typing...': '{{ firstUser }} a {{ secondUser }} stanno scrivendo...',\n * });\n *\n * // Make sure to call setLanguage to reflect new language in UI.\n * i18n.setLanguage('it');\n * <Chat client={chatClient} i18nInstance={i18n}>\n * ...\n * </Chat>\n * ```\n */\n i18nInstance?: Streami18n;\n /**\n * You can pass the theme object to customize the styles of Chat components. You can check the default theme in [theme.ts](https://github.com/GetStream/stream-chat-react-native/blob/main/package/src/contexts/themeContext/utils/theme.ts)\n *\n * Please check section about [themes in cookbook](https://github.com/GetStream/stream-chat-react-native/wiki/Cookbook-v3.0#theme) for details.\n *\n * ```\n * import type { DeepPartial, Theme } from 'stream-chat-react-native';\n *\n * const theme: DeepPartial<Theme> = {\n * messageSimple: {\n * file: {\n * container: {\n * backgroundColor: 'red',\n * },\n * icon: {\n * height: 16,\n * width: 16,\n * },\n * },\n * },\n * };\n *\n * <Chat style={theme}>\n * </Chat>\n * ```\n *\n * @overrideType object\n */\n style?: DeepPartial<Theme>;\n};\n\nconst ChatWithContext = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n props: PropsWithChildren<ChatProps<StreamChatGenerics>>,\n) => {\n const { children, client, closeConnectionOnBackground = true, i18nInstance, style } = props;\n\n const [channel, setChannel] = useState<Channel<StreamChatGenerics>>();\n const [translators, setTranslators] = useState<TranslationContextValue>({\n t: (key: string) => key,\n tDateTimeParser: (input?: string | number | Date) => Dayjs(input),\n });\n\n /**\n * Setup translators\n */\n const loadingTranslators = useStreami18n({ i18nInstance, setTranslators });\n\n /**\n * Setup connection event listeners\n */\n const { connectionRecovering, isOnline } = useIsOnline<StreamChatGenerics>(\n client,\n closeConnectionOnBackground,\n );\n\n /**\n * Setup muted user listener\n */\n const mutedUsers = useMutedUsers<StreamChatGenerics>(client);\n\n useEffect(() => {\n if (client.setUserAgent) {\n client.setUserAgent(`${SDK}-${Platform.OS}-${version}`);\n // This is to disable recovery related logic in js client, since we handle it in this SDK\n client.recoverStateOnReconnect = false;\n }\n }, []);\n\n const setActiveChannel = (newChannel?: Channel<StreamChatGenerics>) => setChannel(newChannel);\n\n const appSettings = useAppSettings(client, isOnline);\n\n const chatContext = useCreateChatContext({\n appSettings,\n channel,\n client,\n connectionRecovering,\n isOnline,\n mutedUsers,\n setActiveChannel,\n });\n\n if (loadingTranslators) return null;\n\n return (\n <ChatProvider<StreamChatGenerics> value={chatContext}>\n <TranslationProvider value={translators}>\n <ThemeProvider style={style}>{children}</ThemeProvider>\n </TranslationProvider>\n </ChatProvider>\n );\n};\n\n/**\n * Chat - Wrapper component for Chat. The needs to be placed around any other chat components.\n * This Chat component provides the ChatContext to all other components.\n *\n * The ChatContext provides the following props:\n *\n * - channel - currently active channel\n * - client - client connection\n * - connectionRecovering - whether or not websocket is reconnecting\n * - isOnline - whether or not set user is active\n * - setActiveChannel - function to set the currently active channel\n *\n * The Chat Component takes the following generics in order:\n * - At (AttachmentType) - custom Attachment object extension\n * - Ct (ChannelType) - custom Channel object extension\n * - Co (CommandType) - custom Command string union extension\n * - Ev (EventType) - custom Event object extension\n * - Me (MessageType) - custom Message object extension\n * - Re (ReactionType) - custom Reaction object extension\n * - Us (UserType) - custom User object extension\n */\nexport const Chat = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n props: PropsWithChildren<ChatProps<StreamChatGenerics>>,\n) => {\n const { style } = useOverlayContext();\n\n return <ChatWithContext {...{ style }} {...props} />;\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["Chat.tsx"],"names":["ChatWithContext","props","children","client","closeConnectionOnBackground","i18nInstance","style","channel","setChannel","t","key","tDateTimeParser","input","translators","setTranslators","loadingTranslators","connectionRecovering","isOnline","mutedUsers","setUserAgent","SDK","Platform","OS","version","recoverStateOnReconnect","setActiveChannel","newChannel","appSettings","chatContext","userLanguage","user","language","DEFAULT_USER_LANGUAGE","Chat"],"mappings":"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","sourcesContent":["import React, { PropsWithChildren, useEffect, useState } from 'react';\nimport { Platform } from 'react-native';\n\nimport Dayjs from 'dayjs';\n\nimport type { Channel } from 'stream-chat';\n\nimport { useAppSettings } from './hooks/useAppSettings';\nimport { useCreateChatContext } from './hooks/useCreateChatContext';\nimport { useIsOnline } from './hooks/useIsOnline';\nimport { useMutedUsers } from './hooks/useMutedUsers';\n\nimport { ChatContextValue, ChatProvider } from '../../contexts/chatContext/ChatContext';\nimport { useOverlayContext } from '../../contexts/overlayContext/OverlayContext';\nimport { DeepPartial, ThemeProvider } from '../../contexts/themeContext/ThemeContext';\nimport type { Theme } from '../../contexts/themeContext/utils/theme';\nimport {\n DEFAULT_USER_LANGUAGE,\n TranslationProvider,\n TranslatorFunctions,\n} from '../../contexts/translationContext/TranslationContext';\nimport { useStreami18n } from '../../hooks/useStreami18n';\nimport init from '../../init';\n\nimport { SDK } from '../../native';\nimport type { DefaultStreamChatGenerics } from '../../types/types';\nimport type { Streami18n } from '../../utils/Streami18n';\nimport { version } from '../../version.json';\n\ninit();\n\nexport type ChatProps<\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n> = Pick<ChatContextValue<StreamChatGenerics>, 'client'> & {\n /**\n * When false, ws connection won't be disconnection upon backgrounding the app.\n * To receive push notifications, its necessary that user doesn't have active\n * websocket connection. So by default, we disconnect websocket connection when\n * app goes to background, and reconnect when app comes to foreground.\n */\n closeConnectionOnBackground?: boolean;\n /**\n * Instance of Streami18n class should be provided to Chat component to enable internationalization.\n *\n * Stream provides following list of in-built translations:\n * 1. English (en)\n * 2. Dutch (nl)\n * 3. ...\n * 4. ...\n *\n * Simplest way to start using chat components in one of the in-built languages would be following:\n *\n * ```\n * const i18n = new Streami18n('nl');\n * <Chat client={chatClient} i18nInstance={i18n}>\n * ...\n * </Chat>\n * ```\n *\n * If you would like to override certain keys in in-built translation.\n * UI will be automatically updated in this case.\n *\n * ```\n * const i18n = new Streami18n('nl');\n *\n * i18n.registerTranslation('nl', {\n * 'Nothing yet...': 'Nog Niet ...',\n * '{{ firstUser }} and {{ secondUser }} are typing...': '{{ firstUser }} en {{ secondUser }} zijn aan het typen...',\n * });\n *\n * <Chat client={chatClient} i18nInstance={i18n}>\n * ...\n * </Chat>\n * ```\n *\n * You can use the same function to add whole new language.\n *\n * ```\n * const i18n = new Streami18n('it');\n *\n * i18n.registerTranslation('it', {\n * 'Nothing yet...': 'Non ancora ...',\n * '{{ firstUser }} and {{ secondUser }} are typing...': '{{ firstUser }} a {{ secondUser }} stanno scrivendo...',\n * });\n *\n * // Make sure to call setLanguage to reflect new language in UI.\n * i18n.setLanguage('it');\n * <Chat client={chatClient} i18nInstance={i18n}>\n * ...\n * </Chat>\n * ```\n */\n i18nInstance?: Streami18n;\n /**\n * You can pass the theme object to customize the styles of Chat components. You can check the default theme in [theme.ts](https://github.com/GetStream/stream-chat-react-native/blob/main/package/src/contexts/themeContext/utils/theme.ts)\n *\n * Please check section about [themes in cookbook](https://github.com/GetStream/stream-chat-react-native/wiki/Cookbook-v3.0#theme) for details.\n *\n * ```\n * import type { DeepPartial, Theme } from 'stream-chat-react-native';\n *\n * const theme: DeepPartial<Theme> = {\n * messageSimple: {\n * file: {\n * container: {\n * backgroundColor: 'red',\n * },\n * icon: {\n * height: 16,\n * width: 16,\n * },\n * },\n * },\n * };\n *\n * <Chat style={theme}>\n * </Chat>\n * ```\n *\n * @overrideType object\n */\n style?: DeepPartial<Theme>;\n};\n\nconst ChatWithContext = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n props: PropsWithChildren<ChatProps<StreamChatGenerics>>,\n) => {\n const { children, client, closeConnectionOnBackground = true, i18nInstance, style } = props;\n\n const [channel, setChannel] = useState<Channel<StreamChatGenerics>>();\n const [translators, setTranslators] = useState<TranslatorFunctions>({\n t: (key: string) => key,\n tDateTimeParser: (input?: string | number | Date) => Dayjs(input),\n });\n\n /**\n * Setup translators\n */\n const loadingTranslators = useStreami18n({ i18nInstance, setTranslators });\n\n /**\n * Setup connection event listeners\n */\n const { connectionRecovering, isOnline } = useIsOnline<StreamChatGenerics>(\n client,\n closeConnectionOnBackground,\n );\n\n /**\n * Setup muted user listener\n */\n const mutedUsers = useMutedUsers<StreamChatGenerics>(client);\n\n useEffect(() => {\n if (client.setUserAgent) {\n client.setUserAgent(`${SDK}-${Platform.OS}-${version}`);\n // This is to disable recovery related logic in js client, since we handle it in this SDK\n client.recoverStateOnReconnect = false;\n }\n }, []);\n\n const setActiveChannel = (newChannel?: Channel<StreamChatGenerics>) => setChannel(newChannel);\n\n const appSettings = useAppSettings(client, isOnline);\n\n const chatContext = useCreateChatContext({\n appSettings,\n channel,\n client,\n connectionRecovering,\n isOnline,\n mutedUsers,\n setActiveChannel,\n });\n\n if (loadingTranslators) return null;\n\n return (\n <ChatProvider<StreamChatGenerics> value={chatContext}>\n <TranslationProvider\n value={{ ...translators, userLanguage: client.user?.language || DEFAULT_USER_LANGUAGE }}\n >\n <ThemeProvider style={style}>{children}</ThemeProvider>\n </TranslationProvider>\n </ChatProvider>\n );\n};\n\n/**\n * Chat - Wrapper component for Chat. The needs to be placed around any other chat components.\n * This Chat component provides the ChatContext to all other components.\n *\n * The ChatContext provides the following props:\n *\n * - channel - currently active channel\n * - client - client connection\n * - connectionRecovering - whether or not websocket is reconnecting\n * - isOnline - whether or not set user is active\n * - setActiveChannel - function to set the currently active channel\n *\n * The Chat Component takes the following generics in order:\n * - At (AttachmentType) - custom Attachment object extension\n * - Ct (ChannelType) - custom Channel object extension\n * - Co (CommandType) - custom Command string union extension\n * - Ev (EventType) - custom Event object extension\n * - Me (MessageType) - custom Message object extension\n * - Re (ReactionType) - custom Reaction object extension\n * - Us (UserType) - custom User object extension\n */\nexport const Chat = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n props: PropsWithChildren<ChatProps<StreamChatGenerics>>,\n) => {\n const { style } = useOverlayContext();\n\n return <ChatWithContext {...{ style }} {...props} />;\n};\n"]}
|
|
@@ -199,17 +199,20 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
199
199
|
return attachment.type === 'giphy' && (((_attachment$giphy = attachment.giphy) == null ? void 0 : (_attachment$giphy$gip = _attachment$giphy[giphyVersion]) == null ? void 0 : _attachment$giphy$gip.url) || attachment.thumb_url || attachment.image_url) || attachment.type === 'image' && !attachment.title_link && !attachment.og_scrape_url && (0, _getUrlOfImageAttachment.getUrlOfImageAttachment)(attachment) || (0, _native.isVideoPackageAvailable)() && attachment.type === 'video';
|
|
200
200
|
})) || [];
|
|
201
201
|
var attachmentPhotos = attachmentImages.map(function (a) {
|
|
202
|
+
var _a$giphy, _a$giphy$giphyVersion;
|
|
203
|
+
|
|
202
204
|
var imageUrl = (0, _getUrlOfImageAttachment.getUrlOfImageAttachment)(a);
|
|
205
|
+
var giphyURL = ((_a$giphy = a.giphy) == null ? void 0 : (_a$giphy$giphyVersion = _a$giphy[giphyVersion]) == null ? void 0 : _a$giphy$giphyVersion.url) || a.thumb_url || a.image_url;
|
|
203
206
|
return {
|
|
204
207
|
channelId: cur.cid,
|
|
205
208
|
created_at: cur.created_at,
|
|
206
209
|
id: "photoId-" + cur.id + "-" + imageUrl,
|
|
207
210
|
messageId: cur.id,
|
|
208
|
-
mime_type: a.mime_type,
|
|
211
|
+
mime_type: a.type === 'giphy' ? 'image/gif' : a.mime_type,
|
|
209
212
|
original_height: a.original_height,
|
|
210
213
|
original_width: a.original_width,
|
|
211
214
|
type: a.type,
|
|
212
|
-
uri: (0, _getResizedImageUrl.getResizedImageUrl)({
|
|
215
|
+
uri: a.type === 'giphy' ? giphyURL : (0, _getResizedImageUrl.getResizedImageUrl)({
|
|
213
216
|
height: screenHeight,
|
|
214
217
|
url: imageUrl,
|
|
215
218
|
width: screenWidth
|
|
@@ -374,7 +377,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
374
377
|
__self: _this,
|
|
375
378
|
__source: {
|
|
376
379
|
fileName: _jsxFileName,
|
|
377
|
-
lineNumber:
|
|
380
|
+
lineNumber: 500,
|
|
378
381
|
columnNumber: 5
|
|
379
382
|
}
|
|
380
383
|
}, _react["default"].createElement(_reactNativeReanimated["default"].View, {
|
|
@@ -382,7 +385,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
382
385
|
__self: _this,
|
|
383
386
|
__source: {
|
|
384
387
|
fileName: _jsxFileName,
|
|
385
|
-
lineNumber:
|
|
388
|
+
lineNumber: 501,
|
|
386
389
|
columnNumber: 7
|
|
387
390
|
}
|
|
388
391
|
}), _react["default"].createElement(_reactNativeGestureHandler.TapGestureHandler, {
|
|
@@ -394,7 +397,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
394
397
|
__self: _this,
|
|
395
398
|
__source: {
|
|
396
399
|
fileName: _jsxFileName,
|
|
397
|
-
lineNumber:
|
|
400
|
+
lineNumber: 502,
|
|
398
401
|
columnNumber: 7
|
|
399
402
|
}
|
|
400
403
|
}, _react["default"].createElement(_reactNativeReanimated["default"].View, {
|
|
@@ -402,7 +405,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
402
405
|
__self: _this,
|
|
403
406
|
__source: {
|
|
404
407
|
fileName: _jsxFileName,
|
|
405
|
-
lineNumber:
|
|
408
|
+
lineNumber: 509,
|
|
406
409
|
columnNumber: 9
|
|
407
410
|
}
|
|
408
411
|
}, _react["default"].createElement(_reactNativeGestureHandler.TapGestureHandler, {
|
|
@@ -416,7 +419,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
416
419
|
__self: _this,
|
|
417
420
|
__source: {
|
|
418
421
|
fileName: _jsxFileName,
|
|
419
|
-
lineNumber:
|
|
422
|
+
lineNumber: 510,
|
|
420
423
|
columnNumber: 11
|
|
421
424
|
}
|
|
422
425
|
}, _react["default"].createElement(_reactNativeReanimated["default"].View, {
|
|
@@ -424,7 +427,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
424
427
|
__self: _this,
|
|
425
428
|
__source: {
|
|
426
429
|
fileName: _jsxFileName,
|
|
427
|
-
lineNumber:
|
|
430
|
+
lineNumber: 519,
|
|
428
431
|
columnNumber: 13
|
|
429
432
|
}
|
|
430
433
|
}, _react["default"].createElement(_reactNativeGestureHandler.PinchGestureHandler, {
|
|
@@ -434,7 +437,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
434
437
|
__self: _this,
|
|
435
438
|
__source: {
|
|
436
439
|
fileName: _jsxFileName,
|
|
437
|
-
lineNumber:
|
|
440
|
+
lineNumber: 520,
|
|
438
441
|
columnNumber: 15
|
|
439
442
|
}
|
|
440
443
|
}, _react["default"].createElement(_reactNativeReanimated["default"].View, {
|
|
@@ -442,7 +445,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
442
445
|
__self: _this,
|
|
443
446
|
__source: {
|
|
444
447
|
fileName: _jsxFileName,
|
|
445
|
-
lineNumber:
|
|
448
|
+
lineNumber: 525,
|
|
446
449
|
columnNumber: 17
|
|
447
450
|
}
|
|
448
451
|
}, _react["default"].createElement(_reactNativeGestureHandler.PanGestureHandler, {
|
|
@@ -455,7 +458,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
455
458
|
__self: _this,
|
|
456
459
|
__source: {
|
|
457
460
|
fileName: _jsxFileName,
|
|
458
|
-
lineNumber:
|
|
461
|
+
lineNumber: 526,
|
|
459
462
|
columnNumber: 19
|
|
460
463
|
}
|
|
461
464
|
}, _react["default"].createElement(_reactNativeReanimated["default"].View, {
|
|
@@ -463,7 +466,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
463
466
|
__self: _this,
|
|
464
467
|
__source: {
|
|
465
468
|
fileName: _jsxFileName,
|
|
466
|
-
lineNumber:
|
|
469
|
+
lineNumber: 534,
|
|
467
470
|
columnNumber: 21
|
|
468
471
|
}
|
|
469
472
|
}, _react["default"].createElement(_reactNativeReanimated["default"].View, {
|
|
@@ -477,7 +480,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
477
480
|
__self: _this,
|
|
478
481
|
__source: {
|
|
479
482
|
fileName: _jsxFileName,
|
|
480
|
-
lineNumber:
|
|
483
|
+
lineNumber: 535,
|
|
481
484
|
columnNumber: 23
|
|
482
485
|
}
|
|
483
486
|
}, photos.map(function (photo, i) {
|
|
@@ -508,7 +511,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
508
511
|
__self: _this,
|
|
509
512
|
__source: {
|
|
510
513
|
fileName: _jsxFileName,
|
|
511
|
-
lineNumber:
|
|
514
|
+
lineNumber: 552,
|
|
512
515
|
columnNumber: 29
|
|
513
516
|
}
|
|
514
517
|
}) : _react["default"].createElement(_AnimatedGalleryImage.AnimatedGalleryImage, {
|
|
@@ -531,7 +534,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
531
534
|
__self: _this,
|
|
532
535
|
__source: {
|
|
533
536
|
fileName: _jsxFileName,
|
|
534
|
-
lineNumber:
|
|
537
|
+
lineNumber: 579,
|
|
535
538
|
columnNumber: 29
|
|
536
539
|
}
|
|
537
540
|
});
|
|
@@ -543,7 +546,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
543
546
|
__self: _this,
|
|
544
547
|
__source: {
|
|
545
548
|
fileName: _jsxFileName,
|
|
546
|
-
lineNumber:
|
|
549
|
+
lineNumber: 611,
|
|
547
550
|
columnNumber: 7
|
|
548
551
|
}
|
|
549
552
|
})), _react["default"].createElement(_ImageGalleryFooter.ImageGalleryFooter, (0, _extends2["default"])({
|
|
@@ -562,7 +565,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
562
565
|
__self: _this,
|
|
563
566
|
__source: {
|
|
564
567
|
fileName: _jsxFileName,
|
|
565
|
-
lineNumber:
|
|
568
|
+
lineNumber: 617,
|
|
566
569
|
columnNumber: 7
|
|
567
570
|
}
|
|
568
571
|
})), _react["default"].createElement(_ImageGalleryOverlay.ImageGalleryOverlay, {
|
|
@@ -572,14 +575,14 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
572
575
|
__self: _this,
|
|
573
576
|
__source: {
|
|
574
577
|
fileName: _jsxFileName,
|
|
575
|
-
lineNumber:
|
|
578
|
+
lineNumber: 632,
|
|
576
579
|
columnNumber: 7
|
|
577
580
|
}
|
|
578
581
|
}), _react["default"].createElement(_bottomSheet.BottomSheetModalProvider, {
|
|
579
582
|
__self: _this,
|
|
580
583
|
__source: {
|
|
581
584
|
fileName: _jsxFileName,
|
|
582
|
-
lineNumber:
|
|
585
|
+
lineNumber: 637,
|
|
583
586
|
columnNumber: 7
|
|
584
587
|
}
|
|
585
588
|
}, _react["default"].createElement(_bottomSheet.BottomSheetModal, {
|
|
@@ -592,7 +595,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
592
595
|
__self: _this,
|
|
593
596
|
__source: {
|
|
594
597
|
fileName: _jsxFileName,
|
|
595
|
-
lineNumber:
|
|
598
|
+
lineNumber: 642,
|
|
596
599
|
columnNumber: 13
|
|
597
600
|
}
|
|
598
601
|
}));
|
|
@@ -607,7 +610,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
607
610
|
__self: _this,
|
|
608
611
|
__source: {
|
|
609
612
|
fileName: _jsxFileName,
|
|
610
|
-
lineNumber:
|
|
613
|
+
lineNumber: 638,
|
|
611
614
|
columnNumber: 9
|
|
612
615
|
}
|
|
613
616
|
}, _react["default"].createElement(_ImageGrid.ImageGrid, (0, _extends2["default"])({
|
|
@@ -619,7 +622,7 @@ var ImageGallery = function ImageGallery(props) {
|
|
|
619
622
|
__self: _this,
|
|
620
623
|
__source: {
|
|
621
624
|
fileName: _jsxFileName,
|
|
622
|
-
lineNumber:
|
|
625
|
+
lineNumber: 653,
|
|
623
626
|
columnNumber: 11
|
|
624
627
|
}
|
|
625
628
|
})))));
|