stream-chat-react-native-core
Version:
The official React Native and Expo components for Stream Chat, a service for building chat applications
372 lines • 17.1 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useMessageInputContext = exports.MessageInputProvider = exports.MessageInputContext = void 0;
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _react = _interopRequireWildcard(require("react"));
var _reactNative = require("react-native");
var _mimeTypes = require("mime-types");
var _streamChat = require("stream-chat");
var _useCreateMessageInputContext = require("./hooks/useCreateMessageInputContext");
var _useMessageComposer = require("./hooks/useMessageComposer");
var _KeyboardCompatibleView = require("../../components/KeyboardCompatibleView/KeyboardCompatibleView");
var _parseLinks = require("../../components/Message/MessageItemView/utils/parseLinks");
var _useAudioRecorder2 = require("../../components/MessageInput/hooks/useAudioRecorder");
var _Notifications = require("../../components/Notifications");
var _useStableCallback = require("../../hooks/useStableCallback");
var _attachments = require("../../middlewares/attachments");
var _native = require("../../native");
var _audioRecorderManager = require("../../state-store/audio-recorder-manager");
var _compressImage = require("../../utils/compressImage");
var _AttachmentPickerContext = require("../attachmentPickerContext/AttachmentPickerContext");
var _ChannelContext = require("../channelContext/ChannelContext");
var _ChatContext = require("../chatContext/ChatContext");
var _MessageComposerAPIContext = require("../messageComposerContext/MessageComposerAPIContext");
var _OwnCapabilitiesContext = require("../ownCapabilitiesContext/OwnCapabilitiesContext");
var _ThreadContext = require("../threadContext/ThreadContext");
var _TranslationContext = require("../translationContext/TranslationContext");
var _defaultBaseContextValue = require("../utils/defaultBaseContextValue");
var _isTestEnvironment = require("../utils/isTestEnvironment");
var _jsxRuntime = require("react/jsx-runtime");
var _jsxFileName = "/home/runner/work/stream-chat-react-native/stream-chat-react-native/package/src/contexts/messageInputContext/MessageInputContext.tsx";
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
var MessageInputContext = exports.MessageInputContext = _react.default.createContext(_defaultBaseContextValue.DEFAULT_BASE_CONTEXT_VALUE);
var MessageInputProvider = ({
children,
value
}) => {
var _useAttachmentPickerC = (0, _AttachmentPickerContext.useAttachmentPickerContext)(),
closePicker = _useAttachmentPickerC.closePicker,
openPicker = _useAttachmentPickerC.openPicker,
attachmentPickerStore = _useAttachmentPickerC.attachmentPickerStore,
disableAttachmentPicker = _useAttachmentPickerC.disableAttachmentPicker;
var _useChatContext = (0, _ChatContext.useChatContext)(),
client = _useChatContext.client;
var channelCapabilities = (0, _OwnCapabilitiesContext.useOwnCapabilitiesContext)();
var _useState = (0, _react.useState)(new _audioRecorderManager.AudioRecorderManager()),
_useState2 = (0, _slicedToArray2.default)(_useState, 1),
audioRecorderManager = _useState2[0];
var _useChannelContext = (0, _ChannelContext.useChannelContext)(),
uploadAbortControllerRef = _useChannelContext.uploadAbortControllerRef;
var _useMessageComposerAP = (0, _MessageComposerAPIContext.useMessageComposerAPIContext)(),
clearEditingState = _useMessageComposerAP.clearEditingState;
var _useThreadContext = (0, _ThreadContext.useThreadContext)(),
thread = _useThreadContext.thread;
var _useTranslationContex = (0, _TranslationContext.useTranslationContext)(),
t = _useTranslationContex.t;
var _useNotificationApi = (0, _Notifications.useNotificationApi)(),
addNotification = _useNotificationApi.addNotification;
var inputBoxRef = (0, _react.useRef)(null);
var _useState3 = (0, _react.useState)(false),
_useState4 = (0, _slicedToArray2.default)(_useState3, 2),
showPollCreationDialog = _useState4[0],
setShowPollCreationDialog = _useState4[1];
var defaultOpenPollCreationDialog = (0, _react.useCallback)(() => setShowPollCreationDialog(true), []);
var closePollCreationDialog = (0, _react.useCallback)(() => setShowPollCreationDialog(false), []);
var openPollCreationDialogFromContext = value.openPollCreationDialog,
allowSendBeforeAttachmentsUpload = value.allowSendBeforeAttachmentsUpload;
var messageComposer = (0, _useMessageComposer.useMessageComposer)();
var attachmentManager = messageComposer.attachmentManager,
editedMessage = messageComposer.editedMessage;
(0, _react.useEffect)(() => {
if (value.doFileUploadRequest) {
attachmentManager.setCustomUploadFn(value.doFileUploadRequest);
}
(0, _attachments.setupVideoAttachmentPreviewMiddleware)(messageComposer);
if (allowSendBeforeAttachmentsUpload) {
messageComposer.compositionMiddlewareExecutor.replace([(0, _attachments.createAttachmentsCompositionMiddleware)(messageComposer)]);
messageComposer.draftCompositionMiddlewareExecutor.replace([(0, _attachments.createDraftAttachmentsCompositionMiddleware)(messageComposer)]);
}
}, [value.doFileUploadRequest, allowSendBeforeAttachmentsUpload, messageComposer, attachmentManager]);
var takeAndUploadImage = (0, _useStableCallback.useStableCallback)(function () {
var _ref = (0, _asyncToGenerator2.default)(function* (mediaType) {
if (!attachmentManager.availableUploadSlots) {
_reactNative.Alert.alert(t('Maximum number of files reached'));
return;
}
var file = yield _native.NativeHandlers.takePhoto({
compressImageQuality: value.compressImageQuality,
mediaType
});
if (file.askToOpenSettings && disableAttachmentPicker) {
_reactNative.Alert.alert(t('Allow camera access in device settings'), t('Device camera is used to take photos or videos.'), [{
style: 'cancel',
text: t('Cancel')
}, {
onPress: () => _reactNative.Linking.openSettings(),
style: 'default',
text: t('Open Settings')
}]);
}
if (file.askToOpenSettings || file.cancelled) {
return file;
}
yield uploadNewFile(file);
return file;
});
return function (_x) {
return _ref.apply(this, arguments);
};
}());
var pickAndUploadImageFromNativePicker = (0, _useStableCallback.useStableCallback)((0, _asyncToGenerator2.default)(function* () {
var _result$assets;
if (!attachmentManager.availableUploadSlots) {
_reactNative.Alert.alert(t('Maximum number of files reached'));
return;
}
var result = yield _native.NativeHandlers.pickImage({
maxNumberOfFiles: attachmentManager.availableUploadSlots
});
if (result.askToOpenSettings) {
_reactNative.Alert.alert(t('Allow access to your Gallery'), t('Device gallery permissions is used to take photos or videos.'), [{
style: 'cancel',
text: t('Cancel')
}, {
onPress: () => _reactNative.Linking.openSettings(),
style: 'default',
text: t('Open Settings')
}]);
}
if (result.cancelled || !((_result$assets = result.assets) != null && _result$assets.length)) {
return;
}
result.assets.forEach(function () {
var _ref3 = (0, _asyncToGenerator2.default)(function* (asset) {
yield uploadNewFile(asset);
});
return function (_x2) {
return _ref3.apply(this, arguments);
};
}());
}));
var pickFile = (0, _useStableCallback.useStableCallback)((0, _asyncToGenerator2.default)(function* () {
var _result$assets2;
if (!(0, _native.isDocumentPickerAvailable)()) {
console.log('The file picker is not installed. Check our Getting Started documentation to install it.');
return;
}
if (!attachmentManager.availableUploadSlots) {
_reactNative.Alert.alert(t('Maximum number of files reached'));
return;
}
var result = yield _native.NativeHandlers.pickDocument({
maxNumberOfFiles: attachmentManager.availableUploadSlots
});
if (result.cancelled || !((_result$assets2 = result.assets) != null && _result$assets2.length)) {
return;
}
result.assets.forEach(function () {
var _ref5 = (0, _asyncToGenerator2.default)(function* (asset) {
yield uploadNewFile(asset);
});
return function (_x3) {
return _ref5.apply(this, arguments);
};
}());
}));
var openAttachmentPicker = (0, _react.useCallback)(() => {
(0, _KeyboardCompatibleView.dismissKeyboard)();
attachmentPickerStore.setSelectedPicker('images');
openPicker();
}, [attachmentPickerStore, openPicker]);
var closeAttachmentPicker = (0, _react.useCallback)(() => {
attachmentPickerStore.setSelectedPicker(undefined);
closePicker();
}, [closePicker, attachmentPickerStore]);
var sendMessage = (0, _useStableCallback.useStableCallback)((0, _asyncToGenerator2.default)(function* () {
var _inputBoxRef$current;
var textToRestore = messageComposer.textComposer.text;
var compositionAccepted = false;
(_inputBoxRef$current = inputBoxRef.current) == null || _inputBoxRef$current.clearState();
try {
var composition = yield messageComposer.compose();
if (!composition || !composition.message) {
var _inputBoxRef$current2;
(_inputBoxRef$current2 = inputBoxRef.current) == null || _inputBoxRef$current2.restoreState(textToRestore);
return;
}
var localMessage = composition.localMessage,
message = composition.message,
sendOptions = composition.sendOptions;
var linkInfos = (0, _parseLinks.parseLinksFromText)(localMessage.text);
if (!channelCapabilities.sendLinks && linkInfos.length > 0) {
var _inputBoxRef$current3;
_reactNative.Alert.alert(t('Links are disabled'), t('Sending links is not allowed in this conversation'));
(_inputBoxRef$current3 = inputBoxRef.current) == null || _inputBoxRef$current3.restoreState(textToRestore);
return;
}
compositionAccepted = true;
if (editedMessage && editedMessage.type !== 'error') {
try {
clearEditingState();
yield value.editMessage({
localMessage,
options: sendOptions
});
} catch (error) {
addNotification({
message: t('Edit message request failed'),
options: {
...(error instanceof Error ? {
originalError: error
} : {}),
severity: 'error'
},
origin: {
emitter: 'MessageComposer'
}
}, {
incident: {
domain: 'api',
entity: 'message',
operation: 'edit'
}
});
throw new Error('Error while editing message');
}
} else {
try {
if (localMessage.poll_id) {
messageComposer.state.partialNext({
id: _streamChat.MessageComposer.generateId(),
pollId: null
});
} else {
messageComposer.clear();
}
if (editedMessage) {
clearEditingState();
}
yield value.sendMessage({
localMessage,
message,
options: sendOptions
});
} catch (error) {
addNotification({
message: t('Send message request failed'),
options: {
...(error instanceof Error ? {
originalError: error
} : {}),
severity: 'error'
},
origin: {
emitter: 'MessageComposer'
}
}, {
incident: {
domain: 'api',
entity: 'message',
operation: 'send'
}
});
throw new Error('Error while sending message');
}
}
} catch (error) {
if (!compositionAccepted) {
var _inputBoxRef$current4;
(_inputBoxRef$current4 = inputBoxRef.current) == null || _inputBoxRef$current4.restoreState(textToRestore);
}
console.error('Error while sending message:', error);
}
}));
var setInputBoxRef = (0, _useStableCallback.useStableCallback)(ref => {
inputBoxRef.current = ref;
if (value.setInputRef) {
value.setInputRef(ref);
}
});
var uploadNewFile = (0, _useStableCallback.useStableCallback)(function () {
var _ref7 = (0, _asyncToGenerator2.default)(function* (file) {
try {
if (!(file != null && file.uri)) {
return;
}
var fallbackMimeType = (0, _mimeTypes.lookup)(file.name || file.uri || '') || (file.duration ? 'video/*' : file.height && file.width ? 'image/*' : undefined);
var normalizedFile = {
...file,
type: file.type || (typeof fallbackMimeType === 'string' ? fallbackMimeType : 'application/octet-stream')
};
uploadAbortControllerRef.current.set(file.name, client.createAbortControllerForNextRequest());
var fileURI = normalizedFile.type.includes('image') ? yield (0, _compressImage.compressedImageURI)(normalizedFile, value.compressImageQuality) : normalizedFile.uri;
var updatedFile = {
...normalizedFile,
uri: fileURI
};
var uploadedFiles = yield attachmentManager.uploadFiles([updatedFile]);
var blockedAttachmentIds = (uploadedFiles != null ? uploadedFiles : []).filter(attachment => {
var _attachment$localMeta;
return (attachment == null || (_attachment$localMeta = attachment.localMetadata) == null ? void 0 : _attachment$localMeta.uploadState) === 'blocked';
}).map(attachment => attachment == null ? void 0 : attachment.localMetadata.id).filter(id => typeof id === 'string');
if (blockedAttachmentIds.length) {
attachmentManager.removeAttachments(blockedAttachmentIds);
}
uploadAbortControllerRef.current.delete(normalizedFile.name);
} catch (error) {
if (error instanceof Error && (error.name === 'AbortError' || error.name === 'CanceledError')) {
uploadAbortControllerRef.current.delete(file.name);
return;
}
}
});
return function (_x4) {
return _ref7.apply(this, arguments);
};
}());
var openPollCreationDialog = (0, _useStableCallback.useStableCallback)(() => {
if (openPollCreationDialogFromContext) {
openPollCreationDialogFromContext({
sendMessage
});
return;
}
defaultOpenPollCreationDialog();
});
var _useAudioRecorder = (0, _useAudioRecorder2.useAudioRecorder)({
audioRecorderManager,
sendMessage
}),
deleteVoiceRecording = _useAudioRecorder.deleteVoiceRecording,
startVoiceRecording = _useAudioRecorder.startVoiceRecording,
stopVoiceRecording = _useAudioRecorder.stopVoiceRecording,
uploadVoiceRecording = _useAudioRecorder.uploadVoiceRecording;
var messageInputContext = (0, _useCreateMessageInputContext.useCreateMessageInputContext)({
closeAttachmentPicker,
inputBoxRef,
openAttachmentPicker,
pickAndUploadImageFromNativePicker,
pickFile,
setInputBoxRef,
takeAndUploadImage,
thread,
uploadNewFile,
...value,
closePollCreationDialog,
openPollCreationDialog,
sendMessage,
showPollCreationDialog,
audioRecorderManager,
startVoiceRecording,
deleteVoiceRecording,
uploadVoiceRecording,
stopVoiceRecording
});
return (0, _jsxRuntime.jsx)(MessageInputContext.Provider, {
value: messageInputContext,
children: children
});
};
exports.MessageInputProvider = MessageInputProvider;
var useMessageInputContext = () => {
var contextValue = (0, _react.useContext)(MessageInputContext);
if (contextValue === _defaultBaseContextValue.DEFAULT_BASE_CONTEXT_VALUE && !(0, _isTestEnvironment.isTestEnvironment)()) {
throw new Error('The useMessageInputContext hook was called outside of the MessageInputContext provider. Make sure you have configured Channel component correctly - https://getstream.io/chat/docs/sdk/reactnative/basics/hello_stream_chat/#channel');
}
return contextValue;
};
exports.useMessageInputContext = useMessageInputContext;
//# sourceMappingURL=MessageInputContext.js.map