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
JavaScript
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