UNPKG

stream-chat-react-native-core

Version:

The official React Native and Expo components for Stream Chat, a service for building chat applications

439 lines 14.1 kB
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.useWithPortalKeyboardSafety = exports.useMessageActionHandlers = void 0; var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _react = require("react"); var _reactNative = require("react-native"); var _useUserMuteActive = require("./useUserMuteActive"); var _useScreenReaderEnabled = require("../../../a11y/hooks/useScreenReaderEnabled"); var _MessageInputContext = require("../../../contexts/messageInputContext/MessageInputContext"); var _TranslationContext = require("../../../contexts/translationContext/TranslationContext"); var _hooks = require("../../../hooks"); var _useTranslatedMessage = require("../../../hooks/useTranslatedMessage"); var _native = require("../../../native"); var _Notifications = require("../../Notifications"); var getErrorMessage = (error, fallback) => error instanceof Error && error.message ? error.message : fallback; var getNotificationError = error => { if (error instanceof Error) return error; if (typeof error === 'string') return new Error(error); if (error && typeof error === 'object' && 'message' in error) { var message = error.message; if (typeof message === 'string') return new Error(message); } return undefined; }; var getNotificationErrorOptions = error => { var originalError = getNotificationError(error); return originalError ? { originalError } : {}; }; var useWithPortalKeyboardSafety = callback => { var callbackAfterKeyboardOpen = (0, _hooks.useAfterKeyboardOpenCallback)(callback); return (0, _hooks.usePortalSettledCallback)(callbackAfterKeyboardOpen); }; exports.useWithPortalKeyboardSafety = useWithPortalKeyboardSafety; var useMessageActionHandlers = ({ channel, client, deleteMessage, deleteReaction, message, retrySendMessage, sendReaction, setEditingState, setQuotedMessage }) => { var _useTranslationContex = (0, _TranslationContext.useTranslationContext)(), t = _useTranslationContex.t; var _useNotificationApi = (0, _Notifications.useNotificationApi)(), addNotification = _useNotificationApi.addNotification; var _useMessageInputConte = (0, _MessageInputContext.useMessageInputContext)(), inputBoxRef = _useMessageInputConte.inputBoxRef; var screenReaderEnabled = (0, _useScreenReaderEnabled.useScreenReaderEnabled)(); var handleResendMessage = (0, _hooks.useStableCallback)(() => retrySendMessage(message)); var translatedMessage = (0, _useTranslatedMessage.useTranslatedMessage)(message); var isMuted = (0, _useUserMuteActive.useUserMuteActive)(message.user); var handleQuotedReplyMessage = (0, _hooks.useStableCallback)(() => { setQuotedMessage(message); if (screenReaderEnabled) { inputBoxRef.current?.focus(); } }); var handleCopyMessage = (0, _hooks.useStableCallback)(() => { if (!message.text) { return; } _native.NativeHandlers.setClipboardString(translatedMessage?.text ?? message.text, { onFailure: error => { addNotification({ message: t('Failed to copy message'), options: { ...getNotificationErrorOptions(error), severity: 'error', type: 'clipboard:message:copy:failed' }, origin: { context: { message }, emitter: 'MessageActions' } }); }, onSuccess: () => { addNotification({ message: t('Message copied to clipboard'), options: { severity: 'success', type: 'clipboard:message:copy:success' }, origin: { context: { message }, emitter: 'MessageActions' } }); } }); }); var handleDeleteMessage = (0, _hooks.useStableCallback)(() => { if (!message.id) { return; } _reactNative.Alert.alert(t('Delete Message'), t('Are you sure you want to permanently delete this message?'), [{ style: 'cancel', text: t('Cancel') }, { onPress: function () { var _ref = (0, _asyncToGenerator2.default)(function* () { try { yield deleteMessage(message); addNotification({ message: t('Message deleted'), options: { severity: 'success', type: 'api:message:delete:success' }, origin: { context: { message }, emitter: 'MessageActions' } }); } catch (error) { addNotification({ message: getErrorMessage(error, t('Error deleting message')), options: { ...getNotificationErrorOptions(error), severity: 'error', type: 'api:message:delete:failed' }, origin: { context: { message }, emitter: 'MessageActions' } }); } }); return function onPress() { return _ref.apply(this, arguments); }; }(), style: 'destructive', text: t('Delete') }], { cancelable: false }); }); var handleDeleteForMeMessage = (0, _hooks.useStableCallback)((0, _asyncToGenerator2.default)(function* () { if (!message.id) { return; } yield deleteMessage(message, { deleteForMe: true }); })); var handleToggleMuteUser = (0, _hooks.useStableCallback)((0, _asyncToGenerator2.default)(function* () { if (!message.user?.id) { return; } try { if (isMuted) { yield client.unmuteUser(message.user.id); addNotification({ message: t('{{ user }} has been unmuted', { user: message.user?.name || message.user?.id }), options: { severity: 'success', type: 'api:user:unmute:success' }, origin: { context: { message }, emitter: 'MessageActions' } }); } else { yield client.muteUser(message.user.id); addNotification({ message: t('{{ user }} has been muted', { user: message.user?.name || message.user?.id }), options: { severity: 'success', type: 'api:user:mute:success' }, origin: { context: { message }, emitter: 'MessageActions' } }); } } catch (error) { addNotification({ message: getErrorMessage(error, isMuted ? t('Error unmuting a user ...') : t('Error muting a user ...')), options: { ...getNotificationErrorOptions(error), severity: 'error', type: isMuted ? 'api:user:unmute:failed' : 'api:user:mute:failed' }, origin: { context: { message }, emitter: 'MessageActions' } }); } })); var handleToggleBanUser = (0, _hooks.useStableCallback)((0, _asyncToGenerator2.default)(function* () { var messageUser = message.user; if (!messageUser) { return; } if (messageUser.banned) { yield client.unbanUser(messageUser.id); } else { yield client.banUser(messageUser.id); } })); var handleTogglePinMessage = (0, _hooks.useStableCallback)((0, _asyncToGenerator2.default)(function* () { var isPinned = !!message.pinned; try { if (!isPinned) { yield client.pinMessage(message, null); addNotification({ message: t('Message pinned'), options: { severity: 'success', type: 'api:message:pin:success' }, origin: { context: { message }, emitter: 'MessageActions' } }); } else { yield client.unpinMessage(message); addNotification({ message: t('Message unpinned'), options: { severity: 'success', type: 'api:message:unpin:success' }, origin: { context: { message }, emitter: 'MessageActions' } }); } } catch (error) { addNotification({ message: getErrorMessage(error, isPinned ? t('Error removing message pin') : t('Error pinning message')), options: { ...getNotificationErrorOptions(error), severity: 'error', type: isPinned ? 'api:message:unpin:failed' : 'api:message:pin:failed' }, origin: { context: { message }, emitter: 'MessageActions' } }); } })); var handleEditMessage = useWithPortalKeyboardSafety(() => { setEditingState(message); }); var handleFlagMessage = (0, _hooks.useStableCallback)(() => { if (!message.id) { return; } _reactNative.Alert.alert(t('Flag Message'), t('Do you want to send a copy of this message to a moderator for further investigation?'), [{ style: 'cancel', text: t('Cancel') }, { onPress: function () { var _ref6 = (0, _asyncToGenerator2.default)(function* () { try { yield client.flagMessage(message.id); addNotification({ message: t('Message has been successfully flagged'), options: { severity: 'success', type: 'api:message:flag:success' }, origin: { context: { message }, emitter: 'MessageActions' } }); } catch (error) { addNotification({ message: getErrorMessage(error, t('Error adding flag')), options: { ...getNotificationErrorOptions(error), severity: 'error', type: 'api:message:flag:failed' }, origin: { context: { message }, emitter: 'MessageActions' } }); } }); return function onPress() { return _ref6.apply(this, arguments); }; }(), text: t('Flag') }], { cancelable: false }); }); var handleMarkUnreadMessage = (0, _hooks.useStableCallback)((0, _asyncToGenerator2.default)(function* () { if (!message.id) { return; } try { yield channel.markUnread({ message_id: message.id }); addNotification({ message: t('Message marked as unread'), options: { severity: 'success', type: 'api:message:markUnread:success' }, origin: { context: { message }, emitter: 'MessageActions' } }); } catch (error) { addNotification({ message: getErrorMessage(error, t('Error marking message unread. Cannot mark unread messages older than the newest 100 channel messages.')), options: { ...getNotificationErrorOptions(error), severity: 'error', type: 'api:message:markUnread:failed' }, origin: { context: { message }, emitter: 'MessageActions' } }); } })); var handleToggleReaction = (0, _hooks.useStableCallback)(function () { var _ref8 = (0, _asyncToGenerator2.default)(function* (reactionType) { var messageId = message.id; var own_reactions = message.own_reactions ?? []; var userExistingReaction = own_reactions.find(reaction => { if (reaction.user && client.userID === reaction.user.id && reaction.type === reactionType) { return true; } else if (reaction.user && client.userID !== reaction.user.id) { console.warn('message.own_reactions contained reactions from a different user, this indicates a bug'); } return false; }); try { if (channel && messageId) { if (userExistingReaction) { yield deleteReaction(userExistingReaction.type, messageId); } else { yield sendReaction(reactionType, messageId); } } } catch (err) { console.log(err); } }); return function (_x) { return _ref8.apply(this, arguments); }; }()); var handleToggleBlockUser = (0, _hooks.useStableCallback)(function () { var _ref9 = (0, _asyncToGenerator2.default)(function* (user) { try { if (!user) { return; } var isBlocked = new Set(client.blockedUsers.getLatestValue().userIds).has(user?.id ?? ''); if (isBlocked) { yield client.unBlockUser(user.id); } else { yield client.blockUser(user.id); } } catch (err) { console.log(err); } }); return function (_x2) { return _ref9.apply(this, arguments); }; }()); return (0, _react.useMemo)(() => ({ handleCopyMessage, handleDeleteForMeMessage, handleDeleteMessage, handleEditMessage, handleFlagMessage, handleMarkUnreadMessage, handleQuotedReplyMessage, handleResendMessage, handleToggleBanUser, handleToggleMuteUser, handleTogglePinMessage, handleToggleReaction, handleToggleBlockUser }), [handleCopyMessage, handleDeleteForMeMessage, handleDeleteMessage, handleEditMessage, handleFlagMessage, handleMarkUnreadMessage, handleQuotedReplyMessage, handleResendMessage, handleToggleBanUser, handleToggleMuteUser, handleTogglePinMessage, handleToggleReaction, handleToggleBlockUser]); }; exports.useMessageActionHandlers = useMessageActionHandlers; //# sourceMappingURL=useMessageActionHandlers.js.map