stream-chat-react-native-core
Version:
The official React Native and Expo components for Stream Chat, a service for building chat applications
254 lines • 11.6 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.MessageUserReactionsSelectorItem = exports.MessageUserReactions = void 0;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _react = _interopRequireWildcard(require("react"));
var _reactNative = require("react-native");
var _reactNativeGestureHandler = require("react-native-gesture-handler");
var _reactNativeReanimated = _interopRequireWildcard(require("react-native-reanimated"));
var _EmojiPickerList = require("./EmojiPickerList");
var _useFetchReactions2 = require("./hooks/useFetchReactions");
var _ReactionButton = require("./ReactionButton");
var _contexts = require("../../contexts");
var _ComponentsContext = require("../../contexts/componentsContext/ComponentsContext");
var _MessageContext = require("../../contexts/messageContext/MessageContext");
var _MessagesContext = require("../../contexts/messagesContext/MessagesContext");
var _ThemeContext = require("../../contexts/themeContext/ThemeContext");
var _TranslationContext = require("../../contexts/translationContext/TranslationContext");
var _hooks = require("../../hooks");
var _theme = require("../../theme");
var _ui = require("../ui");
var _UIComponents = require("../UIComponents");
var _jsxRuntime = require("react/jsx-runtime");
var _jsxFileName = "/home/runner/work/stream-chat-react-native/stream-chat-react-native/package/src/components/MessageMenu/MessageUserReactions.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 ITEM_WIDTH = 60;
var getItemLayout = (_, index) => ({
length: ITEM_WIDTH,
offset: ITEM_WIDTH * index,
index
});
var sort = {
created_at: -1
};
var MessageUserReactionsSelectorItem = props => {
var Icon = props.Icon,
type = props.type,
onSelectReaction = props.onSelectReaction,
selectedReaction = props.selectedReaction,
count = props.count;
var SelectorIcon = (0, _react.useCallback)(({
...props
}) => (0, _jsxRuntime.jsx)(Icon, {
...props,
size: 16
}), [Icon]);
return (0, _jsxRuntime.jsx)(_ReactionButton.ReactionButton, {
Icon: SelectorIcon,
onPress: onSelectReaction,
selected: selectedReaction === type,
type: type,
count: count,
size: 'sm'
});
};
exports.MessageUserReactionsSelectorItem = MessageUserReactionsSelectorItem;
var renderSelectorItem = ({
index,
item
}) => (0, _jsxRuntime.jsx)(MessageUserReactionsSelectorItem, {
Icon: item.Icon,
onSelectReaction: item.onSelectReaction,
selectedReaction: item.selectedReaction,
type: item.type,
count: item.count
}, `${item.type}_${index}`);
var reactionsKeyExtractor = item => `${item.id}-${item.type}`;
var reactionSelectorKeyExtractor = item => item.type;
var MessageUserReactions = props => {
var styles = useStyles();
var _useState = (0, _react.useState)(false),
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
showMoreReactions = _useState2[0],
setShowMoreReactions = _useState2[1];
var message = props.message,
propReactions = props.reactions,
propSelectedReaction = props.selectedReaction,
propSupportedReactions = props.supportedReactions;
var selectorListRef = (0, _react.useRef)(null);
var _useBottomSheetContex = (0, _contexts.useBottomSheetContext)(),
close = _useBottomSheetContex.close;
var reactionTypes = (0, _react.useMemo)(() => Object.keys(message?.reaction_groups ?? {}), [message?.reaction_groups]);
var _useState3 = (0, _react.useState)(propSelectedReaction),
_useState4 = (0, _slicedToArray2.default)(_useState3, 2),
selectedReaction = _useState4[0],
setSelectedReaction = _useState4[1];
var _useMessagesContext = (0, _MessagesContext.useMessagesContext)(),
contextSupportedReactions = _useMessagesContext.supportedReactions;
var _useComponentsContext = (0, _ComponentsContext.useComponentsContext)(),
icons = _useComponentsContext.icons,
MessageUserReactionsItem = _useComponentsContext.MessageUserReactionsItem;
var _useMessageContext = (0, _MessageContext.useMessageContext)(),
handleReaction = _useMessageContext.handleReaction;
var supportedReactions = propSupportedReactions ?? contextSupportedReactions;
var onSelectReaction = (0, _hooks.useStableCallback)(reactionType => {
setSelectedReaction(currentReaction => currentReaction === reactionType ? undefined : reactionType);
});
(0, _react.useEffect)(() => {
if (selectedReaction && reactionTypes.length > 0 && !reactionTypes.includes(selectedReaction)) {
setSelectedReaction(undefined);
}
}, [reactionTypes, selectedReaction]);
var selectorReactions = (0, _react.useMemo)(() => reactionTypes.reduce((acc, reaction) => {
var reactionData = supportedReactions?.find(supportedReaction => supportedReaction.type === reaction);
if (reactionData) {
acc.push({
...reactionData,
onSelectReaction,
selectedReaction,
count: (message?.reaction_counts?.[reactionData.type] ?? 0).toString()
});
}
return acc;
}, []), [message?.reaction_counts, onSelectReaction, reactionTypes, selectedReaction, supportedReactions]);
var selectedIndex = (0, _react.useMemo)(() => {
if (!selectedReaction) {
return -1;
}
return selectorReactions.findIndex(reaction => reaction.type === selectedReaction);
}, [selectedReaction, selectorReactions]);
(0, _react.useEffect)(() => {
if (selectedIndex !== -1 && selectorListRef.current) {
selectorListRef.current?.scrollToIndex({
index: selectedIndex,
animated: true
});
}
}, [selectedIndex]);
var _useFetchReactions = (0, _useFetchReactions2.useFetchReactions)({
message,
reactionType: selectedReaction,
sort
}),
loading = _useFetchReactions.loading,
loadNextPage = _useFetchReactions.loadNextPage,
fetchedReactions = _useFetchReactions.reactions;
var _useTheme = (0, _ThemeContext.useTheme)(),
_useTheme$theme$messa = _useTheme.theme.messageMenu.userReactions,
container = _useTheme$theme$messa.container,
contentContainer = _useTheme$theme$messa.contentContainer,
flatlistContainer = _useTheme$theme$messa.flatlistContainer,
reactionSelectorContainer = _useTheme$theme$messa.reactionSelectorContainer,
reactionsText = _useTheme$theme$messa.reactionsText;
var _useTranslationContex = (0, _TranslationContext.useTranslationContext)(),
t = _useTranslationContex.t;
var totalReactionCount = (0, _react.useMemo)(() => Object.values(message?.reaction_counts ?? {}).reduce((acc, reactionCount) => acc + reactionCount, 0), [message?.reaction_counts]);
var reactions = (0, _react.useMemo)(() => propReactions || fetchedReactions.map(reaction => ({
id: reaction.user?.id,
image: reaction.user?.image,
name: reaction.user?.name,
type: reaction.type
})), [propReactions, fetchedReactions]);
var renderItem = (0, _react.useCallback)(({
item
}) => (0, _jsxRuntime.jsx)(MessageUserReactionsItem, {
reaction: item,
supportedReactions: supportedReactions ?? []
}), [MessageUserReactionsItem, supportedReactions]);
var handleSelectReaction = (0, _hooks.useStableCallback)(emoji => {
if (handleReaction) {
handleReaction(emoji);
}
close();
});
var onShowMoreReactionsPress = (0, _hooks.useStableCallback)(() => setShowMoreReactions(true));
var MoreEmojisIcon = (0, _react.useCallback)(props => (0, _jsxRuntime.jsx)(_reactNative.View, {
style: styles.showMoreReactionsButton,
children: (0, _jsxRuntime.jsx)(icons.MoreEmojis, {
...props
})
}), [icons, styles.showMoreReactionsButton]);
var ShowMoreReactionsButton = (0, _react.useCallback)(() => (0, _jsxRuntime.jsx)(_ui.Button, {
accessibilityLabel: 'more-reactions-button',
variant: 'secondary',
type: 'outline',
size: 'sm',
LeadingIcon: MoreEmojisIcon,
onPress: onShowMoreReactionsPress
}), [onShowMoreReactionsPress, MoreEmojisIcon]);
return (0, _jsxRuntime.jsx)(_reactNative.View, {
accessibilityLabel: "User Reactions on long press message",
style: [styles.container, container],
children: showMoreReactions ? (0, _jsxRuntime.jsx)(_reactNativeReanimated.default.View, {
entering: _reactNativeReanimated.FadeIn.duration(200),
exiting: _reactNativeReanimated.FadeOut.duration(200),
children: (0, _jsxRuntime.jsx)(_EmojiPickerList.EmojiPickerList, {
onSelectReaction: handleSelectReaction,
renderFullInitially: false
})
}, 'emoji-viewer') : (0, _jsxRuntime.jsxs)(_reactNativeReanimated.default.View, {
exiting: _reactNativeReanimated.FadeOut.duration(200),
children: [(0, _jsxRuntime.jsx)(_reactNative.Text, {
style: [styles.reactionsText, reactionsText],
children: t('{{count}} Reactions', {
count: totalReactionCount
})
}), (0, _jsxRuntime.jsx)(_reactNative.View, {
style: [styles.reactionSelectorContainer, reactionSelectorContainer],
children: (0, _jsxRuntime.jsx)(_reactNativeGestureHandler.FlatList, {
showsHorizontalScrollIndicator: false,
contentContainerStyle: [styles.contentContainer, contentContainer],
data: selectorReactions,
getItemLayout: getItemLayout,
horizontal: true,
keyExtractor: reactionSelectorKeyExtractor,
ListHeaderComponent: ShowMoreReactionsButton,
renderItem: renderSelectorItem,
ref: selectorListRef
})
}), !loading ? (0, _jsxRuntime.jsx)(_UIComponents.StreamBottomSheetModalFlatList, {
accessibilityLabel: "reaction-flat-list",
contentContainerStyle: [styles.flatListContainer, flatlistContainer],
data: reactions,
keyExtractor: reactionsKeyExtractor,
onEndReached: loadNextPage,
renderItem: renderItem
}) : null]
}, 'reaction-details')
});
};
exports.MessageUserReactions = MessageUserReactions;
var useStyles = () => {
var _useTheme2 = (0, _ThemeContext.useTheme)(),
semantics = _useTheme2.theme.semantics;
return (0, _react.useMemo)(() => _reactNative.StyleSheet.create({
container: {
flex: 1
},
contentContainer: {
flexGrow: 1,
gap: _theme.primitives.spacingXs,
paddingHorizontal: _theme.primitives.spacingMd,
paddingVertical: _theme.primitives.spacingSm
},
flatListContainer: {
justifyContent: 'center'
},
reactionSelectorContainer: {
flexDirection: 'row'
},
reactionsText: {
fontSize: _theme.primitives.typographyFontSizeMd,
fontWeight: _theme.primitives.typographyFontWeightSemiBold,
color: semantics.textPrimary,
paddingVertical: _theme.primitives.spacingSm,
textAlign: 'center'
},
showMoreReactionsButton: {
paddingHorizontal: _theme.primitives.spacingXs
}
}), [semantics.textPrimary]);
};
//# sourceMappingURL=MessageUserReactions.js.map