@sendbird/uikit-react-native 3.11.0 → 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.
Files changed (48) hide show
  1. package/README.md +7 -5
  2. package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js +0 -3
  3. package/lib/commonjs/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -1
  4. package/lib/commonjs/platform/createMediaService.expo.js +83 -12
  5. package/lib/commonjs/platform/createMediaService.expo.js.map +1 -1
  6. package/lib/commonjs/platform/createNotificationService.native.js +31 -6
  7. package/lib/commonjs/platform/createNotificationService.native.js.map +1 -1
  8. package/lib/commonjs/platform/createPlayerService.expo.js +214 -113
  9. package/lib/commonjs/platform/createPlayerService.expo.js.map +1 -1
  10. package/lib/commonjs/platform/createRecorderService.expo.js +248 -130
  11. package/lib/commonjs/platform/createRecorderService.expo.js.map +1 -1
  12. package/lib/commonjs/utils/expoBackwardUtils.js +23 -0
  13. package/lib/commonjs/utils/expoBackwardUtils.js.map +1 -1
  14. package/lib/commonjs/utils/expoPermissionGranted.js.map +1 -1
  15. package/lib/commonjs/version.js +1 -1
  16. package/lib/commonjs/version.js.map +1 -1
  17. package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js +0 -3
  18. package/lib/module/domain/groupChannel/component/GroupChannelMessageList.js.map +1 -1
  19. package/lib/module/platform/createMediaService.expo.js +82 -13
  20. package/lib/module/platform/createMediaService.expo.js.map +1 -1
  21. package/lib/module/platform/createNotificationService.native.js +32 -6
  22. package/lib/module/platform/createNotificationService.native.js.map +1 -1
  23. package/lib/module/platform/createPlayerService.expo.js +214 -113
  24. package/lib/module/platform/createPlayerService.expo.js.map +1 -1
  25. package/lib/module/platform/createRecorderService.expo.js +249 -131
  26. package/lib/module/platform/createRecorderService.expo.js.map +1 -1
  27. package/lib/module/utils/expoBackwardUtils.js +23 -0
  28. package/lib/module/utils/expoBackwardUtils.js.map +1 -1
  29. package/lib/module/utils/expoPermissionGranted.js.map +1 -1
  30. package/lib/module/version.js +1 -1
  31. package/lib/module/version.js.map +1 -1
  32. package/lib/typescript/src/containers/SendbirdUIKitContainer.d.ts +1 -1
  33. package/lib/typescript/src/platform/createMediaService.expo.d.ts +2 -2
  34. package/lib/typescript/src/platform/createNotificationService.native.d.ts +13 -1
  35. package/lib/typescript/src/platform/createPlayerService.expo.d.ts +2 -2
  36. package/lib/typescript/src/platform/createRecorderService.expo.d.ts +2 -2
  37. package/lib/typescript/src/utils/expoBackwardUtils.d.ts +10 -0
  38. package/lib/typescript/src/utils/expoPermissionGranted.d.ts +1 -1
  39. package/lib/typescript/src/version.d.ts +1 -1
  40. package/package.json +16 -5
  41. package/src/domain/groupChannel/component/GroupChannelMessageList.tsx +0 -3
  42. package/src/platform/createMediaService.expo.tsx +87 -9
  43. package/src/platform/createNotificationService.native.ts +53 -7
  44. package/src/platform/createPlayerService.expo.tsx +242 -109
  45. package/src/platform/createRecorderService.expo.tsx +267 -110
  46. package/src/utils/expoBackwardUtils.ts +29 -0
  47. package/src/utils/expoPermissionGranted.ts +3 -1
  48. package/src/version.ts +1 -1
package/README.md CHANGED
@@ -213,7 +213,8 @@ expo install expo-image-picker \
213
213
  expo-file-system \
214
214
  expo-clipboard \
215
215
  expo-notifications \
216
- expo-av \
216
+ expo-audio \
217
+ expo-video \
217
218
  expo-video-thumbnails \
218
219
  expo-image-manipulator
219
220
  ```
@@ -225,7 +226,8 @@ import * as ExpoFS from 'expo-file-system';
225
226
  import * as ExpoImagePicker from 'expo-image-picker';
226
227
  import * as ExpoMediaLibrary from 'expo-media-library';
227
228
  import * as ExpoNotifications from 'expo-notifications';
228
- import * as ExpoAV from 'expo-av';
229
+ import * as ExpoAudio from 'expo-audio';
230
+ import * as ExpoVideo from 'expo-video';
229
231
  import * as ExpoVideoThumbnail from 'expo-video-thumbnails';
230
232
  import * as ExpoImageManipulator from 'expo-image-manipulator';
231
233
 
@@ -239,16 +241,16 @@ const expoPlatformServices = {
239
241
  documentPickerModule: ExpoDocumentPicker,
240
242
  }),
241
243
  media: createExpoMediaService({
242
- avModule: ExpoAV,
244
+ avModule: ExpoVideo,
243
245
  thumbnailModule: ExpoVideoThumbnail,
244
246
  imageManipulator: ExpoImageManipulator,
245
247
  fsModule: ExpoFS,
246
248
  }),
247
249
  player: createExpoPlayerService({
248
- avModule: ExpoAV,
250
+ avModule: ExpoAudio,
249
251
  }),
250
252
  recorder: createExpoRecorderService({
251
- avModule: ExpoAV,
253
+ avModule: ExpoAudio,
252
254
  }),
253
255
  };
254
256
  ```
@@ -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":";;;;;;AACA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AAEA,IAAAC,2BAAA,GAAAD,OAAA;AACA,IAAAE,WAAA,GAAAF,OAAA;AACA,IAAAG,WAAA,GAAAH,OAAA;AASA,IAAAI,mBAAA,GAAAC,sBAAA,CAAAL,OAAA;AAEA,IAAAM,UAAA,GAAAN,OAAA;AAEA,IAAAO,WAAA,GAAAP,OAAA;AACA,IAAAQ,cAAA,GAAAR,OAAA;AAA+D,SAAAK,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAAA,SAAAG,yBAAAH,CAAA,6BAAAI,OAAA,mBAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAD,wBAAA,YAAAA,CAAAH,CAAA,WAAAA,CAAA,GAAAM,CAAA,GAAAD,CAAA,KAAAL,CAAA;AAAA,SAAAV,wBAAAU,CAAA,EAAAK,CAAA,SAAAA,CAAA,IAAAL,CAAA,IAAAA,CAAA,CAAAC,UAAA,SAAAD,CAAA,eAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,WAAAE,OAAA,EAAAF,CAAA,QAAAM,CAAA,GAAAH,wBAAA,CAAAE,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAC,GAAA,CAAAP,CAAA,UAAAM,CAAA,CAAAE,GAAA,CAAAR,CAAA,OAAAS,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,CAAA,IAAAf,CAAA,oBAAAe,CAAA,OAAAC,cAAA,CAAAC,IAAA,CAAAjB,CAAA,EAAAe,CAAA,SAAAG,CAAA,GAAAP,CAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAd,CAAA,EAAAe,CAAA,UAAAG,CAAA,KAAAA,CAAA,CAAAV,GAAA,IAAAU,CAAA,CAAAC,GAAA,IAAAP,MAAA,CAAAC,cAAA,CAAAJ,CAAA,EAAAM,CAAA,EAAAG,CAAA,IAAAT,CAAA,CAAAM,CAAA,IAAAf,CAAA,CAAAe,CAAA,YAAAN,CAAA,CAAAP,OAAA,GAAAF,CAAA,EAAAM,CAAA,IAAAA,CAAA,CAAAa,GAAA,CAAAnB,CAAA,EAAAS,CAAA,GAAAA,CAAA;AAAA,SAAAW,SAAA,WAAAA,QAAA,GAAAR,MAAA,CAAAS,MAAA,GAAAT,MAAA,CAAAS,MAAA,CAAAC,IAAA,eAAAb,CAAA,aAAAT,CAAA,MAAAA,CAAA,GAAAuB,SAAA,CAAAC,MAAA,EAAAxB,CAAA,UAAAM,CAAA,GAAAiB,SAAA,CAAAvB,CAAA,YAAAK,CAAA,IAAAC,CAAA,OAAAU,cAAA,CAAAC,IAAA,CAAAX,CAAA,EAAAD,CAAA,MAAAI,CAAA,CAAAJ,CAAA,IAAAC,CAAA,CAAAD,CAAA,aAAAI,CAAA,KAAAW,QAAA,CAAAK,KAAA,OAAAF,SAAA;AAG/D,MAAMG,uBAAuB,GAAIC,KAAuC,IAAK;EAC3E,MAAMC,KAAK,GAAG,IAAAC,oCAAQ,EAAC,CAAC;EACxB,MAAM;IAAEC;EAAQ,CAAC,GAAG,IAAAC,2BAAe,EAAC,CAAC;EACrC,MAAM;IAAEC,GAAG;IAAEC,SAAS;IAAEC;EAA4B,CAAC,GAAG,IAAAC,2BAAe,EAAC,CAAC;EACzE,MAAM;IAAEC,gBAAgB;IAAEC;EAAkB,CAAC,GAAG,IAAAC,iBAAU,EAACC,mCAAoB,CAACC,QAAQ,CAAC;EACzF,MAAMC,kBAAkB,GAAG,IAAAH,iBAAU,EAACC,mCAAoB,CAACG,MAAM,CAAC;EAClE,MAAM;IAAEC,WAAW;IAAEC,kBAAkB;IAAEC,qBAAqB;IAAEC;EAA4B,CAAC,GAAG,IAAAR,iBAAU,EACxGC,mCAAoB,CAACQ,WACvB,CAAC;EAED,MAAMC,YAAY,GAAG,IAAAC,2BAAe,EAAC,CAAC;EAEtC,MAAMC,iBAAiB,GAAG,IAAAC,aAAM,EAAC,KAAK,CAAC;EACvC,MAAMC,sBAAsB,GAAG,IAAAD,aAAM,EAAC,KAAK,CAAC;EAC5C,MAAME,0BAA0B,GAAG,IAAAF,aAAM,EAAC,KAAK,CAAC;EAChD,MAAMG,yBAAyB,GAAG,IAAAH,aAAM,EAAC,KAAK,CAAC;EAC/C,MAAM,CAACI,8BAA8B,EAAEC,iCAAiC,CAAC,GAAG,IAAAC,eAAQ,EAAC,KAAK,CAAC;EAC3F,MAAMC,gBAAgB,GAAG,IAAAP,aAAM,EAAoB,CAAC;EACpD,MAAMQ,wBAAwB,GAAG,IAAAR,aAAM,EAAC,KAAK,CAAC;EAC9C,MAAM,CAACS,kBAAkB,EAAEC,qBAAqB,CAAC,GAAG,IAAAJ,eAAQ,EAA8BK,SAAS,CAAC;EACpG,MAAMC,uBAAuB,GAAG,IAAAZ,aAAM,EAAgD,IAAI,CAAC;EAE3F,MAAMa,oBAAoB,GAAG,IAAAC,kBAAW,EACrCC,cAAuB,IAAK;IAC3B,IAAIhB,iBAAiB,CAACiB,OAAO,KAAKD,cAAc,EAAE;MAAA,IAAAE,qBAAA;MAChDlB,iBAAiB,CAACiB,OAAO,GAAGD,cAAc;MAC1C,CAAAE,qBAAA,GAAAzC,KAAK,CAAC0C,mBAAmB,cAAAD,qBAAA,eAAzBA,qBAAA,CAAAnD,IAAA,CAAAU,KAAK,EAAuBuC,cAAc,CAAC;IAC7C;EACF,CAAC,EACD,CAACvC,KAAK,CAAC0C,mBAAmB,CAC5B,CAAC;EAED,MAAMC,2BAA2B,GAAG,IAAAL,kBAAW,EAC5CM,qBAA8B,IAAK;IAClC,IAAIZ,wBAAwB,CAACQ,OAAO,KAAKI,qBAAqB,EAAE;MAAA,IAAAC,qBAAA;MAC9Db,wBAAwB,CAACQ,OAAO,GAAGI,qBAAqB;MACxD,CAAAC,qBAAA,GAAA7C,KAAK,CAAC8C,0BAA0B,cAAAD,qBAAA,eAAhCA,qBAAA,CAAAvD,IAAA,CAAAU,KAAK,EAA8B4C,qBAAqB,CAAC;IAC3D;EACF,CAAC,EACD,CAAC5C,KAAK,CAAC8C,0BAA0B,CACnC,CAAC;EAED,MAAMC,4BAA4B,GAAG,IAAAC,4BAAgB,EACnD,CAACC,SAAiB,EAAEC,aAAsB,EAAEC,OAAe,KAAc;IACvE,MAAMC,YAAY,GAAGpD,KAAK,CAACqD,QAAQ,CAACC,IAAI,CAAEC,EAAE,IAAKA,EAAE,CAACN,SAAS,KAAKA,SAAS,CAAC;IAC5E,MAAMO,gBAAgB,GAAG,CAAC,CAACJ,YAAY;IACvChB,uBAAuB,CAACI,OAAO,GAAG,IAAI;IAEtC,IAAIgB,gBAAgB,EAAE;MACpB,IAAIN,aAAa,EAAE;QACjBO,UAAU,CAAC,MAAMzD,KAAK,CAAC0D,kBAAkB,CAAC;UAAEC,aAAa,EAAEV;QAAU,CAAC,CAAC,EAAEW,wCAA6B,CAAC;MACzG;MACAxB,uBAAuB,CAACI,OAAO,GAAG;QAAEW,OAAO;QAAEU,SAAS,EAAEC,IAAI,CAACC,GAAG,CAAC;MAAE,CAAC;MACpE7C,qBAAqB,CAAC;QAAE8C,SAAS,EAAEZ,YAAY,CAACY,SAAS;QAAEC,QAAQ,EAAE,IAAI;QAAEd;MAAQ,CAAC,CAAC;IACvF,CAAC,MAAM;MACL,IAAInD,KAAK,CAACkE,OAAO,CAACC,sBAAsB,IAAIlB,SAAS,EAAE;QACrD,IAAIC,aAAa,EAAE;UACjBlD,KAAK,CAAC0D,kBAAkB,CAAC;YAAEC,aAAa,EAAEV;UAAU,CAAC,CAAC;QACxD;QACAjD,KAAK,CAACoE,mCAAmC,CAACnB,SAAS,CAAC,CAACoB,KAAK,CAAEC,CAAC,IAAK,CAAC,CAAC,CAAC;MACvE,CAAC,MAAM;QACL,OAAO,KAAK;MACd;IACF;IACA,OAAO,IAAI;EACb,CACF,CAAC;EAED,MAAMC,wBAAwB,GAAG,IAAAvB,4BAAgB,EAAEwB,KAAc,IAAK;IACpE7C,yBAAyB,CAACa,OAAO,GAAGgC,KAAK;IACzCxE,KAAK,CAACuE,wBAAwB,CAACC,KAAK,CAAC;EACvC,CAAC,CAAC;EAEF,MAAMC,cAAc,GAAG,IAAAzB,4BAAgB,EAAC,OAAOiB,QAAQ,GAAG,KAAK,KAAK;IAClE,IAAIjE,KAAK,CAAC0E,OAAO,CAAC,CAAC,EAAE;MACnB1E,KAAK,CAAC0D,kBAAkB,CAACvB,SAAS,CAAC;MACnCoC,wBAAwB,CAAC,KAAK,CAAC;MAE/B,MAAMvE,KAAK,CAAC2E,kBAAkB,CAAC,CAAC,CAACN,KAAK,CAAEC,CAAC,IAAK,CAAC,CAAC,CAAC;MACjDC,wBAAwB,CAAC,KAAK,CAAC;MAC/BtD,kBAAkB,CAAC;QAAEgD;MAAS,CAAC,CAAC;IAClC,CAAC,MAAM;MACLhD,kBAAkB,CAAC;QAAEgD;MAAS,CAAC,CAAC;IAClC;EACF,CAAC,CAAC;EAEF,MAAMW,wCAAwC,GAAG,IAAAtC,kBAAW,EAAC,MAAM;IAAA,IAAAuC,qBAAA;IACjExC,oBAAoB,CAAC,IAAI,CAAC;IAC1BM,2BAA2B,CAAC,KAAK,CAAC;IAClC,CAAAkC,qBAAA,GAAA7E,KAAK,CAAC8E,gBAAgB,cAAAD,qBAAA,eAAtBA,qBAAA,CAAAvF,IAAA,CAAAU,KAAyB,CAAC;IAC1B,IAAA+E,gCAAoB,EAAC,CAAC/E,KAAK,CAACkE,OAAO,CAAC,CAAC;EACvC,CAAC,EAAE,CAAC7B,oBAAoB,EAAEM,2BAA2B,EAAE3C,KAAK,CAACkE,OAAO,CAACc,GAAG,EAAEhF,KAAK,CAAC8E,gBAAgB,CAAC,CAAC;EAElG,MAAMG,uBAAuB,GAAG,IAAA3C,kBAAW,EACzC,CAACe,QAA2B,EAAE6B,gBAAwB,KAA6B;IACjF,IAAI7B,QAAQ,CAACxD,MAAM,IAAIqF,gBAAgB,EAAE;MACvC,OAAO,IAAI;IACb;IAEA,MAAMC,WAAW,GAAG9B,QAAQ,CAAC6B,gBAAgB,CAAC;IAC9C,IAAIC,WAAW,EAAE;MACf,IAAIA,WAAW,CAACC,MAAM,EAAE;QACtB,OAAOH,uBAAuB,CAAC5B,QAAQ,EAAE6B,gBAAgB,GAAG,CAAC,CAAC;MAChE,CAAC,MAAM;QACL,OAAOC,WAAW;MACpB;IACF;IACA,OAAO,IAAI;EACb,CAAC,EACD,EACF,CAAC;EAED,MAAME,sBAAsB,GAAG,IAAArC,4BAAgB,EAAEsC,uBAAgC,IAAK;IACpF,IAAI,CAAChF,SAAS,CAACiF,KAAK,CAACC,YAAY,CAACtB,OAAO,CAACuB,kBAAkB,IAAI,CAACH,uBAAuB,EAAE;MACxF;IACF;IAEA,OAAOtF,KAAK,CAACqD,QAAQ,CAACC,IAAI,CAAC,CAACoC,GAAG,EAAEC,KAAK,KAAK;MAAA,IAAAC,kBAAA;MACzC,IAAIF,GAAG,CAACN,MAAM,EAAE;QACd,OAAO,KAAK;MACd;MAEA,MAAMS,uBAAuB,GAAG7F,KAAK,CAACkE,OAAO,CAAC4B,UAAU,KAAKJ,GAAG,CAACzC,SAAS,GAAG,CAAC;MAC9E,IAAI4C,uBAAuB,EAAE;QAC3B,OAAO,IAAI;MACb;MAEA,MAAME,oBAAoB,GAAGd,uBAAuB,CAACjF,KAAK,CAACqD,QAAQ,EAAEsC,KAAK,GAAG,CAAC,CAAC;MAC/E,MAAMK,6BAA6B,GAAG,GAAAJ,kBAAA,GAAC5F,KAAK,CAACiG,WAAW,cAAAL,kBAAA,eAAjBA,kBAAA,CAAAtG,IAAA,CAAAU,KAAoB,CAAC,KAAI+F,oBAAoB,IAAI,IAAI;MAC5F,MAAMG,iBAAiB,GACrBH,oBAAoB,IAAI,IAAI,IAAIA,oBAAoB,CAAC9C,SAAS,IAAIjD,KAAK,CAACkE,OAAO,CAAC4B,UAAU;MAC5F,MAAMK,eAAe,GAAGnG,KAAK,CAACkE,OAAO,CAAC4B,UAAU,GAAGJ,GAAG,CAACzC,SAAS;MAChE,OAAO,CAAC+C,6BAA6B,IAAIE,iBAAiB,KAAKC,eAAe;IAChF,CAAC,CAAC;EACJ,CAAC,CAAC;EAEF,IAAAC,gBAAS,EAAC,MAAM;IACd,IAAI,CAACnE,kBAAkB,EAAE;MACvB,MAAMoE,uBAAuB,GAAGhB,sBAAsB,CAACrF,KAAK,CAACsF,uBAAuB,IAAI,KAAK,CAAC;MAC9F,IAAIe,uBAAuB,EAAE;QAC3BC,wBAAwB,CAACD,uBAAuB,CAAC;QACjDnE,qBAAqB,CAACmE,uBAAuB,CAAC;MAChD;IACF;EACF,CAAC,EAAE,CAACrG,KAAK,CAACqD,QAAQ,EAAErD,KAAK,CAACkE,OAAO,CAAC4B,UAAU,EAAExF,SAAS,CAACiF,KAAK,CAACC,YAAY,CAACtB,OAAO,CAACuB,kBAAkB,CAAC,CAAC;EAEvG,MAAMa,wBAAwB,GAAG,IAAAtD,4BAAgB,EAAEuD,cAA2C,IAAK;IAAA,IAAAC,qBAAA;IACjG,MAAMC,mBAAmB,GAAG,CAAC,GAAAD,qBAAA,GAACzE,gBAAgB,CAACS,OAAO,cAAAgE,qBAAA,eAAxBA,qBAAA,CAA0BE,IAAI,CACzDC,OAAO,IAAKA,OAAO,CAAC3C,SAAS,MAAKuC,cAAc,aAAdA,cAAc,uBAAdA,cAAc,CAAEvC,SAAS,CAC9D,CAAC;IAED,IAAIvC,sBAAsB,CAACe,OAAO,KAAKiE,mBAAmB,EAAE;MAC1DhF,sBAAsB,CAACe,OAAO,GAAGiE,mBAAmB;MACpDG,iCAAiC,CAAC,CAAC;MACnC,IAAI,CAACH,mBAAmB,IAAIlF,iBAAiB,CAACiB,OAAO,EAAE;QACrD;MACF;MAEAH,oBAAoB,CAAC,IAAI,CAAC;MAC1B,IAAIL,wBAAwB,CAACQ,OAAO,EAAE;QACpC;MACF;MAEA,IAAI,CAAC,GAAGxC,KAAK,CAAC6G,WAAW,CAAChH,MAAM,EAAE;QAChCG,KAAK,CAACkE,OAAO,CAAC4C,YAAY,CAAC9G,KAAK,CAAC6G,WAAW,CAAC,CAAC,CAAC,CAAC;MAClD,CAAC,MAAM;QACL7G,KAAK,CAACkE,OAAO,CAAC6C,UAAU,CAAC,CAAC;MAC5B;IACF;EACF,CAAC,CAAC;EAEF,MAAMC,sBAAsB,GAAG,IAAAhE,4BAAgB,EAC7C,MAAOiE,IAAsG,IAAK;IAChH,IAAI,CAAC3G,SAAS,CAACiF,KAAK,CAACC,YAAY,CAACtB,OAAO,CAACuB,kBAAkB,EAAE;MAC5D;IACF;IAEA1D,gBAAgB,CAACS,OAAO,GAAGyE,IAAI,CAACC,aAAa,CAACC,MAAM,CAAEC,KAAK,IAAKA,KAAK,CAACC,IAAI,CAAC,CAACC,GAAG,CAAEF,KAAK,IAAKA,KAAK,CAACC,IAAI,CAAC;IACtGf,wBAAwB,CAACrE,kBAAkB,CAAC;EAC9C,CACF,CAAC;EAED,MAAMsF,0BAA0B,GAAG,IAAAjF,kBAAW,EAC5C,MAAOqE,OAAwB,IAAK;IAClC,IAAIrG,SAAS,CAACiF,KAAK,CAACC,YAAY,CAACtB,OAAO,CAACuB,kBAAkB,IAAIkB,OAAO,EAAE;MACtE,MAAM3G,KAAK,CAACkE,OAAO,CAAC4C,YAAY,CAACH,OAAO,CAAC;MACzChE,2BAA2B,CAAC,IAAI,CAAC;IACnC;EACF,CAAC,EACD,CAACrC,SAAS,CAACiF,KAAK,CAACC,YAAY,CAACtB,OAAO,CAACuB,kBAAkB,EAAE9C,2BAA2B,CACvF,CAAC;EAED,IAAAyD,gBAAS,EAAC,MAAM;IACd1E,0BAA0B,CAACc,OAAO,GAAG,CAAC,CAACxC,KAAK,CAACsF,uBAAuB,IAAI,CAAC,CAACvD,gBAAgB,CAACS,OAAO;EACpG,CAAC,EAAE,CAACxC,KAAK,CAACsF,uBAAuB,EAAEvD,gBAAgB,CAACS,OAAO,CAAC,CAAC;EAE7D,MAAMgF,8BAA8B,GAAG,IAAAhG,aAAM,EAA8B,CAAC;EAC5E,MAAMoF,iCAAiC,GAAG,IAAA5D,4BAAgB,EAAC,MAAM;IAC/D,MAAMyE,iBAAiB,GACrB,CAAC9F,yBAAyB,CAACa,OAAO,IAClC,CAACR,wBAAwB,CAACQ,OAAO,KAChCjB,iBAAiB,CAACiB,OAAO,IAAI,CAACd,0BAA0B,CAACc,OAAO,CAAC;IAEpEgF,8BAA8B,CAAChF,OAAO,GAAG;MACvCkF,OAAO,EACLpH,SAAS,CAACiF,KAAK,CAACC,YAAY,CAACtB,OAAO,CAACuB,kBAAkB,IACvD,CAACgC,iBAAiB,IAClB/F,0BAA0B,CAACc,OAAO,IAClC,CAAC,GAAGxC,KAAK,CAACkE,OAAO,CAACyD,kBAAkB,IACpC,CAAClG,sBAAsB,CAACe,OAAO;MACjCoF,YAAY,EAAEhD,wCAAwC;MACtD+C,kBAAkB,EAAE3H,KAAK,CAACkE,OAAO,CAACyD;IACpC,CAAC;IACD,IAAI/F,8BAA8B,KAAK4F,8BAA8B,CAAChF,OAAO,CAACkF,OAAO,EAAE;MACrF7F,iCAAiC,CAAC2F,8BAA8B,CAAChF,OAAO,CAACkF,OAAO,CAAC;IACnF;EACF,CAAC,CAAC;EAEF,IAAAtB,gBAAS,EAAC,MAAM;IACdQ,iCAAiC,CAAC,CAAC;EACrC,CAAC,EAAE,CACDlF,0BAA0B,CAACc,OAAO,EAClCxC,KAAK,CAACkE,OAAO,CAACyD,kBAAkB,EAChCrH,SAAS,CAACiF,KAAK,CAACC,YAAY,CAACtB,OAAO,CAACuB,kBAAkB,CACxD,CAAC;EAEF,IAAAoC,kCAAsB,EAACxH,GAAG,EAAE;IAC1ByH,iBAAiBA,CAAC5D,OAAO,EAAE6D,KAAK,EAAE;MAChC,IAAI,IAAAC,8BAAkB,EAAC9D,OAAO,EAAElE,KAAK,CAACkE,OAAO,CAAC,EAAE;MAChD,MAAM+D,aAAa,GAAGjI,KAAK,CAACqD,QAAQ,CAAC,CAAC,CAAC;MACvC,MAAM6E,eAAe,GAAGD,aAAa,IAAIA,aAAa,CAACjE,SAAS,KAAK+D,KAAK,CAAC/D,SAAS;MACpF,MAAMmE,+BAA+B,GAAG,CAACnI,KAAK,CAACoI,sBAAsB,IAAI,CAACpI,KAAK,CAAC0E,OAAO,CAAC,CAAC;MACzF,IAAIwD,eAAe,IAAIC,+BAA+B,EAAE;QACtDlH,kBAAkB,CAAC;UAAEgD,QAAQ,EAAE,IAAI;UAAEd,OAAO,EAAE;QAAI,CAAC,CAAC;MACtD;IACF,CAAC;IACDkF,gBAAgBA,CAACnE,OAAO,EAAE;MACxB,IAAI,IAAA8D,8BAAkB,EAAC9D,OAAO,EAAElE,KAAK,CAACkE,OAAO,CAAC,EAAE;IAClD;EACF,CAAC,CAAC;EAEF,IAAAkC,gBAAS,EAAC,MAAM;IACd,OAAOtF,kBAAkB,CAACwH,SAAS,CAAC,CAAC;MAAEC,IAAI;MAAEC;IAAK,CAAC,KAAK;MACtD,QAAQD,IAAI;QACV,KAAK,wBAAwB;QAC7B,KAAK,mBAAmB;UAAE;YACxB,IAAI,CAACvI,KAAK,CAACoI,sBAAsB,EAAE;cACjC3D,cAAc,CAAC,IAAI,CAAC;YACtB;YACA;UACF;QACA,KAAK,kBAAkB;UAAE;YACvB,MAAMgE,WAAW,GAAGzI,KAAK,CAACkE,OAAO,CAACuE,WAAW;YAC7C,MAAM,CAACC,cAAc,CAAC,GAAGF,IAAI,CAACnF,QAAQ;YAEtC,MAAMsF,kBAAkB,GACtBD,cAAc,IAAID,WAAW,IAAIA,WAAW,CAACzE,SAAS,KAAK0E,cAAc,CAAC1E,SAAS;YAErF,MAAM4E,gBAAgB,GAAG5I,KAAK,CAACkE,OAAO,CAAC2E,QAAQ,IAAIF,kBAAkB;YAErE,IAAIC,gBAAgB,EAAE;cACpBnE,cAAc,CAAC,KAAK,CAAC;YACvB,CAAC,MAAM,IAAI,CAACzE,KAAK,CAACoI,sBAAsB,IAAIO,kBAAkB,EAAE;cAC9DlE,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;YACxCmC,iCAAiC,CAAC,CAAC;YACnC;UACF;QACA,KAAK,qCAAqC;UAAE;YAC1ClF,0BAA0B,CAACc,OAAO,GAAG,IAAI;YACzC,MAAMsG,uBAAuB,GAAGzD,sBAAsB,CAAC,IAAI,CAAC;YAC5DiB,wBAAwB,CAACwC,uBAAuB,CAAC;YACjD5G,qBAAqB,CAAC4G,uBAAuB,CAAC;YAC9C,IAAI,CAAC9I,KAAK,CAACoI,sBAAsB,EAAE;cACjC3D,cAAc,CAAC,IAAI,CAAC;YACtB;YACA;UACF;MACF;IACF,CAAC,CAAC;EACJ,CAAC,EAAE,CAACzE,KAAK,CAACoI,sBAAsB,CAAC,CAAC;EAElC,IAAAhC,gBAAS,EAAC,MAAM;IACd,OAAO7F,2BAA2B,CAACwI,MAAM,CAACT,SAAS,CAAEU,OAAwD,IAAK;MAChH,QAAQA,OAAO,CAACT,IAAI;QAClB,KAAK,qCAAqC;UAAE;YAC1CxF,4BAA4B,CAACiG,OAAO,CAACR,IAAI,CAAC7E,aAAa,EAAE,KAAK,EAAEsF,2CAAgC,CAAC;YACjG;UACF;MACF;IACF,CAAC,CAAC;EACJ,CAAC,EAAE,EAAE,CAAC;EAEN,IAAA7C,gBAAS,EAAC,MAAM;IACd;IACA;IACA;IACA,IAAI/E,YAAY,IAAIrB,KAAK,CAACkJ,UAAU,EAAE;MACpCnG,4BAA4B,CAAC/C,KAAK,CAACkJ,UAAU,CAACvF,aAAa,EAAE,KAAK,EAAEsF,2CAAgC,CAAC;IACvG;EACF,CAAC,EAAE,CAAC5H,YAAY,CAAC,CAAC;EAElB,MAAM8H,oBAAoB,GAAG,IAAAnG,4BAAgB,EAC3C,CAACoG,aAA8B,EAAEC,YAAqC,KAAK;IACzE,IACElI,2BAA2B,IAC3Bb,SAAS,CAACiF,KAAK,CAACC,YAAY,CAACtB,OAAO,CAACoF,SAAS,KAAK,QAAQ,IAC3DhJ,SAAS,CAACiF,KAAK,CAACC,YAAY,CAACtB,OAAO,CAACqF,qBAAqB,KAAK,QAAQ,EACvE;MACA,IAAIH,aAAa,CAACnG,SAAS,IAAIjD,KAAK,CAACkE,OAAO,CAACC,sBAAsB,EAAE;QACnEhD,2BAA2B,CAACiI,aAAa,EAA6BC,YAAY,CAACpG,SAAS,CAAC;MAC/F,CAAC,MAAM;QACLhD,KAAK,CAACuJ,IAAI,CAACrJ,OAAO,CAACsJ,KAAK,CAACC,qBAAqB,EAAE,OAAO,CAAC;MAC1D;IACF,CAAC,MAAM;MACL,MAAMC,iBAAiB,GAAG5G,4BAA4B,CAACqG,aAAa,CAACnG,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;MACxF,IAAI,CAAC0G,iBAAiB,EAAE1J,KAAK,CAACuJ,IAAI,CAACrJ,OAAO,CAACsJ,KAAK,CAACC,qBAAqB,EAAE,OAAO,CAAC;IAClF;EACF,CACF,CAAC;EAED,MAAME,eAAe,GAAG,IAAA5G,4BAAgB,EAAC,MAAM;IAC7C,IAAIhD,KAAK,CAAC0E,OAAO,CAAC,CAAC,EAAE;MACnB,IAAItC,uBAAuB,CAACI,OAAO,EAAE;QACnC,MAAMqH,WAAW,GAAG/F,IAAI,CAACC,GAAG,CAAC,CAAC;QAC9B,MAAM+F,WAAW,GAAGD,WAAW,GAAGzH,uBAAuB,CAACI,OAAO,CAACqB,SAAS;QAE3E,MAAMkG,gBAAgB,GAAG,GAAG;QAC5B,IAAID,WAAW,IAAI1H,uBAAuB,CAACI,OAAO,CAACW,OAAO,GAAG4G,gBAAgB,EAAE;UAAA,IAAAC,qBAAA;UAC7E,CAAAA,qBAAA,GAAAhK,KAAK,CAAC4J,eAAe,cAAAI,qBAAA,eAArBA,qBAAA,CAAA1K,IAAA,CAAAU,KAAwB,CAAC;UACzBoC,uBAAuB,CAACI,OAAO,GAAG,IAAI;QACxC;MACF,CAAC,MAAM;QAAA,IAAAyH,sBAAA;QACL,CAAAA,sBAAA,GAAAjK,KAAK,CAAC4J,eAAe,cAAAK,sBAAA,eAArBA,sBAAA,CAAA3K,IAAA,CAAAU,KAAwB,CAAC;MAC3B;IACF;EACF,CAAC,CAAC;EAEF,oBACEtC,MAAA,CAAAa,OAAA,CAAA2L,aAAA,CAAClM,mBAAA,CAAAO,OAAkB,EAAAkB,QAAA,KACbO,KAAK;IACTmK,GAAG,EAAEnJ,WAAY;IACjBuD,wBAAwB,EAAEA,wBAAyB;IACnD6F,cAAc,EAAE1J,iBAAkB;IAClC2J,sBAAsB,EAAE3J,iBAAkB;IAC1C4J,aAAa,EAAE7J,gBAAiB;IAChCuG,sBAAsB,EAAEA,sBAAuB;IAC/CmC,oBAAoB,EAAEA,oBAAqB;IAC3CoB,wBAAwB,EAAE9F,cAAe;IACzC+F,2BAA2B,EAAE/F,cAAe;IAC5C8C,0BAA0B,EAAEA,0BAA2B;IACvDqC,eAAe,EAAEA,eAAgB;IACjC3H,kBAAkB,EAAEA,kBAAmB;IACvCwI,2BAA2B,EAAEjD,8BAA8B,CAAChF;EAAQ,EACrE,CAAC;AAEN,CAAC;AAAC,IAAAkI,QAAA,GAAAC,OAAA,CAAApM,OAAA,gBAEaqM,cAAK,CAACC,IAAI,CAAC9K,uBAAuB,CAAC","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":[]}
@@ -4,34 +4,105 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- var _react = _interopRequireDefault(require("react"));
7
+ var _react = _interopRequireWildcard(require("react"));
8
8
  var _uikitUtils = require("@sendbird/uikit-utils");
9
9
  var _SBUUtils = _interopRequireDefault(require("../libs/SBUUtils"));
10
10
  var _expoBackwardUtils = _interopRequireDefault(require("../utils/expoBackwardUtils"));
11
11
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
12
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
13
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
12
14
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
13
- const createExpoMediaService = ({
14
- avModule,
15
- thumbnailModule,
16
- imageManipulator,
17
- fsModule
18
- }) => {
19
- return {
20
- VideoComponent({
15
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
16
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
17
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
18
+ class LegacyExpoAVVideoAdapter {
19
+ constructor(avModule) {
20
+ _defineProperty(this, "avModule", void 0);
21
+ _defineProperty(this, "VideoComponent", ({
21
22
  source,
22
23
  resizeMode,
23
24
  onLoad,
24
25
  ...props
25
- }) {
26
+ }) => {
26
27
  // FIXME: type error https://github.com/expo/expo/issues/17101
27
28
  // @ts-ignore
28
- return /*#__PURE__*/_react.default.createElement(avModule.Video, _extends({}, props, {
29
+ return /*#__PURE__*/_react.default.createElement(this.avModule.Video, _extends({}, props, {
29
30
  source: source,
30
31
  resizeMode: resizeMode,
31
32
  onLoad: onLoad,
32
33
  useNativeControls: true
33
34
  }));
34
- },
35
+ });
36
+ this.avModule = avModule;
37
+ }
38
+ }
39
+ class ExpoVideoAdapter {
40
+ constructor(_videoModule) {
41
+ this._videoModule = _videoModule;
42
+ _defineProperty(this, "VideoComponent", ({
43
+ source,
44
+ resizeMode,
45
+ onLoad,
46
+ ...props
47
+ }) => {
48
+ const player = this._videoModule.useVideoPlayer(source);
49
+ (0, _react.useEffect)(() => {
50
+ if (onLoad && player) {
51
+ let subscription = null;
52
+ try {
53
+ subscription = player.addListener('statusChange', eventData => {
54
+ const {
55
+ status,
56
+ error
57
+ } = eventData;
58
+ if (status === 'readyToPlay' && !error) {
59
+ onLoad();
60
+ }
61
+ });
62
+ } catch (error) {
63
+ const timeout = setTimeout(() => onLoad(), 300);
64
+ return () => clearTimeout(timeout);
65
+ }
66
+ return () => {
67
+ if (subscription) {
68
+ subscription.remove();
69
+ }
70
+ };
71
+ }
72
+ return undefined;
73
+ }, [onLoad, player]);
74
+ const getContentFit = mode => {
75
+ switch (mode) {
76
+ case 'cover':
77
+ return 'cover';
78
+ case 'contain':
79
+ return 'contain';
80
+ case 'stretch':
81
+ return 'fill';
82
+ default:
83
+ return 'contain';
84
+ }
85
+ };
86
+ return /*#__PURE__*/_react.default.createElement(this._videoModule.VideoView, {
87
+ ...props,
88
+ player,
89
+ contentFit: getContentFit(resizeMode)
90
+ });
91
+ });
92
+ }
93
+ }
94
+ const createExpoMediaService = ({
95
+ avModule,
96
+ thumbnailModule,
97
+ imageManipulator,
98
+ fsModule
99
+ }) => {
100
+ if (_expoBackwardUtils.default.expoAV.isLegacyAVModule(avModule)) {
101
+ _uikitUtils.Logger.warn('[MediaService.Expo] expo-av is deprecated and will be removed in Expo 54. Please migrate to expo-video.');
102
+ }
103
+ const videoAdapter = _expoBackwardUtils.default.expoAV.isVideoModule(avModule) ? new ExpoVideoAdapter(avModule) : new LegacyExpoAVVideoAdapter(avModule);
104
+ return {
105
+ VideoComponent: videoAdapter.VideoComponent,
35
106
  async getVideoThumbnail({
36
107
  url,
37
108
  quality,
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireDefault","require","_uikitUtils","_SBUUtils","_expoBackwardUtils","e","__esModule","default","_extends","Object","assign","bind","n","arguments","length","t","r","hasOwnProperty","call","apply","createExpoMediaService","avModule","thumbnailModule","imageManipulator","fsModule","VideoComponent","source","resizeMode","onLoad","props","createElement","Video","useNativeControls","getVideoThumbnail","url","quality","timeMills","uri","getThumbnailAsync","time","path","compressImage","maxWidth","maxHeight","compressionRate","originSize","SBUUtils","getImageSize","resizingSize","getDownscaleSize","width","height","compressedURI","manipulateAsync","resize","compress","Math","min","max","fileInfo","getInfoAsync","size","expoBackwardUtils","toFileSize","_default","exports"],"sources":["createMediaService.expo.tsx"],"sourcesContent":["import type * as ExpoAV from 'expo-av';\nimport type * as ExpoFS from 'expo-file-system';\nimport type * as ExpoImageManipulator from 'expo-image-manipulator';\nimport type * as ExpoVideoThumbnail from 'expo-video-thumbnails';\nimport React from 'react';\n\nimport { getDownscaleSize } from '@sendbird/uikit-utils';\n\nimport SBUUtils from '../libs/SBUUtils';\nimport expoBackwardUtils from '../utils/expoBackwardUtils';\nimport type { MediaServiceInterface } from './types';\n\ntype Modules = {\n avModule: typeof ExpoAV;\n thumbnailModule: typeof ExpoVideoThumbnail;\n imageManipulator: typeof ExpoImageManipulator;\n fsModule: typeof ExpoFS;\n};\n\nconst createExpoMediaService = ({\n avModule,\n thumbnailModule,\n imageManipulator,\n fsModule,\n}: Modules): MediaServiceInterface => {\n return {\n VideoComponent({ source, resizeMode, onLoad, ...props }) {\n // FIXME: type error https://github.com/expo/expo/issues/17101\n // @ts-ignore\n return <avModule.Video {...props} source={source} resizeMode={resizeMode} onLoad={onLoad} useNativeControls />;\n },\n async getVideoThumbnail({ url, quality, timeMills }) {\n try {\n const { uri } = await thumbnailModule.getThumbnailAsync(url, { quality, time: timeMills });\n return { path: uri };\n } catch {\n return null;\n }\n },\n async compressImage({ maxWidth, maxHeight, compressionRate = 1, uri }) {\n const originSize = await SBUUtils.getImageSize(uri);\n const resizingSize = getDownscaleSize(originSize, { width: maxWidth, height: maxHeight });\n\n const { uri: compressedURI } = await imageManipulator.manipulateAsync(uri, [{ resize: resizingSize }], {\n compress: Math.min(Math.max(0, compressionRate), 1),\n });\n const fileInfo = await fsModule.getInfoAsync(uri);\n\n return { uri: compressedURI, size: expoBackwardUtils.toFileSize(fileInfo) };\n },\n };\n};\n\nexport default createExpoMediaService;\n"],"mappings":";;;;;;AAIA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,WAAA,GAAAD,OAAA;AAEA,IAAAE,SAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,kBAAA,GAAAJ,sBAAA,CAAAC,OAAA;AAA2D,SAAAD,uBAAAK,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAAA,SAAAG,SAAA,WAAAA,QAAA,GAAAC,MAAA,CAAAC,MAAA,GAAAD,MAAA,CAAAC,MAAA,CAAAC,IAAA,eAAAC,CAAA,aAAAP,CAAA,MAAAA,CAAA,GAAAQ,SAAA,CAAAC,MAAA,EAAAT,CAAA,UAAAU,CAAA,GAAAF,SAAA,CAAAR,CAAA,YAAAW,CAAA,IAAAD,CAAA,OAAAE,cAAA,CAAAC,IAAA,CAAAH,CAAA,EAAAC,CAAA,MAAAJ,CAAA,CAAAI,CAAA,IAAAD,CAAA,CAAAC,CAAA,aAAAJ,CAAA,KAAAJ,QAAA,CAAAW,KAAA,OAAAN,SAAA;AAU3D,MAAMO,sBAAsB,GAAGA,CAAC;EAC9BC,QAAQ;EACRC,eAAe;EACfC,gBAAgB;EAChBC;AACO,CAAC,KAA4B;EACpC,OAAO;IACLC,cAAcA,CAAC;MAAEC,MAAM;MAAEC,UAAU;MAAEC,MAAM;MAAE,GAAGC;IAAM,CAAC,EAAE;MACvD;MACA;MACA,oBAAO9B,MAAA,CAAAQ,OAAA,CAAAuB,aAAA,CAACT,QAAQ,CAACU,KAAK,EAAAvB,QAAA,KAAKqB,KAAK;QAAEH,MAAM,EAAEA,MAAO;QAACC,UAAU,EAAEA,UAAW;QAACC,MAAM,EAAEA,MAAO;QAACI,iBAAiB;MAAA,EAAE,CAAC;IAChH,CAAC;IACD,MAAMC,iBAAiBA,CAAC;MAAEC,GAAG;MAAEC,OAAO;MAAEC;IAAU,CAAC,EAAE;MACnD,IAAI;QACF,MAAM;UAAEC;QAAI,CAAC,GAAG,MAAMf,eAAe,CAACgB,iBAAiB,CAACJ,GAAG,EAAE;UAAEC,OAAO;UAAEI,IAAI,EAAEH;QAAU,CAAC,CAAC;QAC1F,OAAO;UAAEI,IAAI,EAAEH;QAAI,CAAC;MACtB,CAAC,CAAC,MAAM;QACN,OAAO,IAAI;MACb;IACF,CAAC;IACD,MAAMI,aAAaA,CAAC;MAAEC,QAAQ;MAAEC,SAAS;MAAEC,eAAe,GAAG,CAAC;MAAEP;IAAI,CAAC,EAAE;MACrE,MAAMQ,UAAU,GAAG,MAAMC,iBAAQ,CAACC,YAAY,CAACV,GAAG,CAAC;MACnD,MAAMW,YAAY,GAAG,IAAAC,4BAAgB,EAACJ,UAAU,EAAE;QAAEK,KAAK,EAAER,QAAQ;QAAES,MAAM,EAAER;MAAU,CAAC,CAAC;MAEzF,MAAM;QAAEN,GAAG,EAAEe;MAAc,CAAC,GAAG,MAAM7B,gBAAgB,CAAC8B,eAAe,CAAChB,GAAG,EAAE,CAAC;QAAEiB,MAAM,EAAEN;MAAa,CAAC,CAAC,EAAE;QACrGO,QAAQ,EAAEC,IAAI,CAACC,GAAG,CAACD,IAAI,CAACE,GAAG,CAAC,CAAC,EAAEd,eAAe,CAAC,EAAE,CAAC;MACpD,CAAC,CAAC;MACF,MAAMe,QAAQ,GAAG,MAAMnC,QAAQ,CAACoC,YAAY,CAACvB,GAAG,CAAC;MAEjD,OAAO;QAAEA,GAAG,EAAEe,aAAa;QAAES,IAAI,EAAEC,0BAAiB,CAACC,UAAU,CAACJ,QAAQ;MAAE,CAAC;IAC7E;EACF,CAAC;AACH,CAAC;AAAC,IAAAK,QAAA,GAAAC,OAAA,CAAA1D,OAAA,GAEaa,sBAAsB","ignoreList":[]}
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_uikitUtils","_SBUUtils","_interopRequireDefault","_expoBackwardUtils","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","_defineProperty","_toPropertyKey","value","enumerable","configurable","writable","_toPrimitive","Symbol","toPrimitive","TypeError","String","Number","LegacyExpoAVVideoAdapter","constructor","avModule","source","resizeMode","onLoad","props","createElement","Video","useNativeControls","ExpoVideoAdapter","_videoModule","player","useVideoPlayer","useEffect","subscription","addListener","eventData","status","error","timeout","setTimeout","clearTimeout","remove","undefined","getContentFit","mode","React","VideoView","contentFit","createExpoMediaService","thumbnailModule","imageManipulator","fsModule","expoBackwardUtils","expoAV","isLegacyAVModule","Logger","warn","videoAdapter","isVideoModule","VideoComponent","getVideoThumbnail","url","quality","timeMills","uri","getThumbnailAsync","time","path","compressImage","maxWidth","maxHeight","compressionRate","originSize","SBUUtils","getImageSize","resizingSize","getDownscaleSize","width","height","compressedURI","manipulateAsync","resize","compress","Math","min","max","fileInfo","getInfoAsync","size","toFileSize","_default","exports"],"sources":["createMediaService.expo.tsx"],"sourcesContent":["import type * as ExpoAV from 'expo-av';\nimport type * as ExpoFS from 'expo-file-system';\nimport type * as ExpoImageManipulator from 'expo-image-manipulator';\nimport type { EventSubscription } from 'expo-modules-core';\nimport type * as ExpoVideo from 'expo-video';\nimport type { StatusChangeEventPayload } from 'expo-video';\nimport type * as ExpoVideoThumbnail from 'expo-video-thumbnails';\nimport React, { useEffect } from 'react';\n\nimport { Logger, getDownscaleSize } from '@sendbird/uikit-utils';\n\nimport SBUUtils from '../libs/SBUUtils';\nimport expoBackwardUtils from '../utils/expoBackwardUtils';\nimport type { ExpoVideoModule } from '../utils/expoBackwardUtils';\nimport type { MediaServiceInterface, VideoProps } from './types';\n\ntype Modules = {\n avModule: ExpoVideoModule;\n thumbnailModule: typeof ExpoVideoThumbnail;\n imageManipulator: typeof ExpoImageManipulator;\n fsModule: typeof ExpoFS;\n};\n\ninterface VideoModuleAdapter {\n VideoComponent: React.ComponentType<VideoProps>;\n}\n\nclass LegacyExpoAVVideoAdapter implements VideoModuleAdapter {\n private readonly avModule: typeof ExpoAV;\n constructor(avModule: typeof ExpoAV) {\n this.avModule = avModule;\n }\n\n VideoComponent = ({ source, resizeMode, onLoad, ...props }: VideoProps) => {\n // FIXME: type error https://github.com/expo/expo/issues/17101\n // @ts-ignore\n return <this.avModule.Video {...props} source={source} resizeMode={resizeMode} onLoad={onLoad} useNativeControls />;\n };\n}\n\nclass ExpoVideoAdapter implements VideoModuleAdapter {\n constructor(private readonly _videoModule: typeof ExpoVideo) {}\n\n VideoComponent = ({ source, resizeMode, onLoad, ...props }: VideoProps) => {\n const player = this._videoModule.useVideoPlayer(source);\n\n useEffect(() => {\n if (onLoad && player) {\n let subscription: EventSubscription | null = null;\n try {\n subscription = player.addListener('statusChange', (eventData: StatusChangeEventPayload) => {\n const { status, error } = eventData;\n if (status === 'readyToPlay' && !error) {\n onLoad();\n }\n });\n } catch (error) {\n const timeout = setTimeout(() => onLoad(), 300);\n return () => clearTimeout(timeout);\n }\n\n return () => {\n if (subscription) {\n subscription.remove();\n }\n };\n }\n return undefined;\n }, [onLoad, player]);\n\n const getContentFit = (mode: typeof resizeMode): 'cover' | 'contain' | 'fill' => {\n switch (mode) {\n case 'cover':\n return 'cover';\n case 'contain':\n return 'contain';\n case 'stretch':\n return 'fill';\n default:\n return 'contain';\n }\n };\n\n return React.createElement(this._videoModule.VideoView, {\n ...props,\n player,\n contentFit: getContentFit(resizeMode),\n });\n };\n}\n\nconst createExpoMediaService = ({\n avModule,\n thumbnailModule,\n imageManipulator,\n fsModule,\n}: Modules): MediaServiceInterface => {\n if (expoBackwardUtils.expoAV.isLegacyAVModule(avModule)) {\n Logger.warn(\n '[MediaService.Expo] expo-av is deprecated and will be removed in Expo 54. Please migrate to expo-video.',\n );\n }\n\n const videoAdapter = expoBackwardUtils.expoAV.isVideoModule(avModule)\n ? new ExpoVideoAdapter(avModule)\n : new LegacyExpoAVVideoAdapter(avModule);\n\n return {\n VideoComponent: videoAdapter.VideoComponent,\n async getVideoThumbnail({ url, quality, timeMills }) {\n try {\n const { uri } = await thumbnailModule.getThumbnailAsync(url, { quality, time: timeMills });\n return { path: uri };\n } catch {\n return null;\n }\n },\n async compressImage({ maxWidth, maxHeight, compressionRate = 1, uri }) {\n const originSize = await SBUUtils.getImageSize(uri);\n const resizingSize = getDownscaleSize(originSize, { width: maxWidth, height: maxHeight });\n\n const { uri: compressedURI } = await imageManipulator.manipulateAsync(uri, [{ resize: resizingSize }], {\n compress: Math.min(Math.max(0, compressionRate), 1),\n });\n const fileInfo = await fsModule.getInfoAsync(uri);\n\n return { uri: compressedURI, size: expoBackwardUtils.toFileSize(fileInfo) };\n },\n };\n};\n\nexport default createExpoMediaService;\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":"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","ignoreList":[]}