@sendbird/uikit-react-native 3.5.0 → 3.5.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 (39) hide show
  1. package/README.md +0 -1
  2. package/lib/commonjs/domain/groupChannel/component/GroupChannelInput.js +7 -3
  3. package/lib/commonjs/domain/groupChannel/component/GroupChannelInput.js.map +1 -1
  4. package/lib/commonjs/domain/groupChannel/types.js.map +1 -1
  5. package/lib/commonjs/domain/openChannel/component/OpenChannelInput.js +7 -3
  6. package/lib/commonjs/domain/openChannel/component/OpenChannelInput.js.map +1 -1
  7. package/lib/commonjs/domain/openChannel/types.js.map +1 -1
  8. package/lib/commonjs/platform/createFileService.expo.js +2 -2
  9. package/lib/commonjs/platform/createFileService.expo.js.map +1 -1
  10. package/lib/commonjs/platform/createFileService.native.js +1 -4
  11. package/lib/commonjs/platform/createFileService.native.js.map +1 -1
  12. package/lib/commonjs/version.js +1 -1
  13. package/lib/commonjs/version.js.map +1 -1
  14. package/lib/module/domain/groupChannel/component/GroupChannelInput.js +7 -3
  15. package/lib/module/domain/groupChannel/component/GroupChannelInput.js.map +1 -1
  16. package/lib/module/domain/groupChannel/types.js.map +1 -1
  17. package/lib/module/domain/openChannel/component/OpenChannelInput.js +7 -3
  18. package/lib/module/domain/openChannel/component/OpenChannelInput.js.map +1 -1
  19. package/lib/module/domain/openChannel/types.js.map +1 -1
  20. package/lib/module/platform/createFileService.expo.js +2 -2
  21. package/lib/module/platform/createFileService.expo.js.map +1 -1
  22. package/lib/module/platform/createFileService.native.js +1 -4
  23. package/lib/module/platform/createFileService.native.js.map +1 -1
  24. package/lib/module/version.js +1 -1
  25. package/lib/module/version.js.map +1 -1
  26. package/lib/typescript/src/containers/SendbirdUIKitContainer.d.ts +1 -1
  27. package/lib/typescript/src/domain/groupChannel/component/GroupChannelInput.d.ts +1 -1
  28. package/lib/typescript/src/domain/groupChannel/types.d.ts +2 -2
  29. package/lib/typescript/src/domain/openChannel/component/OpenChannelInput.d.ts +1 -1
  30. package/lib/typescript/src/domain/openChannel/types.d.ts +2 -2
  31. package/lib/typescript/src/version.d.ts +1 -1
  32. package/package.json +5 -5
  33. package/src/domain/groupChannel/component/GroupChannelInput.tsx +3 -3
  34. package/src/domain/groupChannel/types.ts +4 -2
  35. package/src/domain/openChannel/component/OpenChannelInput.tsx +3 -3
  36. package/src/domain/openChannel/types.ts +4 -2
  37. package/src/platform/createFileService.expo.ts +2 -2
  38. package/src/platform/createFileService.native.ts +1 -9
  39. package/src/version.ts +1 -1
package/README.md CHANGED
@@ -96,7 +96,6 @@ Add the following permission usage descriptions to your `info.plist` file.
96
96
  | Key | Type | Value |
97
97
  | --------------------------------------------------- | ------ | --------------------------------------------------------------- |
98
98
  | Privacy - Camera Usage Description | string | $(PRODUCT_NAME) would like to use your camera |
99
- | Privacy - Media Library Usage Description | string | $(PRODUCT_NAME) would like access to your photo library |
100
99
  | Privacy - Photo Library Usage Description | string | $(PRODUCT_NAME) would like access to your photo library |
101
100
  | Privacy - Photo Library Additions Usage Description | string | $(PRODUCT_NAME) would like to save photos to your photo library |
102
101
 
@@ -12,7 +12,11 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
12
12
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
13
13
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
14
14
  function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
15
- const GroupChannelInput = props => {
15
+ const GroupChannelInput = _ref => {
16
+ let {
17
+ inputDisabled,
18
+ ...props
19
+ } = _ref;
16
20
  const {
17
21
  channel,
18
22
  keyboardAvoidOffset = 0,
@@ -28,10 +32,10 @@ const GroupChannelInput = props => {
28
32
  setMessageToEdit: setMessageToEdit,
29
33
  messageToReply: messageToReply,
30
34
  setMessageToReply: setMessageToReply,
35
+ keyboardAvoidOffset: keyboardAvoidOffset,
31
36
  inputMuted: chatAvailableState.muted,
32
37
  inputFrozen: chatAvailableState.frozen,
33
- inputDisabled: chatAvailableState.disabled,
34
- keyboardAvoidOffset: keyboardAvoidOffset
38
+ inputDisabled: inputDisabled ?? chatAvailableState.disabled
35
39
  }, props));
36
40
  };
37
41
  var _default = /*#__PURE__*/_react.default.memo(GroupChannelInput);
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireWildcard","require","_uikitUtils","_ChannelInput","_interopRequireDefault","_moduleContext","obj","__esModule","default","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","_extends","assign","bind","target","i","arguments","length","source","apply","GroupChannelInput","props","channel","keyboardAvoidOffset","messageToEdit","setMessageToEdit","messageToReply","setMessageToReply","useContext","GroupChannelContexts","Fragment","chatAvailableState","getGroupChannelChatAvailableState","createElement","inputMuted","muted","inputFrozen","frozen","inputDisabled","disabled","_default","React","memo","exports"],"sources":["GroupChannelInput.tsx"],"sourcesContent":["import React, { useContext } from 'react';\n\nimport { getGroupChannelChatAvailableState } from '@sendbird/uikit-utils';\n\nimport ChannelInput from '../../../components/ChannelInput';\nimport { GroupChannelContexts } from '../module/moduleContext';\nimport type { GroupChannelProps } from '../types';\n\nconst GroupChannelInput = (props: GroupChannelProps['Input']) => {\n const {\n channel,\n keyboardAvoidOffset = 0,\n messageToEdit,\n setMessageToEdit,\n messageToReply,\n setMessageToReply,\n } = useContext(GroupChannelContexts.Fragment);\n\n const chatAvailableState = getGroupChannelChatAvailableState(channel);\n\n return (\n <ChannelInput\n channel={channel}\n messageToEdit={messageToEdit}\n setMessageToEdit={setMessageToEdit}\n messageToReply={messageToReply}\n setMessageToReply={setMessageToReply}\n inputMuted={chatAvailableState.muted}\n inputFrozen={chatAvailableState.frozen}\n inputDisabled={chatAvailableState.disabled}\n keyboardAvoidOffset={keyboardAvoidOffset}\n {...props}\n />\n );\n};\n\nexport default React.memo(GroupChannelInput);\n"],"mappings":"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"}
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_uikitUtils","_ChannelInput","_interopRequireDefault","_moduleContext","obj","__esModule","default","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","_extends","assign","bind","target","i","arguments","length","source","apply","GroupChannelInput","_ref","inputDisabled","props","channel","keyboardAvoidOffset","messageToEdit","setMessageToEdit","messageToReply","setMessageToReply","useContext","GroupChannelContexts","Fragment","chatAvailableState","getGroupChannelChatAvailableState","createElement","inputMuted","muted","inputFrozen","frozen","disabled","_default","React","memo","exports"],"sources":["GroupChannelInput.tsx"],"sourcesContent":["import React, { useContext } from 'react';\n\nimport { getGroupChannelChatAvailableState } from '@sendbird/uikit-utils';\n\nimport ChannelInput from '../../../components/ChannelInput';\nimport { GroupChannelContexts } from '../module/moduleContext';\nimport type { GroupChannelProps } from '../types';\n\nconst GroupChannelInput = ({ inputDisabled, ...props }: GroupChannelProps['Input']) => {\n const {\n channel,\n keyboardAvoidOffset = 0,\n messageToEdit,\n setMessageToEdit,\n messageToReply,\n setMessageToReply,\n } = useContext(GroupChannelContexts.Fragment);\n\n const chatAvailableState = getGroupChannelChatAvailableState(channel);\n\n return (\n <ChannelInput\n channel={channel}\n messageToEdit={messageToEdit}\n setMessageToEdit={setMessageToEdit}\n messageToReply={messageToReply}\n setMessageToReply={setMessageToReply}\n keyboardAvoidOffset={keyboardAvoidOffset}\n inputMuted={chatAvailableState.muted}\n inputFrozen={chatAvailableState.frozen}\n inputDisabled={inputDisabled ?? chatAvailableState.disabled}\n {...props}\n />\n );\n};\n\nexport default React.memo(GroupChannelInput);\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import type React from 'react';\nimport type { FlatList } from 'react-native';\n\nimport type { MessageCollectionParams, MessageFilterParams } from '@sendbird/chat/groupChannel';\nimport type { UseGroupChannelMessagesOptions } from '@sendbird/uikit-chat-hooks';\nimport type {\n OnBeforeHandler,\n SendbirdFileMessage,\n SendbirdFileMessageCreateParams,\n SendbirdFileMessageUpdateParams,\n SendbirdGroupChannel,\n SendbirdMessage,\n SendbirdUser,\n SendbirdUserMessage,\n SendbirdUserMessageCreateParams,\n SendbirdUserMessageUpdateParams,\n} from '@sendbird/uikit-utils';\n\nimport type { ChannelInputProps, SuggestedMentionListProps } from '../../components/ChannelInput';\nimport type { ChannelMessageListProps } from '../../components/ChannelMessageList';\nimport type { CommonComponent } from '../../types';\nimport type { PubSub } from '../../utils/pubsub';\n\nexport type MessageListQueryParamsType = Omit<MessageCollectionParams, 'filter'> & MessageFilterParams;\nexport interface GroupChannelProps {\n Fragment: {\n channel: SendbirdGroupChannel;\n onChannelDeleted: () => void;\n onPressHeaderLeft: GroupChannelProps['Header']['onPressHeaderLeft'];\n onPressHeaderRight: GroupChannelProps['Header']['onPressHeaderRight'];\n onPressMediaMessage?: GroupChannelProps['MessageList']['onPressMediaMessage'];\n\n onBeforeSendUserMessage?: OnBeforeHandler<SendbirdUserMessageCreateParams>;\n onBeforeSendFileMessage?: OnBeforeHandler<SendbirdFileMessageCreateParams>;\n onBeforeUpdateUserMessage?: OnBeforeHandler<SendbirdUserMessageUpdateParams>;\n onBeforeUpdateFileMessage?: OnBeforeHandler<SendbirdFileMessageUpdateParams>;\n\n renderMessage?: GroupChannelProps['MessageList']['renderMessage'];\n renderNewMessagesButton?: GroupChannelProps['MessageList']['renderNewMessagesButton'];\n renderScrollToBottomButton?: GroupChannelProps['MessageList']['renderScrollToBottomButton'];\n\n enableTypingIndicator?: GroupChannelProps['Provider']['enableTypingIndicator'];\n enableMessageGrouping?: GroupChannelProps['MessageList']['enableMessageGrouping'];\n\n keyboardAvoidOffset?: GroupChannelProps['Provider']['keyboardAvoidOffset'];\n flatListProps?: GroupChannelProps['MessageList']['flatListProps'];\n sortComparator?: UseGroupChannelMessagesOptions['sortComparator'];\n\n searchItem?: GroupChannelProps['MessageList']['searchItem'];\n\n /**\n * @description You can specify the query parameters for the message list.\n * @example\n * ```\n * <GroupChannelFragment messageListQueryParams={{ prevResultLimit: 20, customTypesFilter: ['filter'] }} />\n * ```\n * */\n messageListQueryParams?: MessageListQueryParamsType;\n /** @deprecated Please use `messageListQueryParams` instead */\n collectionCreator?: UseGroupChannelMessagesOptions['collectionCreator'];\n };\n Header: {\n shouldHideRight: () => boolean;\n onPressHeaderLeft: () => void;\n onPressHeaderRight: () => void;\n };\n MessageList: Pick<\n ChannelMessageListProps<SendbirdGroupChannel>,\n | 'enableMessageGrouping'\n | 'currentUserId'\n | 'channel'\n | 'messages'\n | 'newMessages'\n | 'scrolledAwayFromBottom'\n | 'onScrolledAwayFromBottom'\n | 'onTopReached'\n | 'onBottomReached'\n | 'onResendFailedMessage'\n | 'onDeleteMessage'\n | 'onPressMediaMessage'\n | 'renderMessage'\n | 'renderNewMessagesButton'\n | 'renderScrollToBottomButton'\n | 'flatListProps'\n | 'hasNext'\n | 'searchItem'\n > & {\n onResetMessageList: () => Promise<void>;\n onResetMessageListWithStartingPoint: (startingPoint: number) => Promise<void>;\n\n // Changing the search item will trigger the focus animation on messages.\n onUpdateSearchItem: (searchItem?: GroupChannelProps['MessageList']['searchItem']) => void;\n };\n Input: Pick<\n ChannelInputProps,\n | 'shouldRenderInput'\n | 'onPressSendUserMessage'\n | 'onPressSendFileMessage'\n | 'onPressUpdateUserMessage'\n | 'onPressUpdateFileMessage'\n | 'SuggestedMentionList'\n | 'AttachmentsButton'\n >;\n\n SuggestedMentionList: SuggestedMentionListProps;\n Provider: {\n channel: SendbirdGroupChannel;\n enableTypingIndicator: boolean;\n keyboardAvoidOffset?: number;\n groupChannelPubSub: PubSub<GroupChannelPubSubContextPayload>;\n\n messages: SendbirdMessage[];\n // Changing the search item will trigger the focus animation on messages.\n onUpdateSearchItem: (searchItem?: GroupChannelProps['MessageList']['searchItem']) => void;\n };\n}\n\n/**\n * Internal context for GroupChannel\n * For example, the developer can create a custom header\n * with getting data from the domain context\n * */\nexport interface GroupChannelContextsType {\n Fragment: React.Context<{\n headerTitle: string;\n keyboardAvoidOffset?: number;\n channel: SendbirdGroupChannel;\n messageToEdit?: SendbirdUserMessage | SendbirdFileMessage;\n setMessageToEdit: (msg?: SendbirdUserMessage | SendbirdFileMessage) => void;\n messageToReply?: SendbirdUserMessage | SendbirdFileMessage;\n setMessageToReply: (msg?: SendbirdUserMessage | SendbirdFileMessage) => void;\n }>;\n TypingIndicator: React.Context<{\n typingUsers: SendbirdUser[];\n }>;\n PubSub: React.Context<PubSub<GroupChannelPubSubContextPayload>>;\n MessageList: React.Context<{\n /**\n * ref object for FlatList of MessageList\n * */\n flatListRef: React.MutableRefObject<FlatList | null>;\n /**\n * Function that scrolls to a message within a group channel.\n * @param messageId {number} - The id of the message to scroll.\n * @param options {object} - Scroll options (optional).\n * @param options.focusAnimated {boolean} - Enable a shake animation on the message component upon completion of scrolling.\n * @param options.viewPosition {number} - Position information to adjust the visible area during scrolling. bottom(0) ~ top(1.0)\n *\n * @example\n * ```\n * const { scrollToMessage } = useContext(GroupChannelContexts.MessageList);\n * const messageIncludedInMessageList = scrollToMessage(lastMessage.messageId, { focusAnimated: true, viewPosition: 1 });\n * if (!messageIncludedInMessageList) console.warn('Message not found in the message list.');\n * ```\n * */\n scrollToMessage: (messageId: number, options?: { focusAnimated?: boolean; viewPosition?: number }) => boolean;\n /**\n * Call the FlatList function asynchronously to scroll to bottom lazily\n * to avoid scrolling before data rendering has been committed.\n * */\n lazyScrollToBottom: (params?: { animated?: boolean; timeout?: number }) => void;\n /**\n * Call the FlatList function asynchronously to scroll to index lazily.\n * to avoid scrolling before data rendering has been committed.\n * */\n lazyScrollToIndex: (params?: {\n index?: number;\n animated?: boolean;\n timeout?: number;\n viewPosition?: number;\n }) => void;\n }>;\n}\nexport interface GroupChannelModule {\n Provider: CommonComponent<GroupChannelProps['Provider']>;\n Header: CommonComponent<GroupChannelProps['Header']>;\n MessageList: CommonComponent<GroupChannelProps['MessageList']>;\n Input: CommonComponent<GroupChannelProps['Input']>;\n SuggestedMentionList: CommonComponent<GroupChannelProps['SuggestedMentionList']>;\n StatusEmpty: CommonComponent;\n StatusLoading: CommonComponent;\n}\n\nexport type GroupChannelFragment = React.FC<GroupChannelProps['Fragment']>;\n\nexport type GroupChannelPubSubContextPayload =\n | {\n type: 'MESSAGE_SENT_PENDING' | 'MESSAGE_SENT_SUCCESS';\n data: {\n message: SendbirdUserMessage | SendbirdFileMessage;\n };\n }\n | {\n type: 'MESSAGES_RECEIVED' | 'MESSAGES_UPDATED';\n data: {\n messages: SendbirdMessage[];\n };\n }\n | {\n type: 'TYPING_BUBBLE_RENDERED';\n data?: undefined;\n };\n"],"mappings":""}
1
+ {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import type React from 'react';\nimport type { FlatList } from 'react-native';\n\nimport type { MessageCollectionParams, MessageFilterParams } from '@sendbird/chat/groupChannel';\nimport type { UseGroupChannelMessagesOptions } from '@sendbird/uikit-chat-hooks';\nimport type {\n OnBeforeHandler,\n PickPartial,\n SendbirdFileMessage,\n SendbirdFileMessageCreateParams,\n SendbirdFileMessageUpdateParams,\n SendbirdGroupChannel,\n SendbirdMessage,\n SendbirdUser,\n SendbirdUserMessage,\n SendbirdUserMessageCreateParams,\n SendbirdUserMessageUpdateParams,\n} from '@sendbird/uikit-utils';\n\nimport type { ChannelInputProps, SuggestedMentionListProps } from '../../components/ChannelInput';\nimport type { ChannelMessageListProps } from '../../components/ChannelMessageList';\nimport type { CommonComponent } from '../../types';\nimport type { PubSub } from '../../utils/pubsub';\n\nexport type MessageListQueryParamsType = Omit<MessageCollectionParams, 'filter'> & MessageFilterParams;\nexport interface GroupChannelProps {\n Fragment: {\n channel: SendbirdGroupChannel;\n onChannelDeleted: () => void;\n onPressHeaderLeft: GroupChannelProps['Header']['onPressHeaderLeft'];\n onPressHeaderRight: GroupChannelProps['Header']['onPressHeaderRight'];\n onPressMediaMessage?: GroupChannelProps['MessageList']['onPressMediaMessage'];\n\n onBeforeSendUserMessage?: OnBeforeHandler<SendbirdUserMessageCreateParams>;\n onBeforeSendFileMessage?: OnBeforeHandler<SendbirdFileMessageCreateParams>;\n onBeforeUpdateUserMessage?: OnBeforeHandler<SendbirdUserMessageUpdateParams>;\n onBeforeUpdateFileMessage?: OnBeforeHandler<SendbirdFileMessageUpdateParams>;\n\n renderMessage?: GroupChannelProps['MessageList']['renderMessage'];\n renderNewMessagesButton?: GroupChannelProps['MessageList']['renderNewMessagesButton'];\n renderScrollToBottomButton?: GroupChannelProps['MessageList']['renderScrollToBottomButton'];\n\n enableTypingIndicator?: GroupChannelProps['Provider']['enableTypingIndicator'];\n enableMessageGrouping?: GroupChannelProps['MessageList']['enableMessageGrouping'];\n\n keyboardAvoidOffset?: GroupChannelProps['Provider']['keyboardAvoidOffset'];\n flatListProps?: GroupChannelProps['MessageList']['flatListProps'];\n sortComparator?: UseGroupChannelMessagesOptions['sortComparator'];\n\n searchItem?: GroupChannelProps['MessageList']['searchItem'];\n\n /**\n * @description You can specify the query parameters for the message list.\n * @example\n * ```\n * <GroupChannelFragment messageListQueryParams={{ prevResultLimit: 20, customTypesFilter: ['filter'] }} />\n * ```\n * */\n messageListQueryParams?: MessageListQueryParamsType;\n /** @deprecated Please use `messageListQueryParams` instead */\n collectionCreator?: UseGroupChannelMessagesOptions['collectionCreator'];\n };\n Header: {\n shouldHideRight: () => boolean;\n onPressHeaderLeft: () => void;\n onPressHeaderRight: () => void;\n };\n MessageList: Pick<\n ChannelMessageListProps<SendbirdGroupChannel>,\n | 'enableMessageGrouping'\n | 'currentUserId'\n | 'channel'\n | 'messages'\n | 'newMessages'\n | 'scrolledAwayFromBottom'\n | 'onScrolledAwayFromBottom'\n | 'onTopReached'\n | 'onBottomReached'\n | 'onResendFailedMessage'\n | 'onDeleteMessage'\n | 'onPressMediaMessage'\n | 'renderMessage'\n | 'renderNewMessagesButton'\n | 'renderScrollToBottomButton'\n | 'flatListProps'\n | 'hasNext'\n | 'searchItem'\n > & {\n onResetMessageList: () => Promise<void>;\n onResetMessageListWithStartingPoint: (startingPoint: number) => Promise<void>;\n\n // Changing the search item will trigger the focus animation on messages.\n onUpdateSearchItem: (searchItem?: GroupChannelProps['MessageList']['searchItem']) => void;\n };\n Input: PickPartial<\n ChannelInputProps,\n | 'shouldRenderInput'\n | 'onPressSendUserMessage'\n | 'onPressSendFileMessage'\n | 'onPressUpdateUserMessage'\n | 'onPressUpdateFileMessage'\n | 'SuggestedMentionList'\n | 'AttachmentsButton',\n 'inputDisabled'\n >;\n\n SuggestedMentionList: SuggestedMentionListProps;\n Provider: {\n channel: SendbirdGroupChannel;\n enableTypingIndicator: boolean;\n keyboardAvoidOffset?: number;\n groupChannelPubSub: PubSub<GroupChannelPubSubContextPayload>;\n\n messages: SendbirdMessage[];\n // Changing the search item will trigger the focus animation on messages.\n onUpdateSearchItem: (searchItem?: GroupChannelProps['MessageList']['searchItem']) => void;\n };\n}\n\n/**\n * Internal context for GroupChannel\n * For example, the developer can create a custom header\n * with getting data from the domain context\n * */\nexport interface GroupChannelContextsType {\n Fragment: React.Context<{\n headerTitle: string;\n keyboardAvoidOffset?: number;\n channel: SendbirdGroupChannel;\n messageToEdit?: SendbirdUserMessage | SendbirdFileMessage;\n setMessageToEdit: (msg?: SendbirdUserMessage | SendbirdFileMessage) => void;\n messageToReply?: SendbirdUserMessage | SendbirdFileMessage;\n setMessageToReply: (msg?: SendbirdUserMessage | SendbirdFileMessage) => void;\n }>;\n TypingIndicator: React.Context<{\n typingUsers: SendbirdUser[];\n }>;\n PubSub: React.Context<PubSub<GroupChannelPubSubContextPayload>>;\n MessageList: React.Context<{\n /**\n * ref object for FlatList of MessageList\n * */\n flatListRef: React.MutableRefObject<FlatList | null>;\n /**\n * Function that scrolls to a message within a group channel.\n * @param messageId {number} - The id of the message to scroll.\n * @param options {object} - Scroll options (optional).\n * @param options.focusAnimated {boolean} - Enable a shake animation on the message component upon completion of scrolling.\n * @param options.viewPosition {number} - Position information to adjust the visible area during scrolling. bottom(0) ~ top(1.0)\n *\n * @example\n * ```\n * const { scrollToMessage } = useContext(GroupChannelContexts.MessageList);\n * const messageIncludedInMessageList = scrollToMessage(lastMessage.messageId, { focusAnimated: true, viewPosition: 1 });\n * if (!messageIncludedInMessageList) console.warn('Message not found in the message list.');\n * ```\n * */\n scrollToMessage: (messageId: number, options?: { focusAnimated?: boolean; viewPosition?: number }) => boolean;\n /**\n * Call the FlatList function asynchronously to scroll to bottom lazily\n * to avoid scrolling before data rendering has been committed.\n * */\n lazyScrollToBottom: (params?: { animated?: boolean; timeout?: number }) => void;\n /**\n * Call the FlatList function asynchronously to scroll to index lazily.\n * to avoid scrolling before data rendering has been committed.\n * */\n lazyScrollToIndex: (params?: {\n index?: number;\n animated?: boolean;\n timeout?: number;\n viewPosition?: number;\n }) => void;\n }>;\n}\nexport interface GroupChannelModule {\n Provider: CommonComponent<GroupChannelProps['Provider']>;\n Header: CommonComponent<GroupChannelProps['Header']>;\n MessageList: CommonComponent<GroupChannelProps['MessageList']>;\n Input: CommonComponent<GroupChannelProps['Input']>;\n SuggestedMentionList: CommonComponent<GroupChannelProps['SuggestedMentionList']>;\n StatusEmpty: CommonComponent;\n StatusLoading: CommonComponent;\n}\n\nexport type GroupChannelFragment = React.FC<GroupChannelProps['Fragment']>;\n\nexport type GroupChannelPubSubContextPayload =\n | {\n type: 'MESSAGE_SENT_PENDING' | 'MESSAGE_SENT_SUCCESS';\n data: {\n message: SendbirdUserMessage | SendbirdFileMessage;\n };\n }\n | {\n type: 'MESSAGES_RECEIVED' | 'MESSAGES_UPDATED';\n data: {\n messages: SendbirdMessage[];\n };\n }\n | {\n type: 'TYPING_BUBBLE_RENDERED';\n data?: undefined;\n };\n"],"mappings":""}
@@ -15,7 +15,11 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
15
15
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
16
16
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
17
17
  function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
18
- const OpenChannelInput = props => {
18
+ const OpenChannelInput = _ref => {
19
+ let {
20
+ inputDisabled,
21
+ ...props
22
+ } = _ref;
19
23
  const {
20
24
  sdk,
21
25
  currentUser
@@ -62,10 +66,10 @@ const OpenChannelInput = props => {
62
66
  channel: channel,
63
67
  messageToEdit: messageToEdit,
64
68
  setMessageToEdit: setMessageToEdit,
69
+ keyboardAvoidOffset: keyboardAvoidOffset,
65
70
  inputMuted: chatAvailableState.muted,
66
71
  inputFrozen: channel.isFrozen,
67
- inputDisabled: chatAvailableState.disabled,
68
- keyboardAvoidOffset: keyboardAvoidOffset
72
+ inputDisabled: inputDisabled ?? chatAvailableState.disabled
69
73
  }, props));
70
74
  };
71
75
  var _default = /*#__PURE__*/_react.default.memo(OpenChannelInput);
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireWildcard","require","_uikitChatHooks","_uikitUtils","_ChannelInput","_interopRequireDefault","_constants","_useContext","_moduleContext","obj","__esModule","default","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","_extends","assign","bind","target","i","arguments","length","source","apply","OpenChannelInput","props","sdk","currentUser","useSendbirdChat","channel","messageToEdit","setMessageToEdit","keyboardAvoidOffset","useContext","OpenChannelContexts","Fragment","chatAvailableState","setChatAvailableState","useState","frozen","muted","disabled","updateChatAvailableState","useCallback","baseChannel","isOpenChannel","userId","UNKNOWN_USER_ID","getOpenChannelChatAvailableState","then","useEffect","handlerId","useUniqHandlerId","useChannelHandler","onChannelFrozen","onChannelUnfrozen","onUserMuted","onUserUnmuted","onOperatorUpdated","createElement","inputMuted","inputFrozen","isFrozen","inputDisabled","_default","React","memo","exports"],"sources":["OpenChannelInput.tsx"],"sourcesContent":["import React, { useCallback, useContext, useEffect, useState } from 'react';\n\nimport { useChannelHandler } from '@sendbird/uikit-chat-hooks';\nimport { SendbirdBaseChannel, getOpenChannelChatAvailableState, useUniqHandlerId } from '@sendbird/uikit-utils';\n\nimport ChannelInput from '../../../components/ChannelInput';\nimport { UNKNOWN_USER_ID } from '../../../constants';\nimport { useSendbirdChat } from '../../../hooks/useContext';\nimport { OpenChannelContexts } from '../module/moduleContext';\nimport type { OpenChannelProps } from '../types';\n\nconst OpenChannelInput = (props: OpenChannelProps['Input']) => {\n const { sdk, currentUser } = useSendbirdChat();\n\n const {\n channel,\n messageToEdit,\n setMessageToEdit,\n keyboardAvoidOffset = 0,\n } = useContext(OpenChannelContexts.Fragment);\n\n const [chatAvailableState, setChatAvailableState] = useState({ frozen: false, muted: false, disabled: false });\n\n const updateChatAvailableState = useCallback(\n (baseChannel: SendbirdBaseChannel) => {\n if (baseChannel.isOpenChannel()) {\n const userId = currentUser?.userId ?? UNKNOWN_USER_ID;\n getOpenChannelChatAvailableState(baseChannel, userId).then(setChatAvailableState);\n }\n },\n [currentUser?.userId],\n );\n\n useEffect(() => {\n updateChatAvailableState(channel);\n }, [channel, updateChatAvailableState]);\n\n const handlerId = useUniqHandlerId('OpenChannelInput');\n useChannelHandler(\n sdk,\n handlerId,\n {\n onChannelFrozen(channel) {\n updateChatAvailableState(channel);\n },\n onChannelUnfrozen(channel) {\n updateChatAvailableState(channel);\n },\n onUserMuted(channel) {\n updateChatAvailableState(channel);\n },\n onUserUnmuted(channel) {\n updateChatAvailableState(channel);\n },\n onOperatorUpdated(channel) {\n updateChatAvailableState(channel);\n },\n },\n 'open',\n );\n\n return (\n <ChannelInput\n channel={channel}\n messageToEdit={messageToEdit}\n setMessageToEdit={setMessageToEdit}\n inputMuted={chatAvailableState.muted}\n inputFrozen={channel.isFrozen}\n inputDisabled={chatAvailableState.disabled}\n keyboardAvoidOffset={keyboardAvoidOffset}\n {...props}\n />\n );\n};\n\nexport default React.memo(OpenChannelInput);\n"],"mappings":"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"}
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_uikitChatHooks","_uikitUtils","_ChannelInput","_interopRequireDefault","_constants","_useContext","_moduleContext","obj","__esModule","default","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","_extends","assign","bind","target","i","arguments","length","source","apply","OpenChannelInput","_ref","inputDisabled","props","sdk","currentUser","useSendbirdChat","channel","messageToEdit","setMessageToEdit","keyboardAvoidOffset","useContext","OpenChannelContexts","Fragment","chatAvailableState","setChatAvailableState","useState","frozen","muted","disabled","updateChatAvailableState","useCallback","baseChannel","isOpenChannel","userId","UNKNOWN_USER_ID","getOpenChannelChatAvailableState","then","useEffect","handlerId","useUniqHandlerId","useChannelHandler","onChannelFrozen","onChannelUnfrozen","onUserMuted","onUserUnmuted","onOperatorUpdated","createElement","inputMuted","inputFrozen","isFrozen","_default","React","memo","exports"],"sources":["OpenChannelInput.tsx"],"sourcesContent":["import React, { useCallback, useContext, useEffect, useState } from 'react';\n\nimport { useChannelHandler } from '@sendbird/uikit-chat-hooks';\nimport { SendbirdBaseChannel, getOpenChannelChatAvailableState, useUniqHandlerId } from '@sendbird/uikit-utils';\n\nimport ChannelInput from '../../../components/ChannelInput';\nimport { UNKNOWN_USER_ID } from '../../../constants';\nimport { useSendbirdChat } from '../../../hooks/useContext';\nimport { OpenChannelContexts } from '../module/moduleContext';\nimport type { OpenChannelProps } from '../types';\n\nconst OpenChannelInput = ({ inputDisabled, ...props }: OpenChannelProps['Input']) => {\n const { sdk, currentUser } = useSendbirdChat();\n\n const {\n channel,\n messageToEdit,\n setMessageToEdit,\n keyboardAvoidOffset = 0,\n } = useContext(OpenChannelContexts.Fragment);\n\n const [chatAvailableState, setChatAvailableState] = useState({ frozen: false, muted: false, disabled: false });\n\n const updateChatAvailableState = useCallback(\n (baseChannel: SendbirdBaseChannel) => {\n if (baseChannel.isOpenChannel()) {\n const userId = currentUser?.userId ?? UNKNOWN_USER_ID;\n getOpenChannelChatAvailableState(baseChannel, userId).then(setChatAvailableState);\n }\n },\n [currentUser?.userId],\n );\n\n useEffect(() => {\n updateChatAvailableState(channel);\n }, [channel, updateChatAvailableState]);\n\n const handlerId = useUniqHandlerId('OpenChannelInput');\n useChannelHandler(\n sdk,\n handlerId,\n {\n onChannelFrozen(channel) {\n updateChatAvailableState(channel);\n },\n onChannelUnfrozen(channel) {\n updateChatAvailableState(channel);\n },\n onUserMuted(channel) {\n updateChatAvailableState(channel);\n },\n onUserUnmuted(channel) {\n updateChatAvailableState(channel);\n },\n onOperatorUpdated(channel) {\n updateChatAvailableState(channel);\n },\n },\n 'open',\n );\n\n return (\n <ChannelInput\n channel={channel}\n messageToEdit={messageToEdit}\n setMessageToEdit={setMessageToEdit}\n keyboardAvoidOffset={keyboardAvoidOffset}\n inputMuted={chatAvailableState.muted}\n inputFrozen={channel.isFrozen}\n inputDisabled={inputDisabled ?? chatAvailableState.disabled}\n {...props}\n />\n );\n};\n\nexport default React.memo(OpenChannelInput);\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import type React from 'react';\n\nimport type { UseOpenChannelMessagesOptions } from '@sendbird/uikit-chat-hooks';\nimport type { Icon } from '@sendbird/uikit-react-native-foundation';\nimport type {\n OnBeforeHandler,\n SendbirdFileMessage,\n SendbirdFileMessageCreateParams,\n SendbirdFileMessageUpdateParams,\n SendbirdMessage,\n SendbirdOpenChannel,\n SendbirdUserMessage,\n SendbirdUserMessageCreateParams,\n SendbirdUserMessageUpdateParams,\n} from '@sendbird/uikit-utils';\n\nimport type { ChannelInputProps } from '../../components/ChannelInput';\nimport type { ChannelMessageListProps } from '../../components/ChannelMessageList';\nimport type { CommonComponent } from '../../types';\nimport type { PubSub } from '../../utils/pubsub';\n\nexport type OpenChannelProps = {\n Fragment: {\n channel: SendbirdOpenChannel;\n onChannelDeleted: () => void;\n onPressHeaderLeft: OpenChannelProps['Header']['onPressHeaderLeft'];\n onPressHeaderRightWithSettings: OpenChannelProps['Header']['onPressHeaderRight'];\n onPressHeaderRightWithParticipants: OpenChannelProps['Header']['onPressHeaderRight'];\n onPressMediaMessage?: OpenChannelProps['MessageList']['onPressMediaMessage'];\n\n onBeforeSendUserMessage?: OnBeforeHandler<SendbirdUserMessageCreateParams>;\n onBeforeSendFileMessage?: OnBeforeHandler<SendbirdFileMessageCreateParams>;\n onBeforeUpdateUserMessage?: OnBeforeHandler<SendbirdUserMessageUpdateParams>;\n onBeforeUpdateFileMessage?: OnBeforeHandler<SendbirdFileMessageUpdateParams>;\n\n renderMessage?: OpenChannelProps['MessageList']['renderMessage'];\n renderNewMessagesButton?: OpenChannelProps['MessageList']['renderNewMessagesButton'];\n renderScrollToBottomButton?: OpenChannelProps['MessageList']['renderScrollToBottomButton'];\n\n enableMessageGrouping?: OpenChannelProps['MessageList']['enableMessageGrouping'];\n\n keyboardAvoidOffset?: OpenChannelProps['Provider']['keyboardAvoidOffset'];\n flatListProps?: OpenChannelProps['MessageList']['flatListProps'];\n sortComparator?: UseOpenChannelMessagesOptions['sortComparator'];\n queryCreator?: UseOpenChannelMessagesOptions['queryCreator'];\n };\n Header: {\n rightIconName: keyof typeof Icon.Assets;\n onPressHeaderLeft: () => void;\n onPressHeaderRight: () => void;\n };\n\n MessageList: Pick<\n ChannelMessageListProps<SendbirdOpenChannel>,\n | 'enableMessageGrouping'\n | 'currentUserId'\n | 'channel'\n | 'messages'\n | 'newMessages'\n | 'scrolledAwayFromBottom'\n | 'onScrolledAwayFromBottom'\n | 'onTopReached'\n | 'onBottomReached'\n | 'onResendFailedMessage'\n | 'onDeleteMessage'\n | 'onPressMediaMessage'\n | 'renderMessage'\n | 'renderNewMessagesButton'\n | 'renderScrollToBottomButton'\n | 'flatListProps'\n | 'hasNext'\n >;\n Input: Pick<\n ChannelInputProps,\n | 'shouldRenderInput'\n | 'onPressSendUserMessage'\n | 'onPressSendFileMessage'\n | 'onPressUpdateUserMessage'\n | 'onPressUpdateFileMessage'\n | 'AttachmentsButton'\n >;\n\n Provider: {\n channel: SendbirdOpenChannel;\n keyboardAvoidOffset?: number;\n openChannelPubSub: PubSub<OpenChannelPubSubContextPayload>;\n };\n};\n\n/**\n * Internal context for OpenChannel\n * For example, the developer can create a custom header\n * with getting data from the domain context\n * */\nexport type OpenChannelContextsType = {\n Fragment: React.Context<{\n headerTitle: string;\n channel: SendbirdOpenChannel;\n messageToEdit?: SendbirdUserMessage | SendbirdFileMessage;\n setMessageToEdit: (msg?: SendbirdUserMessage | SendbirdFileMessage) => void;\n keyboardAvoidOffset?: number;\n }>;\n PubSub: React.Context<PubSub<OpenChannelPubSubContextPayload>>;\n};\nexport interface OpenChannelModule {\n Provider: CommonComponent<OpenChannelProps['Provider']>;\n Header: CommonComponent<OpenChannelProps['Header']>;\n MessageList: CommonComponent<OpenChannelProps['MessageList']>;\n Input: CommonComponent<OpenChannelProps['Input']>;\n StatusEmpty: CommonComponent;\n StatusLoading: CommonComponent;\n}\n\nexport type OpenChannelFragment = React.FC<OpenChannelProps['Fragment']>;\n\nexport type OpenChannelPubSubContextPayload =\n | {\n type: 'MESSAGE_SENT_PENDING' | 'MESSAGE_SENT_SUCCESS';\n data: {\n message: SendbirdUserMessage | SendbirdFileMessage;\n };\n }\n | {\n type: 'MESSAGES_RECEIVED';\n data: {\n messages: SendbirdMessage[];\n };\n };\n"],"mappings":""}
1
+ {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import type React from 'react';\n\nimport type { UseOpenChannelMessagesOptions } from '@sendbird/uikit-chat-hooks';\nimport type { Icon } from '@sendbird/uikit-react-native-foundation';\nimport type {\n OnBeforeHandler,\n PickPartial,\n SendbirdFileMessage,\n SendbirdFileMessageCreateParams,\n SendbirdFileMessageUpdateParams,\n SendbirdMessage,\n SendbirdOpenChannel,\n SendbirdUserMessage,\n SendbirdUserMessageCreateParams,\n SendbirdUserMessageUpdateParams,\n} from '@sendbird/uikit-utils';\n\nimport type { ChannelInputProps } from '../../components/ChannelInput';\nimport type { ChannelMessageListProps } from '../../components/ChannelMessageList';\nimport type { CommonComponent } from '../../types';\nimport type { PubSub } from '../../utils/pubsub';\n\nexport type OpenChannelProps = {\n Fragment: {\n channel: SendbirdOpenChannel;\n onChannelDeleted: () => void;\n onPressHeaderLeft: OpenChannelProps['Header']['onPressHeaderLeft'];\n onPressHeaderRightWithSettings: OpenChannelProps['Header']['onPressHeaderRight'];\n onPressHeaderRightWithParticipants: OpenChannelProps['Header']['onPressHeaderRight'];\n onPressMediaMessage?: OpenChannelProps['MessageList']['onPressMediaMessage'];\n\n onBeforeSendUserMessage?: OnBeforeHandler<SendbirdUserMessageCreateParams>;\n onBeforeSendFileMessage?: OnBeforeHandler<SendbirdFileMessageCreateParams>;\n onBeforeUpdateUserMessage?: OnBeforeHandler<SendbirdUserMessageUpdateParams>;\n onBeforeUpdateFileMessage?: OnBeforeHandler<SendbirdFileMessageUpdateParams>;\n\n renderMessage?: OpenChannelProps['MessageList']['renderMessage'];\n renderNewMessagesButton?: OpenChannelProps['MessageList']['renderNewMessagesButton'];\n renderScrollToBottomButton?: OpenChannelProps['MessageList']['renderScrollToBottomButton'];\n\n enableMessageGrouping?: OpenChannelProps['MessageList']['enableMessageGrouping'];\n\n keyboardAvoidOffset?: OpenChannelProps['Provider']['keyboardAvoidOffset'];\n flatListProps?: OpenChannelProps['MessageList']['flatListProps'];\n sortComparator?: UseOpenChannelMessagesOptions['sortComparator'];\n queryCreator?: UseOpenChannelMessagesOptions['queryCreator'];\n };\n Header: {\n rightIconName: keyof typeof Icon.Assets;\n onPressHeaderLeft: () => void;\n onPressHeaderRight: () => void;\n };\n\n MessageList: Pick<\n ChannelMessageListProps<SendbirdOpenChannel>,\n | 'enableMessageGrouping'\n | 'currentUserId'\n | 'channel'\n | 'messages'\n | 'newMessages'\n | 'scrolledAwayFromBottom'\n | 'onScrolledAwayFromBottom'\n | 'onTopReached'\n | 'onBottomReached'\n | 'onResendFailedMessage'\n | 'onDeleteMessage'\n | 'onPressMediaMessage'\n | 'renderMessage'\n | 'renderNewMessagesButton'\n | 'renderScrollToBottomButton'\n | 'flatListProps'\n | 'hasNext'\n >;\n Input: PickPartial<\n ChannelInputProps,\n | 'shouldRenderInput'\n | 'onPressSendUserMessage'\n | 'onPressSendFileMessage'\n | 'onPressUpdateUserMessage'\n | 'onPressUpdateFileMessage'\n | 'AttachmentsButton',\n 'inputDisabled'\n >;\n\n Provider: {\n channel: SendbirdOpenChannel;\n keyboardAvoidOffset?: number;\n openChannelPubSub: PubSub<OpenChannelPubSubContextPayload>;\n };\n};\n\n/**\n * Internal context for OpenChannel\n * For example, the developer can create a custom header\n * with getting data from the domain context\n * */\nexport type OpenChannelContextsType = {\n Fragment: React.Context<{\n headerTitle: string;\n channel: SendbirdOpenChannel;\n messageToEdit?: SendbirdUserMessage | SendbirdFileMessage;\n setMessageToEdit: (msg?: SendbirdUserMessage | SendbirdFileMessage) => void;\n keyboardAvoidOffset?: number;\n }>;\n PubSub: React.Context<PubSub<OpenChannelPubSubContextPayload>>;\n};\nexport interface OpenChannelModule {\n Provider: CommonComponent<OpenChannelProps['Provider']>;\n Header: CommonComponent<OpenChannelProps['Header']>;\n MessageList: CommonComponent<OpenChannelProps['MessageList']>;\n Input: CommonComponent<OpenChannelProps['Input']>;\n StatusEmpty: CommonComponent;\n StatusLoading: CommonComponent;\n}\n\nexport type OpenChannelFragment = React.FC<OpenChannelProps['Fragment']>;\n\nexport type OpenChannelPubSubContextPayload =\n | {\n type: 'MESSAGE_SENT_PENDING' | 'MESSAGE_SENT_SUCCESS';\n data: {\n message: SendbirdUserMessage | SendbirdFileMessage;\n };\n }\n | {\n type: 'MESSAGES_RECEIVED';\n data: {\n messages: SendbirdMessage[];\n };\n };\n"],"mappings":""}
@@ -26,11 +26,11 @@ const createExpoFileService = _ref => {
26
26
  return (0, _expoPermissionGranted.default)([res]);
27
27
  }
28
28
  async hasMediaLibraryPermission(type) {
29
- const perms = await mediaLibraryModule.getPermissionsAsync(type === 'write');
29
+ const perms = await imagePickerModule.getMediaLibraryPermissionsAsync(type === 'write');
30
30
  return (0, _expoPermissionGranted.default)([perms]);
31
31
  }
32
32
  async requestMediaLibraryPermission(type) {
33
- const perms = await mediaLibraryModule.requestPermissionsAsync(type === 'write');
33
+ const perms = await imagePickerModule.requestMediaLibraryPermissionsAsync(type === 'write');
34
34
  return (0, _expoPermissionGranted.default)([perms]);
35
35
  }
36
36
  async openCamera(options) {
@@ -1 +1 @@
1
- {"version":3,"names":["_uikitUtils","require","_SBUError","_interopRequireDefault","_expoBackwardUtils","_expoPermissionGranted","obj","__esModule","default","createExpoFileService","_ref","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","ExpoFileServiceInterface","hasCameraPermission","res","getCameraPermissionsAsync","expoPermissionGranted","requestCameraPermission","requestCameraPermissionsAsync","hasMediaLibraryPermission","type","perms","getPermissionsAsync","requestMediaLibraryPermission","requestPermissionsAsync","openCamera","options","hasPermission","granted","_options$onOpenFailur","onOpenFailure","call","SBUError","PERMISSIONS_DENIED","response","launchCameraAsync","mediaTypes","mediaType","MediaTypeOptions","Images","Videos","All","expoBackwardUtils","imagePicker","isCanceled","file","toFilePickerResponses","openMediaLibrary","_options$onOpenFailur2","selectionLimit","launchImageLibraryAsync","openDocument","getDocumentAsync","documentPicker","e","_options$onOpenFailur3","UNKNOWN","save","Error","basePath","documentDirectory","cacheDirectory","downloadPath","fileName","downloadAsync","fileUrl","getFileType","fileType","match","saveToLibraryAsync","uri","createRecordFilePath","customExtension","arguments","length","undefined","filename","Date","now","recordFilePath","_default","exports"],"sources":["createFileService.expo.ts"],"sourcesContent":["import type * as ExpoDocumentPicker from 'expo-document-picker';\nimport type * as ExpoFs from 'expo-file-system';\nimport type * as ExpoImagePicker from 'expo-image-picker';\nimport type * as ExpoMediaLibrary from 'expo-media-library';\n\nimport { getFileType } from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport expoBackwardUtils from '../utils/expoBackwardUtils';\nimport type { ExpoMediaLibraryPermissionResponse, ExpoPermissionResponse } from '../utils/expoPermissionGranted';\nimport expoPermissionGranted from '../utils/expoPermissionGranted';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nconst createExpoFileService = ({\n imagePickerModule,\n documentPickerModule,\n mediaLibraryModule,\n fsModule,\n}: {\n imagePickerModule: typeof ExpoImagePicker;\n documentPickerModule: typeof ExpoDocumentPicker;\n mediaLibraryModule: typeof ExpoMediaLibrary;\n fsModule: typeof ExpoFs;\n}): FileServiceInterface => {\n class ExpoFileServiceInterface implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.getCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n async requestCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.requestCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n async hasMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {\n const perms = (await mediaLibraryModule.getPermissionsAsync(\n type === 'write',\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n async requestMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {\n const perms = (await mediaLibraryModule.requestPermissionsAsync(\n type === 'write',\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCameraAsync({\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n\n if (expoBackwardUtils.imagePicker.isCanceled(response)) return null;\n\n const [file] = await expoBackwardUtils.imagePicker.toFilePickerResponses(response, fsModule);\n return file;\n }\n async openMediaLibrary(options: OpenMediaLibraryOptions) {\n const hasPermission = await this.hasMediaLibraryPermission('read');\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission('read');\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const selectionLimit = options?.selectionLimit || 1;\n const response = await imagePickerModule.launchImageLibraryAsync({\n selectionLimit,\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n if (expoBackwardUtils.imagePicker.isCanceled(response)) return null;\n return expoBackwardUtils.imagePicker.toFilePickerResponses(response, fsModule);\n }\n\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n try {\n const response = await documentPickerModule.getDocumentAsync({ type: '*/*' });\n if (expoBackwardUtils.documentPicker.isCanceled(response)) return null;\n\n const [file] = await expoBackwardUtils.documentPicker.toFilePickerResponses(response);\n return file;\n } catch (e) {\n options?.onOpenFailure?.(SBUError.UNKNOWN, e);\n return null;\n }\n }\n\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryPermission('write');\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission('write');\n if (!granted) throw new Error('Permission not granted');\n }\n\n const basePath = fsModule.documentDirectory || fsModule.cacheDirectory;\n if (!basePath) throw new Error('Cannot determine directory');\n\n const downloadPath = `${basePath}/${options.fileName}`;\n\n const response = await fsModule.downloadAsync(options.fileUrl, downloadPath);\n if (getFileType(options.fileType || '').match(/video|image/)) {\n await mediaLibraryModule.saveToLibraryAsync(response.uri);\n }\n return response.uri;\n }\n createRecordFilePath(customExtension = 'm4a'): { recordFilePath: string; uri: string } {\n const basePath = fsModule.cacheDirectory;\n if (!basePath) throw new Error('Cannot determine directory');\n\n const filename = `record-${Date.now()}.${customExtension}`;\n return {\n uri: `${basePath}/${filename}`,\n recordFilePath: `${basePath}/${filename}`,\n };\n }\n }\n\n return new ExpoFileServiceInterface();\n};\n\nexport default createExpoFileService;\n"],"mappings":"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"}
1
+ {"version":3,"names":["_uikitUtils","require","_SBUError","_interopRequireDefault","_expoBackwardUtils","_expoPermissionGranted","obj","__esModule","default","createExpoFileService","_ref","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","ExpoFileServiceInterface","hasCameraPermission","res","getCameraPermissionsAsync","expoPermissionGranted","requestCameraPermission","requestCameraPermissionsAsync","hasMediaLibraryPermission","type","perms","getMediaLibraryPermissionsAsync","requestMediaLibraryPermission","requestMediaLibraryPermissionsAsync","openCamera","options","hasPermission","granted","_options$onOpenFailur","onOpenFailure","call","SBUError","PERMISSIONS_DENIED","response","launchCameraAsync","mediaTypes","mediaType","MediaTypeOptions","Images","Videos","All","expoBackwardUtils","imagePicker","isCanceled","file","toFilePickerResponses","openMediaLibrary","_options$onOpenFailur2","selectionLimit","launchImageLibraryAsync","openDocument","getDocumentAsync","documentPicker","e","_options$onOpenFailur3","UNKNOWN","save","Error","basePath","documentDirectory","cacheDirectory","downloadPath","fileName","downloadAsync","fileUrl","getFileType","fileType","match","saveToLibraryAsync","uri","createRecordFilePath","customExtension","arguments","length","undefined","filename","Date","now","recordFilePath","_default","exports"],"sources":["createFileService.expo.ts"],"sourcesContent":["import type * as ExpoDocumentPicker from 'expo-document-picker';\nimport type * as ExpoFs from 'expo-file-system';\nimport type * as ExpoImagePicker from 'expo-image-picker';\nimport type * as ExpoMediaLibrary from 'expo-media-library';\n\nimport { getFileType } from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport expoBackwardUtils from '../utils/expoBackwardUtils';\nimport type { ExpoMediaLibraryPermissionResponse, ExpoPermissionResponse } from '../utils/expoPermissionGranted';\nimport expoPermissionGranted from '../utils/expoPermissionGranted';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nconst createExpoFileService = ({\n imagePickerModule,\n documentPickerModule,\n mediaLibraryModule,\n fsModule,\n}: {\n imagePickerModule: typeof ExpoImagePicker;\n documentPickerModule: typeof ExpoDocumentPicker;\n mediaLibraryModule: typeof ExpoMediaLibrary;\n fsModule: typeof ExpoFs;\n}): FileServiceInterface => {\n class ExpoFileServiceInterface implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.getCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n async requestCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.requestCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n async hasMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {\n const perms = (await imagePickerModule.getMediaLibraryPermissionsAsync(\n type === 'write',\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n async requestMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {\n const perms = (await imagePickerModule.requestMediaLibraryPermissionsAsync(\n type === 'write',\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCameraAsync({\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n\n if (expoBackwardUtils.imagePicker.isCanceled(response)) return null;\n\n const [file] = await expoBackwardUtils.imagePicker.toFilePickerResponses(response, fsModule);\n return file;\n }\n async openMediaLibrary(options: OpenMediaLibraryOptions) {\n const hasPermission = await this.hasMediaLibraryPermission('read');\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission('read');\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const selectionLimit = options?.selectionLimit || 1;\n const response = await imagePickerModule.launchImageLibraryAsync({\n selectionLimit,\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n if (expoBackwardUtils.imagePicker.isCanceled(response)) return null;\n return expoBackwardUtils.imagePicker.toFilePickerResponses(response, fsModule);\n }\n\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n try {\n const response = await documentPickerModule.getDocumentAsync({ type: '*/*' });\n if (expoBackwardUtils.documentPicker.isCanceled(response)) return null;\n\n const [file] = await expoBackwardUtils.documentPicker.toFilePickerResponses(response);\n return file;\n } catch (e) {\n options?.onOpenFailure?.(SBUError.UNKNOWN, e);\n return null;\n }\n }\n\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryPermission('write');\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission('write');\n if (!granted) throw new Error('Permission not granted');\n }\n\n const basePath = fsModule.documentDirectory || fsModule.cacheDirectory;\n if (!basePath) throw new Error('Cannot determine directory');\n\n const downloadPath = `${basePath}/${options.fileName}`;\n\n const response = await fsModule.downloadAsync(options.fileUrl, downloadPath);\n if (getFileType(options.fileType || '').match(/video|image/)) {\n await mediaLibraryModule.saveToLibraryAsync(response.uri);\n }\n return response.uri;\n }\n createRecordFilePath(customExtension = 'm4a'): { recordFilePath: string; uri: string } {\n const basePath = fsModule.cacheDirectory;\n if (!basePath) throw new Error('Cannot determine directory');\n\n const filename = `record-${Date.now()}.${customExtension}`;\n return {\n uri: `${basePath}/${filename}`,\n recordFilePath: `${basePath}/${filename}`,\n };\n }\n }\n\n return new ExpoFileServiceInterface();\n};\n\nexport default createExpoFileService;\n"],"mappings":"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"}
@@ -37,7 +37,7 @@ const createNativeFileService = _ref => {
37
37
  default: []
38
38
  });
39
39
  const mediaLibraryPermissions = _reactNative.Platform.select({
40
- ios: [permissionModule.PERMISSIONS.IOS.MEDIA_LIBRARY, permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY],
40
+ ios: [permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY, permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY_ADD_ONLY],
41
41
  android: getAndroidStoragePermissionsByAPILevel(permissionModule),
42
42
  default: []
43
43
  });
@@ -86,9 +86,6 @@ const createNativeFileService = _ref => {
86
86
  }
87
87
  async hasMediaLibraryPermission() {
88
88
  const status = await permissionModule.checkMultiple(mediaLibraryPermissions);
89
- if (__DEV__ && _reactNative.Platform.OS === 'ios' && status['ios.permission.MEDIA_LIBRARY'] === 'unavailable' && status['ios.permission.PHOTO_LIBRARY'] === 'granted') {
90
- return true;
91
- }
92
89
  return (0, _nativePermissionGranted.default)(status);
93
90
  }
94
91
  async requestMediaLibraryPermission() {
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","_uikitUtils","_SBUError","_interopRequireDefault","_nativePermissionGranted","_normalizeFile","obj","__esModule","default","_defineProperty","key","value","_toPropertyKey","Object","defineProperty","enumerable","configurable","writable","arg","_toPrimitive","String","input","hint","prim","Symbol","toPrimitive","undefined","res","call","TypeError","Number","getAndroidStoragePermissionsByAPILevel","permissionModule","Platform","OS","Version","PERMISSIONS","ANDROID","READ_MEDIA_AUDIO","READ_MEDIA_IMAGES","READ_MEDIA_VIDEO","READ_EXTERNAL_STORAGE","WRITE_EXTERNAL_STORAGE","createNativeFileService","_ref","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","cameraPermissions","select","ios","IOS","CAMERA","MICROPHONE","android","mediaLibraryPermissions","MEDIA_LIBRARY","PHOTO_LIBRARY","NativeFileService","constructor","options","dirname","Dirs","CacheDir","DocumentDir","context","filename","fileName","extension","getFileExtension","getFileExtensionFromMime","fileType","fileUrl","getFileExtensionFromUri","normalizeFileName","path","buildDownloadPath","FileSystem","fetch","downloadedPath","file","name","type","getFileType","hasCameraPermission","status","checkMultiple","nativePermissionGranted","requestCameraPermission","requestMultiple","hasMediaLibraryPermission","__DEV__","requestMediaLibraryPermission","openCamera","_response$assets","hasPermission","granted","_options$onOpenFailur","onOpenFailure","SBUError","PERMISSIONS_DENIED","response","launchCamera","presentationStyle","cameraType","mediaType","didCancel","errorCode","_options$onOpenFailur2","DEVICE_UNAVAILABLE","Error","errorMessage","fileSize","size","uri","assets","normalizeFile","openMediaLibrary","selectionLimit","_options$onOpenFailur3","launchImageLibrary","_options$onOpenFailur4","Promise","all","slice","map","_ref2","openDocument","pickSingle","e","isCancel","isInProgress","_options$onOpenFailur5","UNKNOWN","save","downloadFile","mediaTypeMap","externalDirMap","externalDir","cpExternal","catch","Logger","error","createRecordFilePath","customExtension","arguments","length","Date","now","recordFilePath","startsWith","_default","exports"],"sources":["createFileService.native.ts"],"sourcesContent":["import type { CameraRoll } from '@react-native-camera-roll/camera-roll';\nimport { Platform } from 'react-native';\nimport type * as DocumentPicker from 'react-native-document-picker';\nimport type * as FileAccess from 'react-native-file-access';\nimport type * as ImagePicker from 'react-native-image-picker';\nimport type * as Permissions from 'react-native-permissions';\nimport type { Permission } from 'react-native-permissions';\n\nimport {\n Logger,\n getFileExtension,\n getFileExtensionFromMime,\n getFileExtensionFromUri,\n getFileType,\n normalizeFileName,\n} from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport nativePermissionGranted from '../utils/nativePermissionGranted';\nimport normalizeFile from '../utils/normalizeFile';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nfunction getAndroidStoragePermissionsByAPILevel(permissionModule: typeof Permissions): Permission[] {\n if (Platform.OS !== 'android') return [];\n\n if (Platform.Version > 32) {\n return [\n permissionModule.PERMISSIONS.ANDROID.READ_MEDIA_AUDIO,\n permissionModule.PERMISSIONS.ANDROID.READ_MEDIA_IMAGES,\n permissionModule.PERMISSIONS.ANDROID.READ_MEDIA_VIDEO,\n ];\n }\n\n if (Platform.Version > 28) {\n return [permissionModule.PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE];\n }\n\n return [\n permissionModule.PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE,\n permissionModule.PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE,\n ];\n}\n\nconst createNativeFileService = ({\n imagePickerModule,\n documentPickerModule,\n permissionModule,\n mediaLibraryModule,\n fsModule,\n}: {\n imagePickerModule: typeof ImagePicker;\n documentPickerModule: typeof DocumentPicker;\n permissionModule: typeof Permissions;\n mediaLibraryModule: typeof CameraRoll;\n fsModule: typeof FileAccess;\n}): FileServiceInterface => {\n const cameraPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.CAMERA, permissionModule.PERMISSIONS.IOS.MICROPHONE],\n android: [permissionModule.PERMISSIONS.ANDROID.CAMERA],\n default: [],\n });\n const mediaLibraryPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.MEDIA_LIBRARY, permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY],\n android: getAndroidStoragePermissionsByAPILevel(permissionModule),\n default: [],\n });\n\n class NativeFileService implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(cameraPermissions);\n return nativePermissionGranted(status);\n }\n async requestCameraPermission(): Promise<boolean> {\n const status = await permissionModule.requestMultiple(cameraPermissions);\n return nativePermissionGranted(status);\n }\n async hasMediaLibraryPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(mediaLibraryPermissions);\n if (\n __DEV__ &&\n Platform.OS === 'ios' &&\n status['ios.permission.MEDIA_LIBRARY'] === 'unavailable' &&\n status['ios.permission.PHOTO_LIBRARY'] === 'granted'\n ) {\n return true;\n }\n return nativePermissionGranted(status);\n }\n async requestMediaLibraryPermission(): Promise<boolean> {\n const status = await permissionModule.requestMultiple(mediaLibraryPermissions);\n return nativePermissionGranted(status);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCamera({\n presentationStyle: 'fullScreen',\n cameraType: options?.cameraType ?? 'back',\n mediaType: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return 'photo';\n case 'video':\n return 'video';\n case 'all':\n return 'mixed';\n default:\n return 'photo';\n }\n })(),\n });\n if (response.didCancel) return null;\n if (response.errorCode === 'camera_unavailable') {\n options?.onOpenFailure?.(SBUError.DEVICE_UNAVAILABLE, new Error(response.errorMessage));\n return null;\n }\n\n const { fileName: name, fileSize: size, type, uri } = response.assets?.[0] ?? {};\n return normalizeFile({ uri, size, name, type });\n }\n async openMediaLibrary(options?: OpenMediaLibraryOptions): Promise<FilePickerResponse[] | null> {\n /**\n * NOTE: options.selectionLimit {@link https://github.com/react-native-image-picker/react-native-image-picker#options}\n * We do not support 0 (any number of files)\n **/\n const selectionLimit = options?.selectionLimit || 1;\n const hasPermission = await this.hasMediaLibraryPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchImageLibrary({\n presentationStyle: 'fullScreen',\n selectionLimit,\n mediaType: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return 'photo';\n case 'video':\n return 'video';\n case 'all':\n return 'mixed';\n default:\n return 'photo';\n }\n })(),\n });\n if (response.didCancel) return null;\n if (response.errorCode === 'camera_unavailable') {\n options?.onOpenFailure?.(SBUError.DEVICE_UNAVAILABLE, new Error(response.errorMessage));\n return null;\n }\n\n return Promise.all(\n (response.assets || [])\n .slice(0, selectionLimit)\n .map(({ fileName: name, fileSize: size, type, uri }) => normalizeFile({ uri, size, name, type })),\n );\n }\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n try {\n const { uri, size, name, type } = await documentPickerModule.pickSingle();\n return normalizeFile({ uri, size, name, type });\n } catch (e) {\n if (!documentPickerModule.isCancel(e) && documentPickerModule.isInProgress(e)) {\n options?.onOpenFailure?.(SBUError.UNKNOWN, e);\n }\n return null;\n }\n }\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission();\n if (!granted) throw new Error('Permission not granted');\n }\n\n const { downloadedPath, file } = await this.downloadFile(options);\n\n if (Platform.OS === 'ios') {\n if (file.type === 'image' || file.type === 'video') {\n const mediaTypeMap = { 'image': 'photo', 'video': 'video' } as const;\n const mediaType = mediaTypeMap[file.type];\n await mediaLibraryModule.save(downloadedPath, { type: mediaType });\n }\n }\n\n if (Platform.OS === 'android') {\n const externalDirMap = { 'file': 'downloads', 'audio': 'audio', 'image': 'images', 'video': 'video' } as const;\n const externalDir = externalDirMap[file.type];\n await fsModule.FileSystem.cpExternal(downloadedPath, file.name, externalDir).catch(() => {\n Logger.error('Failed to save file to external storage. Retry saving to downloads directory instead.');\n return fsModule.FileSystem.cpExternal(downloadedPath, file.name, 'downloads');\n });\n }\n\n return downloadedPath;\n }\n\n private buildDownloadPath = async (options: SaveOptions) => {\n const dirname = Platform.select({ android: fsModule.Dirs.CacheDir, default: fsModule.Dirs.DocumentDir });\n const context = { dirname, filename: options.fileName };\n const extension =\n getFileExtension(options.fileName) ||\n getFileExtensionFromMime(options.fileType) ||\n getFileExtension(options.fileUrl) ||\n (await getFileExtensionFromUri(options.fileUrl));\n\n if (extension) context.filename = normalizeFileName(context.filename, extension);\n\n return { path: `${context.dirname}/${context.filename}`, ...context };\n };\n\n private downloadFile = async (options: SaveOptions) => {\n const { path, filename } = await this.buildDownloadPath(options);\n await fsModule.FileSystem.fetch(options.fileUrl, { path });\n return {\n downloadedPath: path,\n file: {\n name: filename,\n type: getFileType(getFileExtension(path)),\n } as const,\n };\n };\n\n createRecordFilePath(customExtension = 'm4a'): { recordFilePath: string; uri: string } {\n const filename = `record-${Date.now()}.${customExtension}`;\n const path = `${fsModule.Dirs.CacheDir}/${filename}`;\n return Platform.select({\n ios: {\n uri: path,\n recordFilePath: filename,\n },\n android: {\n uri: path.startsWith('file://') ? path : 'file://' + path,\n recordFilePath: path,\n },\n default: {\n uri: path,\n recordFilePath: path,\n },\n });\n }\n }\n\n return new NativeFileService();\n};\n\nexport default createNativeFileService;\n"],"mappings":"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"}
1
+ {"version":3,"names":["_reactNative","require","_uikitUtils","_SBUError","_interopRequireDefault","_nativePermissionGranted","_normalizeFile","obj","__esModule","default","_defineProperty","key","value","_toPropertyKey","Object","defineProperty","enumerable","configurable","writable","arg","_toPrimitive","String","input","hint","prim","Symbol","toPrimitive","undefined","res","call","TypeError","Number","getAndroidStoragePermissionsByAPILevel","permissionModule","Platform","OS","Version","PERMISSIONS","ANDROID","READ_MEDIA_AUDIO","READ_MEDIA_IMAGES","READ_MEDIA_VIDEO","READ_EXTERNAL_STORAGE","WRITE_EXTERNAL_STORAGE","createNativeFileService","_ref","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","cameraPermissions","select","ios","IOS","CAMERA","MICROPHONE","android","mediaLibraryPermissions","PHOTO_LIBRARY","PHOTO_LIBRARY_ADD_ONLY","NativeFileService","constructor","options","dirname","Dirs","CacheDir","DocumentDir","context","filename","fileName","extension","getFileExtension","getFileExtensionFromMime","fileType","fileUrl","getFileExtensionFromUri","normalizeFileName","path","buildDownloadPath","FileSystem","fetch","downloadedPath","file","name","type","getFileType","hasCameraPermission","status","checkMultiple","nativePermissionGranted","requestCameraPermission","requestMultiple","hasMediaLibraryPermission","requestMediaLibraryPermission","openCamera","_response$assets","hasPermission","granted","_options$onOpenFailur","onOpenFailure","SBUError","PERMISSIONS_DENIED","response","launchCamera","presentationStyle","cameraType","mediaType","didCancel","errorCode","_options$onOpenFailur2","DEVICE_UNAVAILABLE","Error","errorMessage","fileSize","size","uri","assets","normalizeFile","openMediaLibrary","selectionLimit","_options$onOpenFailur3","launchImageLibrary","_options$onOpenFailur4","Promise","all","slice","map","_ref2","openDocument","pickSingle","e","isCancel","isInProgress","_options$onOpenFailur5","UNKNOWN","save","downloadFile","mediaTypeMap","externalDirMap","externalDir","cpExternal","catch","Logger","error","createRecordFilePath","customExtension","arguments","length","Date","now","recordFilePath","startsWith","_default","exports"],"sources":["createFileService.native.ts"],"sourcesContent":["import type { CameraRoll } from '@react-native-camera-roll/camera-roll';\nimport { Platform } from 'react-native';\nimport type * as DocumentPicker from 'react-native-document-picker';\nimport type * as FileAccess from 'react-native-file-access';\nimport type * as ImagePicker from 'react-native-image-picker';\nimport type * as Permissions from 'react-native-permissions';\nimport type { Permission } from 'react-native-permissions';\n\nimport {\n Logger,\n getFileExtension,\n getFileExtensionFromMime,\n getFileExtensionFromUri,\n getFileType,\n normalizeFileName,\n} from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport nativePermissionGranted from '../utils/nativePermissionGranted';\nimport normalizeFile from '../utils/normalizeFile';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nfunction getAndroidStoragePermissionsByAPILevel(permissionModule: typeof Permissions): Permission[] {\n if (Platform.OS !== 'android') return [];\n\n if (Platform.Version > 32) {\n return [\n permissionModule.PERMISSIONS.ANDROID.READ_MEDIA_AUDIO,\n permissionModule.PERMISSIONS.ANDROID.READ_MEDIA_IMAGES,\n permissionModule.PERMISSIONS.ANDROID.READ_MEDIA_VIDEO,\n ];\n }\n\n if (Platform.Version > 28) {\n return [permissionModule.PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE];\n }\n\n return [\n permissionModule.PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE,\n permissionModule.PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE,\n ];\n}\n\nconst createNativeFileService = ({\n imagePickerModule,\n documentPickerModule,\n permissionModule,\n mediaLibraryModule,\n fsModule,\n}: {\n imagePickerModule: typeof ImagePicker;\n documentPickerModule: typeof DocumentPicker;\n permissionModule: typeof Permissions;\n mediaLibraryModule: typeof CameraRoll;\n fsModule: typeof FileAccess;\n}): FileServiceInterface => {\n const cameraPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.CAMERA, permissionModule.PERMISSIONS.IOS.MICROPHONE],\n android: [permissionModule.PERMISSIONS.ANDROID.CAMERA],\n default: [],\n });\n const mediaLibraryPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY, permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY_ADD_ONLY],\n android: getAndroidStoragePermissionsByAPILevel(permissionModule),\n default: [],\n });\n\n class NativeFileService implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(cameraPermissions);\n return nativePermissionGranted(status);\n }\n async requestCameraPermission(): Promise<boolean> {\n const status = await permissionModule.requestMultiple(cameraPermissions);\n return nativePermissionGranted(status);\n }\n async hasMediaLibraryPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(mediaLibraryPermissions);\n return nativePermissionGranted(status);\n }\n async requestMediaLibraryPermission(): Promise<boolean> {\n const status = await permissionModule.requestMultiple(mediaLibraryPermissions);\n return nativePermissionGranted(status);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCamera({\n presentationStyle: 'fullScreen',\n cameraType: options?.cameraType ?? 'back',\n mediaType: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return 'photo';\n case 'video':\n return 'video';\n case 'all':\n return 'mixed';\n default:\n return 'photo';\n }\n })(),\n });\n if (response.didCancel) return null;\n if (response.errorCode === 'camera_unavailable') {\n options?.onOpenFailure?.(SBUError.DEVICE_UNAVAILABLE, new Error(response.errorMessage));\n return null;\n }\n\n const { fileName: name, fileSize: size, type, uri } = response.assets?.[0] ?? {};\n return normalizeFile({ uri, size, name, type });\n }\n async openMediaLibrary(options?: OpenMediaLibraryOptions): Promise<FilePickerResponse[] | null> {\n /**\n * NOTE: options.selectionLimit {@link https://github.com/react-native-image-picker/react-native-image-picker#options}\n * We do not support 0 (any number of files)\n **/\n const selectionLimit = options?.selectionLimit || 1;\n const hasPermission = await this.hasMediaLibraryPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchImageLibrary({\n presentationStyle: 'fullScreen',\n selectionLimit,\n mediaType: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return 'photo';\n case 'video':\n return 'video';\n case 'all':\n return 'mixed';\n default:\n return 'photo';\n }\n })(),\n });\n if (response.didCancel) return null;\n if (response.errorCode === 'camera_unavailable') {\n options?.onOpenFailure?.(SBUError.DEVICE_UNAVAILABLE, new Error(response.errorMessage));\n return null;\n }\n\n return Promise.all(\n (response.assets || [])\n .slice(0, selectionLimit)\n .map(({ fileName: name, fileSize: size, type, uri }) => normalizeFile({ uri, size, name, type })),\n );\n }\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n try {\n const { uri, size, name, type } = await documentPickerModule.pickSingle();\n return normalizeFile({ uri, size, name, type });\n } catch (e) {\n if (!documentPickerModule.isCancel(e) && documentPickerModule.isInProgress(e)) {\n options?.onOpenFailure?.(SBUError.UNKNOWN, e);\n }\n return null;\n }\n }\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission();\n if (!granted) throw new Error('Permission not granted');\n }\n\n const { downloadedPath, file } = await this.downloadFile(options);\n\n if (Platform.OS === 'ios') {\n if (file.type === 'image' || file.type === 'video') {\n const mediaTypeMap = { 'image': 'photo', 'video': 'video' } as const;\n const mediaType = mediaTypeMap[file.type];\n await mediaLibraryModule.save(downloadedPath, { type: mediaType });\n }\n }\n\n if (Platform.OS === 'android') {\n const externalDirMap = { 'file': 'downloads', 'audio': 'audio', 'image': 'images', 'video': 'video' } as const;\n const externalDir = externalDirMap[file.type];\n await fsModule.FileSystem.cpExternal(downloadedPath, file.name, externalDir).catch(() => {\n Logger.error('Failed to save file to external storage. Retry saving to downloads directory instead.');\n return fsModule.FileSystem.cpExternal(downloadedPath, file.name, 'downloads');\n });\n }\n\n return downloadedPath;\n }\n\n private buildDownloadPath = async (options: SaveOptions) => {\n const dirname = Platform.select({ android: fsModule.Dirs.CacheDir, default: fsModule.Dirs.DocumentDir });\n const context = { dirname, filename: options.fileName };\n const extension =\n getFileExtension(options.fileName) ||\n getFileExtensionFromMime(options.fileType) ||\n getFileExtension(options.fileUrl) ||\n (await getFileExtensionFromUri(options.fileUrl));\n\n if (extension) context.filename = normalizeFileName(context.filename, extension);\n\n return { path: `${context.dirname}/${context.filename}`, ...context };\n };\n\n private downloadFile = async (options: SaveOptions) => {\n const { path, filename } = await this.buildDownloadPath(options);\n await fsModule.FileSystem.fetch(options.fileUrl, { path });\n return {\n downloadedPath: path,\n file: {\n name: filename,\n type: getFileType(getFileExtension(path)),\n } as const,\n };\n };\n\n createRecordFilePath(customExtension = 'm4a'): { recordFilePath: string; uri: string } {\n const filename = `record-${Date.now()}.${customExtension}`;\n const path = `${fsModule.Dirs.CacheDir}/${filename}`;\n return Platform.select({\n ios: {\n uri: path,\n recordFilePath: filename,\n },\n android: {\n uri: path.startsWith('file://') ? path : 'file://' + path,\n recordFilePath: path,\n },\n default: {\n uri: path,\n recordFilePath: path,\n },\n });\n }\n }\n\n return new NativeFileService();\n};\n\nexport default createNativeFileService;\n"],"mappings":"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"}
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- const VERSION = '3.5.0';
7
+ const VERSION = '3.5.2';
8
8
  var _default = VERSION;
9
9
  exports.default = _default;
10
10
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["VERSION","_default","exports","default"],"sources":["version.ts"],"sourcesContent":["const VERSION = '3.5.0';\nexport default VERSION;\n"],"mappings":";;;;;;AAAA,MAAMA,OAAO,GAAG,OAAO;AAAC,IAAAC,QAAA,GACTD,OAAO;AAAAE,OAAA,CAAAC,OAAA,GAAAF,QAAA"}
1
+ {"version":3,"names":["VERSION","_default","exports","default"],"sources":["version.ts"],"sourcesContent":["const VERSION = '3.5.2';\nexport default VERSION;\n"],"mappings":";;;;;;AAAA,MAAMA,OAAO,GAAG,OAAO;AAAC,IAAAC,QAAA,GACTD,OAAO;AAAAE,OAAA,CAAAC,OAAA,GAAAF,QAAA"}
@@ -3,7 +3,11 @@ import React, { useContext } from 'react';
3
3
  import { getGroupChannelChatAvailableState } from '@sendbird/uikit-utils';
4
4
  import ChannelInput from '../../../components/ChannelInput';
5
5
  import { GroupChannelContexts } from '../module/moduleContext';
6
- const GroupChannelInput = props => {
6
+ const GroupChannelInput = _ref => {
7
+ let {
8
+ inputDisabled,
9
+ ...props
10
+ } = _ref;
7
11
  const {
8
12
  channel,
9
13
  keyboardAvoidOffset = 0,
@@ -19,10 +23,10 @@ const GroupChannelInput = props => {
19
23
  setMessageToEdit: setMessageToEdit,
20
24
  messageToReply: messageToReply,
21
25
  setMessageToReply: setMessageToReply,
26
+ keyboardAvoidOffset: keyboardAvoidOffset,
22
27
  inputMuted: chatAvailableState.muted,
23
28
  inputFrozen: chatAvailableState.frozen,
24
- inputDisabled: chatAvailableState.disabled,
25
- keyboardAvoidOffset: keyboardAvoidOffset
29
+ inputDisabled: inputDisabled ?? chatAvailableState.disabled
26
30
  }, props));
27
31
  };
28
32
  export default /*#__PURE__*/React.memo(GroupChannelInput);
@@ -1 +1 @@
1
- {"version":3,"names":["React","useContext","getGroupChannelChatAvailableState","ChannelInput","GroupChannelContexts","GroupChannelInput","props","channel","keyboardAvoidOffset","messageToEdit","setMessageToEdit","messageToReply","setMessageToReply","Fragment","chatAvailableState","createElement","_extends","inputMuted","muted","inputFrozen","frozen","inputDisabled","disabled","memo"],"sources":["GroupChannelInput.tsx"],"sourcesContent":["import React, { useContext } from 'react';\n\nimport { getGroupChannelChatAvailableState } from '@sendbird/uikit-utils';\n\nimport ChannelInput from '../../../components/ChannelInput';\nimport { GroupChannelContexts } from '../module/moduleContext';\nimport type { GroupChannelProps } from '../types';\n\nconst GroupChannelInput = (props: GroupChannelProps['Input']) => {\n const {\n channel,\n keyboardAvoidOffset = 0,\n messageToEdit,\n setMessageToEdit,\n messageToReply,\n setMessageToReply,\n } = useContext(GroupChannelContexts.Fragment);\n\n const chatAvailableState = getGroupChannelChatAvailableState(channel);\n\n return (\n <ChannelInput\n channel={channel}\n messageToEdit={messageToEdit}\n setMessageToEdit={setMessageToEdit}\n messageToReply={messageToReply}\n setMessageToReply={setMessageToReply}\n inputMuted={chatAvailableState.muted}\n inputFrozen={chatAvailableState.frozen}\n inputDisabled={chatAvailableState.disabled}\n keyboardAvoidOffset={keyboardAvoidOffset}\n {...props}\n />\n );\n};\n\nexport default React.memo(GroupChannelInput);\n"],"mappings":";AAAA,OAAOA,KAAK,IAAIC,UAAU,QAAQ,OAAO;AAEzC,SAASC,iCAAiC,QAAQ,uBAAuB;AAEzE,OAAOC,YAAY,MAAM,kCAAkC;AAC3D,SAASC,oBAAoB,QAAQ,yBAAyB;AAG9D,MAAMC,iBAAiB,GAAIC,KAAiC,IAAK;EAC/D,MAAM;IACJC,OAAO;IACPC,mBAAmB,GAAG,CAAC;IACvBC,aAAa;IACbC,gBAAgB;IAChBC,cAAc;IACdC;EACF,CAAC,GAAGX,UAAU,CAACG,oBAAoB,CAACS,QAAQ,CAAC;EAE7C,MAAMC,kBAAkB,GAAGZ,iCAAiC,CAACK,OAAO,CAAC;EAErE,oBACEP,KAAA,CAAAe,aAAA,CAACZ,YAAY,EAAAa,QAAA;IACXT,OAAO,EAAEA,OAAQ;IACjBE,aAAa,EAAEA,aAAc;IAC7BC,gBAAgB,EAAEA,gBAAiB;IACnCC,cAAc,EAAEA,cAAe;IAC/BC,iBAAiB,EAAEA,iBAAkB;IACrCK,UAAU,EAAEH,kBAAkB,CAACI,KAAM;IACrCC,WAAW,EAAEL,kBAAkB,CAACM,MAAO;IACvCC,aAAa,EAAEP,kBAAkB,CAACQ,QAAS;IAC3Cd,mBAAmB,EAAEA;EAAoB,GACrCF,KAAK,EACT;AAEN,CAAC;AAED,4BAAeN,KAAK,CAACuB,IAAI,CAAClB,iBAAiB,CAAC"}
1
+ {"version":3,"names":["React","useContext","getGroupChannelChatAvailableState","ChannelInput","GroupChannelContexts","GroupChannelInput","_ref","inputDisabled","props","channel","keyboardAvoidOffset","messageToEdit","setMessageToEdit","messageToReply","setMessageToReply","Fragment","chatAvailableState","createElement","_extends","inputMuted","muted","inputFrozen","frozen","disabled","memo"],"sources":["GroupChannelInput.tsx"],"sourcesContent":["import React, { useContext } from 'react';\n\nimport { getGroupChannelChatAvailableState } from '@sendbird/uikit-utils';\n\nimport ChannelInput from '../../../components/ChannelInput';\nimport { GroupChannelContexts } from '../module/moduleContext';\nimport type { GroupChannelProps } from '../types';\n\nconst GroupChannelInput = ({ inputDisabled, ...props }: GroupChannelProps['Input']) => {\n const {\n channel,\n keyboardAvoidOffset = 0,\n messageToEdit,\n setMessageToEdit,\n messageToReply,\n setMessageToReply,\n } = useContext(GroupChannelContexts.Fragment);\n\n const chatAvailableState = getGroupChannelChatAvailableState(channel);\n\n return (\n <ChannelInput\n channel={channel}\n messageToEdit={messageToEdit}\n setMessageToEdit={setMessageToEdit}\n messageToReply={messageToReply}\n setMessageToReply={setMessageToReply}\n keyboardAvoidOffset={keyboardAvoidOffset}\n inputMuted={chatAvailableState.muted}\n inputFrozen={chatAvailableState.frozen}\n inputDisabled={inputDisabled ?? chatAvailableState.disabled}\n {...props}\n />\n );\n};\n\nexport default React.memo(GroupChannelInput);\n"],"mappings":";AAAA,OAAOA,KAAK,IAAIC,UAAU,QAAQ,OAAO;AAEzC,SAASC,iCAAiC,QAAQ,uBAAuB;AAEzE,OAAOC,YAAY,MAAM,kCAAkC;AAC3D,SAASC,oBAAoB,QAAQ,yBAAyB;AAG9D,MAAMC,iBAAiB,GAAGC,IAAA,IAA6D;EAAA,IAA5D;IAAEC,aAAa;IAAE,GAAGC;EAAkC,CAAC,GAAAF,IAAA;EAChF,MAAM;IACJG,OAAO;IACPC,mBAAmB,GAAG,CAAC;IACvBC,aAAa;IACbC,gBAAgB;IAChBC,cAAc;IACdC;EACF,CAAC,GAAGb,UAAU,CAACG,oBAAoB,CAACW,QAAQ,CAAC;EAE7C,MAAMC,kBAAkB,GAAGd,iCAAiC,CAACO,OAAO,CAAC;EAErE,oBACET,KAAA,CAAAiB,aAAA,CAACd,YAAY,EAAAe,QAAA;IACXT,OAAO,EAAEA,OAAQ;IACjBE,aAAa,EAAEA,aAAc;IAC7BC,gBAAgB,EAAEA,gBAAiB;IACnCC,cAAc,EAAEA,cAAe;IAC/BC,iBAAiB,EAAEA,iBAAkB;IACrCJ,mBAAmB,EAAEA,mBAAoB;IACzCS,UAAU,EAAEH,kBAAkB,CAACI,KAAM;IACrCC,WAAW,EAAEL,kBAAkB,CAACM,MAAO;IACvCf,aAAa,EAAEA,aAAa,IAAIS,kBAAkB,CAACO;EAAS,GACxDf,KAAK,EACT;AAEN,CAAC;AAED,4BAAeR,KAAK,CAACwB,IAAI,CAACnB,iBAAiB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import type React from 'react';\nimport type { FlatList } from 'react-native';\n\nimport type { MessageCollectionParams, MessageFilterParams } from '@sendbird/chat/groupChannel';\nimport type { UseGroupChannelMessagesOptions } from '@sendbird/uikit-chat-hooks';\nimport type {\n OnBeforeHandler,\n SendbirdFileMessage,\n SendbirdFileMessageCreateParams,\n SendbirdFileMessageUpdateParams,\n SendbirdGroupChannel,\n SendbirdMessage,\n SendbirdUser,\n SendbirdUserMessage,\n SendbirdUserMessageCreateParams,\n SendbirdUserMessageUpdateParams,\n} from '@sendbird/uikit-utils';\n\nimport type { ChannelInputProps, SuggestedMentionListProps } from '../../components/ChannelInput';\nimport type { ChannelMessageListProps } from '../../components/ChannelMessageList';\nimport type { CommonComponent } from '../../types';\nimport type { PubSub } from '../../utils/pubsub';\n\nexport type MessageListQueryParamsType = Omit<MessageCollectionParams, 'filter'> & MessageFilterParams;\nexport interface GroupChannelProps {\n Fragment: {\n channel: SendbirdGroupChannel;\n onChannelDeleted: () => void;\n onPressHeaderLeft: GroupChannelProps['Header']['onPressHeaderLeft'];\n onPressHeaderRight: GroupChannelProps['Header']['onPressHeaderRight'];\n onPressMediaMessage?: GroupChannelProps['MessageList']['onPressMediaMessage'];\n\n onBeforeSendUserMessage?: OnBeforeHandler<SendbirdUserMessageCreateParams>;\n onBeforeSendFileMessage?: OnBeforeHandler<SendbirdFileMessageCreateParams>;\n onBeforeUpdateUserMessage?: OnBeforeHandler<SendbirdUserMessageUpdateParams>;\n onBeforeUpdateFileMessage?: OnBeforeHandler<SendbirdFileMessageUpdateParams>;\n\n renderMessage?: GroupChannelProps['MessageList']['renderMessage'];\n renderNewMessagesButton?: GroupChannelProps['MessageList']['renderNewMessagesButton'];\n renderScrollToBottomButton?: GroupChannelProps['MessageList']['renderScrollToBottomButton'];\n\n enableTypingIndicator?: GroupChannelProps['Provider']['enableTypingIndicator'];\n enableMessageGrouping?: GroupChannelProps['MessageList']['enableMessageGrouping'];\n\n keyboardAvoidOffset?: GroupChannelProps['Provider']['keyboardAvoidOffset'];\n flatListProps?: GroupChannelProps['MessageList']['flatListProps'];\n sortComparator?: UseGroupChannelMessagesOptions['sortComparator'];\n\n searchItem?: GroupChannelProps['MessageList']['searchItem'];\n\n /**\n * @description You can specify the query parameters for the message list.\n * @example\n * ```\n * <GroupChannelFragment messageListQueryParams={{ prevResultLimit: 20, customTypesFilter: ['filter'] }} />\n * ```\n * */\n messageListQueryParams?: MessageListQueryParamsType;\n /** @deprecated Please use `messageListQueryParams` instead */\n collectionCreator?: UseGroupChannelMessagesOptions['collectionCreator'];\n };\n Header: {\n shouldHideRight: () => boolean;\n onPressHeaderLeft: () => void;\n onPressHeaderRight: () => void;\n };\n MessageList: Pick<\n ChannelMessageListProps<SendbirdGroupChannel>,\n | 'enableMessageGrouping'\n | 'currentUserId'\n | 'channel'\n | 'messages'\n | 'newMessages'\n | 'scrolledAwayFromBottom'\n | 'onScrolledAwayFromBottom'\n | 'onTopReached'\n | 'onBottomReached'\n | 'onResendFailedMessage'\n | 'onDeleteMessage'\n | 'onPressMediaMessage'\n | 'renderMessage'\n | 'renderNewMessagesButton'\n | 'renderScrollToBottomButton'\n | 'flatListProps'\n | 'hasNext'\n | 'searchItem'\n > & {\n onResetMessageList: () => Promise<void>;\n onResetMessageListWithStartingPoint: (startingPoint: number) => Promise<void>;\n\n // Changing the search item will trigger the focus animation on messages.\n onUpdateSearchItem: (searchItem?: GroupChannelProps['MessageList']['searchItem']) => void;\n };\n Input: Pick<\n ChannelInputProps,\n | 'shouldRenderInput'\n | 'onPressSendUserMessage'\n | 'onPressSendFileMessage'\n | 'onPressUpdateUserMessage'\n | 'onPressUpdateFileMessage'\n | 'SuggestedMentionList'\n | 'AttachmentsButton'\n >;\n\n SuggestedMentionList: SuggestedMentionListProps;\n Provider: {\n channel: SendbirdGroupChannel;\n enableTypingIndicator: boolean;\n keyboardAvoidOffset?: number;\n groupChannelPubSub: PubSub<GroupChannelPubSubContextPayload>;\n\n messages: SendbirdMessage[];\n // Changing the search item will trigger the focus animation on messages.\n onUpdateSearchItem: (searchItem?: GroupChannelProps['MessageList']['searchItem']) => void;\n };\n}\n\n/**\n * Internal context for GroupChannel\n * For example, the developer can create a custom header\n * with getting data from the domain context\n * */\nexport interface GroupChannelContextsType {\n Fragment: React.Context<{\n headerTitle: string;\n keyboardAvoidOffset?: number;\n channel: SendbirdGroupChannel;\n messageToEdit?: SendbirdUserMessage | SendbirdFileMessage;\n setMessageToEdit: (msg?: SendbirdUserMessage | SendbirdFileMessage) => void;\n messageToReply?: SendbirdUserMessage | SendbirdFileMessage;\n setMessageToReply: (msg?: SendbirdUserMessage | SendbirdFileMessage) => void;\n }>;\n TypingIndicator: React.Context<{\n typingUsers: SendbirdUser[];\n }>;\n PubSub: React.Context<PubSub<GroupChannelPubSubContextPayload>>;\n MessageList: React.Context<{\n /**\n * ref object for FlatList of MessageList\n * */\n flatListRef: React.MutableRefObject<FlatList | null>;\n /**\n * Function that scrolls to a message within a group channel.\n * @param messageId {number} - The id of the message to scroll.\n * @param options {object} - Scroll options (optional).\n * @param options.focusAnimated {boolean} - Enable a shake animation on the message component upon completion of scrolling.\n * @param options.viewPosition {number} - Position information to adjust the visible area during scrolling. bottom(0) ~ top(1.0)\n *\n * @example\n * ```\n * const { scrollToMessage } = useContext(GroupChannelContexts.MessageList);\n * const messageIncludedInMessageList = scrollToMessage(lastMessage.messageId, { focusAnimated: true, viewPosition: 1 });\n * if (!messageIncludedInMessageList) console.warn('Message not found in the message list.');\n * ```\n * */\n scrollToMessage: (messageId: number, options?: { focusAnimated?: boolean; viewPosition?: number }) => boolean;\n /**\n * Call the FlatList function asynchronously to scroll to bottom lazily\n * to avoid scrolling before data rendering has been committed.\n * */\n lazyScrollToBottom: (params?: { animated?: boolean; timeout?: number }) => void;\n /**\n * Call the FlatList function asynchronously to scroll to index lazily.\n * to avoid scrolling before data rendering has been committed.\n * */\n lazyScrollToIndex: (params?: {\n index?: number;\n animated?: boolean;\n timeout?: number;\n viewPosition?: number;\n }) => void;\n }>;\n}\nexport interface GroupChannelModule {\n Provider: CommonComponent<GroupChannelProps['Provider']>;\n Header: CommonComponent<GroupChannelProps['Header']>;\n MessageList: CommonComponent<GroupChannelProps['MessageList']>;\n Input: CommonComponent<GroupChannelProps['Input']>;\n SuggestedMentionList: CommonComponent<GroupChannelProps['SuggestedMentionList']>;\n StatusEmpty: CommonComponent;\n StatusLoading: CommonComponent;\n}\n\nexport type GroupChannelFragment = React.FC<GroupChannelProps['Fragment']>;\n\nexport type GroupChannelPubSubContextPayload =\n | {\n type: 'MESSAGE_SENT_PENDING' | 'MESSAGE_SENT_SUCCESS';\n data: {\n message: SendbirdUserMessage | SendbirdFileMessage;\n };\n }\n | {\n type: 'MESSAGES_RECEIVED' | 'MESSAGES_UPDATED';\n data: {\n messages: SendbirdMessage[];\n };\n }\n | {\n type: 'TYPING_BUBBLE_RENDERED';\n data?: undefined;\n };\n"],"mappings":""}
1
+ {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import type React from 'react';\nimport type { FlatList } from 'react-native';\n\nimport type { MessageCollectionParams, MessageFilterParams } from '@sendbird/chat/groupChannel';\nimport type { UseGroupChannelMessagesOptions } from '@sendbird/uikit-chat-hooks';\nimport type {\n OnBeforeHandler,\n PickPartial,\n SendbirdFileMessage,\n SendbirdFileMessageCreateParams,\n SendbirdFileMessageUpdateParams,\n SendbirdGroupChannel,\n SendbirdMessage,\n SendbirdUser,\n SendbirdUserMessage,\n SendbirdUserMessageCreateParams,\n SendbirdUserMessageUpdateParams,\n} from '@sendbird/uikit-utils';\n\nimport type { ChannelInputProps, SuggestedMentionListProps } from '../../components/ChannelInput';\nimport type { ChannelMessageListProps } from '../../components/ChannelMessageList';\nimport type { CommonComponent } from '../../types';\nimport type { PubSub } from '../../utils/pubsub';\n\nexport type MessageListQueryParamsType = Omit<MessageCollectionParams, 'filter'> & MessageFilterParams;\nexport interface GroupChannelProps {\n Fragment: {\n channel: SendbirdGroupChannel;\n onChannelDeleted: () => void;\n onPressHeaderLeft: GroupChannelProps['Header']['onPressHeaderLeft'];\n onPressHeaderRight: GroupChannelProps['Header']['onPressHeaderRight'];\n onPressMediaMessage?: GroupChannelProps['MessageList']['onPressMediaMessage'];\n\n onBeforeSendUserMessage?: OnBeforeHandler<SendbirdUserMessageCreateParams>;\n onBeforeSendFileMessage?: OnBeforeHandler<SendbirdFileMessageCreateParams>;\n onBeforeUpdateUserMessage?: OnBeforeHandler<SendbirdUserMessageUpdateParams>;\n onBeforeUpdateFileMessage?: OnBeforeHandler<SendbirdFileMessageUpdateParams>;\n\n renderMessage?: GroupChannelProps['MessageList']['renderMessage'];\n renderNewMessagesButton?: GroupChannelProps['MessageList']['renderNewMessagesButton'];\n renderScrollToBottomButton?: GroupChannelProps['MessageList']['renderScrollToBottomButton'];\n\n enableTypingIndicator?: GroupChannelProps['Provider']['enableTypingIndicator'];\n enableMessageGrouping?: GroupChannelProps['MessageList']['enableMessageGrouping'];\n\n keyboardAvoidOffset?: GroupChannelProps['Provider']['keyboardAvoidOffset'];\n flatListProps?: GroupChannelProps['MessageList']['flatListProps'];\n sortComparator?: UseGroupChannelMessagesOptions['sortComparator'];\n\n searchItem?: GroupChannelProps['MessageList']['searchItem'];\n\n /**\n * @description You can specify the query parameters for the message list.\n * @example\n * ```\n * <GroupChannelFragment messageListQueryParams={{ prevResultLimit: 20, customTypesFilter: ['filter'] }} />\n * ```\n * */\n messageListQueryParams?: MessageListQueryParamsType;\n /** @deprecated Please use `messageListQueryParams` instead */\n collectionCreator?: UseGroupChannelMessagesOptions['collectionCreator'];\n };\n Header: {\n shouldHideRight: () => boolean;\n onPressHeaderLeft: () => void;\n onPressHeaderRight: () => void;\n };\n MessageList: Pick<\n ChannelMessageListProps<SendbirdGroupChannel>,\n | 'enableMessageGrouping'\n | 'currentUserId'\n | 'channel'\n | 'messages'\n | 'newMessages'\n | 'scrolledAwayFromBottom'\n | 'onScrolledAwayFromBottom'\n | 'onTopReached'\n | 'onBottomReached'\n | 'onResendFailedMessage'\n | 'onDeleteMessage'\n | 'onPressMediaMessage'\n | 'renderMessage'\n | 'renderNewMessagesButton'\n | 'renderScrollToBottomButton'\n | 'flatListProps'\n | 'hasNext'\n | 'searchItem'\n > & {\n onResetMessageList: () => Promise<void>;\n onResetMessageListWithStartingPoint: (startingPoint: number) => Promise<void>;\n\n // Changing the search item will trigger the focus animation on messages.\n onUpdateSearchItem: (searchItem?: GroupChannelProps['MessageList']['searchItem']) => void;\n };\n Input: PickPartial<\n ChannelInputProps,\n | 'shouldRenderInput'\n | 'onPressSendUserMessage'\n | 'onPressSendFileMessage'\n | 'onPressUpdateUserMessage'\n | 'onPressUpdateFileMessage'\n | 'SuggestedMentionList'\n | 'AttachmentsButton',\n 'inputDisabled'\n >;\n\n SuggestedMentionList: SuggestedMentionListProps;\n Provider: {\n channel: SendbirdGroupChannel;\n enableTypingIndicator: boolean;\n keyboardAvoidOffset?: number;\n groupChannelPubSub: PubSub<GroupChannelPubSubContextPayload>;\n\n messages: SendbirdMessage[];\n // Changing the search item will trigger the focus animation on messages.\n onUpdateSearchItem: (searchItem?: GroupChannelProps['MessageList']['searchItem']) => void;\n };\n}\n\n/**\n * Internal context for GroupChannel\n * For example, the developer can create a custom header\n * with getting data from the domain context\n * */\nexport interface GroupChannelContextsType {\n Fragment: React.Context<{\n headerTitle: string;\n keyboardAvoidOffset?: number;\n channel: SendbirdGroupChannel;\n messageToEdit?: SendbirdUserMessage | SendbirdFileMessage;\n setMessageToEdit: (msg?: SendbirdUserMessage | SendbirdFileMessage) => void;\n messageToReply?: SendbirdUserMessage | SendbirdFileMessage;\n setMessageToReply: (msg?: SendbirdUserMessage | SendbirdFileMessage) => void;\n }>;\n TypingIndicator: React.Context<{\n typingUsers: SendbirdUser[];\n }>;\n PubSub: React.Context<PubSub<GroupChannelPubSubContextPayload>>;\n MessageList: React.Context<{\n /**\n * ref object for FlatList of MessageList\n * */\n flatListRef: React.MutableRefObject<FlatList | null>;\n /**\n * Function that scrolls to a message within a group channel.\n * @param messageId {number} - The id of the message to scroll.\n * @param options {object} - Scroll options (optional).\n * @param options.focusAnimated {boolean} - Enable a shake animation on the message component upon completion of scrolling.\n * @param options.viewPosition {number} - Position information to adjust the visible area during scrolling. bottom(0) ~ top(1.0)\n *\n * @example\n * ```\n * const { scrollToMessage } = useContext(GroupChannelContexts.MessageList);\n * const messageIncludedInMessageList = scrollToMessage(lastMessage.messageId, { focusAnimated: true, viewPosition: 1 });\n * if (!messageIncludedInMessageList) console.warn('Message not found in the message list.');\n * ```\n * */\n scrollToMessage: (messageId: number, options?: { focusAnimated?: boolean; viewPosition?: number }) => boolean;\n /**\n * Call the FlatList function asynchronously to scroll to bottom lazily\n * to avoid scrolling before data rendering has been committed.\n * */\n lazyScrollToBottom: (params?: { animated?: boolean; timeout?: number }) => void;\n /**\n * Call the FlatList function asynchronously to scroll to index lazily.\n * to avoid scrolling before data rendering has been committed.\n * */\n lazyScrollToIndex: (params?: {\n index?: number;\n animated?: boolean;\n timeout?: number;\n viewPosition?: number;\n }) => void;\n }>;\n}\nexport interface GroupChannelModule {\n Provider: CommonComponent<GroupChannelProps['Provider']>;\n Header: CommonComponent<GroupChannelProps['Header']>;\n MessageList: CommonComponent<GroupChannelProps['MessageList']>;\n Input: CommonComponent<GroupChannelProps['Input']>;\n SuggestedMentionList: CommonComponent<GroupChannelProps['SuggestedMentionList']>;\n StatusEmpty: CommonComponent;\n StatusLoading: CommonComponent;\n}\n\nexport type GroupChannelFragment = React.FC<GroupChannelProps['Fragment']>;\n\nexport type GroupChannelPubSubContextPayload =\n | {\n type: 'MESSAGE_SENT_PENDING' | 'MESSAGE_SENT_SUCCESS';\n data: {\n message: SendbirdUserMessage | SendbirdFileMessage;\n };\n }\n | {\n type: 'MESSAGES_RECEIVED' | 'MESSAGES_UPDATED';\n data: {\n messages: SendbirdMessage[];\n };\n }\n | {\n type: 'TYPING_BUBBLE_RENDERED';\n data?: undefined;\n };\n"],"mappings":""}
@@ -6,7 +6,11 @@ import ChannelInput from '../../../components/ChannelInput';
6
6
  import { UNKNOWN_USER_ID } from '../../../constants';
7
7
  import { useSendbirdChat } from '../../../hooks/useContext';
8
8
  import { OpenChannelContexts } from '../module/moduleContext';
9
- const OpenChannelInput = props => {
9
+ const OpenChannelInput = _ref => {
10
+ let {
11
+ inputDisabled,
12
+ ...props
13
+ } = _ref;
10
14
  const {
11
15
  sdk,
12
16
  currentUser
@@ -53,10 +57,10 @@ const OpenChannelInput = props => {
53
57
  channel: channel,
54
58
  messageToEdit: messageToEdit,
55
59
  setMessageToEdit: setMessageToEdit,
60
+ keyboardAvoidOffset: keyboardAvoidOffset,
56
61
  inputMuted: chatAvailableState.muted,
57
62
  inputFrozen: channel.isFrozen,
58
- inputDisabled: chatAvailableState.disabled,
59
- keyboardAvoidOffset: keyboardAvoidOffset
63
+ inputDisabled: inputDisabled ?? chatAvailableState.disabled
60
64
  }, props));
61
65
  };
62
66
  export default /*#__PURE__*/React.memo(OpenChannelInput);
@@ -1 +1 @@
1
- {"version":3,"names":["React","useCallback","useContext","useEffect","useState","useChannelHandler","getOpenChannelChatAvailableState","useUniqHandlerId","ChannelInput","UNKNOWN_USER_ID","useSendbirdChat","OpenChannelContexts","OpenChannelInput","props","sdk","currentUser","channel","messageToEdit","setMessageToEdit","keyboardAvoidOffset","Fragment","chatAvailableState","setChatAvailableState","frozen","muted","disabled","updateChatAvailableState","baseChannel","isOpenChannel","userId","then","handlerId","onChannelFrozen","onChannelUnfrozen","onUserMuted","onUserUnmuted","onOperatorUpdated","createElement","_extends","inputMuted","inputFrozen","isFrozen","inputDisabled","memo"],"sources":["OpenChannelInput.tsx"],"sourcesContent":["import React, { useCallback, useContext, useEffect, useState } from 'react';\n\nimport { useChannelHandler } from '@sendbird/uikit-chat-hooks';\nimport { SendbirdBaseChannel, getOpenChannelChatAvailableState, useUniqHandlerId } from '@sendbird/uikit-utils';\n\nimport ChannelInput from '../../../components/ChannelInput';\nimport { UNKNOWN_USER_ID } from '../../../constants';\nimport { useSendbirdChat } from '../../../hooks/useContext';\nimport { OpenChannelContexts } from '../module/moduleContext';\nimport type { OpenChannelProps } from '../types';\n\nconst OpenChannelInput = (props: OpenChannelProps['Input']) => {\n const { sdk, currentUser } = useSendbirdChat();\n\n const {\n channel,\n messageToEdit,\n setMessageToEdit,\n keyboardAvoidOffset = 0,\n } = useContext(OpenChannelContexts.Fragment);\n\n const [chatAvailableState, setChatAvailableState] = useState({ frozen: false, muted: false, disabled: false });\n\n const updateChatAvailableState = useCallback(\n (baseChannel: SendbirdBaseChannel) => {\n if (baseChannel.isOpenChannel()) {\n const userId = currentUser?.userId ?? UNKNOWN_USER_ID;\n getOpenChannelChatAvailableState(baseChannel, userId).then(setChatAvailableState);\n }\n },\n [currentUser?.userId],\n );\n\n useEffect(() => {\n updateChatAvailableState(channel);\n }, [channel, updateChatAvailableState]);\n\n const handlerId = useUniqHandlerId('OpenChannelInput');\n useChannelHandler(\n sdk,\n handlerId,\n {\n onChannelFrozen(channel) {\n updateChatAvailableState(channel);\n },\n onChannelUnfrozen(channel) {\n updateChatAvailableState(channel);\n },\n onUserMuted(channel) {\n updateChatAvailableState(channel);\n },\n onUserUnmuted(channel) {\n updateChatAvailableState(channel);\n },\n onOperatorUpdated(channel) {\n updateChatAvailableState(channel);\n },\n },\n 'open',\n );\n\n return (\n <ChannelInput\n channel={channel}\n messageToEdit={messageToEdit}\n setMessageToEdit={setMessageToEdit}\n inputMuted={chatAvailableState.muted}\n inputFrozen={channel.isFrozen}\n inputDisabled={chatAvailableState.disabled}\n keyboardAvoidOffset={keyboardAvoidOffset}\n {...props}\n />\n );\n};\n\nexport default React.memo(OpenChannelInput);\n"],"mappings":";AAAA,OAAOA,KAAK,IAAIC,WAAW,EAAEC,UAAU,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AAE3E,SAASC,iBAAiB,QAAQ,4BAA4B;AAC9D,SAA8BC,gCAAgC,EAAEC,gBAAgB,QAAQ,uBAAuB;AAE/G,OAAOC,YAAY,MAAM,kCAAkC;AAC3D,SAASC,eAAe,QAAQ,oBAAoB;AACpD,SAASC,eAAe,QAAQ,2BAA2B;AAC3D,SAASC,mBAAmB,QAAQ,yBAAyB;AAG7D,MAAMC,gBAAgB,GAAIC,KAAgC,IAAK;EAC7D,MAAM;IAAEC,GAAG;IAAEC;EAAY,CAAC,GAAGL,eAAe,EAAE;EAE9C,MAAM;IACJM,OAAO;IACPC,aAAa;IACbC,gBAAgB;IAChBC,mBAAmB,GAAG;EACxB,CAAC,GAAGjB,UAAU,CAACS,mBAAmB,CAACS,QAAQ,CAAC;EAE5C,MAAM,CAACC,kBAAkB,EAAEC,qBAAqB,CAAC,GAAGlB,QAAQ,CAAC;IAAEmB,MAAM,EAAE,KAAK;IAAEC,KAAK,EAAE,KAAK;IAAEC,QAAQ,EAAE;EAAM,CAAC,CAAC;EAE9G,MAAMC,wBAAwB,GAAGzB,WAAW,CACzC0B,WAAgC,IAAK;IACpC,IAAIA,WAAW,CAACC,aAAa,EAAE,EAAE;MAC/B,MAAMC,MAAM,GAAG,CAAAd,WAAW,aAAXA,WAAW,uBAAXA,WAAW,CAAEc,MAAM,KAAIpB,eAAe;MACrDH,gCAAgC,CAACqB,WAAW,EAAEE,MAAM,CAAC,CAACC,IAAI,CAACR,qBAAqB,CAAC;IACnF;EACF,CAAC,EACD,CAACP,WAAW,aAAXA,WAAW,uBAAXA,WAAW,CAAEc,MAAM,CAAC,CACtB;EAED1B,SAAS,CAAC,MAAM;IACduB,wBAAwB,CAACV,OAAO,CAAC;EACnC,CAAC,EAAE,CAACA,OAAO,EAAEU,wBAAwB,CAAC,CAAC;EAEvC,MAAMK,SAAS,GAAGxB,gBAAgB,CAAC,kBAAkB,CAAC;EACtDF,iBAAiB,CACfS,GAAG,EACHiB,SAAS,EACT;IACEC,eAAeA,CAAChB,OAAO,EAAE;MACvBU,wBAAwB,CAACV,OAAO,CAAC;IACnC,CAAC;IACDiB,iBAAiBA,CAACjB,OAAO,EAAE;MACzBU,wBAAwB,CAACV,OAAO,CAAC;IACnC,CAAC;IACDkB,WAAWA,CAAClB,OAAO,EAAE;MACnBU,wBAAwB,CAACV,OAAO,CAAC;IACnC,CAAC;IACDmB,aAAaA,CAACnB,OAAO,EAAE;MACrBU,wBAAwB,CAACV,OAAO,CAAC;IACnC,CAAC;IACDoB,iBAAiBA,CAACpB,OAAO,EAAE;MACzBU,wBAAwB,CAACV,OAAO,CAAC;IACnC;EACF,CAAC,EACD,MAAM,CACP;EAED,oBACEhB,KAAA,CAAAqC,aAAA,CAAC7B,YAAY,EAAA8B,QAAA;IACXtB,OAAO,EAAEA,OAAQ;IACjBC,aAAa,EAAEA,aAAc;IAC7BC,gBAAgB,EAAEA,gBAAiB;IACnCqB,UAAU,EAAElB,kBAAkB,CAACG,KAAM;IACrCgB,WAAW,EAAExB,OAAO,CAACyB,QAAS;IAC9BC,aAAa,EAAErB,kBAAkB,CAACI,QAAS;IAC3CN,mBAAmB,EAAEA;EAAoB,GACrCN,KAAK,EACT;AAEN,CAAC;AAED,4BAAeb,KAAK,CAAC2C,IAAI,CAAC/B,gBAAgB,CAAC"}
1
+ {"version":3,"names":["React","useCallback","useContext","useEffect","useState","useChannelHandler","getOpenChannelChatAvailableState","useUniqHandlerId","ChannelInput","UNKNOWN_USER_ID","useSendbirdChat","OpenChannelContexts","OpenChannelInput","_ref","inputDisabled","props","sdk","currentUser","channel","messageToEdit","setMessageToEdit","keyboardAvoidOffset","Fragment","chatAvailableState","setChatAvailableState","frozen","muted","disabled","updateChatAvailableState","baseChannel","isOpenChannel","userId","then","handlerId","onChannelFrozen","onChannelUnfrozen","onUserMuted","onUserUnmuted","onOperatorUpdated","createElement","_extends","inputMuted","inputFrozen","isFrozen","memo"],"sources":["OpenChannelInput.tsx"],"sourcesContent":["import React, { useCallback, useContext, useEffect, useState } from 'react';\n\nimport { useChannelHandler } from '@sendbird/uikit-chat-hooks';\nimport { SendbirdBaseChannel, getOpenChannelChatAvailableState, useUniqHandlerId } from '@sendbird/uikit-utils';\n\nimport ChannelInput from '../../../components/ChannelInput';\nimport { UNKNOWN_USER_ID } from '../../../constants';\nimport { useSendbirdChat } from '../../../hooks/useContext';\nimport { OpenChannelContexts } from '../module/moduleContext';\nimport type { OpenChannelProps } from '../types';\n\nconst OpenChannelInput = ({ inputDisabled, ...props }: OpenChannelProps['Input']) => {\n const { sdk, currentUser } = useSendbirdChat();\n\n const {\n channel,\n messageToEdit,\n setMessageToEdit,\n keyboardAvoidOffset = 0,\n } = useContext(OpenChannelContexts.Fragment);\n\n const [chatAvailableState, setChatAvailableState] = useState({ frozen: false, muted: false, disabled: false });\n\n const updateChatAvailableState = useCallback(\n (baseChannel: SendbirdBaseChannel) => {\n if (baseChannel.isOpenChannel()) {\n const userId = currentUser?.userId ?? UNKNOWN_USER_ID;\n getOpenChannelChatAvailableState(baseChannel, userId).then(setChatAvailableState);\n }\n },\n [currentUser?.userId],\n );\n\n useEffect(() => {\n updateChatAvailableState(channel);\n }, [channel, updateChatAvailableState]);\n\n const handlerId = useUniqHandlerId('OpenChannelInput');\n useChannelHandler(\n sdk,\n handlerId,\n {\n onChannelFrozen(channel) {\n updateChatAvailableState(channel);\n },\n onChannelUnfrozen(channel) {\n updateChatAvailableState(channel);\n },\n onUserMuted(channel) {\n updateChatAvailableState(channel);\n },\n onUserUnmuted(channel) {\n updateChatAvailableState(channel);\n },\n onOperatorUpdated(channel) {\n updateChatAvailableState(channel);\n },\n },\n 'open',\n );\n\n return (\n <ChannelInput\n channel={channel}\n messageToEdit={messageToEdit}\n setMessageToEdit={setMessageToEdit}\n keyboardAvoidOffset={keyboardAvoidOffset}\n inputMuted={chatAvailableState.muted}\n inputFrozen={channel.isFrozen}\n inputDisabled={inputDisabled ?? chatAvailableState.disabled}\n {...props}\n />\n );\n};\n\nexport default React.memo(OpenChannelInput);\n"],"mappings":";AAAA,OAAOA,KAAK,IAAIC,WAAW,EAAEC,UAAU,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AAE3E,SAASC,iBAAiB,QAAQ,4BAA4B;AAC9D,SAA8BC,gCAAgC,EAAEC,gBAAgB,QAAQ,uBAAuB;AAE/G,OAAOC,YAAY,MAAM,kCAAkC;AAC3D,SAASC,eAAe,QAAQ,oBAAoB;AACpD,SAASC,eAAe,QAAQ,2BAA2B;AAC3D,SAASC,mBAAmB,QAAQ,yBAAyB;AAG7D,MAAMC,gBAAgB,GAAGC,IAAA,IAA4D;EAAA,IAA3D;IAAEC,aAAa;IAAE,GAAGC;EAAiC,CAAC,GAAAF,IAAA;EAC9E,MAAM;IAAEG,GAAG;IAAEC;EAAY,CAAC,GAAGP,eAAe,EAAE;EAE9C,MAAM;IACJQ,OAAO;IACPC,aAAa;IACbC,gBAAgB;IAChBC,mBAAmB,GAAG;EACxB,CAAC,GAAGnB,UAAU,CAACS,mBAAmB,CAACW,QAAQ,CAAC;EAE5C,MAAM,CAACC,kBAAkB,EAAEC,qBAAqB,CAAC,GAAGpB,QAAQ,CAAC;IAAEqB,MAAM,EAAE,KAAK;IAAEC,KAAK,EAAE,KAAK;IAAEC,QAAQ,EAAE;EAAM,CAAC,CAAC;EAE9G,MAAMC,wBAAwB,GAAG3B,WAAW,CACzC4B,WAAgC,IAAK;IACpC,IAAIA,WAAW,CAACC,aAAa,EAAE,EAAE;MAC/B,MAAMC,MAAM,GAAG,CAAAd,WAAW,aAAXA,WAAW,uBAAXA,WAAW,CAAEc,MAAM,KAAItB,eAAe;MACrDH,gCAAgC,CAACuB,WAAW,EAAEE,MAAM,CAAC,CAACC,IAAI,CAACR,qBAAqB,CAAC;IACnF;EACF,CAAC,EACD,CAACP,WAAW,aAAXA,WAAW,uBAAXA,WAAW,CAAEc,MAAM,CAAC,CACtB;EAED5B,SAAS,CAAC,MAAM;IACdyB,wBAAwB,CAACV,OAAO,CAAC;EACnC,CAAC,EAAE,CAACA,OAAO,EAAEU,wBAAwB,CAAC,CAAC;EAEvC,MAAMK,SAAS,GAAG1B,gBAAgB,CAAC,kBAAkB,CAAC;EACtDF,iBAAiB,CACfW,GAAG,EACHiB,SAAS,EACT;IACEC,eAAeA,CAAChB,OAAO,EAAE;MACvBU,wBAAwB,CAACV,OAAO,CAAC;IACnC,CAAC;IACDiB,iBAAiBA,CAACjB,OAAO,EAAE;MACzBU,wBAAwB,CAACV,OAAO,CAAC;IACnC,CAAC;IACDkB,WAAWA,CAAClB,OAAO,EAAE;MACnBU,wBAAwB,CAACV,OAAO,CAAC;IACnC,CAAC;IACDmB,aAAaA,CAACnB,OAAO,EAAE;MACrBU,wBAAwB,CAACV,OAAO,CAAC;IACnC,CAAC;IACDoB,iBAAiBA,CAACpB,OAAO,EAAE;MACzBU,wBAAwB,CAACV,OAAO,CAAC;IACnC;EACF,CAAC,EACD,MAAM,CACP;EAED,oBACElB,KAAA,CAAAuC,aAAA,CAAC/B,YAAY,EAAAgC,QAAA;IACXtB,OAAO,EAAEA,OAAQ;IACjBC,aAAa,EAAEA,aAAc;IAC7BC,gBAAgB,EAAEA,gBAAiB;IACnCC,mBAAmB,EAAEA,mBAAoB;IACzCoB,UAAU,EAAElB,kBAAkB,CAACG,KAAM;IACrCgB,WAAW,EAAExB,OAAO,CAACyB,QAAS;IAC9B7B,aAAa,EAAEA,aAAa,IAAIS,kBAAkB,CAACI;EAAS,GACxDZ,KAAK,EACT;AAEN,CAAC;AAED,4BAAef,KAAK,CAAC4C,IAAI,CAAChC,gBAAgB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import type React from 'react';\n\nimport type { UseOpenChannelMessagesOptions } from '@sendbird/uikit-chat-hooks';\nimport type { Icon } from '@sendbird/uikit-react-native-foundation';\nimport type {\n OnBeforeHandler,\n SendbirdFileMessage,\n SendbirdFileMessageCreateParams,\n SendbirdFileMessageUpdateParams,\n SendbirdMessage,\n SendbirdOpenChannel,\n SendbirdUserMessage,\n SendbirdUserMessageCreateParams,\n SendbirdUserMessageUpdateParams,\n} from '@sendbird/uikit-utils';\n\nimport type { ChannelInputProps } from '../../components/ChannelInput';\nimport type { ChannelMessageListProps } from '../../components/ChannelMessageList';\nimport type { CommonComponent } from '../../types';\nimport type { PubSub } from '../../utils/pubsub';\n\nexport type OpenChannelProps = {\n Fragment: {\n channel: SendbirdOpenChannel;\n onChannelDeleted: () => void;\n onPressHeaderLeft: OpenChannelProps['Header']['onPressHeaderLeft'];\n onPressHeaderRightWithSettings: OpenChannelProps['Header']['onPressHeaderRight'];\n onPressHeaderRightWithParticipants: OpenChannelProps['Header']['onPressHeaderRight'];\n onPressMediaMessage?: OpenChannelProps['MessageList']['onPressMediaMessage'];\n\n onBeforeSendUserMessage?: OnBeforeHandler<SendbirdUserMessageCreateParams>;\n onBeforeSendFileMessage?: OnBeforeHandler<SendbirdFileMessageCreateParams>;\n onBeforeUpdateUserMessage?: OnBeforeHandler<SendbirdUserMessageUpdateParams>;\n onBeforeUpdateFileMessage?: OnBeforeHandler<SendbirdFileMessageUpdateParams>;\n\n renderMessage?: OpenChannelProps['MessageList']['renderMessage'];\n renderNewMessagesButton?: OpenChannelProps['MessageList']['renderNewMessagesButton'];\n renderScrollToBottomButton?: OpenChannelProps['MessageList']['renderScrollToBottomButton'];\n\n enableMessageGrouping?: OpenChannelProps['MessageList']['enableMessageGrouping'];\n\n keyboardAvoidOffset?: OpenChannelProps['Provider']['keyboardAvoidOffset'];\n flatListProps?: OpenChannelProps['MessageList']['flatListProps'];\n sortComparator?: UseOpenChannelMessagesOptions['sortComparator'];\n queryCreator?: UseOpenChannelMessagesOptions['queryCreator'];\n };\n Header: {\n rightIconName: keyof typeof Icon.Assets;\n onPressHeaderLeft: () => void;\n onPressHeaderRight: () => void;\n };\n\n MessageList: Pick<\n ChannelMessageListProps<SendbirdOpenChannel>,\n | 'enableMessageGrouping'\n | 'currentUserId'\n | 'channel'\n | 'messages'\n | 'newMessages'\n | 'scrolledAwayFromBottom'\n | 'onScrolledAwayFromBottom'\n | 'onTopReached'\n | 'onBottomReached'\n | 'onResendFailedMessage'\n | 'onDeleteMessage'\n | 'onPressMediaMessage'\n | 'renderMessage'\n | 'renderNewMessagesButton'\n | 'renderScrollToBottomButton'\n | 'flatListProps'\n | 'hasNext'\n >;\n Input: Pick<\n ChannelInputProps,\n | 'shouldRenderInput'\n | 'onPressSendUserMessage'\n | 'onPressSendFileMessage'\n | 'onPressUpdateUserMessage'\n | 'onPressUpdateFileMessage'\n | 'AttachmentsButton'\n >;\n\n Provider: {\n channel: SendbirdOpenChannel;\n keyboardAvoidOffset?: number;\n openChannelPubSub: PubSub<OpenChannelPubSubContextPayload>;\n };\n};\n\n/**\n * Internal context for OpenChannel\n * For example, the developer can create a custom header\n * with getting data from the domain context\n * */\nexport type OpenChannelContextsType = {\n Fragment: React.Context<{\n headerTitle: string;\n channel: SendbirdOpenChannel;\n messageToEdit?: SendbirdUserMessage | SendbirdFileMessage;\n setMessageToEdit: (msg?: SendbirdUserMessage | SendbirdFileMessage) => void;\n keyboardAvoidOffset?: number;\n }>;\n PubSub: React.Context<PubSub<OpenChannelPubSubContextPayload>>;\n};\nexport interface OpenChannelModule {\n Provider: CommonComponent<OpenChannelProps['Provider']>;\n Header: CommonComponent<OpenChannelProps['Header']>;\n MessageList: CommonComponent<OpenChannelProps['MessageList']>;\n Input: CommonComponent<OpenChannelProps['Input']>;\n StatusEmpty: CommonComponent;\n StatusLoading: CommonComponent;\n}\n\nexport type OpenChannelFragment = React.FC<OpenChannelProps['Fragment']>;\n\nexport type OpenChannelPubSubContextPayload =\n | {\n type: 'MESSAGE_SENT_PENDING' | 'MESSAGE_SENT_SUCCESS';\n data: {\n message: SendbirdUserMessage | SendbirdFileMessage;\n };\n }\n | {\n type: 'MESSAGES_RECEIVED';\n data: {\n messages: SendbirdMessage[];\n };\n };\n"],"mappings":""}
1
+ {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import type React from 'react';\n\nimport type { UseOpenChannelMessagesOptions } from '@sendbird/uikit-chat-hooks';\nimport type { Icon } from '@sendbird/uikit-react-native-foundation';\nimport type {\n OnBeforeHandler,\n PickPartial,\n SendbirdFileMessage,\n SendbirdFileMessageCreateParams,\n SendbirdFileMessageUpdateParams,\n SendbirdMessage,\n SendbirdOpenChannel,\n SendbirdUserMessage,\n SendbirdUserMessageCreateParams,\n SendbirdUserMessageUpdateParams,\n} from '@sendbird/uikit-utils';\n\nimport type { ChannelInputProps } from '../../components/ChannelInput';\nimport type { ChannelMessageListProps } from '../../components/ChannelMessageList';\nimport type { CommonComponent } from '../../types';\nimport type { PubSub } from '../../utils/pubsub';\n\nexport type OpenChannelProps = {\n Fragment: {\n channel: SendbirdOpenChannel;\n onChannelDeleted: () => void;\n onPressHeaderLeft: OpenChannelProps['Header']['onPressHeaderLeft'];\n onPressHeaderRightWithSettings: OpenChannelProps['Header']['onPressHeaderRight'];\n onPressHeaderRightWithParticipants: OpenChannelProps['Header']['onPressHeaderRight'];\n onPressMediaMessage?: OpenChannelProps['MessageList']['onPressMediaMessage'];\n\n onBeforeSendUserMessage?: OnBeforeHandler<SendbirdUserMessageCreateParams>;\n onBeforeSendFileMessage?: OnBeforeHandler<SendbirdFileMessageCreateParams>;\n onBeforeUpdateUserMessage?: OnBeforeHandler<SendbirdUserMessageUpdateParams>;\n onBeforeUpdateFileMessage?: OnBeforeHandler<SendbirdFileMessageUpdateParams>;\n\n renderMessage?: OpenChannelProps['MessageList']['renderMessage'];\n renderNewMessagesButton?: OpenChannelProps['MessageList']['renderNewMessagesButton'];\n renderScrollToBottomButton?: OpenChannelProps['MessageList']['renderScrollToBottomButton'];\n\n enableMessageGrouping?: OpenChannelProps['MessageList']['enableMessageGrouping'];\n\n keyboardAvoidOffset?: OpenChannelProps['Provider']['keyboardAvoidOffset'];\n flatListProps?: OpenChannelProps['MessageList']['flatListProps'];\n sortComparator?: UseOpenChannelMessagesOptions['sortComparator'];\n queryCreator?: UseOpenChannelMessagesOptions['queryCreator'];\n };\n Header: {\n rightIconName: keyof typeof Icon.Assets;\n onPressHeaderLeft: () => void;\n onPressHeaderRight: () => void;\n };\n\n MessageList: Pick<\n ChannelMessageListProps<SendbirdOpenChannel>,\n | 'enableMessageGrouping'\n | 'currentUserId'\n | 'channel'\n | 'messages'\n | 'newMessages'\n | 'scrolledAwayFromBottom'\n | 'onScrolledAwayFromBottom'\n | 'onTopReached'\n | 'onBottomReached'\n | 'onResendFailedMessage'\n | 'onDeleteMessage'\n | 'onPressMediaMessage'\n | 'renderMessage'\n | 'renderNewMessagesButton'\n | 'renderScrollToBottomButton'\n | 'flatListProps'\n | 'hasNext'\n >;\n Input: PickPartial<\n ChannelInputProps,\n | 'shouldRenderInput'\n | 'onPressSendUserMessage'\n | 'onPressSendFileMessage'\n | 'onPressUpdateUserMessage'\n | 'onPressUpdateFileMessage'\n | 'AttachmentsButton',\n 'inputDisabled'\n >;\n\n Provider: {\n channel: SendbirdOpenChannel;\n keyboardAvoidOffset?: number;\n openChannelPubSub: PubSub<OpenChannelPubSubContextPayload>;\n };\n};\n\n/**\n * Internal context for OpenChannel\n * For example, the developer can create a custom header\n * with getting data from the domain context\n * */\nexport type OpenChannelContextsType = {\n Fragment: React.Context<{\n headerTitle: string;\n channel: SendbirdOpenChannel;\n messageToEdit?: SendbirdUserMessage | SendbirdFileMessage;\n setMessageToEdit: (msg?: SendbirdUserMessage | SendbirdFileMessage) => void;\n keyboardAvoidOffset?: number;\n }>;\n PubSub: React.Context<PubSub<OpenChannelPubSubContextPayload>>;\n};\nexport interface OpenChannelModule {\n Provider: CommonComponent<OpenChannelProps['Provider']>;\n Header: CommonComponent<OpenChannelProps['Header']>;\n MessageList: CommonComponent<OpenChannelProps['MessageList']>;\n Input: CommonComponent<OpenChannelProps['Input']>;\n StatusEmpty: CommonComponent;\n StatusLoading: CommonComponent;\n}\n\nexport type OpenChannelFragment = React.FC<OpenChannelProps['Fragment']>;\n\nexport type OpenChannelPubSubContextPayload =\n | {\n type: 'MESSAGE_SENT_PENDING' | 'MESSAGE_SENT_SUCCESS';\n data: {\n message: SendbirdUserMessage | SendbirdFileMessage;\n };\n }\n | {\n type: 'MESSAGES_RECEIVED';\n data: {\n messages: SendbirdMessage[];\n };\n };\n"],"mappings":""}
@@ -19,11 +19,11 @@ const createExpoFileService = _ref => {
19
19
  return expoPermissionGranted([res]);
20
20
  }
21
21
  async hasMediaLibraryPermission(type) {
22
- const perms = await mediaLibraryModule.getPermissionsAsync(type === 'write');
22
+ const perms = await imagePickerModule.getMediaLibraryPermissionsAsync(type === 'write');
23
23
  return expoPermissionGranted([perms]);
24
24
  }
25
25
  async requestMediaLibraryPermission(type) {
26
- const perms = await mediaLibraryModule.requestPermissionsAsync(type === 'write');
26
+ const perms = await imagePickerModule.requestMediaLibraryPermissionsAsync(type === 'write');
27
27
  return expoPermissionGranted([perms]);
28
28
  }
29
29
  async openCamera(options) {
@@ -1 +1 @@
1
- {"version":3,"names":["getFileType","SBUError","expoBackwardUtils","expoPermissionGranted","createExpoFileService","_ref","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","ExpoFileServiceInterface","hasCameraPermission","res","getCameraPermissionsAsync","requestCameraPermission","requestCameraPermissionsAsync","hasMediaLibraryPermission","type","perms","getPermissionsAsync","requestMediaLibraryPermission","requestPermissionsAsync","openCamera","options","hasPermission","granted","_options$onOpenFailur","onOpenFailure","call","PERMISSIONS_DENIED","response","launchCameraAsync","mediaTypes","mediaType","MediaTypeOptions","Images","Videos","All","imagePicker","isCanceled","file","toFilePickerResponses","openMediaLibrary","_options$onOpenFailur2","selectionLimit","launchImageLibraryAsync","openDocument","getDocumentAsync","documentPicker","e","_options$onOpenFailur3","UNKNOWN","save","Error","basePath","documentDirectory","cacheDirectory","downloadPath","fileName","downloadAsync","fileUrl","fileType","match","saveToLibraryAsync","uri","createRecordFilePath","customExtension","arguments","length","undefined","filename","Date","now","recordFilePath"],"sources":["createFileService.expo.ts"],"sourcesContent":["import type * as ExpoDocumentPicker from 'expo-document-picker';\nimport type * as ExpoFs from 'expo-file-system';\nimport type * as ExpoImagePicker from 'expo-image-picker';\nimport type * as ExpoMediaLibrary from 'expo-media-library';\n\nimport { getFileType } from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport expoBackwardUtils from '../utils/expoBackwardUtils';\nimport type { ExpoMediaLibraryPermissionResponse, ExpoPermissionResponse } from '../utils/expoPermissionGranted';\nimport expoPermissionGranted from '../utils/expoPermissionGranted';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nconst createExpoFileService = ({\n imagePickerModule,\n documentPickerModule,\n mediaLibraryModule,\n fsModule,\n}: {\n imagePickerModule: typeof ExpoImagePicker;\n documentPickerModule: typeof ExpoDocumentPicker;\n mediaLibraryModule: typeof ExpoMediaLibrary;\n fsModule: typeof ExpoFs;\n}): FileServiceInterface => {\n class ExpoFileServiceInterface implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.getCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n async requestCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.requestCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n async hasMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {\n const perms = (await mediaLibraryModule.getPermissionsAsync(\n type === 'write',\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n async requestMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {\n const perms = (await mediaLibraryModule.requestPermissionsAsync(\n type === 'write',\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCameraAsync({\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n\n if (expoBackwardUtils.imagePicker.isCanceled(response)) return null;\n\n const [file] = await expoBackwardUtils.imagePicker.toFilePickerResponses(response, fsModule);\n return file;\n }\n async openMediaLibrary(options: OpenMediaLibraryOptions) {\n const hasPermission = await this.hasMediaLibraryPermission('read');\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission('read');\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const selectionLimit = options?.selectionLimit || 1;\n const response = await imagePickerModule.launchImageLibraryAsync({\n selectionLimit,\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n if (expoBackwardUtils.imagePicker.isCanceled(response)) return null;\n return expoBackwardUtils.imagePicker.toFilePickerResponses(response, fsModule);\n }\n\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n try {\n const response = await documentPickerModule.getDocumentAsync({ type: '*/*' });\n if (expoBackwardUtils.documentPicker.isCanceled(response)) return null;\n\n const [file] = await expoBackwardUtils.documentPicker.toFilePickerResponses(response);\n return file;\n } catch (e) {\n options?.onOpenFailure?.(SBUError.UNKNOWN, e);\n return null;\n }\n }\n\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryPermission('write');\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission('write');\n if (!granted) throw new Error('Permission not granted');\n }\n\n const basePath = fsModule.documentDirectory || fsModule.cacheDirectory;\n if (!basePath) throw new Error('Cannot determine directory');\n\n const downloadPath = `${basePath}/${options.fileName}`;\n\n const response = await fsModule.downloadAsync(options.fileUrl, downloadPath);\n if (getFileType(options.fileType || '').match(/video|image/)) {\n await mediaLibraryModule.saveToLibraryAsync(response.uri);\n }\n return response.uri;\n }\n createRecordFilePath(customExtension = 'm4a'): { recordFilePath: string; uri: string } {\n const basePath = fsModule.cacheDirectory;\n if (!basePath) throw new Error('Cannot determine directory');\n\n const filename = `record-${Date.now()}.${customExtension}`;\n return {\n uri: `${basePath}/${filename}`,\n recordFilePath: `${basePath}/${filename}`,\n };\n }\n }\n\n return new ExpoFileServiceInterface();\n};\n\nexport default createExpoFileService;\n"],"mappings":"AAKA,SAASA,WAAW,QAAQ,uBAAuB;AAEnD,OAAOC,QAAQ,MAAM,kBAAkB;AACvC,OAAOC,iBAAiB,MAAM,4BAA4B;AAE1D,OAAOC,qBAAqB,MAAM,gCAAgC;AAUlE,MAAMC,qBAAqB,GAAGC,IAAA,IAUF;EAAA,IAVG;IAC7BC,iBAAiB;IACjBC,oBAAoB;IACpBC,kBAAkB;IAClBC;EAMF,CAAC,GAAAJ,IAAA;EACC,MAAMK,wBAAwB,CAAiC;IAC7D,MAAMC,mBAAmBA,CAAA,EAAqB;MAC5C,MAAMC,GAAG,GAAI,MAAMN,iBAAiB,CAACO,yBAAyB,EAA6B;MAC3F,OAAOV,qBAAqB,CAAC,CAACS,GAAG,CAAC,CAAC;IACrC;IACA,MAAME,uBAAuBA,CAAA,EAAqB;MAChD,MAAMF,GAAG,GAAI,MAAMN,iBAAiB,CAACS,6BAA6B,EAA6B;MAC/F,OAAOZ,qBAAqB,CAAC,CAACS,GAAG,CAAC,CAAC;IACrC;IACA,MAAMI,yBAAyBA,CAACC,IAAsB,EAAoB;MACxE,MAAMC,KAAK,GAAI,MAAMV,kBAAkB,CAACW,mBAAmB,CACzDF,IAAI,KAAK,OAAO,CACsB;MACxC,OAAOd,qBAAqB,CAAC,CAACe,KAAK,CAAC,CAAC;IACvC;IACA,MAAME,6BAA6BA,CAACH,IAAsB,EAAoB;MAC5E,MAAMC,KAAK,GAAI,MAAMV,kBAAkB,CAACa,uBAAuB,CAC7DJ,IAAI,KAAK,OAAO,CACsB;MACxC,OAAOd,qBAAqB,CAAC,CAACe,KAAK,CAAC,CAAC;IACvC;IAEA,MAAMI,UAAUA,CAACC,OAA2B,EAA+B;MACzE,MAAMC,aAAa,GAAG,MAAM,IAAI,CAACb,mBAAmB,EAAE;MACtD,IAAI,CAACa,aAAa,EAAE;QAClB,MAAMC,OAAO,GAAG,MAAM,IAAI,CAACX,uBAAuB,EAAE;QACpD,IAAI,CAACW,OAAO,EAAE;UAAA,IAAAC,qBAAA;UACZH,OAAO,aAAPA,OAAO,wBAAAG,qBAAA,GAAPH,OAAO,CAAEI,aAAa,cAAAD,qBAAA,uBAAtBA,qBAAA,CAAAE,IAAA,CAAAL,OAAO,EAAkBtB,QAAQ,CAAC4B,kBAAkB,CAAC;UACrD,OAAO,IAAI;QACb;MACF;MAEA,MAAMC,QAAQ,GAAG,MAAMxB,iBAAiB,CAACyB,iBAAiB,CAAC;QACzDC,UAAU,EAAE,CAAC,MAAM;UACjB,QAAQT,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEU,SAAS;YACxB,KAAK,OAAO;cACV,OAAO3B,iBAAiB,CAAC4B,gBAAgB,CAACC,MAAM;YAClD,KAAK,OAAO;cACV,OAAO7B,iBAAiB,CAAC4B,gBAAgB,CAACE,MAAM;YAClD,KAAK,KAAK;cACR,OAAO9B,iBAAiB,CAAC4B,gBAAgB,CAACG,GAAG;YAC/C;cACE,OAAO/B,iBAAiB,CAAC4B,gBAAgB,CAACC,MAAM;UAAC;QAEvD,CAAC;MACH,CAAC,CAAC;MAEF,IAAIjC,iBAAiB,CAACoC,WAAW,CAACC,UAAU,CAACT,QAAQ,CAAC,EAAE,OAAO,IAAI;MAEnE,MAAM,CAACU,IAAI,CAAC,GAAG,MAAMtC,iBAAiB,CAACoC,WAAW,CAACG,qBAAqB,CAACX,QAAQ,EAAErB,QAAQ,CAAC;MAC5F,OAAO+B,IAAI;IACb;IACA,MAAME,gBAAgBA,CAACnB,OAAgC,EAAE;MACvD,MAAMC,aAAa,GAAG,MAAM,IAAI,CAACR,yBAAyB,CAAC,MAAM,CAAC;MAClE,IAAI,CAACQ,aAAa,EAAE;QAClB,MAAMC,OAAO,GAAG,MAAM,IAAI,CAACL,6BAA6B,CAAC,MAAM,CAAC;QAChE,IAAI,CAACK,OAAO,EAAE;UAAA,IAAAkB,sBAAA;UACZpB,OAAO,aAAPA,OAAO,wBAAAoB,sBAAA,GAAPpB,OAAO,CAAEI,aAAa,cAAAgB,sBAAA,uBAAtBA,sBAAA,CAAAf,IAAA,CAAAL,OAAO,EAAkBtB,QAAQ,CAAC4B,kBAAkB,CAAC;UACrD,OAAO,IAAI;QACb;MACF;MAEA,MAAMe,cAAc,GAAG,CAAArB,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEqB,cAAc,KAAI,CAAC;MACnD,MAAMd,QAAQ,GAAG,MAAMxB,iBAAiB,CAACuC,uBAAuB,CAAC;QAC/DD,cAAc;QACdZ,UAAU,EAAE,CAAC,MAAM;UACjB,QAAQT,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEU,SAAS;YACxB,KAAK,OAAO;cACV,OAAO3B,iBAAiB,CAAC4B,gBAAgB,CAACC,MAAM;YAClD,KAAK,OAAO;cACV,OAAO7B,iBAAiB,CAAC4B,gBAAgB,CAACE,MAAM;YAClD,KAAK,KAAK;cACR,OAAO9B,iBAAiB,CAAC4B,gBAAgB,CAACG,GAAG;YAC/C;cACE,OAAO/B,iBAAiB,CAAC4B,gBAAgB,CAACC,MAAM;UAAC;QAEvD,CAAC;MACH,CAAC,CAAC;MACF,IAAIjC,iBAAiB,CAACoC,WAAW,CAACC,UAAU,CAACT,QAAQ,CAAC,EAAE,OAAO,IAAI;MACnE,OAAO5B,iBAAiB,CAACoC,WAAW,CAACG,qBAAqB,CAACX,QAAQ,EAAErB,QAAQ,CAAC;IAChF;IAEA,MAAMqC,YAAYA,CAACvB,OAA6B,EAA+B;MAC7E,IAAI;QACF,MAAMO,QAAQ,GAAG,MAAMvB,oBAAoB,CAACwC,gBAAgB,CAAC;UAAE9B,IAAI,EAAE;QAAM,CAAC,CAAC;QAC7E,IAAIf,iBAAiB,CAAC8C,cAAc,CAACT,UAAU,CAACT,QAAQ,CAAC,EAAE,OAAO,IAAI;QAEtE,MAAM,CAACU,IAAI,CAAC,GAAG,MAAMtC,iBAAiB,CAAC8C,cAAc,CAACP,qBAAqB,CAACX,QAAQ,CAAC;QACrF,OAAOU,IAAI;MACb,CAAC,CAAC,OAAOS,CAAC,EAAE;QAAA,IAAAC,sBAAA;QACV3B,OAAO,aAAPA,OAAO,wBAAA2B,sBAAA,GAAP3B,OAAO,CAAEI,aAAa,cAAAuB,sBAAA,uBAAtBA,sBAAA,CAAAtB,IAAA,CAAAL,OAAO,EAAkBtB,QAAQ,CAACkD,OAAO,EAAEF,CAAC,CAAC;QAC7C,OAAO,IAAI;MACb;IACF;IAEA,MAAMG,IAAIA,CAAC7B,OAAoB,EAAmB;MAChD,MAAMC,aAAa,GAAG,MAAM,IAAI,CAACR,yBAAyB,CAAC,OAAO,CAAC;MACnE,IAAI,CAACQ,aAAa,EAAE;QAClB,MAAMC,OAAO,GAAG,MAAM,IAAI,CAACL,6BAA6B,CAAC,OAAO,CAAC;QACjE,IAAI,CAACK,OAAO,EAAE,MAAM,IAAI4B,KAAK,CAAC,wBAAwB,CAAC;MACzD;MAEA,MAAMC,QAAQ,GAAG7C,QAAQ,CAAC8C,iBAAiB,IAAI9C,QAAQ,CAAC+C,cAAc;MACtE,IAAI,CAACF,QAAQ,EAAE,MAAM,IAAID,KAAK,CAAC,4BAA4B,CAAC;MAE5D,MAAMI,YAAY,GAAI,GAAEH,QAAS,IAAG/B,OAAO,CAACmC,QAAS,EAAC;MAEtD,MAAM5B,QAAQ,GAAG,MAAMrB,QAAQ,CAACkD,aAAa,CAACpC,OAAO,CAACqC,OAAO,EAAEH,YAAY,CAAC;MAC5E,IAAIzD,WAAW,CAACuB,OAAO,CAACsC,QAAQ,IAAI,EAAE,CAAC,CAACC,KAAK,CAAC,aAAa,CAAC,EAAE;QAC5D,MAAMtD,kBAAkB,CAACuD,kBAAkB,CAACjC,QAAQ,CAACkC,GAAG,CAAC;MAC3D;MACA,OAAOlC,QAAQ,CAACkC,GAAG;IACrB;IACAC,oBAAoBA,CAAA,EAAmE;MAAA,IAAlEC,eAAe,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,KAAK;MAC1C,MAAMb,QAAQ,GAAG7C,QAAQ,CAAC+C,cAAc;MACxC,IAAI,CAACF,QAAQ,EAAE,MAAM,IAAID,KAAK,CAAC,4BAA4B,CAAC;MAE5D,MAAMiB,QAAQ,GAAI,UAASC,IAAI,CAACC,GAAG,EAAG,IAAGN,eAAgB,EAAC;MAC1D,OAAO;QACLF,GAAG,EAAG,GAAEV,QAAS,IAAGgB,QAAS,EAAC;QAC9BG,cAAc,EAAG,GAAEnB,QAAS,IAAGgB,QAAS;MAC1C,CAAC;IACH;EACF;EAEA,OAAO,IAAI5D,wBAAwB,EAAE;AACvC,CAAC;AAED,eAAeN,qBAAqB"}
1
+ {"version":3,"names":["getFileType","SBUError","expoBackwardUtils","expoPermissionGranted","createExpoFileService","_ref","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","ExpoFileServiceInterface","hasCameraPermission","res","getCameraPermissionsAsync","requestCameraPermission","requestCameraPermissionsAsync","hasMediaLibraryPermission","type","perms","getMediaLibraryPermissionsAsync","requestMediaLibraryPermission","requestMediaLibraryPermissionsAsync","openCamera","options","hasPermission","granted","_options$onOpenFailur","onOpenFailure","call","PERMISSIONS_DENIED","response","launchCameraAsync","mediaTypes","mediaType","MediaTypeOptions","Images","Videos","All","imagePicker","isCanceled","file","toFilePickerResponses","openMediaLibrary","_options$onOpenFailur2","selectionLimit","launchImageLibraryAsync","openDocument","getDocumentAsync","documentPicker","e","_options$onOpenFailur3","UNKNOWN","save","Error","basePath","documentDirectory","cacheDirectory","downloadPath","fileName","downloadAsync","fileUrl","fileType","match","saveToLibraryAsync","uri","createRecordFilePath","customExtension","arguments","length","undefined","filename","Date","now","recordFilePath"],"sources":["createFileService.expo.ts"],"sourcesContent":["import type * as ExpoDocumentPicker from 'expo-document-picker';\nimport type * as ExpoFs from 'expo-file-system';\nimport type * as ExpoImagePicker from 'expo-image-picker';\nimport type * as ExpoMediaLibrary from 'expo-media-library';\n\nimport { getFileType } from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport expoBackwardUtils from '../utils/expoBackwardUtils';\nimport type { ExpoMediaLibraryPermissionResponse, ExpoPermissionResponse } from '../utils/expoPermissionGranted';\nimport expoPermissionGranted from '../utils/expoPermissionGranted';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nconst createExpoFileService = ({\n imagePickerModule,\n documentPickerModule,\n mediaLibraryModule,\n fsModule,\n}: {\n imagePickerModule: typeof ExpoImagePicker;\n documentPickerModule: typeof ExpoDocumentPicker;\n mediaLibraryModule: typeof ExpoMediaLibrary;\n fsModule: typeof ExpoFs;\n}): FileServiceInterface => {\n class ExpoFileServiceInterface implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.getCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n async requestCameraPermission(): Promise<boolean> {\n const res = (await imagePickerModule.requestCameraPermissionsAsync()) as ExpoPermissionResponse;\n return expoPermissionGranted([res]);\n }\n async hasMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {\n const perms = (await imagePickerModule.getMediaLibraryPermissionsAsync(\n type === 'write',\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n async requestMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {\n const perms = (await imagePickerModule.requestMediaLibraryPermissionsAsync(\n type === 'write',\n )) as ExpoMediaLibraryPermissionResponse;\n return expoPermissionGranted([perms]);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCameraAsync({\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n\n if (expoBackwardUtils.imagePicker.isCanceled(response)) return null;\n\n const [file] = await expoBackwardUtils.imagePicker.toFilePickerResponses(response, fsModule);\n return file;\n }\n async openMediaLibrary(options: OpenMediaLibraryOptions) {\n const hasPermission = await this.hasMediaLibraryPermission('read');\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission('read');\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const selectionLimit = options?.selectionLimit || 1;\n const response = await imagePickerModule.launchImageLibraryAsync({\n selectionLimit,\n mediaTypes: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return imagePickerModule.MediaTypeOptions.Images;\n case 'video':\n return imagePickerModule.MediaTypeOptions.Videos;\n case 'all':\n return imagePickerModule.MediaTypeOptions.All;\n default:\n return imagePickerModule.MediaTypeOptions.Images;\n }\n })(),\n });\n if (expoBackwardUtils.imagePicker.isCanceled(response)) return null;\n return expoBackwardUtils.imagePicker.toFilePickerResponses(response, fsModule);\n }\n\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n try {\n const response = await documentPickerModule.getDocumentAsync({ type: '*/*' });\n if (expoBackwardUtils.documentPicker.isCanceled(response)) return null;\n\n const [file] = await expoBackwardUtils.documentPicker.toFilePickerResponses(response);\n return file;\n } catch (e) {\n options?.onOpenFailure?.(SBUError.UNKNOWN, e);\n return null;\n }\n }\n\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryPermission('write');\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission('write');\n if (!granted) throw new Error('Permission not granted');\n }\n\n const basePath = fsModule.documentDirectory || fsModule.cacheDirectory;\n if (!basePath) throw new Error('Cannot determine directory');\n\n const downloadPath = `${basePath}/${options.fileName}`;\n\n const response = await fsModule.downloadAsync(options.fileUrl, downloadPath);\n if (getFileType(options.fileType || '').match(/video|image/)) {\n await mediaLibraryModule.saveToLibraryAsync(response.uri);\n }\n return response.uri;\n }\n createRecordFilePath(customExtension = 'm4a'): { recordFilePath: string; uri: string } {\n const basePath = fsModule.cacheDirectory;\n if (!basePath) throw new Error('Cannot determine directory');\n\n const filename = `record-${Date.now()}.${customExtension}`;\n return {\n uri: `${basePath}/${filename}`,\n recordFilePath: `${basePath}/${filename}`,\n };\n }\n }\n\n return new ExpoFileServiceInterface();\n};\n\nexport default createExpoFileService;\n"],"mappings":"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"}
@@ -30,7 +30,7 @@ const createNativeFileService = _ref => {
30
30
  default: []
31
31
  });
32
32
  const mediaLibraryPermissions = Platform.select({
33
- ios: [permissionModule.PERMISSIONS.IOS.MEDIA_LIBRARY, permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY],
33
+ ios: [permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY, permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY_ADD_ONLY],
34
34
  android: getAndroidStoragePermissionsByAPILevel(permissionModule),
35
35
  default: []
36
36
  });
@@ -79,9 +79,6 @@ const createNativeFileService = _ref => {
79
79
  }
80
80
  async hasMediaLibraryPermission() {
81
81
  const status = await permissionModule.checkMultiple(mediaLibraryPermissions);
82
- if (__DEV__ && Platform.OS === 'ios' && status['ios.permission.MEDIA_LIBRARY'] === 'unavailable' && status['ios.permission.PHOTO_LIBRARY'] === 'granted') {
83
- return true;
84
- }
85
82
  return nativePermissionGranted(status);
86
83
  }
87
84
  async requestMediaLibraryPermission() {
@@ -1 +1 @@
1
- {"version":3,"names":["Platform","Logger","getFileExtension","getFileExtensionFromMime","getFileExtensionFromUri","getFileType","normalizeFileName","SBUError","nativePermissionGranted","normalizeFile","getAndroidStoragePermissionsByAPILevel","permissionModule","OS","Version","PERMISSIONS","ANDROID","READ_MEDIA_AUDIO","READ_MEDIA_IMAGES","READ_MEDIA_VIDEO","READ_EXTERNAL_STORAGE","WRITE_EXTERNAL_STORAGE","createNativeFileService","_ref","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","cameraPermissions","select","ios","IOS","CAMERA","MICROPHONE","android","default","mediaLibraryPermissions","MEDIA_LIBRARY","PHOTO_LIBRARY","NativeFileService","constructor","_defineProperty","options","dirname","Dirs","CacheDir","DocumentDir","context","filename","fileName","extension","fileType","fileUrl","path","buildDownloadPath","FileSystem","fetch","downloadedPath","file","name","type","hasCameraPermission","status","checkMultiple","requestCameraPermission","requestMultiple","hasMediaLibraryPermission","__DEV__","requestMediaLibraryPermission","openCamera","_response$assets","hasPermission","granted","_options$onOpenFailur","onOpenFailure","call","PERMISSIONS_DENIED","response","launchCamera","presentationStyle","cameraType","mediaType","didCancel","errorCode","_options$onOpenFailur2","DEVICE_UNAVAILABLE","Error","errorMessage","fileSize","size","uri","assets","openMediaLibrary","selectionLimit","_options$onOpenFailur3","launchImageLibrary","_options$onOpenFailur4","Promise","all","slice","map","_ref2","openDocument","pickSingle","e","isCancel","isInProgress","_options$onOpenFailur5","UNKNOWN","save","downloadFile","mediaTypeMap","externalDirMap","externalDir","cpExternal","catch","error","createRecordFilePath","customExtension","arguments","length","undefined","Date","now","recordFilePath","startsWith"],"sources":["createFileService.native.ts"],"sourcesContent":["import type { CameraRoll } from '@react-native-camera-roll/camera-roll';\nimport { Platform } from 'react-native';\nimport type * as DocumentPicker from 'react-native-document-picker';\nimport type * as FileAccess from 'react-native-file-access';\nimport type * as ImagePicker from 'react-native-image-picker';\nimport type * as Permissions from 'react-native-permissions';\nimport type { Permission } from 'react-native-permissions';\n\nimport {\n Logger,\n getFileExtension,\n getFileExtensionFromMime,\n getFileExtensionFromUri,\n getFileType,\n normalizeFileName,\n} from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport nativePermissionGranted from '../utils/nativePermissionGranted';\nimport normalizeFile from '../utils/normalizeFile';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nfunction getAndroidStoragePermissionsByAPILevel(permissionModule: typeof Permissions): Permission[] {\n if (Platform.OS !== 'android') return [];\n\n if (Platform.Version > 32) {\n return [\n permissionModule.PERMISSIONS.ANDROID.READ_MEDIA_AUDIO,\n permissionModule.PERMISSIONS.ANDROID.READ_MEDIA_IMAGES,\n permissionModule.PERMISSIONS.ANDROID.READ_MEDIA_VIDEO,\n ];\n }\n\n if (Platform.Version > 28) {\n return [permissionModule.PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE];\n }\n\n return [\n permissionModule.PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE,\n permissionModule.PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE,\n ];\n}\n\nconst createNativeFileService = ({\n imagePickerModule,\n documentPickerModule,\n permissionModule,\n mediaLibraryModule,\n fsModule,\n}: {\n imagePickerModule: typeof ImagePicker;\n documentPickerModule: typeof DocumentPicker;\n permissionModule: typeof Permissions;\n mediaLibraryModule: typeof CameraRoll;\n fsModule: typeof FileAccess;\n}): FileServiceInterface => {\n const cameraPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.CAMERA, permissionModule.PERMISSIONS.IOS.MICROPHONE],\n android: [permissionModule.PERMISSIONS.ANDROID.CAMERA],\n default: [],\n });\n const mediaLibraryPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.MEDIA_LIBRARY, permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY],\n android: getAndroidStoragePermissionsByAPILevel(permissionModule),\n default: [],\n });\n\n class NativeFileService implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(cameraPermissions);\n return nativePermissionGranted(status);\n }\n async requestCameraPermission(): Promise<boolean> {\n const status = await permissionModule.requestMultiple(cameraPermissions);\n return nativePermissionGranted(status);\n }\n async hasMediaLibraryPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(mediaLibraryPermissions);\n if (\n __DEV__ &&\n Platform.OS === 'ios' &&\n status['ios.permission.MEDIA_LIBRARY'] === 'unavailable' &&\n status['ios.permission.PHOTO_LIBRARY'] === 'granted'\n ) {\n return true;\n }\n return nativePermissionGranted(status);\n }\n async requestMediaLibraryPermission(): Promise<boolean> {\n const status = await permissionModule.requestMultiple(mediaLibraryPermissions);\n return nativePermissionGranted(status);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCamera({\n presentationStyle: 'fullScreen',\n cameraType: options?.cameraType ?? 'back',\n mediaType: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return 'photo';\n case 'video':\n return 'video';\n case 'all':\n return 'mixed';\n default:\n return 'photo';\n }\n })(),\n });\n if (response.didCancel) return null;\n if (response.errorCode === 'camera_unavailable') {\n options?.onOpenFailure?.(SBUError.DEVICE_UNAVAILABLE, new Error(response.errorMessage));\n return null;\n }\n\n const { fileName: name, fileSize: size, type, uri } = response.assets?.[0] ?? {};\n return normalizeFile({ uri, size, name, type });\n }\n async openMediaLibrary(options?: OpenMediaLibraryOptions): Promise<FilePickerResponse[] | null> {\n /**\n * NOTE: options.selectionLimit {@link https://github.com/react-native-image-picker/react-native-image-picker#options}\n * We do not support 0 (any number of files)\n **/\n const selectionLimit = options?.selectionLimit || 1;\n const hasPermission = await this.hasMediaLibraryPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchImageLibrary({\n presentationStyle: 'fullScreen',\n selectionLimit,\n mediaType: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return 'photo';\n case 'video':\n return 'video';\n case 'all':\n return 'mixed';\n default:\n return 'photo';\n }\n })(),\n });\n if (response.didCancel) return null;\n if (response.errorCode === 'camera_unavailable') {\n options?.onOpenFailure?.(SBUError.DEVICE_UNAVAILABLE, new Error(response.errorMessage));\n return null;\n }\n\n return Promise.all(\n (response.assets || [])\n .slice(0, selectionLimit)\n .map(({ fileName: name, fileSize: size, type, uri }) => normalizeFile({ uri, size, name, type })),\n );\n }\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n try {\n const { uri, size, name, type } = await documentPickerModule.pickSingle();\n return normalizeFile({ uri, size, name, type });\n } catch (e) {\n if (!documentPickerModule.isCancel(e) && documentPickerModule.isInProgress(e)) {\n options?.onOpenFailure?.(SBUError.UNKNOWN, e);\n }\n return null;\n }\n }\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission();\n if (!granted) throw new Error('Permission not granted');\n }\n\n const { downloadedPath, file } = await this.downloadFile(options);\n\n if (Platform.OS === 'ios') {\n if (file.type === 'image' || file.type === 'video') {\n const mediaTypeMap = { 'image': 'photo', 'video': 'video' } as const;\n const mediaType = mediaTypeMap[file.type];\n await mediaLibraryModule.save(downloadedPath, { type: mediaType });\n }\n }\n\n if (Platform.OS === 'android') {\n const externalDirMap = { 'file': 'downloads', 'audio': 'audio', 'image': 'images', 'video': 'video' } as const;\n const externalDir = externalDirMap[file.type];\n await fsModule.FileSystem.cpExternal(downloadedPath, file.name, externalDir).catch(() => {\n Logger.error('Failed to save file to external storage. Retry saving to downloads directory instead.');\n return fsModule.FileSystem.cpExternal(downloadedPath, file.name, 'downloads');\n });\n }\n\n return downloadedPath;\n }\n\n private buildDownloadPath = async (options: SaveOptions) => {\n const dirname = Platform.select({ android: fsModule.Dirs.CacheDir, default: fsModule.Dirs.DocumentDir });\n const context = { dirname, filename: options.fileName };\n const extension =\n getFileExtension(options.fileName) ||\n getFileExtensionFromMime(options.fileType) ||\n getFileExtension(options.fileUrl) ||\n (await getFileExtensionFromUri(options.fileUrl));\n\n if (extension) context.filename = normalizeFileName(context.filename, extension);\n\n return { path: `${context.dirname}/${context.filename}`, ...context };\n };\n\n private downloadFile = async (options: SaveOptions) => {\n const { path, filename } = await this.buildDownloadPath(options);\n await fsModule.FileSystem.fetch(options.fileUrl, { path });\n return {\n downloadedPath: path,\n file: {\n name: filename,\n type: getFileType(getFileExtension(path)),\n } as const,\n };\n };\n\n createRecordFilePath(customExtension = 'm4a'): { recordFilePath: string; uri: string } {\n const filename = `record-${Date.now()}.${customExtension}`;\n const path = `${fsModule.Dirs.CacheDir}/${filename}`;\n return Platform.select({\n ios: {\n uri: path,\n recordFilePath: filename,\n },\n android: {\n uri: path.startsWith('file://') ? path : 'file://' + path,\n recordFilePath: path,\n },\n default: {\n uri: path,\n recordFilePath: path,\n },\n });\n }\n }\n\n return new NativeFileService();\n};\n\nexport default createNativeFileService;\n"],"mappings":"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"}
1
+ {"version":3,"names":["Platform","Logger","getFileExtension","getFileExtensionFromMime","getFileExtensionFromUri","getFileType","normalizeFileName","SBUError","nativePermissionGranted","normalizeFile","getAndroidStoragePermissionsByAPILevel","permissionModule","OS","Version","PERMISSIONS","ANDROID","READ_MEDIA_AUDIO","READ_MEDIA_IMAGES","READ_MEDIA_VIDEO","READ_EXTERNAL_STORAGE","WRITE_EXTERNAL_STORAGE","createNativeFileService","_ref","imagePickerModule","documentPickerModule","mediaLibraryModule","fsModule","cameraPermissions","select","ios","IOS","CAMERA","MICROPHONE","android","default","mediaLibraryPermissions","PHOTO_LIBRARY","PHOTO_LIBRARY_ADD_ONLY","NativeFileService","constructor","_defineProperty","options","dirname","Dirs","CacheDir","DocumentDir","context","filename","fileName","extension","fileType","fileUrl","path","buildDownloadPath","FileSystem","fetch","downloadedPath","file","name","type","hasCameraPermission","status","checkMultiple","requestCameraPermission","requestMultiple","hasMediaLibraryPermission","requestMediaLibraryPermission","openCamera","_response$assets","hasPermission","granted","_options$onOpenFailur","onOpenFailure","call","PERMISSIONS_DENIED","response","launchCamera","presentationStyle","cameraType","mediaType","didCancel","errorCode","_options$onOpenFailur2","DEVICE_UNAVAILABLE","Error","errorMessage","fileSize","size","uri","assets","openMediaLibrary","selectionLimit","_options$onOpenFailur3","launchImageLibrary","_options$onOpenFailur4","Promise","all","slice","map","_ref2","openDocument","pickSingle","e","isCancel","isInProgress","_options$onOpenFailur5","UNKNOWN","save","downloadFile","mediaTypeMap","externalDirMap","externalDir","cpExternal","catch","error","createRecordFilePath","customExtension","arguments","length","undefined","Date","now","recordFilePath","startsWith"],"sources":["createFileService.native.ts"],"sourcesContent":["import type { CameraRoll } from '@react-native-camera-roll/camera-roll';\nimport { Platform } from 'react-native';\nimport type * as DocumentPicker from 'react-native-document-picker';\nimport type * as FileAccess from 'react-native-file-access';\nimport type * as ImagePicker from 'react-native-image-picker';\nimport type * as Permissions from 'react-native-permissions';\nimport type { Permission } from 'react-native-permissions';\n\nimport {\n Logger,\n getFileExtension,\n getFileExtensionFromMime,\n getFileExtensionFromUri,\n getFileType,\n normalizeFileName,\n} from '@sendbird/uikit-utils';\n\nimport SBUError from '../libs/SBUError';\nimport nativePermissionGranted from '../utils/nativePermissionGranted';\nimport normalizeFile from '../utils/normalizeFile';\nimport type {\n FilePickerResponse,\n FileServiceInterface,\n OpenCameraOptions,\n OpenDocumentOptions,\n OpenMediaLibraryOptions,\n SaveOptions,\n} from './types';\n\nfunction getAndroidStoragePermissionsByAPILevel(permissionModule: typeof Permissions): Permission[] {\n if (Platform.OS !== 'android') return [];\n\n if (Platform.Version > 32) {\n return [\n permissionModule.PERMISSIONS.ANDROID.READ_MEDIA_AUDIO,\n permissionModule.PERMISSIONS.ANDROID.READ_MEDIA_IMAGES,\n permissionModule.PERMISSIONS.ANDROID.READ_MEDIA_VIDEO,\n ];\n }\n\n if (Platform.Version > 28) {\n return [permissionModule.PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE];\n }\n\n return [\n permissionModule.PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE,\n permissionModule.PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE,\n ];\n}\n\nconst createNativeFileService = ({\n imagePickerModule,\n documentPickerModule,\n permissionModule,\n mediaLibraryModule,\n fsModule,\n}: {\n imagePickerModule: typeof ImagePicker;\n documentPickerModule: typeof DocumentPicker;\n permissionModule: typeof Permissions;\n mediaLibraryModule: typeof CameraRoll;\n fsModule: typeof FileAccess;\n}): FileServiceInterface => {\n const cameraPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.CAMERA, permissionModule.PERMISSIONS.IOS.MICROPHONE],\n android: [permissionModule.PERMISSIONS.ANDROID.CAMERA],\n default: [],\n });\n const mediaLibraryPermissions: Permission[] = Platform.select({\n ios: [permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY, permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY_ADD_ONLY],\n android: getAndroidStoragePermissionsByAPILevel(permissionModule),\n default: [],\n });\n\n class NativeFileService implements FileServiceInterface {\n async hasCameraPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(cameraPermissions);\n return nativePermissionGranted(status);\n }\n async requestCameraPermission(): Promise<boolean> {\n const status = await permissionModule.requestMultiple(cameraPermissions);\n return nativePermissionGranted(status);\n }\n async hasMediaLibraryPermission(): Promise<boolean> {\n const status = await permissionModule.checkMultiple(mediaLibraryPermissions);\n return nativePermissionGranted(status);\n }\n async requestMediaLibraryPermission(): Promise<boolean> {\n const status = await permissionModule.requestMultiple(mediaLibraryPermissions);\n return nativePermissionGranted(status);\n }\n\n async openCamera(options?: OpenCameraOptions): Promise<FilePickerResponse> {\n const hasPermission = await this.hasCameraPermission();\n if (!hasPermission) {\n const granted = await this.requestCameraPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchCamera({\n presentationStyle: 'fullScreen',\n cameraType: options?.cameraType ?? 'back',\n mediaType: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return 'photo';\n case 'video':\n return 'video';\n case 'all':\n return 'mixed';\n default:\n return 'photo';\n }\n })(),\n });\n if (response.didCancel) return null;\n if (response.errorCode === 'camera_unavailable') {\n options?.onOpenFailure?.(SBUError.DEVICE_UNAVAILABLE, new Error(response.errorMessage));\n return null;\n }\n\n const { fileName: name, fileSize: size, type, uri } = response.assets?.[0] ?? {};\n return normalizeFile({ uri, size, name, type });\n }\n async openMediaLibrary(options?: OpenMediaLibraryOptions): Promise<FilePickerResponse[] | null> {\n /**\n * NOTE: options.selectionLimit {@link https://github.com/react-native-image-picker/react-native-image-picker#options}\n * We do not support 0 (any number of files)\n **/\n const selectionLimit = options?.selectionLimit || 1;\n const hasPermission = await this.hasMediaLibraryPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission();\n if (!granted) {\n options?.onOpenFailure?.(SBUError.PERMISSIONS_DENIED);\n return null;\n }\n }\n\n const response = await imagePickerModule.launchImageLibrary({\n presentationStyle: 'fullScreen',\n selectionLimit,\n mediaType: (() => {\n switch (options?.mediaType) {\n case 'photo':\n return 'photo';\n case 'video':\n return 'video';\n case 'all':\n return 'mixed';\n default:\n return 'photo';\n }\n })(),\n });\n if (response.didCancel) return null;\n if (response.errorCode === 'camera_unavailable') {\n options?.onOpenFailure?.(SBUError.DEVICE_UNAVAILABLE, new Error(response.errorMessage));\n return null;\n }\n\n return Promise.all(\n (response.assets || [])\n .slice(0, selectionLimit)\n .map(({ fileName: name, fileSize: size, type, uri }) => normalizeFile({ uri, size, name, type })),\n );\n }\n async openDocument(options?: OpenDocumentOptions): Promise<FilePickerResponse> {\n try {\n const { uri, size, name, type } = await documentPickerModule.pickSingle();\n return normalizeFile({ uri, size, name, type });\n } catch (e) {\n if (!documentPickerModule.isCancel(e) && documentPickerModule.isInProgress(e)) {\n options?.onOpenFailure?.(SBUError.UNKNOWN, e);\n }\n return null;\n }\n }\n async save(options: SaveOptions): Promise<string> {\n const hasPermission = await this.hasMediaLibraryPermission();\n if (!hasPermission) {\n const granted = await this.requestMediaLibraryPermission();\n if (!granted) throw new Error('Permission not granted');\n }\n\n const { downloadedPath, file } = await this.downloadFile(options);\n\n if (Platform.OS === 'ios') {\n if (file.type === 'image' || file.type === 'video') {\n const mediaTypeMap = { 'image': 'photo', 'video': 'video' } as const;\n const mediaType = mediaTypeMap[file.type];\n await mediaLibraryModule.save(downloadedPath, { type: mediaType });\n }\n }\n\n if (Platform.OS === 'android') {\n const externalDirMap = { 'file': 'downloads', 'audio': 'audio', 'image': 'images', 'video': 'video' } as const;\n const externalDir = externalDirMap[file.type];\n await fsModule.FileSystem.cpExternal(downloadedPath, file.name, externalDir).catch(() => {\n Logger.error('Failed to save file to external storage. Retry saving to downloads directory instead.');\n return fsModule.FileSystem.cpExternal(downloadedPath, file.name, 'downloads');\n });\n }\n\n return downloadedPath;\n }\n\n private buildDownloadPath = async (options: SaveOptions) => {\n const dirname = Platform.select({ android: fsModule.Dirs.CacheDir, default: fsModule.Dirs.DocumentDir });\n const context = { dirname, filename: options.fileName };\n const extension =\n getFileExtension(options.fileName) ||\n getFileExtensionFromMime(options.fileType) ||\n getFileExtension(options.fileUrl) ||\n (await getFileExtensionFromUri(options.fileUrl));\n\n if (extension) context.filename = normalizeFileName(context.filename, extension);\n\n return { path: `${context.dirname}/${context.filename}`, ...context };\n };\n\n private downloadFile = async (options: SaveOptions) => {\n const { path, filename } = await this.buildDownloadPath(options);\n await fsModule.FileSystem.fetch(options.fileUrl, { path });\n return {\n downloadedPath: path,\n file: {\n name: filename,\n type: getFileType(getFileExtension(path)),\n } as const,\n };\n };\n\n createRecordFilePath(customExtension = 'm4a'): { recordFilePath: string; uri: string } {\n const filename = `record-${Date.now()}.${customExtension}`;\n const path = `${fsModule.Dirs.CacheDir}/${filename}`;\n return Platform.select({\n ios: {\n uri: path,\n recordFilePath: filename,\n },\n android: {\n uri: path.startsWith('file://') ? path : 'file://' + path,\n recordFilePath: path,\n },\n default: {\n uri: path,\n recordFilePath: path,\n },\n });\n }\n }\n\n return new NativeFileService();\n};\n\nexport default createNativeFileService;\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- const VERSION = '3.5.0';
1
+ const VERSION = '3.5.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.5.0';\nexport default VERSION;\n"],"mappings":"AAAA,MAAMA,OAAO,GAAG,OAAO;AACvB,eAAeA,OAAO"}
1
+ {"version":3,"names":["VERSION"],"sources":["version.ts"],"sourcesContent":["const VERSION = '3.5.2';\nexport default VERSION;\n"],"mappings":"AAAA,MAAMA,OAAO,GAAG,OAAO;AACvB,eAAeA,OAAO"}
@@ -13,7 +13,7 @@ import type { StringSet } from '../localization/StringSet.type';
13
13
  import type { ClipboardServiceInterface, FileServiceInterface, MediaServiceInterface, NotificationServiceInterface, PlayerServiceInterface, RecorderServiceInterface } from '../platform/types';
14
14
  import type { ErrorBoundaryProps, LocalCacheStorage } from '../types';
15
15
  export declare const SendbirdUIKit: Readonly<{
16
- VERSION: "3.5.0";
16
+ VERSION: "3.5.2";
17
17
  PLATFORM: string;
18
18
  DEFAULT: {
19
19
  AUTO_PUSH_TOKEN_REGISTRATION: boolean;
@@ -1,3 +1,3 @@
1
1
  import React from 'react';
2
- declare const _default: React.MemoExoticComponent<(props: Pick<import("../../../components/ChannelInput").ChannelInputProps, "onPressUpdateUserMessage" | "shouldRenderInput" | "onPressSendUserMessage" | "onPressSendFileMessage" | "onPressUpdateFileMessage" | "SuggestedMentionList" | "AttachmentsButton">) => React.JSX.Element>;
2
+ declare const _default: React.MemoExoticComponent<({ inputDisabled, ...props }: import("@sendbird/uikit-utils").PickPartial<import("../../../components/ChannelInput").ChannelInputProps, "onPressUpdateUserMessage" | "shouldRenderInput" | "onPressSendUserMessage" | "onPressSendFileMessage" | "onPressUpdateFileMessage" | "SuggestedMentionList" | "AttachmentsButton", "inputDisabled">) => React.JSX.Element>;
3
3
  export default _default;
@@ -2,7 +2,7 @@ import type React from 'react';
2
2
  import type { FlatList } from 'react-native';
3
3
  import type { MessageCollectionParams, MessageFilterParams } from '@sendbird/chat/groupChannel';
4
4
  import type { UseGroupChannelMessagesOptions } from '@sendbird/uikit-chat-hooks';
5
- import type { OnBeforeHandler, SendbirdFileMessage, SendbirdFileMessageCreateParams, SendbirdFileMessageUpdateParams, SendbirdGroupChannel, SendbirdMessage, SendbirdUser, SendbirdUserMessage, SendbirdUserMessageCreateParams, SendbirdUserMessageUpdateParams } from '@sendbird/uikit-utils';
5
+ import type { OnBeforeHandler, PickPartial, SendbirdFileMessage, SendbirdFileMessageCreateParams, SendbirdFileMessageUpdateParams, SendbirdGroupChannel, SendbirdMessage, SendbirdUser, SendbirdUserMessage, SendbirdUserMessageCreateParams, SendbirdUserMessageUpdateParams } from '@sendbird/uikit-utils';
6
6
  import type { ChannelInputProps, SuggestedMentionListProps } from '../../components/ChannelInput';
7
7
  import type { ChannelMessageListProps } from '../../components/ChannelMessageList';
8
8
  import type { CommonComponent } from '../../types';
@@ -49,7 +49,7 @@ export interface GroupChannelProps {
49
49
  onResetMessageListWithStartingPoint: (startingPoint: number) => Promise<void>;
50
50
  onUpdateSearchItem: (searchItem?: GroupChannelProps['MessageList']['searchItem']) => void;
51
51
  };
52
- Input: Pick<ChannelInputProps, 'shouldRenderInput' | 'onPressSendUserMessage' | 'onPressSendFileMessage' | 'onPressUpdateUserMessage' | 'onPressUpdateFileMessage' | 'SuggestedMentionList' | 'AttachmentsButton'>;
52
+ Input: PickPartial<ChannelInputProps, 'shouldRenderInput' | 'onPressSendUserMessage' | 'onPressSendFileMessage' | 'onPressUpdateUserMessage' | 'onPressUpdateFileMessage' | 'SuggestedMentionList' | 'AttachmentsButton', 'inputDisabled'>;
53
53
  SuggestedMentionList: SuggestedMentionListProps;
54
54
  Provider: {
55
55
  channel: SendbirdGroupChannel;
@@ -1,3 +1,3 @@
1
1
  import React from 'react';
2
- declare const _default: React.MemoExoticComponent<(props: Pick<import("../../../components/ChannelInput").ChannelInputProps, "onPressUpdateUserMessage" | "shouldRenderInput" | "onPressSendUserMessage" | "onPressSendFileMessage" | "onPressUpdateFileMessage" | "AttachmentsButton">) => React.JSX.Element>;
2
+ declare const _default: React.MemoExoticComponent<({ inputDisabled, ...props }: import("@sendbird/uikit-utils").PickPartial<import("../../../components/ChannelInput").ChannelInputProps, "onPressUpdateUserMessage" | "shouldRenderInput" | "onPressSendUserMessage" | "onPressSendFileMessage" | "onPressUpdateFileMessage" | "AttachmentsButton", "inputDisabled">) => React.JSX.Element>;
3
3
  export default _default;
@@ -1,7 +1,7 @@
1
1
  import type React from 'react';
2
2
  import type { UseOpenChannelMessagesOptions } from '@sendbird/uikit-chat-hooks';
3
3
  import type { Icon } from '@sendbird/uikit-react-native-foundation';
4
- import type { OnBeforeHandler, SendbirdFileMessage, SendbirdFileMessageCreateParams, SendbirdFileMessageUpdateParams, SendbirdMessage, SendbirdOpenChannel, SendbirdUserMessage, SendbirdUserMessageCreateParams, SendbirdUserMessageUpdateParams } from '@sendbird/uikit-utils';
4
+ import type { OnBeforeHandler, PickPartial, SendbirdFileMessage, SendbirdFileMessageCreateParams, SendbirdFileMessageUpdateParams, SendbirdMessage, SendbirdOpenChannel, SendbirdUserMessage, SendbirdUserMessageCreateParams, SendbirdUserMessageUpdateParams } from '@sendbird/uikit-utils';
5
5
  import type { ChannelInputProps } from '../../components/ChannelInput';
6
6
  import type { ChannelMessageListProps } from '../../components/ChannelMessageList';
7
7
  import type { CommonComponent } from '../../types';
@@ -33,7 +33,7 @@ export type OpenChannelProps = {
33
33
  onPressHeaderRight: () => void;
34
34
  };
35
35
  MessageList: Pick<ChannelMessageListProps<SendbirdOpenChannel>, 'enableMessageGrouping' | 'currentUserId' | 'channel' | 'messages' | 'newMessages' | 'scrolledAwayFromBottom' | 'onScrolledAwayFromBottom' | 'onTopReached' | 'onBottomReached' | 'onResendFailedMessage' | 'onDeleteMessage' | 'onPressMediaMessage' | 'renderMessage' | 'renderNewMessagesButton' | 'renderScrollToBottomButton' | 'flatListProps' | 'hasNext'>;
36
- Input: Pick<ChannelInputProps, 'shouldRenderInput' | 'onPressSendUserMessage' | 'onPressSendFileMessage' | 'onPressUpdateUserMessage' | 'onPressUpdateFileMessage' | 'AttachmentsButton'>;
36
+ Input: PickPartial<ChannelInputProps, 'shouldRenderInput' | 'onPressSendUserMessage' | 'onPressSendFileMessage' | 'onPressUpdateUserMessage' | 'onPressUpdateFileMessage' | 'AttachmentsButton', 'inputDisabled'>;
37
37
  Provider: {
38
38
  channel: SendbirdOpenChannel;
39
39
  keyboardAvoidOffset?: number;
@@ -1,2 +1,2 @@
1
- declare const VERSION = "3.5.0";
1
+ declare const VERSION = "3.5.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.5.0",
3
+ "version": "3.5.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.5.0",
64
- "@sendbird/uikit-react-native-foundation": "3.5.0",
63
+ "@sendbird/uikit-chat-hooks": "3.5.2",
64
+ "@sendbird/uikit-react-native-foundation": "3.5.2",
65
65
  "@sendbird/uikit-tools": "0.0.1-alpha.66",
66
- "@sendbird/uikit-utils": "3.5.0"
66
+ "@sendbird/uikit-utils": "3.5.2"
67
67
  },
68
68
  "devDependencies": {
69
69
  "@bam.tech/react-native-image-resizer": "^3.0.4",
@@ -203,5 +203,5 @@
203
203
  ]
204
204
  ]
205
205
  },
206
- "gitHead": "d1153f29c96710d1deeeb5f24928bdf269c69310"
206
+ "gitHead": "b43229b4161614b92919750676588cd3fd4f0845"
207
207
  }
@@ -6,7 +6,7 @@ import ChannelInput from '../../../components/ChannelInput';
6
6
  import { GroupChannelContexts } from '../module/moduleContext';
7
7
  import type { GroupChannelProps } from '../types';
8
8
 
9
- const GroupChannelInput = (props: GroupChannelProps['Input']) => {
9
+ const GroupChannelInput = ({ inputDisabled, ...props }: GroupChannelProps['Input']) => {
10
10
  const {
11
11
  channel,
12
12
  keyboardAvoidOffset = 0,
@@ -25,10 +25,10 @@ const GroupChannelInput = (props: GroupChannelProps['Input']) => {
25
25
  setMessageToEdit={setMessageToEdit}
26
26
  messageToReply={messageToReply}
27
27
  setMessageToReply={setMessageToReply}
28
+ keyboardAvoidOffset={keyboardAvoidOffset}
28
29
  inputMuted={chatAvailableState.muted}
29
30
  inputFrozen={chatAvailableState.frozen}
30
- inputDisabled={chatAvailableState.disabled}
31
- keyboardAvoidOffset={keyboardAvoidOffset}
31
+ inputDisabled={inputDisabled ?? chatAvailableState.disabled}
32
32
  {...props}
33
33
  />
34
34
  );
@@ -5,6 +5,7 @@ import type { MessageCollectionParams, MessageFilterParams } from '@sendbird/cha
5
5
  import type { UseGroupChannelMessagesOptions } from '@sendbird/uikit-chat-hooks';
6
6
  import type {
7
7
  OnBeforeHandler,
8
+ PickPartial,
8
9
  SendbirdFileMessage,
9
10
  SendbirdFileMessageCreateParams,
10
11
  SendbirdFileMessageUpdateParams,
@@ -91,7 +92,7 @@ export interface GroupChannelProps {
91
92
  // Changing the search item will trigger the focus animation on messages.
92
93
  onUpdateSearchItem: (searchItem?: GroupChannelProps['MessageList']['searchItem']) => void;
93
94
  };
94
- Input: Pick<
95
+ Input: PickPartial<
95
96
  ChannelInputProps,
96
97
  | 'shouldRenderInput'
97
98
  | 'onPressSendUserMessage'
@@ -99,7 +100,8 @@ export interface GroupChannelProps {
99
100
  | 'onPressUpdateUserMessage'
100
101
  | 'onPressUpdateFileMessage'
101
102
  | 'SuggestedMentionList'
102
- | 'AttachmentsButton'
103
+ | 'AttachmentsButton',
104
+ 'inputDisabled'
103
105
  >;
104
106
 
105
107
  SuggestedMentionList: SuggestedMentionListProps;
@@ -9,7 +9,7 @@ import { useSendbirdChat } from '../../../hooks/useContext';
9
9
  import { OpenChannelContexts } from '../module/moduleContext';
10
10
  import type { OpenChannelProps } from '../types';
11
11
 
12
- const OpenChannelInput = (props: OpenChannelProps['Input']) => {
12
+ const OpenChannelInput = ({ inputDisabled, ...props }: OpenChannelProps['Input']) => {
13
13
  const { sdk, currentUser } = useSendbirdChat();
14
14
 
15
15
  const {
@@ -64,10 +64,10 @@ const OpenChannelInput = (props: OpenChannelProps['Input']) => {
64
64
  channel={channel}
65
65
  messageToEdit={messageToEdit}
66
66
  setMessageToEdit={setMessageToEdit}
67
+ keyboardAvoidOffset={keyboardAvoidOffset}
67
68
  inputMuted={chatAvailableState.muted}
68
69
  inputFrozen={channel.isFrozen}
69
- inputDisabled={chatAvailableState.disabled}
70
- keyboardAvoidOffset={keyboardAvoidOffset}
70
+ inputDisabled={inputDisabled ?? chatAvailableState.disabled}
71
71
  {...props}
72
72
  />
73
73
  );
@@ -4,6 +4,7 @@ import type { UseOpenChannelMessagesOptions } from '@sendbird/uikit-chat-hooks';
4
4
  import type { Icon } from '@sendbird/uikit-react-native-foundation';
5
5
  import type {
6
6
  OnBeforeHandler,
7
+ PickPartial,
7
8
  SendbirdFileMessage,
8
9
  SendbirdFileMessageCreateParams,
9
10
  SendbirdFileMessageUpdateParams,
@@ -70,14 +71,15 @@ export type OpenChannelProps = {
70
71
  | 'flatListProps'
71
72
  | 'hasNext'
72
73
  >;
73
- Input: Pick<
74
+ Input: PickPartial<
74
75
  ChannelInputProps,
75
76
  | 'shouldRenderInput'
76
77
  | 'onPressSendUserMessage'
77
78
  | 'onPressSendFileMessage'
78
79
  | 'onPressUpdateUserMessage'
79
80
  | 'onPressUpdateFileMessage'
80
- | 'AttachmentsButton'
81
+ | 'AttachmentsButton',
82
+ 'inputDisabled'
81
83
  >;
82
84
 
83
85
  Provider: {
@@ -39,13 +39,13 @@ const createExpoFileService = ({
39
39
  return expoPermissionGranted([res]);
40
40
  }
41
41
  async hasMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {
42
- const perms = (await mediaLibraryModule.getPermissionsAsync(
42
+ const perms = (await imagePickerModule.getMediaLibraryPermissionsAsync(
43
43
  type === 'write',
44
44
  )) as ExpoMediaLibraryPermissionResponse;
45
45
  return expoPermissionGranted([perms]);
46
46
  }
47
47
  async requestMediaLibraryPermission(type: 'write' | 'read'): Promise<boolean> {
48
- const perms = (await mediaLibraryModule.requestPermissionsAsync(
48
+ const perms = (await imagePickerModule.requestMediaLibraryPermissionsAsync(
49
49
  type === 'write',
50
50
  )) as ExpoMediaLibraryPermissionResponse;
51
51
  return expoPermissionGranted([perms]);
@@ -67,7 +67,7 @@ const createNativeFileService = ({
67
67
  default: [],
68
68
  });
69
69
  const mediaLibraryPermissions: Permission[] = Platform.select({
70
- ios: [permissionModule.PERMISSIONS.IOS.MEDIA_LIBRARY, permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY],
70
+ ios: [permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY, permissionModule.PERMISSIONS.IOS.PHOTO_LIBRARY_ADD_ONLY],
71
71
  android: getAndroidStoragePermissionsByAPILevel(permissionModule),
72
72
  default: [],
73
73
  });
@@ -83,14 +83,6 @@ const createNativeFileService = ({
83
83
  }
84
84
  async hasMediaLibraryPermission(): Promise<boolean> {
85
85
  const status = await permissionModule.checkMultiple(mediaLibraryPermissions);
86
- if (
87
- __DEV__ &&
88
- Platform.OS === 'ios' &&
89
- status['ios.permission.MEDIA_LIBRARY'] === 'unavailable' &&
90
- status['ios.permission.PHOTO_LIBRARY'] === 'granted'
91
- ) {
92
- return true;
93
- }
94
86
  return nativePermissionGranted(status);
95
87
  }
96
88
  async requestMediaLibraryPermission(): Promise<boolean> {
package/src/version.ts CHANGED
@@ -1,2 +1,2 @@
1
- const VERSION = '3.5.0';
1
+ const VERSION = '3.5.2';
2
2
  export default VERSION;