@sendbird/uikit-react-native 3.11.1 → 3.11.2

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.
@@ -226,9 +226,6 @@ const GroupChannelMessageList = props => {
226
226
  timeout: 250
227
227
  });
228
228
  }
229
- },
230
- onChannelChanged(channel) {
231
- if ((0, _uikitUtils.isDifferentChannel)(channel, props.channel)) return;
232
229
  }
233
230
  });
234
231
  (0, _react.useEffect)(() => {
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireWildcard","require","_uikitReactNativeFoundation","_uikitTools","_uikitUtils","_ChannelMessageList","_interopRequireDefault","_constants","_useContext","_moduleContext","e","__esModule","default","_getRequireWildcardCache","WeakMap","r","t","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","_extends","assign","bind","arguments","length","apply","GroupChannelMessageList","props","toast","useToast","STRINGS","useLocalization","sdk","sbOptions","groupChannelFragmentOptions","useSendbirdChat","setMessageToEdit","setMessageToReply","useContext","GroupChannelContexts","Fragment","groupChannelPubSub","PubSub","flatListRef","lazyScrollToBottom","lazyScrollToMessageId","onPressReplyMessageInThread","MessageList","isFirstMount","useIsFirstMount","hasSeenNewLineRef","useRef","isNewLineInViewportRef","isNewLineExistInChannelRef","scrolledAwayFromBottomRef","isVisibleUnreadMessageFloating","setIsVisibleUnreadMessageFloating","useState","viewableMessages","hasUserMarkedAsUnreadRef","unreadFirstMessage","setUnreadFirstMessage","undefined","pendingBottomReachedRef","updateHasSeenNewLine","useCallback","hasSeenNewLine","current","_props$onNewLineSeenC","onNewLineSeenChange","updateHasUserMarkedAsUnread","hasUserMarkedAsUnread","_props$onUserMarkedAs","onUserMarkedAsUnreadChange","scrollToMessageWithCreatedAt","useFreshCallback","createdAt","focusAnimated","timeout","foundMessage","messages","find","it","isIncludedInList","setTimeout","onUpdateSearchItem","startingPoint","MESSAGE_FOCUS_ANIMATION_DELAY","timestamp","Date","now","messageId","animated","channel","messageOffsetTimestamp","onResetMessageListWithStartingPoint","catch","_","onScrolledAwayFromBottom","value","scrollToBottom","hasNext","onResetMessageList","onPressUnreadMessagesFloatingCloseButton","_props$resetNewMessag","resetNewMessages","confirmAndMarkAsRead","url","getPrevNonSilentMessage","prevMessageIndex","prevMessage","silent","findFirstUnreadMessage","isNewLineExistInChannel","uikit","groupChannel","enableMarkAsUnread","msg","index","_props$hasPrevious","isMarkedAsUnreadMessage","myLastRead","prevNonSilentMessage","hasNoPreviousAndNoPrevMessage","hasPrevious","prevMessageIsRead","isMessageUnread","useEffect","foundUnreadFirstMessage","processNewLineVisibility","unreadFirstMsg","_viewableMessages$cur","isNewLineInViewport","some","message","updateUnreadMessagesFloatingProps","newMessages","markAsUnread","markAsRead","onViewableItemsChanged","info","viewableItems","filter","token","item","map","onPressMarkAsUnreadMessage","unreadMessagesFloatingPropsRef","canAutoMarkAsRead","visible","unreadMessageCount","onPressClose","useGroupChannelHandler","onReactionUpdated","event","isDifferentChannel","recentMessage","isRecentMessage","scrollReachedBottomAndCanScroll","scrolledAwayFromBottom","onChannelChanged","subscribe","type","data","lastMessage","updatedMessage","lastMessageUpdated","isMaybeStreaming","hasAiBot","foundFirstUnreadMessage","pubsub","payload","MESSAGE_SEARCH_SAFE_SCROLL_DELAY","searchItem","onPressParentMessage","parentMessage","childMessage","replyType","threadReplySelectType","show","TOAST","FIND_PARENT_MSG_ERROR","canScrollToParent","onBottomReached","currentTime","elapsedTime","timeoutThreshold","_props$onBottomReache","_props$onBottomReache2","createElement","ref","onReplyMessage","onReplyInThreadMessage","onEditMessage","onPressNewMessagesButton","onPressScrollToBottomButton","unreadMessagesFloatingProps","_default","exports","React","memo"],"sources":["GroupChannelMessageList.tsx"],"sourcesContent":["import type { ViewToken } from '@react-native/virtualized-lists';\nimport React, { useCallback, useContext, useEffect, useRef, useState } from 'react';\n\nimport { useToast } from '@sendbird/uikit-react-native-foundation';\nimport { useGroupChannelHandler } from '@sendbird/uikit-tools';\nimport {\n SendbirdMessage,\n SendbirdSendableMessage,\n confirmAndMarkAsRead,\n isDifferentChannel,\n useFreshCallback,\n useIsFirstMount,\n} from '@sendbird/uikit-utils';\n\nimport ChannelMessageList from '../../../components/ChannelMessageList';\nimport { UnreadMessagesFloatingProps } from '../../../components/UnreadMessagesFloating';\nimport { MESSAGE_FOCUS_ANIMATION_DELAY, MESSAGE_SEARCH_SAFE_SCROLL_DELAY } from '../../../constants';\nimport { GroupChannelFragmentOptionsPubSubContextPayload } from '../../../contexts/SendbirdChatCtx';\nimport { useLocalization, useSendbirdChat } from '../../../hooks/useContext';\nimport { GroupChannelContexts } from '../module/moduleContext';\nimport type { GroupChannelProps } from '../types';\n\nconst GroupChannelMessageList = (props: GroupChannelProps['MessageList']) => {\n const toast = useToast();\n const { STRINGS } = useLocalization();\n const { sdk, sbOptions, groupChannelFragmentOptions } = useSendbirdChat();\n const { setMessageToEdit, setMessageToReply } = useContext(GroupChannelContexts.Fragment);\n const groupChannelPubSub = useContext(GroupChannelContexts.PubSub);\n const { flatListRef, lazyScrollToBottom, lazyScrollToMessageId, onPressReplyMessageInThread } = useContext(\n GroupChannelContexts.MessageList,\n );\n\n const isFirstMount = useIsFirstMount();\n\n const hasSeenNewLineRef = useRef(false);\n const isNewLineInViewportRef = useRef(false);\n const isNewLineExistInChannelRef = useRef(false);\n const scrolledAwayFromBottomRef = useRef(false);\n const [isVisibleUnreadMessageFloating, setIsVisibleUnreadMessageFloating] = useState(false);\n const viewableMessages = useRef<SendbirdMessage[]>();\n const hasUserMarkedAsUnreadRef = useRef(false);\n const [unreadFirstMessage, setUnreadFirstMessage] = useState<SendbirdMessage | undefined>(undefined);\n const pendingBottomReachedRef = useRef<{ timeout: number; timestamp: number } | null>(null);\n\n const updateHasSeenNewLine = useCallback(\n (hasSeenNewLine: boolean) => {\n if (hasSeenNewLineRef.current !== hasSeenNewLine) {\n hasSeenNewLineRef.current = hasSeenNewLine;\n props.onNewLineSeenChange?.(hasSeenNewLine);\n }\n },\n [props.onNewLineSeenChange],\n );\n\n const updateHasUserMarkedAsUnread = useCallback(\n (hasUserMarkedAsUnread: boolean) => {\n if (hasUserMarkedAsUnreadRef.current !== hasUserMarkedAsUnread) {\n hasUserMarkedAsUnreadRef.current = hasUserMarkedAsUnread;\n props.onUserMarkedAsUnreadChange?.(hasUserMarkedAsUnread);\n }\n },\n [props.onUserMarkedAsUnreadChange],\n );\n\n const scrollToMessageWithCreatedAt = useFreshCallback(\n (createdAt: number, focusAnimated: boolean, timeout: number): boolean => {\n const foundMessage = props.messages.find((it) => it.createdAt === createdAt);\n const isIncludedInList = !!foundMessage;\n pendingBottomReachedRef.current = null;\n\n if (isIncludedInList) {\n if (focusAnimated) {\n setTimeout(() => props.onUpdateSearchItem({ startingPoint: createdAt }), MESSAGE_FOCUS_ANIMATION_DELAY);\n }\n pendingBottomReachedRef.current = { timeout, timestamp: Date.now() };\n lazyScrollToMessageId({ messageId: foundMessage.messageId, animated: true, timeout });\n } else {\n if (props.channel.messageOffsetTimestamp <= createdAt) {\n if (focusAnimated) {\n props.onUpdateSearchItem({ startingPoint: createdAt });\n }\n props.onResetMessageListWithStartingPoint(createdAt).catch((_) => {});\n } else {\n return false;\n }\n }\n return true;\n },\n );\n\n const onScrolledAwayFromBottom = useFreshCallback((value: boolean) => {\n scrolledAwayFromBottomRef.current = value;\n props.onScrolledAwayFromBottom(value);\n });\n\n const scrollToBottom = useFreshCallback(async (animated = false) => {\n if (props.hasNext()) {\n props.onUpdateSearchItem(undefined);\n onScrolledAwayFromBottom(false);\n\n await props.onResetMessageList().catch((_) => {});\n onScrolledAwayFromBottom(false);\n lazyScrollToBottom({ animated });\n } else {\n lazyScrollToBottom({ animated });\n }\n });\n\n const onPressUnreadMessagesFloatingCloseButton = useCallback(() => {\n updateHasSeenNewLine(true);\n updateHasUserMarkedAsUnread(false);\n props.resetNewMessages?.();\n confirmAndMarkAsRead([props.channel]);\n }, [updateHasSeenNewLine, updateHasUserMarkedAsUnread, props.channel.url, props.resetNewMessages]);\n\n const getPrevNonSilentMessage = useCallback(\n (messages: SendbirdMessage[], prevMessageIndex: number): SendbirdMessage | null => {\n if (messages.length <= prevMessageIndex) {\n return null;\n }\n\n const prevMessage = messages[prevMessageIndex];\n if (prevMessage) {\n if (prevMessage.silent) {\n return getPrevNonSilentMessage(messages, prevMessageIndex + 1);\n } else {\n return prevMessage;\n }\n }\n return null;\n },\n [],\n );\n\n const findFirstUnreadMessage = useFreshCallback((isNewLineExistInChannel: boolean) => {\n if (!sbOptions.uikit.groupChannel.channel.enableMarkAsUnread || !isNewLineExistInChannel) {\n return;\n }\n\n return props.messages.find((msg, index) => {\n if (msg.silent) {\n return false;\n }\n\n const isMarkedAsUnreadMessage = props.channel.myLastRead === msg.createdAt - 1;\n if (isMarkedAsUnreadMessage) {\n return true;\n }\n\n const prevNonSilentMessage = getPrevNonSilentMessage(props.messages, index + 1);\n const hasNoPreviousAndNoPrevMessage = !props.hasPrevious?.() && prevNonSilentMessage == null;\n const prevMessageIsRead =\n prevNonSilentMessage != null && prevNonSilentMessage.createdAt <= props.channel.myLastRead;\n const isMessageUnread = props.channel.myLastRead < msg.createdAt;\n return (hasNoPreviousAndNoPrevMessage || prevMessageIsRead) && isMessageUnread;\n });\n });\n\n useEffect(() => {\n if (!unreadFirstMessage) {\n const foundUnreadFirstMessage = findFirstUnreadMessage(props.isNewLineExistInChannel ?? false);\n if (foundUnreadFirstMessage) {\n processNewLineVisibility(foundUnreadFirstMessage);\n setUnreadFirstMessage(foundUnreadFirstMessage);\n }\n }\n }, [props.messages, props.channel.myLastRead, sbOptions.uikit.groupChannel.channel.enableMarkAsUnread]);\n\n const processNewLineVisibility = useFreshCallback((unreadFirstMsg: SendbirdMessage | undefined) => {\n const isNewLineInViewport = !!viewableMessages.current?.some(\n (message) => message.messageId === unreadFirstMsg?.messageId,\n );\n\n if (isNewLineInViewportRef.current !== isNewLineInViewport) {\n isNewLineInViewportRef.current = isNewLineInViewport;\n updateUnreadMessagesFloatingProps();\n if (!isNewLineInViewport || hasSeenNewLineRef.current) {\n return;\n }\n\n updateHasSeenNewLine(true);\n if (hasUserMarkedAsUnreadRef.current) {\n return;\n }\n\n if (0 < props.newMessages.length) {\n props.channel.markAsUnread(props.newMessages[0]);\n } else {\n props.channel.markAsRead();\n }\n }\n });\n\n const onViewableItemsChanged = useFreshCallback(\n async (info: { viewableItems: Array<ViewToken<SendbirdMessage>>; changed: Array<ViewToken<SendbirdMessage>> }) => {\n if (!sbOptions.uikit.groupChannel.channel.enableMarkAsUnread) {\n return;\n }\n\n viewableMessages.current = info.viewableItems.filter((token) => token.item).map((token) => token.item);\n processNewLineVisibility(unreadFirstMessage);\n },\n );\n\n const onPressMarkAsUnreadMessage = useCallback(\n async (message: SendbirdMessage) => {\n if (sbOptions.uikit.groupChannel.channel.enableMarkAsUnread && message) {\n await props.channel.markAsUnread(message);\n updateHasUserMarkedAsUnread(true);\n }\n },\n [sbOptions.uikit.groupChannel.channel.enableMarkAsUnread, updateHasUserMarkedAsUnread],\n );\n\n useEffect(() => {\n isNewLineExistInChannelRef.current = !!props.isNewLineExistInChannel && !!viewableMessages.current;\n }, [props.isNewLineExistInChannel, viewableMessages.current]);\n\n const unreadMessagesFloatingPropsRef = useRef<UnreadMessagesFloatingProps>();\n const updateUnreadMessagesFloatingProps = useFreshCallback(() => {\n const canAutoMarkAsRead =\n !scrolledAwayFromBottomRef.current &&\n !hasUserMarkedAsUnreadRef.current &&\n (hasSeenNewLineRef.current || !isNewLineExistInChannelRef.current);\n\n unreadMessagesFloatingPropsRef.current = {\n visible:\n sbOptions.uikit.groupChannel.channel.enableMarkAsUnread &&\n !canAutoMarkAsRead &&\n isNewLineExistInChannelRef.current &&\n 0 < props.channel.unreadMessageCount &&\n !isNewLineInViewportRef.current,\n onPressClose: onPressUnreadMessagesFloatingCloseButton,\n unreadMessageCount: props.channel.unreadMessageCount,\n };\n if (isVisibleUnreadMessageFloating !== unreadMessagesFloatingPropsRef.current.visible) {\n setIsVisibleUnreadMessageFloating(unreadMessagesFloatingPropsRef.current.visible);\n }\n });\n\n useEffect(() => {\n updateUnreadMessagesFloatingProps();\n }, [\n isNewLineExistInChannelRef.current,\n props.channel.unreadMessageCount,\n sbOptions.uikit.groupChannel.channel.enableMarkAsUnread,\n ]);\n\n useGroupChannelHandler(sdk, {\n onReactionUpdated(channel, event) {\n if (isDifferentChannel(channel, props.channel)) return;\n const recentMessage = props.messages[0];\n const isRecentMessage = recentMessage && recentMessage.messageId === event.messageId;\n const scrollReachedBottomAndCanScroll = !props.scrolledAwayFromBottom && !props.hasNext();\n if (isRecentMessage && scrollReachedBottomAndCanScroll) {\n lazyScrollToBottom({ animated: true, timeout: 250 });\n }\n },\n onChannelChanged(channel) {\n if (isDifferentChannel(channel, props.channel)) return;\n },\n });\n\n useEffect(() => {\n return groupChannelPubSub.subscribe(({ type, data }) => {\n switch (type) {\n case 'TYPING_BUBBLE_RENDERED':\n case 'MESSAGES_RECEIVED': {\n if (!props.scrolledAwayFromBottom) {\n scrollToBottom(true);\n }\n break;\n }\n case 'MESSAGES_UPDATED': {\n const lastMessage = props.channel.lastMessage;\n const [updatedMessage] = data.messages;\n\n const lastMessageUpdated =\n updatedMessage && lastMessage && lastMessage.messageId === updatedMessage.messageId;\n\n const isMaybeStreaming = props.channel.hasAiBot && lastMessageUpdated;\n\n if (isMaybeStreaming) {\n scrollToBottom(false);\n } else if (!props.scrolledAwayFromBottom && lastMessageUpdated) {\n scrollToBottom(true);\n }\n break;\n }\n case 'MESSAGE_SENT_SUCCESS':\n case 'MESSAGE_SENT_PENDING': {\n scrollToBottom(false);\n break;\n }\n case 'ON_MARKED_AS_READ_BY_CURRENT_USER': {\n updateUnreadMessagesFloatingProps();\n break;\n }\n case 'ON_MARKED_AS_UNREAD_BY_CURRENT_USER': {\n isNewLineExistInChannelRef.current = true;\n const foundFirstUnreadMessage = findFirstUnreadMessage(true);\n processNewLineVisibility(foundFirstUnreadMessage);\n setUnreadFirstMessage(foundFirstUnreadMessage);\n if (!props.scrolledAwayFromBottom) {\n scrollToBottom(true);\n }\n break;\n }\n }\n });\n }, [props.scrolledAwayFromBottom]);\n\n useEffect(() => {\n return groupChannelFragmentOptions.pubsub.subscribe((payload: GroupChannelFragmentOptionsPubSubContextPayload) => {\n switch (payload.type) {\n case 'OVERRIDE_SEARCH_ITEM_STARTING_POINT': {\n scrollToMessageWithCreatedAt(payload.data.startingPoint, false, MESSAGE_SEARCH_SAFE_SCROLL_DELAY);\n break;\n }\n }\n });\n }, []);\n\n useEffect(() => {\n // Only trigger once when message list mount with initial props.searchItem\n // - Search screen + searchItem > mount message list\n // - Reset message list + searchItem > re-mount message list\n if (isFirstMount && props.searchItem) {\n scrollToMessageWithCreatedAt(props.searchItem.startingPoint, false, MESSAGE_SEARCH_SAFE_SCROLL_DELAY);\n }\n }, [isFirstMount]);\n\n const onPressParentMessage = useFreshCallback(\n (parentMessage: SendbirdMessage, childMessage: SendbirdSendableMessage) => {\n if (\n onPressReplyMessageInThread &&\n sbOptions.uikit.groupChannel.channel.replyType === 'thread' &&\n sbOptions.uikit.groupChannel.channel.threadReplySelectType === 'thread'\n ) {\n if (parentMessage.createdAt >= props.channel.messageOffsetTimestamp) {\n onPressReplyMessageInThread(parentMessage as SendbirdSendableMessage, childMessage.createdAt);\n } else {\n toast.show(STRINGS.TOAST.FIND_PARENT_MSG_ERROR, 'error');\n }\n } else {\n const canScrollToParent = scrollToMessageWithCreatedAt(parentMessage.createdAt, true, 0);\n if (!canScrollToParent) toast.show(STRINGS.TOAST.FIND_PARENT_MSG_ERROR, 'error');\n }\n },\n );\n\n const onBottomReached = useFreshCallback(() => {\n if (props.hasNext()) {\n if (pendingBottomReachedRef.current) {\n const currentTime = Date.now();\n const elapsedTime = currentTime - pendingBottomReachedRef.current.timestamp;\n\n const timeoutThreshold = 500;\n if (elapsedTime >= pendingBottomReachedRef.current.timeout + timeoutThreshold) {\n props.onBottomReached?.();\n pendingBottomReachedRef.current = null;\n }\n } else {\n props.onBottomReached?.();\n }\n }\n });\n\n return (\n <ChannelMessageList\n {...props}\n ref={flatListRef}\n onScrolledAwayFromBottom={onScrolledAwayFromBottom}\n onReplyMessage={setMessageToReply}\n onReplyInThreadMessage={setMessageToReply}\n onEditMessage={setMessageToEdit}\n onViewableItemsChanged={onViewableItemsChanged}\n onPressParentMessage={onPressParentMessage}\n onPressNewMessagesButton={scrollToBottom}\n onPressScrollToBottomButton={scrollToBottom}\n onPressMarkAsUnreadMessage={onPressMarkAsUnreadMessage}\n onBottomReached={onBottomReached}\n unreadFirstMessage={unreadFirstMessage}\n unreadMessagesFloatingProps={unreadMessagesFloatingPropsRef.current}\n />\n );\n};\n\nexport default React.memo(GroupChannelMessageList);\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_uikitReactNativeFoundation","_uikitTools","_uikitUtils","_ChannelMessageList","_interopRequireDefault","_constants","_useContext","_moduleContext","e","__esModule","default","_getRequireWildcardCache","WeakMap","r","t","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","_extends","assign","bind","arguments","length","apply","GroupChannelMessageList","props","toast","useToast","STRINGS","useLocalization","sdk","sbOptions","groupChannelFragmentOptions","useSendbirdChat","setMessageToEdit","setMessageToReply","useContext","GroupChannelContexts","Fragment","groupChannelPubSub","PubSub","flatListRef","lazyScrollToBottom","lazyScrollToMessageId","onPressReplyMessageInThread","MessageList","isFirstMount","useIsFirstMount","hasSeenNewLineRef","useRef","isNewLineInViewportRef","isNewLineExistInChannelRef","scrolledAwayFromBottomRef","isVisibleUnreadMessageFloating","setIsVisibleUnreadMessageFloating","useState","viewableMessages","hasUserMarkedAsUnreadRef","unreadFirstMessage","setUnreadFirstMessage","undefined","pendingBottomReachedRef","updateHasSeenNewLine","useCallback","hasSeenNewLine","current","_props$onNewLineSeenC","onNewLineSeenChange","updateHasUserMarkedAsUnread","hasUserMarkedAsUnread","_props$onUserMarkedAs","onUserMarkedAsUnreadChange","scrollToMessageWithCreatedAt","useFreshCallback","createdAt","focusAnimated","timeout","foundMessage","messages","find","it","isIncludedInList","setTimeout","onUpdateSearchItem","startingPoint","MESSAGE_FOCUS_ANIMATION_DELAY","timestamp","Date","now","messageId","animated","channel","messageOffsetTimestamp","onResetMessageListWithStartingPoint","catch","_","onScrolledAwayFromBottom","value","scrollToBottom","hasNext","onResetMessageList","onPressUnreadMessagesFloatingCloseButton","_props$resetNewMessag","resetNewMessages","confirmAndMarkAsRead","url","getPrevNonSilentMessage","prevMessageIndex","prevMessage","silent","findFirstUnreadMessage","isNewLineExistInChannel","uikit","groupChannel","enableMarkAsUnread","msg","index","_props$hasPrevious","isMarkedAsUnreadMessage","myLastRead","prevNonSilentMessage","hasNoPreviousAndNoPrevMessage","hasPrevious","prevMessageIsRead","isMessageUnread","useEffect","foundUnreadFirstMessage","processNewLineVisibility","unreadFirstMsg","_viewableMessages$cur","isNewLineInViewport","some","message","updateUnreadMessagesFloatingProps","newMessages","markAsUnread","markAsRead","onViewableItemsChanged","info","viewableItems","filter","token","item","map","onPressMarkAsUnreadMessage","unreadMessagesFloatingPropsRef","canAutoMarkAsRead","visible","unreadMessageCount","onPressClose","useGroupChannelHandler","onReactionUpdated","event","isDifferentChannel","recentMessage","isRecentMessage","scrollReachedBottomAndCanScroll","scrolledAwayFromBottom","subscribe","type","data","lastMessage","updatedMessage","lastMessageUpdated","isMaybeStreaming","hasAiBot","foundFirstUnreadMessage","pubsub","payload","MESSAGE_SEARCH_SAFE_SCROLL_DELAY","searchItem","onPressParentMessage","parentMessage","childMessage","replyType","threadReplySelectType","show","TOAST","FIND_PARENT_MSG_ERROR","canScrollToParent","onBottomReached","currentTime","elapsedTime","timeoutThreshold","_props$onBottomReache","_props$onBottomReache2","createElement","ref","onReplyMessage","onReplyInThreadMessage","onEditMessage","onPressNewMessagesButton","onPressScrollToBottomButton","unreadMessagesFloatingProps","_default","exports","React","memo"],"sources":["GroupChannelMessageList.tsx"],"sourcesContent":["import type { ViewToken } from '@react-native/virtualized-lists';\nimport React, { useCallback, useContext, useEffect, useRef, useState } from 'react';\n\nimport { useToast } from '@sendbird/uikit-react-native-foundation';\nimport { useGroupChannelHandler } from '@sendbird/uikit-tools';\nimport {\n SendbirdMessage,\n SendbirdSendableMessage,\n confirmAndMarkAsRead,\n isDifferentChannel,\n useFreshCallback,\n useIsFirstMount,\n} from '@sendbird/uikit-utils';\n\nimport ChannelMessageList from '../../../components/ChannelMessageList';\nimport { UnreadMessagesFloatingProps } from '../../../components/UnreadMessagesFloating';\nimport { MESSAGE_FOCUS_ANIMATION_DELAY, MESSAGE_SEARCH_SAFE_SCROLL_DELAY } from '../../../constants';\nimport { GroupChannelFragmentOptionsPubSubContextPayload } from '../../../contexts/SendbirdChatCtx';\nimport { useLocalization, useSendbirdChat } from '../../../hooks/useContext';\nimport { GroupChannelContexts } from '../module/moduleContext';\nimport type { GroupChannelProps } from '../types';\n\nconst GroupChannelMessageList = (props: GroupChannelProps['MessageList']) => {\n const toast = useToast();\n const { STRINGS } = useLocalization();\n const { sdk, sbOptions, groupChannelFragmentOptions } = useSendbirdChat();\n const { setMessageToEdit, setMessageToReply } = useContext(GroupChannelContexts.Fragment);\n const groupChannelPubSub = useContext(GroupChannelContexts.PubSub);\n const { flatListRef, lazyScrollToBottom, lazyScrollToMessageId, onPressReplyMessageInThread } = useContext(\n GroupChannelContexts.MessageList,\n );\n\n const isFirstMount = useIsFirstMount();\n\n const hasSeenNewLineRef = useRef(false);\n const isNewLineInViewportRef = useRef(false);\n const isNewLineExistInChannelRef = useRef(false);\n const scrolledAwayFromBottomRef = useRef(false);\n const [isVisibleUnreadMessageFloating, setIsVisibleUnreadMessageFloating] = useState(false);\n const viewableMessages = useRef<SendbirdMessage[]>();\n const hasUserMarkedAsUnreadRef = useRef(false);\n const [unreadFirstMessage, setUnreadFirstMessage] = useState<SendbirdMessage | undefined>(undefined);\n const pendingBottomReachedRef = useRef<{ timeout: number; timestamp: number } | null>(null);\n\n const updateHasSeenNewLine = useCallback(\n (hasSeenNewLine: boolean) => {\n if (hasSeenNewLineRef.current !== hasSeenNewLine) {\n hasSeenNewLineRef.current = hasSeenNewLine;\n props.onNewLineSeenChange?.(hasSeenNewLine);\n }\n },\n [props.onNewLineSeenChange],\n );\n\n const updateHasUserMarkedAsUnread = useCallback(\n (hasUserMarkedAsUnread: boolean) => {\n if (hasUserMarkedAsUnreadRef.current !== hasUserMarkedAsUnread) {\n hasUserMarkedAsUnreadRef.current = hasUserMarkedAsUnread;\n props.onUserMarkedAsUnreadChange?.(hasUserMarkedAsUnread);\n }\n },\n [props.onUserMarkedAsUnreadChange],\n );\n\n const scrollToMessageWithCreatedAt = useFreshCallback(\n (createdAt: number, focusAnimated: boolean, timeout: number): boolean => {\n const foundMessage = props.messages.find((it) => it.createdAt === createdAt);\n const isIncludedInList = !!foundMessage;\n pendingBottomReachedRef.current = null;\n\n if (isIncludedInList) {\n if (focusAnimated) {\n setTimeout(() => props.onUpdateSearchItem({ startingPoint: createdAt }), MESSAGE_FOCUS_ANIMATION_DELAY);\n }\n pendingBottomReachedRef.current = { timeout, timestamp: Date.now() };\n lazyScrollToMessageId({ messageId: foundMessage.messageId, animated: true, timeout });\n } else {\n if (props.channel.messageOffsetTimestamp <= createdAt) {\n if (focusAnimated) {\n props.onUpdateSearchItem({ startingPoint: createdAt });\n }\n props.onResetMessageListWithStartingPoint(createdAt).catch((_) => {});\n } else {\n return false;\n }\n }\n return true;\n },\n );\n\n const onScrolledAwayFromBottom = useFreshCallback((value: boolean) => {\n scrolledAwayFromBottomRef.current = value;\n props.onScrolledAwayFromBottom(value);\n });\n\n const scrollToBottom = useFreshCallback(async (animated = false) => {\n if (props.hasNext()) {\n props.onUpdateSearchItem(undefined);\n onScrolledAwayFromBottom(false);\n\n await props.onResetMessageList().catch((_) => {});\n onScrolledAwayFromBottom(false);\n lazyScrollToBottom({ animated });\n } else {\n lazyScrollToBottom({ animated });\n }\n });\n\n const onPressUnreadMessagesFloatingCloseButton = useCallback(() => {\n updateHasSeenNewLine(true);\n updateHasUserMarkedAsUnread(false);\n props.resetNewMessages?.();\n confirmAndMarkAsRead([props.channel]);\n }, [updateHasSeenNewLine, updateHasUserMarkedAsUnread, props.channel.url, props.resetNewMessages]);\n\n const getPrevNonSilentMessage = useCallback(\n (messages: SendbirdMessage[], prevMessageIndex: number): SendbirdMessage | null => {\n if (messages.length <= prevMessageIndex) {\n return null;\n }\n\n const prevMessage = messages[prevMessageIndex];\n if (prevMessage) {\n if (prevMessage.silent) {\n return getPrevNonSilentMessage(messages, prevMessageIndex + 1);\n } else {\n return prevMessage;\n }\n }\n return null;\n },\n [],\n );\n\n const findFirstUnreadMessage = useFreshCallback((isNewLineExistInChannel: boolean) => {\n if (!sbOptions.uikit.groupChannel.channel.enableMarkAsUnread || !isNewLineExistInChannel) {\n return;\n }\n\n return props.messages.find((msg, index) => {\n if (msg.silent) {\n return false;\n }\n\n const isMarkedAsUnreadMessage = props.channel.myLastRead === msg.createdAt - 1;\n if (isMarkedAsUnreadMessage) {\n return true;\n }\n\n const prevNonSilentMessage = getPrevNonSilentMessage(props.messages, index + 1);\n const hasNoPreviousAndNoPrevMessage = !props.hasPrevious?.() && prevNonSilentMessage == null;\n const prevMessageIsRead =\n prevNonSilentMessage != null && prevNonSilentMessage.createdAt <= props.channel.myLastRead;\n const isMessageUnread = props.channel.myLastRead < msg.createdAt;\n return (hasNoPreviousAndNoPrevMessage || prevMessageIsRead) && isMessageUnread;\n });\n });\n\n useEffect(() => {\n if (!unreadFirstMessage) {\n const foundUnreadFirstMessage = findFirstUnreadMessage(props.isNewLineExistInChannel ?? false);\n if (foundUnreadFirstMessage) {\n processNewLineVisibility(foundUnreadFirstMessage);\n setUnreadFirstMessage(foundUnreadFirstMessage);\n }\n }\n }, [props.messages, props.channel.myLastRead, sbOptions.uikit.groupChannel.channel.enableMarkAsUnread]);\n\n const processNewLineVisibility = useFreshCallback((unreadFirstMsg: SendbirdMessage | undefined) => {\n const isNewLineInViewport = !!viewableMessages.current?.some(\n (message) => message.messageId === unreadFirstMsg?.messageId,\n );\n\n if (isNewLineInViewportRef.current !== isNewLineInViewport) {\n isNewLineInViewportRef.current = isNewLineInViewport;\n updateUnreadMessagesFloatingProps();\n if (!isNewLineInViewport || hasSeenNewLineRef.current) {\n return;\n }\n\n updateHasSeenNewLine(true);\n if (hasUserMarkedAsUnreadRef.current) {\n return;\n }\n\n if (0 < props.newMessages.length) {\n props.channel.markAsUnread(props.newMessages[0]);\n } else {\n props.channel.markAsRead();\n }\n }\n });\n\n const onViewableItemsChanged = useFreshCallback(\n async (info: { viewableItems: Array<ViewToken<SendbirdMessage>>; changed: Array<ViewToken<SendbirdMessage>> }) => {\n if (!sbOptions.uikit.groupChannel.channel.enableMarkAsUnread) {\n return;\n }\n\n viewableMessages.current = info.viewableItems.filter((token) => token.item).map((token) => token.item);\n processNewLineVisibility(unreadFirstMessage);\n },\n );\n\n const onPressMarkAsUnreadMessage = useCallback(\n async (message: SendbirdMessage) => {\n if (sbOptions.uikit.groupChannel.channel.enableMarkAsUnread && message) {\n await props.channel.markAsUnread(message);\n updateHasUserMarkedAsUnread(true);\n }\n },\n [sbOptions.uikit.groupChannel.channel.enableMarkAsUnread, updateHasUserMarkedAsUnread],\n );\n\n useEffect(() => {\n isNewLineExistInChannelRef.current = !!props.isNewLineExistInChannel && !!viewableMessages.current;\n }, [props.isNewLineExistInChannel, viewableMessages.current]);\n\n const unreadMessagesFloatingPropsRef = useRef<UnreadMessagesFloatingProps>();\n const updateUnreadMessagesFloatingProps = useFreshCallback(() => {\n const canAutoMarkAsRead =\n !scrolledAwayFromBottomRef.current &&\n !hasUserMarkedAsUnreadRef.current &&\n (hasSeenNewLineRef.current || !isNewLineExistInChannelRef.current);\n\n unreadMessagesFloatingPropsRef.current = {\n visible:\n sbOptions.uikit.groupChannel.channel.enableMarkAsUnread &&\n !canAutoMarkAsRead &&\n isNewLineExistInChannelRef.current &&\n 0 < props.channel.unreadMessageCount &&\n !isNewLineInViewportRef.current,\n onPressClose: onPressUnreadMessagesFloatingCloseButton,\n unreadMessageCount: props.channel.unreadMessageCount,\n };\n if (isVisibleUnreadMessageFloating !== unreadMessagesFloatingPropsRef.current.visible) {\n setIsVisibleUnreadMessageFloating(unreadMessagesFloatingPropsRef.current.visible);\n }\n });\n\n useEffect(() => {\n updateUnreadMessagesFloatingProps();\n }, [\n isNewLineExistInChannelRef.current,\n props.channel.unreadMessageCount,\n sbOptions.uikit.groupChannel.channel.enableMarkAsUnread,\n ]);\n\n useGroupChannelHandler(sdk, {\n onReactionUpdated(channel, event) {\n if (isDifferentChannel(channel, props.channel)) return;\n const recentMessage = props.messages[0];\n const isRecentMessage = recentMessage && recentMessage.messageId === event.messageId;\n const scrollReachedBottomAndCanScroll = !props.scrolledAwayFromBottom && !props.hasNext();\n if (isRecentMessage && scrollReachedBottomAndCanScroll) {\n lazyScrollToBottom({ animated: true, timeout: 250 });\n }\n },\n });\n\n useEffect(() => {\n return groupChannelPubSub.subscribe(({ type, data }) => {\n switch (type) {\n case 'TYPING_BUBBLE_RENDERED':\n case 'MESSAGES_RECEIVED': {\n if (!props.scrolledAwayFromBottom) {\n scrollToBottom(true);\n }\n break;\n }\n case 'MESSAGES_UPDATED': {\n const lastMessage = props.channel.lastMessage;\n const [updatedMessage] = data.messages;\n\n const lastMessageUpdated =\n updatedMessage && lastMessage && lastMessage.messageId === updatedMessage.messageId;\n\n const isMaybeStreaming = props.channel.hasAiBot && lastMessageUpdated;\n\n if (isMaybeStreaming) {\n scrollToBottom(false);\n } else if (!props.scrolledAwayFromBottom && lastMessageUpdated) {\n scrollToBottom(true);\n }\n break;\n }\n case 'MESSAGE_SENT_SUCCESS':\n case 'MESSAGE_SENT_PENDING': {\n scrollToBottom(false);\n break;\n }\n case 'ON_MARKED_AS_READ_BY_CURRENT_USER': {\n updateUnreadMessagesFloatingProps();\n break;\n }\n case 'ON_MARKED_AS_UNREAD_BY_CURRENT_USER': {\n isNewLineExistInChannelRef.current = true;\n const foundFirstUnreadMessage = findFirstUnreadMessage(true);\n processNewLineVisibility(foundFirstUnreadMessage);\n setUnreadFirstMessage(foundFirstUnreadMessage);\n if (!props.scrolledAwayFromBottom) {\n scrollToBottom(true);\n }\n break;\n }\n }\n });\n }, [props.scrolledAwayFromBottom]);\n\n useEffect(() => {\n return groupChannelFragmentOptions.pubsub.subscribe((payload: GroupChannelFragmentOptionsPubSubContextPayload) => {\n switch (payload.type) {\n case 'OVERRIDE_SEARCH_ITEM_STARTING_POINT': {\n scrollToMessageWithCreatedAt(payload.data.startingPoint, false, MESSAGE_SEARCH_SAFE_SCROLL_DELAY);\n break;\n }\n }\n });\n }, []);\n\n useEffect(() => {\n // Only trigger once when message list mount with initial props.searchItem\n // - Search screen + searchItem > mount message list\n // - Reset message list + searchItem > re-mount message list\n if (isFirstMount && props.searchItem) {\n scrollToMessageWithCreatedAt(props.searchItem.startingPoint, false, MESSAGE_SEARCH_SAFE_SCROLL_DELAY);\n }\n }, [isFirstMount]);\n\n const onPressParentMessage = useFreshCallback(\n (parentMessage: SendbirdMessage, childMessage: SendbirdSendableMessage) => {\n if (\n onPressReplyMessageInThread &&\n sbOptions.uikit.groupChannel.channel.replyType === 'thread' &&\n sbOptions.uikit.groupChannel.channel.threadReplySelectType === 'thread'\n ) {\n if (parentMessage.createdAt >= props.channel.messageOffsetTimestamp) {\n onPressReplyMessageInThread(parentMessage as SendbirdSendableMessage, childMessage.createdAt);\n } else {\n toast.show(STRINGS.TOAST.FIND_PARENT_MSG_ERROR, 'error');\n }\n } else {\n const canScrollToParent = scrollToMessageWithCreatedAt(parentMessage.createdAt, true, 0);\n if (!canScrollToParent) toast.show(STRINGS.TOAST.FIND_PARENT_MSG_ERROR, 'error');\n }\n },\n );\n\n const onBottomReached = useFreshCallback(() => {\n if (props.hasNext()) {\n if (pendingBottomReachedRef.current) {\n const currentTime = Date.now();\n const elapsedTime = currentTime - pendingBottomReachedRef.current.timestamp;\n\n const timeoutThreshold = 500;\n if (elapsedTime >= pendingBottomReachedRef.current.timeout + timeoutThreshold) {\n props.onBottomReached?.();\n pendingBottomReachedRef.current = null;\n }\n } else {\n props.onBottomReached?.();\n }\n }\n });\n\n return (\n <ChannelMessageList\n {...props}\n ref={flatListRef}\n onScrolledAwayFromBottom={onScrolledAwayFromBottom}\n onReplyMessage={setMessageToReply}\n onReplyInThreadMessage={setMessageToReply}\n onEditMessage={setMessageToEdit}\n onViewableItemsChanged={onViewableItemsChanged}\n onPressParentMessage={onPressParentMessage}\n onPressNewMessagesButton={scrollToBottom}\n onPressScrollToBottomButton={scrollToBottom}\n onPressMarkAsUnreadMessage={onPressMarkAsUnreadMessage}\n onBottomReached={onBottomReached}\n unreadFirstMessage={unreadFirstMessage}\n unreadMessagesFloatingProps={unreadMessagesFloatingPropsRef.current}\n />\n );\n};\n\nexport default React.memo(GroupChannelMessageList);\n"],"mappings":"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","ignoreList":[]}
@@ -5,18 +5,38 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
  var _reactNative = require("react-native");
8
+ // Type definitions for Firebase Messaging Module instance
9
+ // This represents the instance returned by messaging() or getMessaging()
10
+ // We use a type alias to handle both v14 and v22+ types
11
+
12
+ // Type definitions for modular API support (Firebase v22+)
13
+ // The modular API provides standalone functions that accept a messaging instance
14
+
15
+ // Create a flexible type that can handle both v14 and v22+ Firebase modules
16
+
17
+ const isModularAPI = module => {
18
+ return typeof module.getMessaging === 'function';
19
+ };
8
20
  const createNativeNotificationService = ({
9
21
  messagingModule,
10
22
  permissionModule
11
23
  }) => {
12
- const module = messagingModule();
24
+ const isModular = isModularAPI(messagingModule);
25
+ const modularMessaging = isModular ? messagingModule : null;
26
+ const messaging = isModular ? modularMessaging.getMessaging() : messagingModule();
13
27
  const authorizedStatus = [messagingModule.AuthorizationStatus.AUTHORIZED, messagingModule.AuthorizationStatus.PROVISIONAL];
14
28
  return {
15
29
  getAPNSToken() {
16
- return module.getAPNSToken();
30
+ if (modularMessaging) {
31
+ return modularMessaging.getAPNSToken(messaging);
32
+ }
33
+ return messaging.getAPNSToken();
17
34
  },
18
35
  getFCMToken() {
19
- return module.getToken();
36
+ if (modularMessaging) {
37
+ return modularMessaging.getToken(messaging);
38
+ }
39
+ return messaging.getToken();
20
40
  },
21
41
  async hasPushPermission() {
22
42
  if (_reactNative.Platform.OS === 'android') {
@@ -24,7 +44,7 @@ const createNativeNotificationService = ({
24
44
  return result.status === 'granted';
25
45
  }
26
46
  if (_reactNative.Platform.OS === 'ios') {
27
- const status = await module.hasPermission();
47
+ const status = modularMessaging ? await modularMessaging.hasPermission(messaging) : await messaging.hasPermission();
28
48
  return authorizedStatus.includes(status);
29
49
  }
30
50
  return false;
@@ -35,13 +55,18 @@ const createNativeNotificationService = ({
35
55
  return result.status === 'granted';
36
56
  }
37
57
  if (_reactNative.Platform.OS === 'ios') {
38
- const status = await module.requestPermission();
58
+ const status = modularMessaging ? await modularMessaging.requestPermission(messaging) : await messaging.requestPermission();
39
59
  return authorizedStatus.includes(status);
40
60
  }
41
61
  return false;
42
62
  },
43
63
  onTokenRefresh(handler) {
44
- return module.onTokenRefresh(token => {
64
+ if (modularMessaging) {
65
+ return modularMessaging.onTokenRefresh(messaging, token => {
66
+ if (_reactNative.Platform.OS === 'android') handler(token);
67
+ });
68
+ }
69
+ return messaging.onTokenRefresh(token => {
45
70
  if (_reactNative.Platform.OS === 'android') handler(token);
46
71
  });
47
72
  }
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","createNativeNotificationService","messagingModule","permissionModule","module","authorizedStatus","AuthorizationStatus","AUTHORIZED","PROVISIONAL","getAPNSToken","getFCMToken","getToken","hasPushPermission","Platform","OS","result","checkNotifications","status","hasPermission","includes","requestPushPermission","requestNotifications","requestPermission","onTokenRefresh","handler","token","_default","exports","default"],"sources":["createNotificationService.native.ts"],"sourcesContent":["import type RNFBMessaging from '@react-native-firebase/messaging';\nimport { Platform } from 'react-native';\nimport type * as Permissions from 'react-native-permissions';\n\nimport type { NotificationServiceInterface } from './types';\n\nconst createNativeNotificationService = ({\n messagingModule,\n permissionModule,\n}: {\n messagingModule: typeof RNFBMessaging;\n permissionModule: typeof Permissions;\n}): NotificationServiceInterface => {\n const module = messagingModule();\n const authorizedStatus = [\n messagingModule.AuthorizationStatus.AUTHORIZED,\n messagingModule.AuthorizationStatus.PROVISIONAL,\n ];\n return {\n getAPNSToken(): Promise<string | null> {\n return module.getAPNSToken();\n },\n getFCMToken(): Promise<string | null> {\n return module.getToken();\n },\n async hasPushPermission(): Promise<boolean> {\n if (Platform.OS === 'android') {\n const result = await permissionModule.checkNotifications();\n return result.status === 'granted';\n }\n\n if (Platform.OS === 'ios') {\n const status = await module.hasPermission();\n return authorizedStatus.includes(status);\n }\n\n return false;\n },\n async requestPushPermission(): Promise<boolean> {\n if (Platform.OS === 'android') {\n const result = await permissionModule.requestNotifications([]);\n return result.status === 'granted';\n }\n\n if (Platform.OS === 'ios') {\n const status = await module.requestPermission();\n return authorizedStatus.includes(status);\n }\n\n return false;\n },\n onTokenRefresh(handler: (token: string) => void): () => void | undefined {\n return module.onTokenRefresh((token) => {\n if (Platform.OS === 'android') handler(token);\n });\n },\n };\n};\n\nexport default createNativeNotificationService;\n"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAKA,MAAMC,+BAA+B,GAAGA,CAAC;EACvCC,eAAe;EACfC;AAIF,CAAC,KAAmC;EAClC,MAAMC,MAAM,GAAGF,eAAe,CAAC,CAAC;EAChC,MAAMG,gBAAgB,GAAG,CACvBH,eAAe,CAACI,mBAAmB,CAACC,UAAU,EAC9CL,eAAe,CAACI,mBAAmB,CAACE,WAAW,CAChD;EACD,OAAO;IACLC,YAAYA,CAAA,EAA2B;MACrC,OAAOL,MAAM,CAACK,YAAY,CAAC,CAAC;IAC9B,CAAC;IACDC,WAAWA,CAAA,EAA2B;MACpC,OAAON,MAAM,CAACO,QAAQ,CAAC,CAAC;IAC1B,CAAC;IACD,MAAMC,iBAAiBA,CAAA,EAAqB;MAC1C,IAAIC,qBAAQ,CAACC,EAAE,KAAK,SAAS,EAAE;QAC7B,MAAMC,MAAM,GAAG,MAAMZ,gBAAgB,CAACa,kBAAkB,CAAC,CAAC;QAC1D,OAAOD,MAAM,CAACE,MAAM,KAAK,SAAS;MACpC;MAEA,IAAIJ,qBAAQ,CAACC,EAAE,KAAK,KAAK,EAAE;QACzB,MAAMG,MAAM,GAAG,MAAMb,MAAM,CAACc,aAAa,CAAC,CAAC;QAC3C,OAAOb,gBAAgB,CAACc,QAAQ,CAACF,MAAM,CAAC;MAC1C;MAEA,OAAO,KAAK;IACd,CAAC;IACD,MAAMG,qBAAqBA,CAAA,EAAqB;MAC9C,IAAIP,qBAAQ,CAACC,EAAE,KAAK,SAAS,EAAE;QAC7B,MAAMC,MAAM,GAAG,MAAMZ,gBAAgB,CAACkB,oBAAoB,CAAC,EAAE,CAAC;QAC9D,OAAON,MAAM,CAACE,MAAM,KAAK,SAAS;MACpC;MAEA,IAAIJ,qBAAQ,CAACC,EAAE,KAAK,KAAK,EAAE;QACzB,MAAMG,MAAM,GAAG,MAAMb,MAAM,CAACkB,iBAAiB,CAAC,CAAC;QAC/C,OAAOjB,gBAAgB,CAACc,QAAQ,CAACF,MAAM,CAAC;MAC1C;MAEA,OAAO,KAAK;IACd,CAAC;IACDM,cAAcA,CAACC,OAAgC,EAA0B;MACvE,OAAOpB,MAAM,CAACmB,cAAc,CAAEE,KAAK,IAAK;QACtC,IAAIZ,qBAAQ,CAACC,EAAE,KAAK,SAAS,EAAEU,OAAO,CAACC,KAAK,CAAC;MAC/C,CAAC,CAAC;IACJ;EACF,CAAC;AACH,CAAC;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEa3B,+BAA+B","ignoreList":[]}
1
+ {"version":3,"names":["_reactNative","require","isModularAPI","module","getMessaging","createNativeNotificationService","messagingModule","permissionModule","isModular","modularMessaging","messaging","authorizedStatus","AuthorizationStatus","AUTHORIZED","PROVISIONAL","getAPNSToken","getFCMToken","getToken","hasPushPermission","Platform","OS","result","checkNotifications","status","hasPermission","includes","requestPushPermission","requestNotifications","requestPermission","onTokenRefresh","handler","token","_default","exports","default"],"sources":["createNotificationService.native.ts"],"sourcesContent":["import type RNFBMessaging from '@react-native-firebase/messaging';\nimport type { FirebaseMessagingTypes } from '@react-native-firebase/messaging';\nimport { Platform } from 'react-native';\nimport type * as Permissions from 'react-native-permissions';\n\nimport type { NotificationServiceInterface } from './types';\n\n// Type definitions for Firebase Messaging Module instance\n// This represents the instance returned by messaging() or getMessaging()\n// We use a type alias to handle both v14 and v22+ types\ntype MessagingInstance = ReturnType<typeof RNFBMessaging>;\n\n// Type definitions for modular API support (Firebase v22+)\n// The modular API provides standalone functions that accept a messaging instance\ntype ModularMessagingType = {\n getMessaging: () => MessagingInstance;\n getAPNSToken: (messaging: MessagingInstance) => Promise<string | null>;\n getToken: (messaging: MessagingInstance) => Promise<string>;\n hasPermission: (messaging: MessagingInstance) => Promise<FirebaseMessagingTypes.AuthorizationStatus>;\n requestPermission: (\n messaging: MessagingInstance,\n iosPermissions?: FirebaseMessagingTypes.IOSPermissions,\n ) => Promise<FirebaseMessagingTypes.AuthorizationStatus>;\n onTokenRefresh: (messaging: MessagingInstance, listener: (token: string) => void) => () => void;\n AuthorizationStatus: typeof RNFBMessaging.AuthorizationStatus;\n};\n\n// Create a flexible type that can handle both v14 and v22+ Firebase modules\ntype FirebaseMessagingModule = typeof RNFBMessaging | ModularMessagingType;\n\nconst isModularAPI = (module: FirebaseMessagingModule): module is ModularMessagingType => {\n return typeof (module as ModularMessagingType).getMessaging === 'function';\n};\n\nconst createNativeNotificationService = ({\n messagingModule,\n permissionModule,\n}: {\n messagingModule: FirebaseMessagingModule;\n permissionModule: typeof Permissions;\n}): NotificationServiceInterface => {\n const isModular = isModularAPI(messagingModule);\n const modularMessaging = isModular ? (messagingModule as ModularMessagingType) : null;\n const messaging = isModular ? modularMessaging!.getMessaging() : (messagingModule as typeof RNFBMessaging)();\n\n const authorizedStatus = [\n messagingModule.AuthorizationStatus.AUTHORIZED,\n messagingModule.AuthorizationStatus.PROVISIONAL,\n ];\n return {\n getAPNSToken(): Promise<string | null> {\n if (modularMessaging) {\n return modularMessaging.getAPNSToken(messaging);\n }\n return messaging.getAPNSToken();\n },\n getFCMToken(): Promise<string | null> {\n if (modularMessaging) {\n return modularMessaging.getToken(messaging);\n }\n return messaging.getToken();\n },\n async hasPushPermission(): Promise<boolean> {\n if (Platform.OS === 'android') {\n const result = await permissionModule.checkNotifications();\n return result.status === 'granted';\n }\n\n if (Platform.OS === 'ios') {\n const status = modularMessaging\n ? await modularMessaging.hasPermission(messaging)\n : await messaging.hasPermission();\n return authorizedStatus.includes(status);\n }\n\n return false;\n },\n async requestPushPermission(): Promise<boolean> {\n if (Platform.OS === 'android') {\n const result = await permissionModule.requestNotifications([]);\n return result.status === 'granted';\n }\n\n if (Platform.OS === 'ios') {\n const status = modularMessaging\n ? await modularMessaging.requestPermission(messaging)\n : await messaging.requestPermission();\n return authorizedStatus.includes(status);\n }\n\n return false;\n },\n onTokenRefresh(handler: (token: string) => void): () => void | undefined {\n if (modularMessaging) {\n return modularMessaging.onTokenRefresh(messaging, (token: string) => {\n if (Platform.OS === 'android') handler(token);\n });\n }\n return messaging.onTokenRefresh((token: string) => {\n if (Platform.OS === 'android') handler(token);\n });\n },\n };\n};\n\nexport default createNativeNotificationService;\n"],"mappings":";;;;;;AAEA,IAAAA,YAAA,GAAAC,OAAA;AAKA;AACA;AACA;;AAGA;AACA;;AAcA;;AAGA,MAAMC,YAAY,GAAIC,MAA+B,IAAqC;EACxF,OAAO,OAAQA,MAAM,CAA0BC,YAAY,KAAK,UAAU;AAC5E,CAAC;AAED,MAAMC,+BAA+B,GAAGA,CAAC;EACvCC,eAAe;EACfC;AAIF,CAAC,KAAmC;EAClC,MAAMC,SAAS,GAAGN,YAAY,CAACI,eAAe,CAAC;EAC/C,MAAMG,gBAAgB,GAAGD,SAAS,GAAIF,eAAe,GAA4B,IAAI;EACrF,MAAMI,SAAS,GAAGF,SAAS,GAAGC,gBAAgB,CAAEL,YAAY,CAAC,CAAC,GAAIE,eAAe,CAA0B,CAAC;EAE5G,MAAMK,gBAAgB,GAAG,CACvBL,eAAe,CAACM,mBAAmB,CAACC,UAAU,EAC9CP,eAAe,CAACM,mBAAmB,CAACE,WAAW,CAChD;EACD,OAAO;IACLC,YAAYA,CAAA,EAA2B;MACrC,IAAIN,gBAAgB,EAAE;QACpB,OAAOA,gBAAgB,CAACM,YAAY,CAACL,SAAS,CAAC;MACjD;MACA,OAAOA,SAAS,CAACK,YAAY,CAAC,CAAC;IACjC,CAAC;IACDC,WAAWA,CAAA,EAA2B;MACpC,IAAIP,gBAAgB,EAAE;QACpB,OAAOA,gBAAgB,CAACQ,QAAQ,CAACP,SAAS,CAAC;MAC7C;MACA,OAAOA,SAAS,CAACO,QAAQ,CAAC,CAAC;IAC7B,CAAC;IACD,MAAMC,iBAAiBA,CAAA,EAAqB;MAC1C,IAAIC,qBAAQ,CAACC,EAAE,KAAK,SAAS,EAAE;QAC7B,MAAMC,MAAM,GAAG,MAAMd,gBAAgB,CAACe,kBAAkB,CAAC,CAAC;QAC1D,OAAOD,MAAM,CAACE,MAAM,KAAK,SAAS;MACpC;MAEA,IAAIJ,qBAAQ,CAACC,EAAE,KAAK,KAAK,EAAE;QACzB,MAAMG,MAAM,GAAGd,gBAAgB,GAC3B,MAAMA,gBAAgB,CAACe,aAAa,CAACd,SAAS,CAAC,GAC/C,MAAMA,SAAS,CAACc,aAAa,CAAC,CAAC;QACnC,OAAOb,gBAAgB,CAACc,QAAQ,CAACF,MAAM,CAAC;MAC1C;MAEA,OAAO,KAAK;IACd,CAAC;IACD,MAAMG,qBAAqBA,CAAA,EAAqB;MAC9C,IAAIP,qBAAQ,CAACC,EAAE,KAAK,SAAS,EAAE;QAC7B,MAAMC,MAAM,GAAG,MAAMd,gBAAgB,CAACoB,oBAAoB,CAAC,EAAE,CAAC;QAC9D,OAAON,MAAM,CAACE,MAAM,KAAK,SAAS;MACpC;MAEA,IAAIJ,qBAAQ,CAACC,EAAE,KAAK,KAAK,EAAE;QACzB,MAAMG,MAAM,GAAGd,gBAAgB,GAC3B,MAAMA,gBAAgB,CAACmB,iBAAiB,CAAClB,SAAS,CAAC,GACnD,MAAMA,SAAS,CAACkB,iBAAiB,CAAC,CAAC;QACvC,OAAOjB,gBAAgB,CAACc,QAAQ,CAACF,MAAM,CAAC;MAC1C;MAEA,OAAO,KAAK;IACd,CAAC;IACDM,cAAcA,CAACC,OAAgC,EAA0B;MACvE,IAAIrB,gBAAgB,EAAE;QACpB,OAAOA,gBAAgB,CAACoB,cAAc,CAACnB,SAAS,EAAGqB,KAAa,IAAK;UACnE,IAAIZ,qBAAQ,CAACC,EAAE,KAAK,SAAS,EAAEU,OAAO,CAACC,KAAK,CAAC;QAC/C,CAAC,CAAC;MACJ;MACA,OAAOrB,SAAS,CAACmB,cAAc,CAAEE,KAAa,IAAK;QACjD,IAAIZ,qBAAQ,CAACC,EAAE,KAAK,SAAS,EAAEU,OAAO,CAACC,KAAK,CAAC;MAC/C,CAAC,CAAC;IACJ;EACF,CAAC;AACH,CAAC;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEa7B,+BAA+B","ignoreList":[]}
@@ -4,6 +4,6 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- const VERSION = '3.11.1';
7
+ const VERSION = '3.11.2';
8
8
  var _default = exports.default = VERSION;
9
9
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["VERSION","_default","exports","default"],"sources":["version.ts"],"sourcesContent":["const VERSION = '3.11.1';\nexport default VERSION;\n"],"mappings":";;;;;;AAAA,MAAMA,OAAO,GAAG,QAAQ;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GACVH,OAAO","ignoreList":[]}
1
+ {"version":3,"names":["VERSION","_default","exports","default"],"sources":["version.ts"],"sourcesContent":["const VERSION = '3.11.2';\nexport default VERSION;\n"],"mappings":";;;;;;AAAA,MAAMA,OAAO,GAAG,QAAQ;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GACVH,OAAO","ignoreList":[]}
@@ -217,9 +217,6 @@ const GroupChannelMessageList = props => {
217
217
  timeout: 250
218
218
  });
219
219
  }
220
- },
221
- onChannelChanged(channel) {
222
- if (isDifferentChannel(channel, props.channel)) return;
223
220
  }
224
221
  });
225
222
  useEffect(() => {
@@ -1 +1 @@
1
- {"version":3,"names":["React","useCallback","useContext","useEffect","useRef","useState","useToast","useGroupChannelHandler","confirmAndMarkAsRead","isDifferentChannel","useFreshCallback","useIsFirstMount","ChannelMessageList","MESSAGE_FOCUS_ANIMATION_DELAY","MESSAGE_SEARCH_SAFE_SCROLL_DELAY","useLocalization","useSendbirdChat","GroupChannelContexts","GroupChannelMessageList","props","toast","STRINGS","sdk","sbOptions","groupChannelFragmentOptions","setMessageToEdit","setMessageToReply","Fragment","groupChannelPubSub","PubSub","flatListRef","lazyScrollToBottom","lazyScrollToMessageId","onPressReplyMessageInThread","MessageList","isFirstMount","hasSeenNewLineRef","isNewLineInViewportRef","isNewLineExistInChannelRef","scrolledAwayFromBottomRef","isVisibleUnreadMessageFloating","setIsVisibleUnreadMessageFloating","viewableMessages","hasUserMarkedAsUnreadRef","unreadFirstMessage","setUnreadFirstMessage","undefined","pendingBottomReachedRef","updateHasSeenNewLine","hasSeenNewLine","current","_props$onNewLineSeenC","onNewLineSeenChange","call","updateHasUserMarkedAsUnread","hasUserMarkedAsUnread","_props$onUserMarkedAs","onUserMarkedAsUnreadChange","scrollToMessageWithCreatedAt","createdAt","focusAnimated","timeout","foundMessage","messages","find","it","isIncludedInList","setTimeout","onUpdateSearchItem","startingPoint","timestamp","Date","now","messageId","animated","channel","messageOffsetTimestamp","onResetMessageListWithStartingPoint","catch","_","onScrolledAwayFromBottom","value","scrollToBottom","hasNext","onResetMessageList","onPressUnreadMessagesFloatingCloseButton","_props$resetNewMessag","resetNewMessages","url","getPrevNonSilentMessage","prevMessageIndex","length","prevMessage","silent","findFirstUnreadMessage","isNewLineExistInChannel","uikit","groupChannel","enableMarkAsUnread","msg","index","_props$hasPrevious","isMarkedAsUnreadMessage","myLastRead","prevNonSilentMessage","hasNoPreviousAndNoPrevMessage","hasPrevious","prevMessageIsRead","isMessageUnread","foundUnreadFirstMessage","processNewLineVisibility","unreadFirstMsg","_viewableMessages$cur","isNewLineInViewport","some","message","updateUnreadMessagesFloatingProps","newMessages","markAsUnread","markAsRead","onViewableItemsChanged","info","viewableItems","filter","token","item","map","onPressMarkAsUnreadMessage","unreadMessagesFloatingPropsRef","canAutoMarkAsRead","visible","unreadMessageCount","onPressClose","onReactionUpdated","event","recentMessage","isRecentMessage","scrollReachedBottomAndCanScroll","scrolledAwayFromBottom","onChannelChanged","subscribe","type","data","lastMessage","updatedMessage","lastMessageUpdated","isMaybeStreaming","hasAiBot","foundFirstUnreadMessage","pubsub","payload","searchItem","onPressParentMessage","parentMessage","childMessage","replyType","threadReplySelectType","show","TOAST","FIND_PARENT_MSG_ERROR","canScrollToParent","onBottomReached","currentTime","elapsedTime","timeoutThreshold","_props$onBottomReache","_props$onBottomReache2","createElement","_extends","ref","onReplyMessage","onReplyInThreadMessage","onEditMessage","onPressNewMessagesButton","onPressScrollToBottomButton","unreadMessagesFloatingProps","memo"],"sources":["GroupChannelMessageList.tsx"],"sourcesContent":["import type { ViewToken } from '@react-native/virtualized-lists';\nimport React, { useCallback, useContext, useEffect, useRef, useState } from 'react';\n\nimport { useToast } from '@sendbird/uikit-react-native-foundation';\nimport { useGroupChannelHandler } from '@sendbird/uikit-tools';\nimport {\n SendbirdMessage,\n SendbirdSendableMessage,\n confirmAndMarkAsRead,\n isDifferentChannel,\n useFreshCallback,\n useIsFirstMount,\n} from '@sendbird/uikit-utils';\n\nimport ChannelMessageList from '../../../components/ChannelMessageList';\nimport { UnreadMessagesFloatingProps } from '../../../components/UnreadMessagesFloating';\nimport { MESSAGE_FOCUS_ANIMATION_DELAY, MESSAGE_SEARCH_SAFE_SCROLL_DELAY } from '../../../constants';\nimport { GroupChannelFragmentOptionsPubSubContextPayload } from '../../../contexts/SendbirdChatCtx';\nimport { useLocalization, useSendbirdChat } from '../../../hooks/useContext';\nimport { GroupChannelContexts } from '../module/moduleContext';\nimport type { GroupChannelProps } from '../types';\n\nconst GroupChannelMessageList = (props: GroupChannelProps['MessageList']) => {\n const toast = useToast();\n const { STRINGS } = useLocalization();\n const { sdk, sbOptions, groupChannelFragmentOptions } = useSendbirdChat();\n const { setMessageToEdit, setMessageToReply } = useContext(GroupChannelContexts.Fragment);\n const groupChannelPubSub = useContext(GroupChannelContexts.PubSub);\n const { flatListRef, lazyScrollToBottom, lazyScrollToMessageId, onPressReplyMessageInThread } = useContext(\n GroupChannelContexts.MessageList,\n );\n\n const isFirstMount = useIsFirstMount();\n\n const hasSeenNewLineRef = useRef(false);\n const isNewLineInViewportRef = useRef(false);\n const isNewLineExistInChannelRef = useRef(false);\n const scrolledAwayFromBottomRef = useRef(false);\n const [isVisibleUnreadMessageFloating, setIsVisibleUnreadMessageFloating] = useState(false);\n const viewableMessages = useRef<SendbirdMessage[]>();\n const hasUserMarkedAsUnreadRef = useRef(false);\n const [unreadFirstMessage, setUnreadFirstMessage] = useState<SendbirdMessage | undefined>(undefined);\n const pendingBottomReachedRef = useRef<{ timeout: number; timestamp: number } | null>(null);\n\n const updateHasSeenNewLine = useCallback(\n (hasSeenNewLine: boolean) => {\n if (hasSeenNewLineRef.current !== hasSeenNewLine) {\n hasSeenNewLineRef.current = hasSeenNewLine;\n props.onNewLineSeenChange?.(hasSeenNewLine);\n }\n },\n [props.onNewLineSeenChange],\n );\n\n const updateHasUserMarkedAsUnread = useCallback(\n (hasUserMarkedAsUnread: boolean) => {\n if (hasUserMarkedAsUnreadRef.current !== hasUserMarkedAsUnread) {\n hasUserMarkedAsUnreadRef.current = hasUserMarkedAsUnread;\n props.onUserMarkedAsUnreadChange?.(hasUserMarkedAsUnread);\n }\n },\n [props.onUserMarkedAsUnreadChange],\n );\n\n const scrollToMessageWithCreatedAt = useFreshCallback(\n (createdAt: number, focusAnimated: boolean, timeout: number): boolean => {\n const foundMessage = props.messages.find((it) => it.createdAt === createdAt);\n const isIncludedInList = !!foundMessage;\n pendingBottomReachedRef.current = null;\n\n if (isIncludedInList) {\n if (focusAnimated) {\n setTimeout(() => props.onUpdateSearchItem({ startingPoint: createdAt }), MESSAGE_FOCUS_ANIMATION_DELAY);\n }\n pendingBottomReachedRef.current = { timeout, timestamp: Date.now() };\n lazyScrollToMessageId({ messageId: foundMessage.messageId, animated: true, timeout });\n } else {\n if (props.channel.messageOffsetTimestamp <= createdAt) {\n if (focusAnimated) {\n props.onUpdateSearchItem({ startingPoint: createdAt });\n }\n props.onResetMessageListWithStartingPoint(createdAt).catch((_) => {});\n } else {\n return false;\n }\n }\n return true;\n },\n );\n\n const onScrolledAwayFromBottom = useFreshCallback((value: boolean) => {\n scrolledAwayFromBottomRef.current = value;\n props.onScrolledAwayFromBottom(value);\n });\n\n const scrollToBottom = useFreshCallback(async (animated = false) => {\n if (props.hasNext()) {\n props.onUpdateSearchItem(undefined);\n onScrolledAwayFromBottom(false);\n\n await props.onResetMessageList().catch((_) => {});\n onScrolledAwayFromBottom(false);\n lazyScrollToBottom({ animated });\n } else {\n lazyScrollToBottom({ animated });\n }\n });\n\n const onPressUnreadMessagesFloatingCloseButton = useCallback(() => {\n updateHasSeenNewLine(true);\n updateHasUserMarkedAsUnread(false);\n props.resetNewMessages?.();\n confirmAndMarkAsRead([props.channel]);\n }, [updateHasSeenNewLine, updateHasUserMarkedAsUnread, props.channel.url, props.resetNewMessages]);\n\n const getPrevNonSilentMessage = useCallback(\n (messages: SendbirdMessage[], prevMessageIndex: number): SendbirdMessage | null => {\n if (messages.length <= prevMessageIndex) {\n return null;\n }\n\n const prevMessage = messages[prevMessageIndex];\n if (prevMessage) {\n if (prevMessage.silent) {\n return getPrevNonSilentMessage(messages, prevMessageIndex + 1);\n } else {\n return prevMessage;\n }\n }\n return null;\n },\n [],\n );\n\n const findFirstUnreadMessage = useFreshCallback((isNewLineExistInChannel: boolean) => {\n if (!sbOptions.uikit.groupChannel.channel.enableMarkAsUnread || !isNewLineExistInChannel) {\n return;\n }\n\n return props.messages.find((msg, index) => {\n if (msg.silent) {\n return false;\n }\n\n const isMarkedAsUnreadMessage = props.channel.myLastRead === msg.createdAt - 1;\n if (isMarkedAsUnreadMessage) {\n return true;\n }\n\n const prevNonSilentMessage = getPrevNonSilentMessage(props.messages, index + 1);\n const hasNoPreviousAndNoPrevMessage = !props.hasPrevious?.() && prevNonSilentMessage == null;\n const prevMessageIsRead =\n prevNonSilentMessage != null && prevNonSilentMessage.createdAt <= props.channel.myLastRead;\n const isMessageUnread = props.channel.myLastRead < msg.createdAt;\n return (hasNoPreviousAndNoPrevMessage || prevMessageIsRead) && isMessageUnread;\n });\n });\n\n useEffect(() => {\n if (!unreadFirstMessage) {\n const foundUnreadFirstMessage = findFirstUnreadMessage(props.isNewLineExistInChannel ?? false);\n if (foundUnreadFirstMessage) {\n processNewLineVisibility(foundUnreadFirstMessage);\n setUnreadFirstMessage(foundUnreadFirstMessage);\n }\n }\n }, [props.messages, props.channel.myLastRead, sbOptions.uikit.groupChannel.channel.enableMarkAsUnread]);\n\n const processNewLineVisibility = useFreshCallback((unreadFirstMsg: SendbirdMessage | undefined) => {\n const isNewLineInViewport = !!viewableMessages.current?.some(\n (message) => message.messageId === unreadFirstMsg?.messageId,\n );\n\n if (isNewLineInViewportRef.current !== isNewLineInViewport) {\n isNewLineInViewportRef.current = isNewLineInViewport;\n updateUnreadMessagesFloatingProps();\n if (!isNewLineInViewport || hasSeenNewLineRef.current) {\n return;\n }\n\n updateHasSeenNewLine(true);\n if (hasUserMarkedAsUnreadRef.current) {\n return;\n }\n\n if (0 < props.newMessages.length) {\n props.channel.markAsUnread(props.newMessages[0]);\n } else {\n props.channel.markAsRead();\n }\n }\n });\n\n const onViewableItemsChanged = useFreshCallback(\n async (info: { viewableItems: Array<ViewToken<SendbirdMessage>>; changed: Array<ViewToken<SendbirdMessage>> }) => {\n if (!sbOptions.uikit.groupChannel.channel.enableMarkAsUnread) {\n return;\n }\n\n viewableMessages.current = info.viewableItems.filter((token) => token.item).map((token) => token.item);\n processNewLineVisibility(unreadFirstMessage);\n },\n );\n\n const onPressMarkAsUnreadMessage = useCallback(\n async (message: SendbirdMessage) => {\n if (sbOptions.uikit.groupChannel.channel.enableMarkAsUnread && message) {\n await props.channel.markAsUnread(message);\n updateHasUserMarkedAsUnread(true);\n }\n },\n [sbOptions.uikit.groupChannel.channel.enableMarkAsUnread, updateHasUserMarkedAsUnread],\n );\n\n useEffect(() => {\n isNewLineExistInChannelRef.current = !!props.isNewLineExistInChannel && !!viewableMessages.current;\n }, [props.isNewLineExistInChannel, viewableMessages.current]);\n\n const unreadMessagesFloatingPropsRef = useRef<UnreadMessagesFloatingProps>();\n const updateUnreadMessagesFloatingProps = useFreshCallback(() => {\n const canAutoMarkAsRead =\n !scrolledAwayFromBottomRef.current &&\n !hasUserMarkedAsUnreadRef.current &&\n (hasSeenNewLineRef.current || !isNewLineExistInChannelRef.current);\n\n unreadMessagesFloatingPropsRef.current = {\n visible:\n sbOptions.uikit.groupChannel.channel.enableMarkAsUnread &&\n !canAutoMarkAsRead &&\n isNewLineExistInChannelRef.current &&\n 0 < props.channel.unreadMessageCount &&\n !isNewLineInViewportRef.current,\n onPressClose: onPressUnreadMessagesFloatingCloseButton,\n unreadMessageCount: props.channel.unreadMessageCount,\n };\n if (isVisibleUnreadMessageFloating !== unreadMessagesFloatingPropsRef.current.visible) {\n setIsVisibleUnreadMessageFloating(unreadMessagesFloatingPropsRef.current.visible);\n }\n });\n\n useEffect(() => {\n updateUnreadMessagesFloatingProps();\n }, [\n isNewLineExistInChannelRef.current,\n props.channel.unreadMessageCount,\n sbOptions.uikit.groupChannel.channel.enableMarkAsUnread,\n ]);\n\n useGroupChannelHandler(sdk, {\n onReactionUpdated(channel, event) {\n if (isDifferentChannel(channel, props.channel)) return;\n const recentMessage = props.messages[0];\n const isRecentMessage = recentMessage && recentMessage.messageId === event.messageId;\n const scrollReachedBottomAndCanScroll = !props.scrolledAwayFromBottom && !props.hasNext();\n if (isRecentMessage && scrollReachedBottomAndCanScroll) {\n lazyScrollToBottom({ animated: true, timeout: 250 });\n }\n },\n onChannelChanged(channel) {\n if (isDifferentChannel(channel, props.channel)) return;\n },\n });\n\n useEffect(() => {\n return groupChannelPubSub.subscribe(({ type, data }) => {\n switch (type) {\n case 'TYPING_BUBBLE_RENDERED':\n case 'MESSAGES_RECEIVED': {\n if (!props.scrolledAwayFromBottom) {\n scrollToBottom(true);\n }\n break;\n }\n case 'MESSAGES_UPDATED': {\n const lastMessage = props.channel.lastMessage;\n const [updatedMessage] = data.messages;\n\n const lastMessageUpdated =\n updatedMessage && lastMessage && lastMessage.messageId === updatedMessage.messageId;\n\n const isMaybeStreaming = props.channel.hasAiBot && lastMessageUpdated;\n\n if (isMaybeStreaming) {\n scrollToBottom(false);\n } else if (!props.scrolledAwayFromBottom && lastMessageUpdated) {\n scrollToBottom(true);\n }\n break;\n }\n case 'MESSAGE_SENT_SUCCESS':\n case 'MESSAGE_SENT_PENDING': {\n scrollToBottom(false);\n break;\n }\n case 'ON_MARKED_AS_READ_BY_CURRENT_USER': {\n updateUnreadMessagesFloatingProps();\n break;\n }\n case 'ON_MARKED_AS_UNREAD_BY_CURRENT_USER': {\n isNewLineExistInChannelRef.current = true;\n const foundFirstUnreadMessage = findFirstUnreadMessage(true);\n processNewLineVisibility(foundFirstUnreadMessage);\n setUnreadFirstMessage(foundFirstUnreadMessage);\n if (!props.scrolledAwayFromBottom) {\n scrollToBottom(true);\n }\n break;\n }\n }\n });\n }, [props.scrolledAwayFromBottom]);\n\n useEffect(() => {\n return groupChannelFragmentOptions.pubsub.subscribe((payload: GroupChannelFragmentOptionsPubSubContextPayload) => {\n switch (payload.type) {\n case 'OVERRIDE_SEARCH_ITEM_STARTING_POINT': {\n scrollToMessageWithCreatedAt(payload.data.startingPoint, false, MESSAGE_SEARCH_SAFE_SCROLL_DELAY);\n break;\n }\n }\n });\n }, []);\n\n useEffect(() => {\n // Only trigger once when message list mount with initial props.searchItem\n // - Search screen + searchItem > mount message list\n // - Reset message list + searchItem > re-mount message list\n if (isFirstMount && props.searchItem) {\n scrollToMessageWithCreatedAt(props.searchItem.startingPoint, false, MESSAGE_SEARCH_SAFE_SCROLL_DELAY);\n }\n }, [isFirstMount]);\n\n const onPressParentMessage = useFreshCallback(\n (parentMessage: SendbirdMessage, childMessage: SendbirdSendableMessage) => {\n if (\n onPressReplyMessageInThread &&\n sbOptions.uikit.groupChannel.channel.replyType === 'thread' &&\n sbOptions.uikit.groupChannel.channel.threadReplySelectType === 'thread'\n ) {\n if (parentMessage.createdAt >= props.channel.messageOffsetTimestamp) {\n onPressReplyMessageInThread(parentMessage as SendbirdSendableMessage, childMessage.createdAt);\n } else {\n toast.show(STRINGS.TOAST.FIND_PARENT_MSG_ERROR, 'error');\n }\n } else {\n const canScrollToParent = scrollToMessageWithCreatedAt(parentMessage.createdAt, true, 0);\n if (!canScrollToParent) toast.show(STRINGS.TOAST.FIND_PARENT_MSG_ERROR, 'error');\n }\n },\n );\n\n const onBottomReached = useFreshCallback(() => {\n if (props.hasNext()) {\n if (pendingBottomReachedRef.current) {\n const currentTime = Date.now();\n const elapsedTime = currentTime - pendingBottomReachedRef.current.timestamp;\n\n const timeoutThreshold = 500;\n if (elapsedTime >= pendingBottomReachedRef.current.timeout + timeoutThreshold) {\n props.onBottomReached?.();\n pendingBottomReachedRef.current = null;\n }\n } else {\n props.onBottomReached?.();\n }\n }\n });\n\n return (\n <ChannelMessageList\n {...props}\n ref={flatListRef}\n onScrolledAwayFromBottom={onScrolledAwayFromBottom}\n onReplyMessage={setMessageToReply}\n onReplyInThreadMessage={setMessageToReply}\n onEditMessage={setMessageToEdit}\n onViewableItemsChanged={onViewableItemsChanged}\n onPressParentMessage={onPressParentMessage}\n onPressNewMessagesButton={scrollToBottom}\n onPressScrollToBottomButton={scrollToBottom}\n onPressMarkAsUnreadMessage={onPressMarkAsUnreadMessage}\n onBottomReached={onBottomReached}\n unreadFirstMessage={unreadFirstMessage}\n unreadMessagesFloatingProps={unreadMessagesFloatingPropsRef.current}\n />\n );\n};\n\nexport default React.memo(GroupChannelMessageList);\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","useCallback","useContext","useEffect","useRef","useState","useToast","useGroupChannelHandler","confirmAndMarkAsRead","isDifferentChannel","useFreshCallback","useIsFirstMount","ChannelMessageList","MESSAGE_FOCUS_ANIMATION_DELAY","MESSAGE_SEARCH_SAFE_SCROLL_DELAY","useLocalization","useSendbirdChat","GroupChannelContexts","GroupChannelMessageList","props","toast","STRINGS","sdk","sbOptions","groupChannelFragmentOptions","setMessageToEdit","setMessageToReply","Fragment","groupChannelPubSub","PubSub","flatListRef","lazyScrollToBottom","lazyScrollToMessageId","onPressReplyMessageInThread","MessageList","isFirstMount","hasSeenNewLineRef","isNewLineInViewportRef","isNewLineExistInChannelRef","scrolledAwayFromBottomRef","isVisibleUnreadMessageFloating","setIsVisibleUnreadMessageFloating","viewableMessages","hasUserMarkedAsUnreadRef","unreadFirstMessage","setUnreadFirstMessage","undefined","pendingBottomReachedRef","updateHasSeenNewLine","hasSeenNewLine","current","_props$onNewLineSeenC","onNewLineSeenChange","call","updateHasUserMarkedAsUnread","hasUserMarkedAsUnread","_props$onUserMarkedAs","onUserMarkedAsUnreadChange","scrollToMessageWithCreatedAt","createdAt","focusAnimated","timeout","foundMessage","messages","find","it","isIncludedInList","setTimeout","onUpdateSearchItem","startingPoint","timestamp","Date","now","messageId","animated","channel","messageOffsetTimestamp","onResetMessageListWithStartingPoint","catch","_","onScrolledAwayFromBottom","value","scrollToBottom","hasNext","onResetMessageList","onPressUnreadMessagesFloatingCloseButton","_props$resetNewMessag","resetNewMessages","url","getPrevNonSilentMessage","prevMessageIndex","length","prevMessage","silent","findFirstUnreadMessage","isNewLineExistInChannel","uikit","groupChannel","enableMarkAsUnread","msg","index","_props$hasPrevious","isMarkedAsUnreadMessage","myLastRead","prevNonSilentMessage","hasNoPreviousAndNoPrevMessage","hasPrevious","prevMessageIsRead","isMessageUnread","foundUnreadFirstMessage","processNewLineVisibility","unreadFirstMsg","_viewableMessages$cur","isNewLineInViewport","some","message","updateUnreadMessagesFloatingProps","newMessages","markAsUnread","markAsRead","onViewableItemsChanged","info","viewableItems","filter","token","item","map","onPressMarkAsUnreadMessage","unreadMessagesFloatingPropsRef","canAutoMarkAsRead","visible","unreadMessageCount","onPressClose","onReactionUpdated","event","recentMessage","isRecentMessage","scrollReachedBottomAndCanScroll","scrolledAwayFromBottom","subscribe","type","data","lastMessage","updatedMessage","lastMessageUpdated","isMaybeStreaming","hasAiBot","foundFirstUnreadMessage","pubsub","payload","searchItem","onPressParentMessage","parentMessage","childMessage","replyType","threadReplySelectType","show","TOAST","FIND_PARENT_MSG_ERROR","canScrollToParent","onBottomReached","currentTime","elapsedTime","timeoutThreshold","_props$onBottomReache","_props$onBottomReache2","createElement","_extends","ref","onReplyMessage","onReplyInThreadMessage","onEditMessage","onPressNewMessagesButton","onPressScrollToBottomButton","unreadMessagesFloatingProps","memo"],"sources":["GroupChannelMessageList.tsx"],"sourcesContent":["import type { ViewToken } from '@react-native/virtualized-lists';\nimport React, { useCallback, useContext, useEffect, useRef, useState } from 'react';\n\nimport { useToast } from '@sendbird/uikit-react-native-foundation';\nimport { useGroupChannelHandler } from '@sendbird/uikit-tools';\nimport {\n SendbirdMessage,\n SendbirdSendableMessage,\n confirmAndMarkAsRead,\n isDifferentChannel,\n useFreshCallback,\n useIsFirstMount,\n} from '@sendbird/uikit-utils';\n\nimport ChannelMessageList from '../../../components/ChannelMessageList';\nimport { UnreadMessagesFloatingProps } from '../../../components/UnreadMessagesFloating';\nimport { MESSAGE_FOCUS_ANIMATION_DELAY, MESSAGE_SEARCH_SAFE_SCROLL_DELAY } from '../../../constants';\nimport { GroupChannelFragmentOptionsPubSubContextPayload } from '../../../contexts/SendbirdChatCtx';\nimport { useLocalization, useSendbirdChat } from '../../../hooks/useContext';\nimport { GroupChannelContexts } from '../module/moduleContext';\nimport type { GroupChannelProps } from '../types';\n\nconst GroupChannelMessageList = (props: GroupChannelProps['MessageList']) => {\n const toast = useToast();\n const { STRINGS } = useLocalization();\n const { sdk, sbOptions, groupChannelFragmentOptions } = useSendbirdChat();\n const { setMessageToEdit, setMessageToReply } = useContext(GroupChannelContexts.Fragment);\n const groupChannelPubSub = useContext(GroupChannelContexts.PubSub);\n const { flatListRef, lazyScrollToBottom, lazyScrollToMessageId, onPressReplyMessageInThread } = useContext(\n GroupChannelContexts.MessageList,\n );\n\n const isFirstMount = useIsFirstMount();\n\n const hasSeenNewLineRef = useRef(false);\n const isNewLineInViewportRef = useRef(false);\n const isNewLineExistInChannelRef = useRef(false);\n const scrolledAwayFromBottomRef = useRef(false);\n const [isVisibleUnreadMessageFloating, setIsVisibleUnreadMessageFloating] = useState(false);\n const viewableMessages = useRef<SendbirdMessage[]>();\n const hasUserMarkedAsUnreadRef = useRef(false);\n const [unreadFirstMessage, setUnreadFirstMessage] = useState<SendbirdMessage | undefined>(undefined);\n const pendingBottomReachedRef = useRef<{ timeout: number; timestamp: number } | null>(null);\n\n const updateHasSeenNewLine = useCallback(\n (hasSeenNewLine: boolean) => {\n if (hasSeenNewLineRef.current !== hasSeenNewLine) {\n hasSeenNewLineRef.current = hasSeenNewLine;\n props.onNewLineSeenChange?.(hasSeenNewLine);\n }\n },\n [props.onNewLineSeenChange],\n );\n\n const updateHasUserMarkedAsUnread = useCallback(\n (hasUserMarkedAsUnread: boolean) => {\n if (hasUserMarkedAsUnreadRef.current !== hasUserMarkedAsUnread) {\n hasUserMarkedAsUnreadRef.current = hasUserMarkedAsUnread;\n props.onUserMarkedAsUnreadChange?.(hasUserMarkedAsUnread);\n }\n },\n [props.onUserMarkedAsUnreadChange],\n );\n\n const scrollToMessageWithCreatedAt = useFreshCallback(\n (createdAt: number, focusAnimated: boolean, timeout: number): boolean => {\n const foundMessage = props.messages.find((it) => it.createdAt === createdAt);\n const isIncludedInList = !!foundMessage;\n pendingBottomReachedRef.current = null;\n\n if (isIncludedInList) {\n if (focusAnimated) {\n setTimeout(() => props.onUpdateSearchItem({ startingPoint: createdAt }), MESSAGE_FOCUS_ANIMATION_DELAY);\n }\n pendingBottomReachedRef.current = { timeout, timestamp: Date.now() };\n lazyScrollToMessageId({ messageId: foundMessage.messageId, animated: true, timeout });\n } else {\n if (props.channel.messageOffsetTimestamp <= createdAt) {\n if (focusAnimated) {\n props.onUpdateSearchItem({ startingPoint: createdAt });\n }\n props.onResetMessageListWithStartingPoint(createdAt).catch((_) => {});\n } else {\n return false;\n }\n }\n return true;\n },\n );\n\n const onScrolledAwayFromBottom = useFreshCallback((value: boolean) => {\n scrolledAwayFromBottomRef.current = value;\n props.onScrolledAwayFromBottom(value);\n });\n\n const scrollToBottom = useFreshCallback(async (animated = false) => {\n if (props.hasNext()) {\n props.onUpdateSearchItem(undefined);\n onScrolledAwayFromBottom(false);\n\n await props.onResetMessageList().catch((_) => {});\n onScrolledAwayFromBottom(false);\n lazyScrollToBottom({ animated });\n } else {\n lazyScrollToBottom({ animated });\n }\n });\n\n const onPressUnreadMessagesFloatingCloseButton = useCallback(() => {\n updateHasSeenNewLine(true);\n updateHasUserMarkedAsUnread(false);\n props.resetNewMessages?.();\n confirmAndMarkAsRead([props.channel]);\n }, [updateHasSeenNewLine, updateHasUserMarkedAsUnread, props.channel.url, props.resetNewMessages]);\n\n const getPrevNonSilentMessage = useCallback(\n (messages: SendbirdMessage[], prevMessageIndex: number): SendbirdMessage | null => {\n if (messages.length <= prevMessageIndex) {\n return null;\n }\n\n const prevMessage = messages[prevMessageIndex];\n if (prevMessage) {\n if (prevMessage.silent) {\n return getPrevNonSilentMessage(messages, prevMessageIndex + 1);\n } else {\n return prevMessage;\n }\n }\n return null;\n },\n [],\n );\n\n const findFirstUnreadMessage = useFreshCallback((isNewLineExistInChannel: boolean) => {\n if (!sbOptions.uikit.groupChannel.channel.enableMarkAsUnread || !isNewLineExistInChannel) {\n return;\n }\n\n return props.messages.find((msg, index) => {\n if (msg.silent) {\n return false;\n }\n\n const isMarkedAsUnreadMessage = props.channel.myLastRead === msg.createdAt - 1;\n if (isMarkedAsUnreadMessage) {\n return true;\n }\n\n const prevNonSilentMessage = getPrevNonSilentMessage(props.messages, index + 1);\n const hasNoPreviousAndNoPrevMessage = !props.hasPrevious?.() && prevNonSilentMessage == null;\n const prevMessageIsRead =\n prevNonSilentMessage != null && prevNonSilentMessage.createdAt <= props.channel.myLastRead;\n const isMessageUnread = props.channel.myLastRead < msg.createdAt;\n return (hasNoPreviousAndNoPrevMessage || prevMessageIsRead) && isMessageUnread;\n });\n });\n\n useEffect(() => {\n if (!unreadFirstMessage) {\n const foundUnreadFirstMessage = findFirstUnreadMessage(props.isNewLineExistInChannel ?? false);\n if (foundUnreadFirstMessage) {\n processNewLineVisibility(foundUnreadFirstMessage);\n setUnreadFirstMessage(foundUnreadFirstMessage);\n }\n }\n }, [props.messages, props.channel.myLastRead, sbOptions.uikit.groupChannel.channel.enableMarkAsUnread]);\n\n const processNewLineVisibility = useFreshCallback((unreadFirstMsg: SendbirdMessage | undefined) => {\n const isNewLineInViewport = !!viewableMessages.current?.some(\n (message) => message.messageId === unreadFirstMsg?.messageId,\n );\n\n if (isNewLineInViewportRef.current !== isNewLineInViewport) {\n isNewLineInViewportRef.current = isNewLineInViewport;\n updateUnreadMessagesFloatingProps();\n if (!isNewLineInViewport || hasSeenNewLineRef.current) {\n return;\n }\n\n updateHasSeenNewLine(true);\n if (hasUserMarkedAsUnreadRef.current) {\n return;\n }\n\n if (0 < props.newMessages.length) {\n props.channel.markAsUnread(props.newMessages[0]);\n } else {\n props.channel.markAsRead();\n }\n }\n });\n\n const onViewableItemsChanged = useFreshCallback(\n async (info: { viewableItems: Array<ViewToken<SendbirdMessage>>; changed: Array<ViewToken<SendbirdMessage>> }) => {\n if (!sbOptions.uikit.groupChannel.channel.enableMarkAsUnread) {\n return;\n }\n\n viewableMessages.current = info.viewableItems.filter((token) => token.item).map((token) => token.item);\n processNewLineVisibility(unreadFirstMessage);\n },\n );\n\n const onPressMarkAsUnreadMessage = useCallback(\n async (message: SendbirdMessage) => {\n if (sbOptions.uikit.groupChannel.channel.enableMarkAsUnread && message) {\n await props.channel.markAsUnread(message);\n updateHasUserMarkedAsUnread(true);\n }\n },\n [sbOptions.uikit.groupChannel.channel.enableMarkAsUnread, updateHasUserMarkedAsUnread],\n );\n\n useEffect(() => {\n isNewLineExistInChannelRef.current = !!props.isNewLineExistInChannel && !!viewableMessages.current;\n }, [props.isNewLineExistInChannel, viewableMessages.current]);\n\n const unreadMessagesFloatingPropsRef = useRef<UnreadMessagesFloatingProps>();\n const updateUnreadMessagesFloatingProps = useFreshCallback(() => {\n const canAutoMarkAsRead =\n !scrolledAwayFromBottomRef.current &&\n !hasUserMarkedAsUnreadRef.current &&\n (hasSeenNewLineRef.current || !isNewLineExistInChannelRef.current);\n\n unreadMessagesFloatingPropsRef.current = {\n visible:\n sbOptions.uikit.groupChannel.channel.enableMarkAsUnread &&\n !canAutoMarkAsRead &&\n isNewLineExistInChannelRef.current &&\n 0 < props.channel.unreadMessageCount &&\n !isNewLineInViewportRef.current,\n onPressClose: onPressUnreadMessagesFloatingCloseButton,\n unreadMessageCount: props.channel.unreadMessageCount,\n };\n if (isVisibleUnreadMessageFloating !== unreadMessagesFloatingPropsRef.current.visible) {\n setIsVisibleUnreadMessageFloating(unreadMessagesFloatingPropsRef.current.visible);\n }\n });\n\n useEffect(() => {\n updateUnreadMessagesFloatingProps();\n }, [\n isNewLineExistInChannelRef.current,\n props.channel.unreadMessageCount,\n sbOptions.uikit.groupChannel.channel.enableMarkAsUnread,\n ]);\n\n useGroupChannelHandler(sdk, {\n onReactionUpdated(channel, event) {\n if (isDifferentChannel(channel, props.channel)) return;\n const recentMessage = props.messages[0];\n const isRecentMessage = recentMessage && recentMessage.messageId === event.messageId;\n const scrollReachedBottomAndCanScroll = !props.scrolledAwayFromBottom && !props.hasNext();\n if (isRecentMessage && scrollReachedBottomAndCanScroll) {\n lazyScrollToBottom({ animated: true, timeout: 250 });\n }\n },\n });\n\n useEffect(() => {\n return groupChannelPubSub.subscribe(({ type, data }) => {\n switch (type) {\n case 'TYPING_BUBBLE_RENDERED':\n case 'MESSAGES_RECEIVED': {\n if (!props.scrolledAwayFromBottom) {\n scrollToBottom(true);\n }\n break;\n }\n case 'MESSAGES_UPDATED': {\n const lastMessage = props.channel.lastMessage;\n const [updatedMessage] = data.messages;\n\n const lastMessageUpdated =\n updatedMessage && lastMessage && lastMessage.messageId === updatedMessage.messageId;\n\n const isMaybeStreaming = props.channel.hasAiBot && lastMessageUpdated;\n\n if (isMaybeStreaming) {\n scrollToBottom(false);\n } else if (!props.scrolledAwayFromBottom && lastMessageUpdated) {\n scrollToBottom(true);\n }\n break;\n }\n case 'MESSAGE_SENT_SUCCESS':\n case 'MESSAGE_SENT_PENDING': {\n scrollToBottom(false);\n break;\n }\n case 'ON_MARKED_AS_READ_BY_CURRENT_USER': {\n updateUnreadMessagesFloatingProps();\n break;\n }\n case 'ON_MARKED_AS_UNREAD_BY_CURRENT_USER': {\n isNewLineExistInChannelRef.current = true;\n const foundFirstUnreadMessage = findFirstUnreadMessage(true);\n processNewLineVisibility(foundFirstUnreadMessage);\n setUnreadFirstMessage(foundFirstUnreadMessage);\n if (!props.scrolledAwayFromBottom) {\n scrollToBottom(true);\n }\n break;\n }\n }\n });\n }, [props.scrolledAwayFromBottom]);\n\n useEffect(() => {\n return groupChannelFragmentOptions.pubsub.subscribe((payload: GroupChannelFragmentOptionsPubSubContextPayload) => {\n switch (payload.type) {\n case 'OVERRIDE_SEARCH_ITEM_STARTING_POINT': {\n scrollToMessageWithCreatedAt(payload.data.startingPoint, false, MESSAGE_SEARCH_SAFE_SCROLL_DELAY);\n break;\n }\n }\n });\n }, []);\n\n useEffect(() => {\n // Only trigger once when message list mount with initial props.searchItem\n // - Search screen + searchItem > mount message list\n // - Reset message list + searchItem > re-mount message list\n if (isFirstMount && props.searchItem) {\n scrollToMessageWithCreatedAt(props.searchItem.startingPoint, false, MESSAGE_SEARCH_SAFE_SCROLL_DELAY);\n }\n }, [isFirstMount]);\n\n const onPressParentMessage = useFreshCallback(\n (parentMessage: SendbirdMessage, childMessage: SendbirdSendableMessage) => {\n if (\n onPressReplyMessageInThread &&\n sbOptions.uikit.groupChannel.channel.replyType === 'thread' &&\n sbOptions.uikit.groupChannel.channel.threadReplySelectType === 'thread'\n ) {\n if (parentMessage.createdAt >= props.channel.messageOffsetTimestamp) {\n onPressReplyMessageInThread(parentMessage as SendbirdSendableMessage, childMessage.createdAt);\n } else {\n toast.show(STRINGS.TOAST.FIND_PARENT_MSG_ERROR, 'error');\n }\n } else {\n const canScrollToParent = scrollToMessageWithCreatedAt(parentMessage.createdAt, true, 0);\n if (!canScrollToParent) toast.show(STRINGS.TOAST.FIND_PARENT_MSG_ERROR, 'error');\n }\n },\n );\n\n const onBottomReached = useFreshCallback(() => {\n if (props.hasNext()) {\n if (pendingBottomReachedRef.current) {\n const currentTime = Date.now();\n const elapsedTime = currentTime - pendingBottomReachedRef.current.timestamp;\n\n const timeoutThreshold = 500;\n if (elapsedTime >= pendingBottomReachedRef.current.timeout + timeoutThreshold) {\n props.onBottomReached?.();\n pendingBottomReachedRef.current = null;\n }\n } else {\n props.onBottomReached?.();\n }\n }\n });\n\n return (\n <ChannelMessageList\n {...props}\n ref={flatListRef}\n onScrolledAwayFromBottom={onScrolledAwayFromBottom}\n onReplyMessage={setMessageToReply}\n onReplyInThreadMessage={setMessageToReply}\n onEditMessage={setMessageToEdit}\n onViewableItemsChanged={onViewableItemsChanged}\n onPressParentMessage={onPressParentMessage}\n onPressNewMessagesButton={scrollToBottom}\n onPressScrollToBottomButton={scrollToBottom}\n onPressMarkAsUnreadMessage={onPressMarkAsUnreadMessage}\n onBottomReached={onBottomReached}\n unreadFirstMessage={unreadFirstMessage}\n unreadMessagesFloatingProps={unreadMessagesFloatingPropsRef.current}\n />\n );\n};\n\nexport default React.memo(GroupChannelMessageList);\n"],"mappings":";AACA,OAAOA,KAAK,IAAIC,WAAW,EAAEC,UAAU,EAAEC,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,OAAO;AAEnF,SAASC,QAAQ,QAAQ,yCAAyC;AAClE,SAASC,sBAAsB,QAAQ,uBAAuB;AAC9D,SAGEC,oBAAoB,EACpBC,kBAAkB,EAClBC,gBAAgB,EAChBC,eAAe,QACV,uBAAuB;AAE9B,OAAOC,kBAAkB,MAAM,wCAAwC;AAEvE,SAASC,6BAA6B,EAAEC,gCAAgC,QAAQ,oBAAoB;AAEpG,SAASC,eAAe,EAAEC,eAAe,QAAQ,2BAA2B;AAC5E,SAASC,oBAAoB,QAAQ,yBAAyB;AAG9D,MAAMC,uBAAuB,GAAIC,KAAuC,IAAK;EAC3E,MAAMC,KAAK,GAAGd,QAAQ,CAAC,CAAC;EACxB,MAAM;IAAEe;EAAQ,CAAC,GAAGN,eAAe,CAAC,CAAC;EACrC,MAAM;IAAEO,GAAG;IAAEC,SAAS;IAAEC;EAA4B,CAAC,GAAGR,eAAe,CAAC,CAAC;EACzE,MAAM;IAAES,gBAAgB;IAAEC;EAAkB,CAAC,GAAGxB,UAAU,CAACe,oBAAoB,CAACU,QAAQ,CAAC;EACzF,MAAMC,kBAAkB,GAAG1B,UAAU,CAACe,oBAAoB,CAACY,MAAM,CAAC;EAClE,MAAM;IAAEC,WAAW;IAAEC,kBAAkB;IAAEC,qBAAqB;IAAEC;EAA4B,CAAC,GAAG/B,UAAU,CACxGe,oBAAoB,CAACiB,WACvB,CAAC;EAED,MAAMC,YAAY,GAAGxB,eAAe,CAAC,CAAC;EAEtC,MAAMyB,iBAAiB,GAAGhC,MAAM,CAAC,KAAK,CAAC;EACvC,MAAMiC,sBAAsB,GAAGjC,MAAM,CAAC,KAAK,CAAC;EAC5C,MAAMkC,0BAA0B,GAAGlC,MAAM,CAAC,KAAK,CAAC;EAChD,MAAMmC,yBAAyB,GAAGnC,MAAM,CAAC,KAAK,CAAC;EAC/C,MAAM,CAACoC,8BAA8B,EAAEC,iCAAiC,CAAC,GAAGpC,QAAQ,CAAC,KAAK,CAAC;EAC3F,MAAMqC,gBAAgB,GAAGtC,MAAM,CAAoB,CAAC;EACpD,MAAMuC,wBAAwB,GAAGvC,MAAM,CAAC,KAAK,CAAC;EAC9C,MAAM,CAACwC,kBAAkB,EAAEC,qBAAqB,CAAC,GAAGxC,QAAQ,CAA8ByC,SAAS,CAAC;EACpG,MAAMC,uBAAuB,GAAG3C,MAAM,CAAgD,IAAI,CAAC;EAE3F,MAAM4C,oBAAoB,GAAG/C,WAAW,CACrCgD,cAAuB,IAAK;IAC3B,IAAIb,iBAAiB,CAACc,OAAO,KAAKD,cAAc,EAAE;MAAA,IAAAE,qBAAA;MAChDf,iBAAiB,CAACc,OAAO,GAAGD,cAAc;MAC1C,CAAAE,qBAAA,GAAAhC,KAAK,CAACiC,mBAAmB,cAAAD,qBAAA,eAAzBA,qBAAA,CAAAE,IAAA,CAAAlC,KAAK,EAAuB8B,cAAc,CAAC;IAC7C;EACF,CAAC,EACD,CAAC9B,KAAK,CAACiC,mBAAmB,CAC5B,CAAC;EAED,MAAME,2BAA2B,GAAGrD,WAAW,CAC5CsD,qBAA8B,IAAK;IAClC,IAAIZ,wBAAwB,CAACO,OAAO,KAAKK,qBAAqB,EAAE;MAAA,IAAAC,qBAAA;MAC9Db,wBAAwB,CAACO,OAAO,GAAGK,qBAAqB;MACxD,CAAAC,qBAAA,GAAArC,KAAK,CAACsC,0BAA0B,cAAAD,qBAAA,eAAhCA,qBAAA,CAAAH,IAAA,CAAAlC,KAAK,EAA8BoC,qBAAqB,CAAC;IAC3D;EACF,CAAC,EACD,CAACpC,KAAK,CAACsC,0BAA0B,CACnC,CAAC;EAED,MAAMC,4BAA4B,GAAGhD,gBAAgB,CACnD,CAACiD,SAAiB,EAAEC,aAAsB,EAAEC,OAAe,KAAc;IACvE,MAAMC,YAAY,GAAG3C,KAAK,CAAC4C,QAAQ,CAACC,IAAI,CAAEC,EAAE,IAAKA,EAAE,CAACN,SAAS,KAAKA,SAAS,CAAC;IAC5E,MAAMO,gBAAgB,GAAG,CAAC,CAACJ,YAAY;IACvCf,uBAAuB,CAACG,OAAO,GAAG,IAAI;IAEtC,IAAIgB,gBAAgB,EAAE;MACpB,IAAIN,aAAa,EAAE;QACjBO,UAAU,CAAC,MAAMhD,KAAK,CAACiD,kBAAkB,CAAC;UAAEC,aAAa,EAAEV;QAAU,CAAC,CAAC,EAAE9C,6BAA6B,CAAC;MACzG;MACAkC,uBAAuB,CAACG,OAAO,GAAG;QAAEW,OAAO;QAAES,SAAS,EAAEC,IAAI,CAACC,GAAG,CAAC;MAAE,CAAC;MACpExC,qBAAqB,CAAC;QAAEyC,SAAS,EAAEX,YAAY,CAACW,SAAS;QAAEC,QAAQ,EAAE,IAAI;QAAEb;MAAQ,CAAC,CAAC;IACvF,CAAC,MAAM;MACL,IAAI1C,KAAK,CAACwD,OAAO,CAACC,sBAAsB,IAAIjB,SAAS,EAAE;QACrD,IAAIC,aAAa,EAAE;UACjBzC,KAAK,CAACiD,kBAAkB,CAAC;YAAEC,aAAa,EAAEV;UAAU,CAAC,CAAC;QACxD;QACAxC,KAAK,CAAC0D,mCAAmC,CAAClB,SAAS,CAAC,CAACmB,KAAK,CAAEC,CAAC,IAAK,CAAC,CAAC,CAAC;MACvE,CAAC,MAAM;QACL,OAAO,KAAK;MACd;IACF;IACA,OAAO,IAAI;EACb,CACF,CAAC;EAED,MAAMC,wBAAwB,GAAGtE,gBAAgB,CAAEuE,KAAc,IAAK;IACpE1C,yBAAyB,CAACW,OAAO,GAAG+B,KAAK;IACzC9D,KAAK,CAAC6D,wBAAwB,CAACC,KAAK,CAAC;EACvC,CAAC,CAAC;EAEF,MAAMC,cAAc,GAAGxE,gBAAgB,CAAC,OAAOgE,QAAQ,GAAG,KAAK,KAAK;IAClE,IAAIvD,KAAK,CAACgE,OAAO,CAAC,CAAC,EAAE;MACnBhE,KAAK,CAACiD,kBAAkB,CAACtB,SAAS,CAAC;MACnCkC,wBAAwB,CAAC,KAAK,CAAC;MAE/B,MAAM7D,KAAK,CAACiE,kBAAkB,CAAC,CAAC,CAACN,KAAK,CAAEC,CAAC,IAAK,CAAC,CAAC,CAAC;MACjDC,wBAAwB,CAAC,KAAK,CAAC;MAC/BjD,kBAAkB,CAAC;QAAE2C;MAAS,CAAC,CAAC;IAClC,CAAC,MAAM;MACL3C,kBAAkB,CAAC;QAAE2C;MAAS,CAAC,CAAC;IAClC;EACF,CAAC,CAAC;EAEF,MAAMW,wCAAwC,GAAGpF,WAAW,CAAC,MAAM;IAAA,IAAAqF,qBAAA;IACjEtC,oBAAoB,CAAC,IAAI,CAAC;IAC1BM,2BAA2B,CAAC,KAAK,CAAC;IAClC,CAAAgC,qBAAA,GAAAnE,KAAK,CAACoE,gBAAgB,cAAAD,qBAAA,eAAtBA,qBAAA,CAAAjC,IAAA,CAAAlC,KAAyB,CAAC;IAC1BX,oBAAoB,CAAC,CAACW,KAAK,CAACwD,OAAO,CAAC,CAAC;EACvC,CAAC,EAAE,CAAC3B,oBAAoB,EAAEM,2BAA2B,EAAEnC,KAAK,CAACwD,OAAO,CAACa,GAAG,EAAErE,KAAK,CAACoE,gBAAgB,CAAC,CAAC;EAElG,MAAME,uBAAuB,GAAGxF,WAAW,CACzC,CAAC8D,QAA2B,EAAE2B,gBAAwB,KAA6B;IACjF,IAAI3B,QAAQ,CAAC4B,MAAM,IAAID,gBAAgB,EAAE;MACvC,OAAO,IAAI;IACb;IAEA,MAAME,WAAW,GAAG7B,QAAQ,CAAC2B,gBAAgB,CAAC;IAC9C,IAAIE,WAAW,EAAE;MACf,IAAIA,WAAW,CAACC,MAAM,EAAE;QACtB,OAAOJ,uBAAuB,CAAC1B,QAAQ,EAAE2B,gBAAgB,GAAG,CAAC,CAAC;MAChE,CAAC,MAAM;QACL,OAAOE,WAAW;MACpB;IACF;IACA,OAAO,IAAI;EACb,CAAC,EACD,EACF,CAAC;EAED,MAAME,sBAAsB,GAAGpF,gBAAgB,CAAEqF,uBAAgC,IAAK;IACpF,IAAI,CAACxE,SAAS,CAACyE,KAAK,CAACC,YAAY,CAACtB,OAAO,CAACuB,kBAAkB,IAAI,CAACH,uBAAuB,EAAE;MACxF;IACF;IAEA,OAAO5E,KAAK,CAAC4C,QAAQ,CAACC,IAAI,CAAC,CAACmC,GAAG,EAAEC,KAAK,KAAK;MAAA,IAAAC,kBAAA;MACzC,IAAIF,GAAG,CAACN,MAAM,EAAE;QACd,OAAO,KAAK;MACd;MAEA,MAAMS,uBAAuB,GAAGnF,KAAK,CAACwD,OAAO,CAAC4B,UAAU,KAAKJ,GAAG,CAACxC,SAAS,GAAG,CAAC;MAC9E,IAAI2C,uBAAuB,EAAE;QAC3B,OAAO,IAAI;MACb;MAEA,MAAME,oBAAoB,GAAGf,uBAAuB,CAACtE,KAAK,CAAC4C,QAAQ,EAAEqC,KAAK,GAAG,CAAC,CAAC;MAC/E,MAAMK,6BAA6B,GAAG,GAAAJ,kBAAA,GAAClF,KAAK,CAACuF,WAAW,cAAAL,kBAAA,eAAjBA,kBAAA,CAAAhD,IAAA,CAAAlC,KAAoB,CAAC,KAAIqF,oBAAoB,IAAI,IAAI;MAC5F,MAAMG,iBAAiB,GACrBH,oBAAoB,IAAI,IAAI,IAAIA,oBAAoB,CAAC7C,SAAS,IAAIxC,KAAK,CAACwD,OAAO,CAAC4B,UAAU;MAC5F,MAAMK,eAAe,GAAGzF,KAAK,CAACwD,OAAO,CAAC4B,UAAU,GAAGJ,GAAG,CAACxC,SAAS;MAChE,OAAO,CAAC8C,6BAA6B,IAAIE,iBAAiB,KAAKC,eAAe;IAChF,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFzG,SAAS,CAAC,MAAM;IACd,IAAI,CAACyC,kBAAkB,EAAE;MACvB,MAAMiE,uBAAuB,GAAGf,sBAAsB,CAAC3E,KAAK,CAAC4E,uBAAuB,IAAI,KAAK,CAAC;MAC9F,IAAIc,uBAAuB,EAAE;QAC3BC,wBAAwB,CAACD,uBAAuB,CAAC;QACjDhE,qBAAqB,CAACgE,uBAAuB,CAAC;MAChD;IACF;EACF,CAAC,EAAE,CAAC1F,KAAK,CAAC4C,QAAQ,EAAE5C,KAAK,CAACwD,OAAO,CAAC4B,UAAU,EAAEhF,SAAS,CAACyE,KAAK,CAACC,YAAY,CAACtB,OAAO,CAACuB,kBAAkB,CAAC,CAAC;EAEvG,MAAMY,wBAAwB,GAAGpG,gBAAgB,CAAEqG,cAA2C,IAAK;IAAA,IAAAC,qBAAA;IACjG,MAAMC,mBAAmB,GAAG,CAAC,GAAAD,qBAAA,GAACtE,gBAAgB,CAACQ,OAAO,cAAA8D,qBAAA,eAAxBA,qBAAA,CAA0BE,IAAI,CACzDC,OAAO,IAAKA,OAAO,CAAC1C,SAAS,MAAKsC,cAAc,aAAdA,cAAc,uBAAdA,cAAc,CAAEtC,SAAS,CAC9D,CAAC;IAED,IAAIpC,sBAAsB,CAACa,OAAO,KAAK+D,mBAAmB,EAAE;MAC1D5E,sBAAsB,CAACa,OAAO,GAAG+D,mBAAmB;MACpDG,iCAAiC,CAAC,CAAC;MACnC,IAAI,CAACH,mBAAmB,IAAI7E,iBAAiB,CAACc,OAAO,EAAE;QACrD;MACF;MAEAF,oBAAoB,CAAC,IAAI,CAAC;MAC1B,IAAIL,wBAAwB,CAACO,OAAO,EAAE;QACpC;MACF;MAEA,IAAI,CAAC,GAAG/B,KAAK,CAACkG,WAAW,CAAC1B,MAAM,EAAE;QAChCxE,KAAK,CAACwD,OAAO,CAAC2C,YAAY,CAACnG,KAAK,CAACkG,WAAW,CAAC,CAAC,CAAC,CAAC;MAClD,CAAC,MAAM;QACLlG,KAAK,CAACwD,OAAO,CAAC4C,UAAU,CAAC,CAAC;MAC5B;IACF;EACF,CAAC,CAAC;EAEF,MAAMC,sBAAsB,GAAG9G,gBAAgB,CAC7C,MAAO+G,IAAsG,IAAK;IAChH,IAAI,CAAClG,SAAS,CAACyE,KAAK,CAACC,YAAY,CAACtB,OAAO,CAACuB,kBAAkB,EAAE;MAC5D;IACF;IAEAxD,gBAAgB,CAACQ,OAAO,GAAGuE,IAAI,CAACC,aAAa,CAACC,MAAM,CAAEC,KAAK,IAAKA,KAAK,CAACC,IAAI,CAAC,CAACC,GAAG,CAAEF,KAAK,IAAKA,KAAK,CAACC,IAAI,CAAC;IACtGf,wBAAwB,CAAClE,kBAAkB,CAAC;EAC9C,CACF,CAAC;EAED,MAAMmF,0BAA0B,GAAG9H,WAAW,CAC5C,MAAOkH,OAAwB,IAAK;IAClC,IAAI5F,SAAS,CAACyE,KAAK,CAACC,YAAY,CAACtB,OAAO,CAACuB,kBAAkB,IAAIiB,OAAO,EAAE;MACtE,MAAMhG,KAAK,CAACwD,OAAO,CAAC2C,YAAY,CAACH,OAAO,CAAC;MACzC7D,2BAA2B,CAAC,IAAI,CAAC;IACnC;EACF,CAAC,EACD,CAAC/B,SAAS,CAACyE,KAAK,CAACC,YAAY,CAACtB,OAAO,CAACuB,kBAAkB,EAAE5C,2BAA2B,CACvF,CAAC;EAEDnD,SAAS,CAAC,MAAM;IACdmC,0BAA0B,CAACY,OAAO,GAAG,CAAC,CAAC/B,KAAK,CAAC4E,uBAAuB,IAAI,CAAC,CAACrD,gBAAgB,CAACQ,OAAO;EACpG,CAAC,EAAE,CAAC/B,KAAK,CAAC4E,uBAAuB,EAAErD,gBAAgB,CAACQ,OAAO,CAAC,CAAC;EAE7D,MAAM8E,8BAA8B,GAAG5H,MAAM,CAA8B,CAAC;EAC5E,MAAMgH,iCAAiC,GAAG1G,gBAAgB,CAAC,MAAM;IAC/D,MAAMuH,iBAAiB,GACrB,CAAC1F,yBAAyB,CAACW,OAAO,IAClC,CAACP,wBAAwB,CAACO,OAAO,KAChCd,iBAAiB,CAACc,OAAO,IAAI,CAACZ,0BAA0B,CAACY,OAAO,CAAC;IAEpE8E,8BAA8B,CAAC9E,OAAO,GAAG;MACvCgF,OAAO,EACL3G,SAAS,CAACyE,KAAK,CAACC,YAAY,CAACtB,OAAO,CAACuB,kBAAkB,IACvD,CAAC+B,iBAAiB,IAClB3F,0BAA0B,CAACY,OAAO,IAClC,CAAC,GAAG/B,KAAK,CAACwD,OAAO,CAACwD,kBAAkB,IACpC,CAAC9F,sBAAsB,CAACa,OAAO;MACjCkF,YAAY,EAAE/C,wCAAwC;MACtD8C,kBAAkB,EAAEhH,KAAK,CAACwD,OAAO,CAACwD;IACpC,CAAC;IACD,IAAI3F,8BAA8B,KAAKwF,8BAA8B,CAAC9E,OAAO,CAACgF,OAAO,EAAE;MACrFzF,iCAAiC,CAACuF,8BAA8B,CAAC9E,OAAO,CAACgF,OAAO,CAAC;IACnF;EACF,CAAC,CAAC;EAEF/H,SAAS,CAAC,MAAM;IACdiH,iCAAiC,CAAC,CAAC;EACrC,CAAC,EAAE,CACD9E,0BAA0B,CAACY,OAAO,EAClC/B,KAAK,CAACwD,OAAO,CAACwD,kBAAkB,EAChC5G,SAAS,CAACyE,KAAK,CAACC,YAAY,CAACtB,OAAO,CAACuB,kBAAkB,CACxD,CAAC;EAEF3F,sBAAsB,CAACe,GAAG,EAAE;IAC1B+G,iBAAiBA,CAAC1D,OAAO,EAAE2D,KAAK,EAAE;MAChC,IAAI7H,kBAAkB,CAACkE,OAAO,EAAExD,KAAK,CAACwD,OAAO,CAAC,EAAE;MAChD,MAAM4D,aAAa,GAAGpH,KAAK,CAAC4C,QAAQ,CAAC,CAAC,CAAC;MACvC,MAAMyE,eAAe,GAAGD,aAAa,IAAIA,aAAa,CAAC9D,SAAS,KAAK6D,KAAK,CAAC7D,SAAS;MACpF,MAAMgE,+BAA+B,GAAG,CAACtH,KAAK,CAACuH,sBAAsB,IAAI,CAACvH,KAAK,CAACgE,OAAO,CAAC,CAAC;MACzF,IAAIqD,eAAe,IAAIC,+BAA+B,EAAE;QACtD1G,kBAAkB,CAAC;UAAE2C,QAAQ,EAAE,IAAI;UAAEb,OAAO,EAAE;QAAI,CAAC,CAAC;MACtD;IACF;EACF,CAAC,CAAC;EAEF1D,SAAS,CAAC,MAAM;IACd,OAAOyB,kBAAkB,CAAC+G,SAAS,CAAC,CAAC;MAAEC,IAAI;MAAEC;IAAK,CAAC,KAAK;MACtD,QAAQD,IAAI;QACV,KAAK,wBAAwB;QAC7B,KAAK,mBAAmB;UAAE;YACxB,IAAI,CAACzH,KAAK,CAACuH,sBAAsB,EAAE;cACjCxD,cAAc,CAAC,IAAI,CAAC;YACtB;YACA;UACF;QACA,KAAK,kBAAkB;UAAE;YACvB,MAAM4D,WAAW,GAAG3H,KAAK,CAACwD,OAAO,CAACmE,WAAW;YAC7C,MAAM,CAACC,cAAc,CAAC,GAAGF,IAAI,CAAC9E,QAAQ;YAEtC,MAAMiF,kBAAkB,GACtBD,cAAc,IAAID,WAAW,IAAIA,WAAW,CAACrE,SAAS,KAAKsE,cAAc,CAACtE,SAAS;YAErF,MAAMwE,gBAAgB,GAAG9H,KAAK,CAACwD,OAAO,CAACuE,QAAQ,IAAIF,kBAAkB;YAErE,IAAIC,gBAAgB,EAAE;cACpB/D,cAAc,CAAC,KAAK,CAAC;YACvB,CAAC,MAAM,IAAI,CAAC/D,KAAK,CAACuH,sBAAsB,IAAIM,kBAAkB,EAAE;cAC9D9D,cAAc,CAAC,IAAI,CAAC;YACtB;YACA;UACF;QACA,KAAK,sBAAsB;QAC3B,KAAK,sBAAsB;UAAE;YAC3BA,cAAc,CAAC,KAAK,CAAC;YACrB;UACF;QACA,KAAK,mCAAmC;UAAE;YACxCkC,iCAAiC,CAAC,CAAC;YACnC;UACF;QACA,KAAK,qCAAqC;UAAE;YAC1C9E,0BAA0B,CAACY,OAAO,GAAG,IAAI;YACzC,MAAMiG,uBAAuB,GAAGrD,sBAAsB,CAAC,IAAI,CAAC;YAC5DgB,wBAAwB,CAACqC,uBAAuB,CAAC;YACjDtG,qBAAqB,CAACsG,uBAAuB,CAAC;YAC9C,IAAI,CAAChI,KAAK,CAACuH,sBAAsB,EAAE;cACjCxD,cAAc,CAAC,IAAI,CAAC;YACtB;YACA;UACF;MACF;IACF,CAAC,CAAC;EACJ,CAAC,EAAE,CAAC/D,KAAK,CAACuH,sBAAsB,CAAC,CAAC;EAElCvI,SAAS,CAAC,MAAM;IACd,OAAOqB,2BAA2B,CAAC4H,MAAM,CAACT,SAAS,CAAEU,OAAwD,IAAK;MAChH,QAAQA,OAAO,CAACT,IAAI;QAClB,KAAK,qCAAqC;UAAE;YAC1ClF,4BAA4B,CAAC2F,OAAO,CAACR,IAAI,CAACxE,aAAa,EAAE,KAAK,EAAEvD,gCAAgC,CAAC;YACjG;UACF;MACF;IACF,CAAC,CAAC;EACJ,CAAC,EAAE,EAAE,CAAC;EAENX,SAAS,CAAC,MAAM;IACd;IACA;IACA;IACA,IAAIgC,YAAY,IAAIhB,KAAK,CAACmI,UAAU,EAAE;MACpC5F,4BAA4B,CAACvC,KAAK,CAACmI,UAAU,CAACjF,aAAa,EAAE,KAAK,EAAEvD,gCAAgC,CAAC;IACvG;EACF,CAAC,EAAE,CAACqB,YAAY,CAAC,CAAC;EAElB,MAAMoH,oBAAoB,GAAG7I,gBAAgB,CAC3C,CAAC8I,aAA8B,EAAEC,YAAqC,KAAK;IACzE,IACExH,2BAA2B,IAC3BV,SAAS,CAACyE,KAAK,CAACC,YAAY,CAACtB,OAAO,CAAC+E,SAAS,KAAK,QAAQ,IAC3DnI,SAAS,CAACyE,KAAK,CAACC,YAAY,CAACtB,OAAO,CAACgF,qBAAqB,KAAK,QAAQ,EACvE;MACA,IAAIH,aAAa,CAAC7F,SAAS,IAAIxC,KAAK,CAACwD,OAAO,CAACC,sBAAsB,EAAE;QACnE3C,2BAA2B,CAACuH,aAAa,EAA6BC,YAAY,CAAC9F,SAAS,CAAC;MAC/F,CAAC,MAAM;QACLvC,KAAK,CAACwI,IAAI,CAACvI,OAAO,CAACwI,KAAK,CAACC,qBAAqB,EAAE,OAAO,CAAC;MAC1D;IACF,CAAC,MAAM;MACL,MAAMC,iBAAiB,GAAGrG,4BAA4B,CAAC8F,aAAa,CAAC7F,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;MACxF,IAAI,CAACoG,iBAAiB,EAAE3I,KAAK,CAACwI,IAAI,CAACvI,OAAO,CAACwI,KAAK,CAACC,qBAAqB,EAAE,OAAO,CAAC;IAClF;EACF,CACF,CAAC;EAED,MAAME,eAAe,GAAGtJ,gBAAgB,CAAC,MAAM;IAC7C,IAAIS,KAAK,CAACgE,OAAO,CAAC,CAAC,EAAE;MACnB,IAAIpC,uBAAuB,CAACG,OAAO,EAAE;QACnC,MAAM+G,WAAW,GAAG1F,IAAI,CAACC,GAAG,CAAC,CAAC;QAC9B,MAAM0F,WAAW,GAAGD,WAAW,GAAGlH,uBAAuB,CAACG,OAAO,CAACoB,SAAS;QAE3E,MAAM6F,gBAAgB,GAAG,GAAG;QAC5B,IAAID,WAAW,IAAInH,uBAAuB,CAACG,OAAO,CAACW,OAAO,GAAGsG,gBAAgB,EAAE;UAAA,IAAAC,qBAAA;UAC7E,CAAAA,qBAAA,GAAAjJ,KAAK,CAAC6I,eAAe,cAAAI,qBAAA,eAArBA,qBAAA,CAAA/G,IAAA,CAAAlC,KAAwB,CAAC;UACzB4B,uBAAuB,CAACG,OAAO,GAAG,IAAI;QACxC;MACF,CAAC,MAAM;QAAA,IAAAmH,sBAAA;QACL,CAAAA,sBAAA,GAAAlJ,KAAK,CAAC6I,eAAe,cAAAK,sBAAA,eAArBA,sBAAA,CAAAhH,IAAA,CAAAlC,KAAwB,CAAC;MAC3B;IACF;EACF,CAAC,CAAC;EAEF,oBACEnB,KAAA,CAAAsK,aAAA,CAAC1J,kBAAkB,EAAA2J,QAAA,KACbpJ,KAAK;IACTqJ,GAAG,EAAE1I,WAAY;IACjBkD,wBAAwB,EAAEA,wBAAyB;IACnDyF,cAAc,EAAE/I,iBAAkB;IAClCgJ,sBAAsB,EAAEhJ,iBAAkB;IAC1CiJ,aAAa,EAAElJ,gBAAiB;IAChC+F,sBAAsB,EAAEA,sBAAuB;IAC/C+B,oBAAoB,EAAEA,oBAAqB;IAC3CqB,wBAAwB,EAAE1F,cAAe;IACzC2F,2BAA2B,EAAE3F,cAAe;IAC5C6C,0BAA0B,EAAEA,0BAA2B;IACvDiC,eAAe,EAAEA,eAAgB;IACjCpH,kBAAkB,EAAEA,kBAAmB;IACvCkI,2BAA2B,EAAE9C,8BAA8B,CAAC9E;EAAQ,EACrE,CAAC;AAEN,CAAC;AAED,4BAAelD,KAAK,CAAC+K,IAAI,CAAC7J,uBAAuB,CAAC","ignoreList":[]}
@@ -1,16 +1,37 @@
1
1
  import { Platform } from 'react-native';
2
+
3
+ // Type definitions for Firebase Messaging Module instance
4
+ // This represents the instance returned by messaging() or getMessaging()
5
+ // We use a type alias to handle both v14 and v22+ types
6
+
7
+ // Type definitions for modular API support (Firebase v22+)
8
+ // The modular API provides standalone functions that accept a messaging instance
9
+
10
+ // Create a flexible type that can handle both v14 and v22+ Firebase modules
11
+
12
+ const isModularAPI = module => {
13
+ return typeof module.getMessaging === 'function';
14
+ };
2
15
  const createNativeNotificationService = ({
3
16
  messagingModule,
4
17
  permissionModule
5
18
  }) => {
6
- const module = messagingModule();
19
+ const isModular = isModularAPI(messagingModule);
20
+ const modularMessaging = isModular ? messagingModule : null;
21
+ const messaging = isModular ? modularMessaging.getMessaging() : messagingModule();
7
22
  const authorizedStatus = [messagingModule.AuthorizationStatus.AUTHORIZED, messagingModule.AuthorizationStatus.PROVISIONAL];
8
23
  return {
9
24
  getAPNSToken() {
10
- return module.getAPNSToken();
25
+ if (modularMessaging) {
26
+ return modularMessaging.getAPNSToken(messaging);
27
+ }
28
+ return messaging.getAPNSToken();
11
29
  },
12
30
  getFCMToken() {
13
- return module.getToken();
31
+ if (modularMessaging) {
32
+ return modularMessaging.getToken(messaging);
33
+ }
34
+ return messaging.getToken();
14
35
  },
15
36
  async hasPushPermission() {
16
37
  if (Platform.OS === 'android') {
@@ -18,7 +39,7 @@ const createNativeNotificationService = ({
18
39
  return result.status === 'granted';
19
40
  }
20
41
  if (Platform.OS === 'ios') {
21
- const status = await module.hasPermission();
42
+ const status = modularMessaging ? await modularMessaging.hasPermission(messaging) : await messaging.hasPermission();
22
43
  return authorizedStatus.includes(status);
23
44
  }
24
45
  return false;
@@ -29,13 +50,18 @@ const createNativeNotificationService = ({
29
50
  return result.status === 'granted';
30
51
  }
31
52
  if (Platform.OS === 'ios') {
32
- const status = await module.requestPermission();
53
+ const status = modularMessaging ? await modularMessaging.requestPermission(messaging) : await messaging.requestPermission();
33
54
  return authorizedStatus.includes(status);
34
55
  }
35
56
  return false;
36
57
  },
37
58
  onTokenRefresh(handler) {
38
- return module.onTokenRefresh(token => {
59
+ if (modularMessaging) {
60
+ return modularMessaging.onTokenRefresh(messaging, token => {
61
+ if (Platform.OS === 'android') handler(token);
62
+ });
63
+ }
64
+ return messaging.onTokenRefresh(token => {
39
65
  if (Platform.OS === 'android') handler(token);
40
66
  });
41
67
  }
@@ -1 +1 @@
1
- {"version":3,"names":["Platform","createNativeNotificationService","messagingModule","permissionModule","module","authorizedStatus","AuthorizationStatus","AUTHORIZED","PROVISIONAL","getAPNSToken","getFCMToken","getToken","hasPushPermission","OS","result","checkNotifications","status","hasPermission","includes","requestPushPermission","requestNotifications","requestPermission","onTokenRefresh","handler","token"],"sources":["createNotificationService.native.ts"],"sourcesContent":["import type RNFBMessaging from '@react-native-firebase/messaging';\nimport { Platform } from 'react-native';\nimport type * as Permissions from 'react-native-permissions';\n\nimport type { NotificationServiceInterface } from './types';\n\nconst createNativeNotificationService = ({\n messagingModule,\n permissionModule,\n}: {\n messagingModule: typeof RNFBMessaging;\n permissionModule: typeof Permissions;\n}): NotificationServiceInterface => {\n const module = messagingModule();\n const authorizedStatus = [\n messagingModule.AuthorizationStatus.AUTHORIZED,\n messagingModule.AuthorizationStatus.PROVISIONAL,\n ];\n return {\n getAPNSToken(): Promise<string | null> {\n return module.getAPNSToken();\n },\n getFCMToken(): Promise<string | null> {\n return module.getToken();\n },\n async hasPushPermission(): Promise<boolean> {\n if (Platform.OS === 'android') {\n const result = await permissionModule.checkNotifications();\n return result.status === 'granted';\n }\n\n if (Platform.OS === 'ios') {\n const status = await module.hasPermission();\n return authorizedStatus.includes(status);\n }\n\n return false;\n },\n async requestPushPermission(): Promise<boolean> {\n if (Platform.OS === 'android') {\n const result = await permissionModule.requestNotifications([]);\n return result.status === 'granted';\n }\n\n if (Platform.OS === 'ios') {\n const status = await module.requestPermission();\n return authorizedStatus.includes(status);\n }\n\n return false;\n },\n onTokenRefresh(handler: (token: string) => void): () => void | undefined {\n return module.onTokenRefresh((token) => {\n if (Platform.OS === 'android') handler(token);\n });\n },\n };\n};\n\nexport default createNativeNotificationService;\n"],"mappings":"AACA,SAASA,QAAQ,QAAQ,cAAc;AAKvC,MAAMC,+BAA+B,GAAGA,CAAC;EACvCC,eAAe;EACfC;AAIF,CAAC,KAAmC;EAClC,MAAMC,MAAM,GAAGF,eAAe,CAAC,CAAC;EAChC,MAAMG,gBAAgB,GAAG,CACvBH,eAAe,CAACI,mBAAmB,CAACC,UAAU,EAC9CL,eAAe,CAACI,mBAAmB,CAACE,WAAW,CAChD;EACD,OAAO;IACLC,YAAYA,CAAA,EAA2B;MACrC,OAAOL,MAAM,CAACK,YAAY,CAAC,CAAC;IAC9B,CAAC;IACDC,WAAWA,CAAA,EAA2B;MACpC,OAAON,MAAM,CAACO,QAAQ,CAAC,CAAC;IAC1B,CAAC;IACD,MAAMC,iBAAiBA,CAAA,EAAqB;MAC1C,IAAIZ,QAAQ,CAACa,EAAE,KAAK,SAAS,EAAE;QAC7B,MAAMC,MAAM,GAAG,MAAMX,gBAAgB,CAACY,kBAAkB,CAAC,CAAC;QAC1D,OAAOD,MAAM,CAACE,MAAM,KAAK,SAAS;MACpC;MAEA,IAAIhB,QAAQ,CAACa,EAAE,KAAK,KAAK,EAAE;QACzB,MAAMG,MAAM,GAAG,MAAMZ,MAAM,CAACa,aAAa,CAAC,CAAC;QAC3C,OAAOZ,gBAAgB,CAACa,QAAQ,CAACF,MAAM,CAAC;MAC1C;MAEA,OAAO,KAAK;IACd,CAAC;IACD,MAAMG,qBAAqBA,CAAA,EAAqB;MAC9C,IAAInB,QAAQ,CAACa,EAAE,KAAK,SAAS,EAAE;QAC7B,MAAMC,MAAM,GAAG,MAAMX,gBAAgB,CAACiB,oBAAoB,CAAC,EAAE,CAAC;QAC9D,OAAON,MAAM,CAACE,MAAM,KAAK,SAAS;MACpC;MAEA,IAAIhB,QAAQ,CAACa,EAAE,KAAK,KAAK,EAAE;QACzB,MAAMG,MAAM,GAAG,MAAMZ,MAAM,CAACiB,iBAAiB,CAAC,CAAC;QAC/C,OAAOhB,gBAAgB,CAACa,QAAQ,CAACF,MAAM,CAAC;MAC1C;MAEA,OAAO,KAAK;IACd,CAAC;IACDM,cAAcA,CAACC,OAAgC,EAA0B;MACvE,OAAOnB,MAAM,CAACkB,cAAc,CAAEE,KAAK,IAAK;QACtC,IAAIxB,QAAQ,CAACa,EAAE,KAAK,SAAS,EAAEU,OAAO,CAACC,KAAK,CAAC;MAC/C,CAAC,CAAC;IACJ;EACF,CAAC;AACH,CAAC;AAED,eAAevB,+BAA+B","ignoreList":[]}
1
+ {"version":3,"names":["Platform","isModularAPI","module","getMessaging","createNativeNotificationService","messagingModule","permissionModule","isModular","modularMessaging","messaging","authorizedStatus","AuthorizationStatus","AUTHORIZED","PROVISIONAL","getAPNSToken","getFCMToken","getToken","hasPushPermission","OS","result","checkNotifications","status","hasPermission","includes","requestPushPermission","requestNotifications","requestPermission","onTokenRefresh","handler","token"],"sources":["createNotificationService.native.ts"],"sourcesContent":["import type RNFBMessaging from '@react-native-firebase/messaging';\nimport type { FirebaseMessagingTypes } from '@react-native-firebase/messaging';\nimport { Platform } from 'react-native';\nimport type * as Permissions from 'react-native-permissions';\n\nimport type { NotificationServiceInterface } from './types';\n\n// Type definitions for Firebase Messaging Module instance\n// This represents the instance returned by messaging() or getMessaging()\n// We use a type alias to handle both v14 and v22+ types\ntype MessagingInstance = ReturnType<typeof RNFBMessaging>;\n\n// Type definitions for modular API support (Firebase v22+)\n// The modular API provides standalone functions that accept a messaging instance\ntype ModularMessagingType = {\n getMessaging: () => MessagingInstance;\n getAPNSToken: (messaging: MessagingInstance) => Promise<string | null>;\n getToken: (messaging: MessagingInstance) => Promise<string>;\n hasPermission: (messaging: MessagingInstance) => Promise<FirebaseMessagingTypes.AuthorizationStatus>;\n requestPermission: (\n messaging: MessagingInstance,\n iosPermissions?: FirebaseMessagingTypes.IOSPermissions,\n ) => Promise<FirebaseMessagingTypes.AuthorizationStatus>;\n onTokenRefresh: (messaging: MessagingInstance, listener: (token: string) => void) => () => void;\n AuthorizationStatus: typeof RNFBMessaging.AuthorizationStatus;\n};\n\n// Create a flexible type that can handle both v14 and v22+ Firebase modules\ntype FirebaseMessagingModule = typeof RNFBMessaging | ModularMessagingType;\n\nconst isModularAPI = (module: FirebaseMessagingModule): module is ModularMessagingType => {\n return typeof (module as ModularMessagingType).getMessaging === 'function';\n};\n\nconst createNativeNotificationService = ({\n messagingModule,\n permissionModule,\n}: {\n messagingModule: FirebaseMessagingModule;\n permissionModule: typeof Permissions;\n}): NotificationServiceInterface => {\n const isModular = isModularAPI(messagingModule);\n const modularMessaging = isModular ? (messagingModule as ModularMessagingType) : null;\n const messaging = isModular ? modularMessaging!.getMessaging() : (messagingModule as typeof RNFBMessaging)();\n\n const authorizedStatus = [\n messagingModule.AuthorizationStatus.AUTHORIZED,\n messagingModule.AuthorizationStatus.PROVISIONAL,\n ];\n return {\n getAPNSToken(): Promise<string | null> {\n if (modularMessaging) {\n return modularMessaging.getAPNSToken(messaging);\n }\n return messaging.getAPNSToken();\n },\n getFCMToken(): Promise<string | null> {\n if (modularMessaging) {\n return modularMessaging.getToken(messaging);\n }\n return messaging.getToken();\n },\n async hasPushPermission(): Promise<boolean> {\n if (Platform.OS === 'android') {\n const result = await permissionModule.checkNotifications();\n return result.status === 'granted';\n }\n\n if (Platform.OS === 'ios') {\n const status = modularMessaging\n ? await modularMessaging.hasPermission(messaging)\n : await messaging.hasPermission();\n return authorizedStatus.includes(status);\n }\n\n return false;\n },\n async requestPushPermission(): Promise<boolean> {\n if (Platform.OS === 'android') {\n const result = await permissionModule.requestNotifications([]);\n return result.status === 'granted';\n }\n\n if (Platform.OS === 'ios') {\n const status = modularMessaging\n ? await modularMessaging.requestPermission(messaging)\n : await messaging.requestPermission();\n return authorizedStatus.includes(status);\n }\n\n return false;\n },\n onTokenRefresh(handler: (token: string) => void): () => void | undefined {\n if (modularMessaging) {\n return modularMessaging.onTokenRefresh(messaging, (token: string) => {\n if (Platform.OS === 'android') handler(token);\n });\n }\n return messaging.onTokenRefresh((token: string) => {\n if (Platform.OS === 'android') handler(token);\n });\n },\n };\n};\n\nexport default createNativeNotificationService;\n"],"mappings":"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","ignoreList":[]}
@@ -1,3 +1,3 @@
1
- const VERSION = '3.11.1';
1
+ const VERSION = '3.11.2';
2
2
  export default VERSION;
3
3
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["VERSION"],"sources":["version.ts"],"sourcesContent":["const VERSION = '3.11.1';\nexport default VERSION;\n"],"mappings":"AAAA,MAAMA,OAAO,GAAG,QAAQ;AACxB,eAAeA,OAAO","ignoreList":[]}
1
+ {"version":3,"names":["VERSION"],"sources":["version.ts"],"sourcesContent":["const VERSION = '3.11.2';\nexport default VERSION;\n"],"mappings":"AAAA,MAAMA,OAAO,GAAG,QAAQ;AACxB,eAAeA,OAAO","ignoreList":[]}
@@ -14,7 +14,7 @@ import type { StringSet } from '../localization/StringSet.type';
14
14
  import type { ClipboardServiceInterface, FileServiceInterface, MediaServiceInterface, NotificationServiceInterface, PlayerServiceInterface, RecorderServiceInterface } from '../platform/types';
15
15
  import { ErrorBoundaryProps, LocalCacheStorage } from '../types';
16
16
  export declare const SendbirdUIKit: Readonly<{
17
- VERSION: "3.11.1";
17
+ VERSION: "3.11.2";
18
18
  PLATFORM: string;
19
19
  DEFAULT: {
20
20
  AUTO_PUSH_TOKEN_REGISTRATION: boolean;
@@ -1,8 +1,20 @@
1
1
  import type RNFBMessaging from '@react-native-firebase/messaging';
2
+ import type { FirebaseMessagingTypes } from '@react-native-firebase/messaging';
2
3
  import type * as Permissions from 'react-native-permissions';
3
4
  import type { NotificationServiceInterface } from './types';
5
+ type MessagingInstance = ReturnType<typeof RNFBMessaging>;
6
+ type ModularMessagingType = {
7
+ getMessaging: () => MessagingInstance;
8
+ getAPNSToken: (messaging: MessagingInstance) => Promise<string | null>;
9
+ getToken: (messaging: MessagingInstance) => Promise<string>;
10
+ hasPermission: (messaging: MessagingInstance) => Promise<FirebaseMessagingTypes.AuthorizationStatus>;
11
+ requestPermission: (messaging: MessagingInstance, iosPermissions?: FirebaseMessagingTypes.IOSPermissions) => Promise<FirebaseMessagingTypes.AuthorizationStatus>;
12
+ onTokenRefresh: (messaging: MessagingInstance, listener: (token: string) => void) => () => void;
13
+ AuthorizationStatus: typeof RNFBMessaging.AuthorizationStatus;
14
+ };
15
+ type FirebaseMessagingModule = typeof RNFBMessaging | ModularMessagingType;
4
16
  declare const createNativeNotificationService: ({ messagingModule, permissionModule, }: {
5
- messagingModule: typeof RNFBMessaging;
17
+ messagingModule: FirebaseMessagingModule;
6
18
  permissionModule: typeof Permissions;
7
19
  }) => NotificationServiceInterface;
8
20
  export default createNativeNotificationService;
@@ -1,2 +1,2 @@
1
- declare const VERSION = "3.11.1";
1
+ declare const VERSION = "3.11.2";
2
2
  export default VERSION;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sendbird/uikit-react-native",
3
- "version": "3.11.1",
3
+ "version": "3.11.2",
4
4
  "description": "Sendbird UIKit for React Native: A feature-rich and customizable chat UI kit with messaging, channel management, and user authentication.",
5
5
  "keywords": [
6
6
  "sendbird",
@@ -60,10 +60,10 @@
60
60
  },
61
61
  "dependencies": {
62
62
  "@openspacelabs/react-native-zoomable-view": "^2.1.5",
63
- "@sendbird/uikit-chat-hooks": "3.11.1",
64
- "@sendbird/uikit-react-native-foundation": "3.11.1",
63
+ "@sendbird/uikit-chat-hooks": "3.11.2",
64
+ "@sendbird/uikit-react-native-foundation": "3.11.2",
65
65
  "@sendbird/uikit-tools": "0.0.15",
66
- "@sendbird/uikit-utils": "3.11.1"
66
+ "@sendbird/uikit-utils": "3.11.2"
67
67
  },
68
68
  "devDependencies": {
69
69
  "@bam.tech/react-native-image-resizer": "^3.0.4",
@@ -242,5 +242,5 @@
242
242
  ]
243
243
  ]
244
244
  },
245
- "gitHead": "16f1f54e8c442492e79a9591ae32203d5db55c2b"
245
+ "gitHead": "2df681bc6eefb1296d78f33982f3beecd3769c66"
246
246
  }
@@ -256,9 +256,6 @@ const GroupChannelMessageList = (props: GroupChannelProps['MessageList']) => {
256
256
  lazyScrollToBottom({ animated: true, timeout: 250 });
257
257
  }
258
258
  },
259
- onChannelChanged(channel) {
260
- if (isDifferentChannel(channel, props.channel)) return;
261
- },
262
259
  });
263
260
 
264
261
  useEffect(() => {
@@ -1,27 +1,64 @@
1
1
  import type RNFBMessaging from '@react-native-firebase/messaging';
2
+ import type { FirebaseMessagingTypes } from '@react-native-firebase/messaging';
2
3
  import { Platform } from 'react-native';
3
4
  import type * as Permissions from 'react-native-permissions';
4
5
 
5
6
  import type { NotificationServiceInterface } from './types';
6
7
 
8
+ // Type definitions for Firebase Messaging Module instance
9
+ // This represents the instance returned by messaging() or getMessaging()
10
+ // We use a type alias to handle both v14 and v22+ types
11
+ type MessagingInstance = ReturnType<typeof RNFBMessaging>;
12
+
13
+ // Type definitions for modular API support (Firebase v22+)
14
+ // The modular API provides standalone functions that accept a messaging instance
15
+ type ModularMessagingType = {
16
+ getMessaging: () => MessagingInstance;
17
+ getAPNSToken: (messaging: MessagingInstance) => Promise<string | null>;
18
+ getToken: (messaging: MessagingInstance) => Promise<string>;
19
+ hasPermission: (messaging: MessagingInstance) => Promise<FirebaseMessagingTypes.AuthorizationStatus>;
20
+ requestPermission: (
21
+ messaging: MessagingInstance,
22
+ iosPermissions?: FirebaseMessagingTypes.IOSPermissions,
23
+ ) => Promise<FirebaseMessagingTypes.AuthorizationStatus>;
24
+ onTokenRefresh: (messaging: MessagingInstance, listener: (token: string) => void) => () => void;
25
+ AuthorizationStatus: typeof RNFBMessaging.AuthorizationStatus;
26
+ };
27
+
28
+ // Create a flexible type that can handle both v14 and v22+ Firebase modules
29
+ type FirebaseMessagingModule = typeof RNFBMessaging | ModularMessagingType;
30
+
31
+ const isModularAPI = (module: FirebaseMessagingModule): module is ModularMessagingType => {
32
+ return typeof (module as ModularMessagingType).getMessaging === 'function';
33
+ };
34
+
7
35
  const createNativeNotificationService = ({
8
36
  messagingModule,
9
37
  permissionModule,
10
38
  }: {
11
- messagingModule: typeof RNFBMessaging;
39
+ messagingModule: FirebaseMessagingModule;
12
40
  permissionModule: typeof Permissions;
13
41
  }): NotificationServiceInterface => {
14
- const module = messagingModule();
42
+ const isModular = isModularAPI(messagingModule);
43
+ const modularMessaging = isModular ? (messagingModule as ModularMessagingType) : null;
44
+ const messaging = isModular ? modularMessaging!.getMessaging() : (messagingModule as typeof RNFBMessaging)();
45
+
15
46
  const authorizedStatus = [
16
47
  messagingModule.AuthorizationStatus.AUTHORIZED,
17
48
  messagingModule.AuthorizationStatus.PROVISIONAL,
18
49
  ];
19
50
  return {
20
51
  getAPNSToken(): Promise<string | null> {
21
- return module.getAPNSToken();
52
+ if (modularMessaging) {
53
+ return modularMessaging.getAPNSToken(messaging);
54
+ }
55
+ return messaging.getAPNSToken();
22
56
  },
23
57
  getFCMToken(): Promise<string | null> {
24
- return module.getToken();
58
+ if (modularMessaging) {
59
+ return modularMessaging.getToken(messaging);
60
+ }
61
+ return messaging.getToken();
25
62
  },
26
63
  async hasPushPermission(): Promise<boolean> {
27
64
  if (Platform.OS === 'android') {
@@ -30,7 +67,9 @@ const createNativeNotificationService = ({
30
67
  }
31
68
 
32
69
  if (Platform.OS === 'ios') {
33
- const status = await module.hasPermission();
70
+ const status = modularMessaging
71
+ ? await modularMessaging.hasPermission(messaging)
72
+ : await messaging.hasPermission();
34
73
  return authorizedStatus.includes(status);
35
74
  }
36
75
 
@@ -43,14 +82,21 @@ const createNativeNotificationService = ({
43
82
  }
44
83
 
45
84
  if (Platform.OS === 'ios') {
46
- const status = await module.requestPermission();
85
+ const status = modularMessaging
86
+ ? await modularMessaging.requestPermission(messaging)
87
+ : await messaging.requestPermission();
47
88
  return authorizedStatus.includes(status);
48
89
  }
49
90
 
50
91
  return false;
51
92
  },
52
93
  onTokenRefresh(handler: (token: string) => void): () => void | undefined {
53
- return module.onTokenRefresh((token) => {
94
+ if (modularMessaging) {
95
+ return modularMessaging.onTokenRefresh(messaging, (token: string) => {
96
+ if (Platform.OS === 'android') handler(token);
97
+ });
98
+ }
99
+ return messaging.onTokenRefresh((token: string) => {
54
100
  if (Platform.OS === 'android') handler(token);
55
101
  });
56
102
  },
package/src/version.ts CHANGED
@@ -1,2 +1,2 @@
1
- const VERSION = '3.11.1';
1
+ const VERSION = '3.11.2';
2
2
  export default VERSION;