stream-chat-react-native-core
Version:
The official React Native and Expo components for Stream Chat, a service for building chat applications
84 lines • 4.07 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useProcessReactions = exports.defaultReactionsSort = void 0;
var _react = require("react");
var _contexts = require("../../../contexts");
var _MessagesContext = require("../../../contexts/messagesContext/MessagesContext");
var defaultReactionsSort = (a, b) => {
if (a.firstReactionAt && b.firstReactionAt) {
return +a.firstReactionAt - +b.firstReactionAt;
}
return a.type.localeCompare(b.type, 'en');
};
exports.defaultReactionsSort = defaultReactionsSort;
var isOwnReaction = (reactionType, ownReactions, latestReactions, userID) => (ownReactions ? ownReactions.some(reaction => reaction.type === reactionType) : false) || (latestReactions ? latestReactions.some(reaction => {
var _reaction$user;
return (reaction == null || (_reaction$user = reaction.user) == null ? void 0 : _reaction$user.id) === userID && reaction.type === reactionType;
}) : false);
var isSupportedReaction = (reactionType, supportedReactions) => supportedReactions ? supportedReactions.some(reactionOption => reactionOption.type === reactionType) : false;
var getEmojiByReactionType = (reactionType, supportedReactions) => {
var _supportedReactions$f;
return supportedReactions ? (_supportedReactions$f = supportedReactions.find(({
type
}) => type === reactionType)) == null ? void 0 : _supportedReactions$f.Icon : null;
};
var getLatestReactedUserNames = (reactionType, latestReactions) => latestReactions ? latestReactions.flatMap(reaction => {
if (reactionType && reactionType === reaction.type) {
var _reaction$user2, _reaction$user3;
var username = ((_reaction$user2 = reaction.user) == null ? void 0 : _reaction$user2.name) || ((_reaction$user3 = reaction.user) == null ? void 0 : _reaction$user3.id);
return username ? [username] : [];
}
return [];
}) : [];
var useProcessReactions = props => {
var _useMessagesContext = (0, _MessagesContext.useMessagesContext)(),
contextSupportedReactions = _useMessagesContext.supportedReactions;
var _useChatContext = (0, _contexts.useChatContext)(),
client = _useChatContext.client;
var latest_reactions = props.latest_reactions,
own_reactions = props.own_reactions,
reaction_groups = props.reaction_groups,
_props$sortReactions = props.sortReactions,
sortReactions = _props$sortReactions === void 0 ? defaultReactionsSort : _props$sortReactions,
_props$supportedReact = props.supportedReactions,
supportedReactions = _props$supportedReact === void 0 ? contextSupportedReactions : _props$supportedReact;
return (0, _react.useMemo)(() => {
if (!reaction_groups) {
return {
existingReactions: [],
hasReactions: false,
totalReactionCount: 0
};
}
var unsortedReactions = Object.entries(reaction_groups).flatMap(([reactionType, {
count,
first_reaction_at,
last_reaction_at
}]) => {
if (count === 0 || !isSupportedReaction(reactionType, supportedReactions)) {
return [];
}
var latestReactedUserNames = getLatestReactedUserNames(reactionType, latest_reactions);
return {
count,
firstReactionAt: first_reaction_at ? new Date(first_reaction_at) : null,
Icon: getEmojiByReactionType(reactionType, supportedReactions),
lastReactionAt: last_reaction_at ? new Date(last_reaction_at) : null,
latestReactedUserNames,
own: isOwnReaction(reactionType, own_reactions, latest_reactions, client.userID),
type: reactionType,
unlistedReactedUserCount: count - latestReactedUserNames.length
};
});
return {
existingReactions: unsortedReactions.sort(sortReactions),
hasReactions: unsortedReactions.length > 0,
totalReactionCount: unsortedReactions.reduce((total, {
count
}) => total + count, 0)
};
}, [client.userID, reaction_groups, own_reactions, latest_reactions, supportedReactions, sortReactions]);
};
exports.useProcessReactions = useProcessReactions;
//# sourceMappingURL=useProcessReactions.js.map