import { CustomComponentContext, createStyleSheet, useUIKitTheme } from '@gathertown/uikit-react-native-foundation';
import type { SendbirdBaseChannel, SendbirdBaseMessage, SendbirdReaction } from '@gathertown/uikit-utils';
import { getReactionCount } from '@gathertown/uikit-utils';
import React, { useContext } from 'react';
import { Pressable } from 'react-native';
import type { Emoji } from '@sendbird/chat';
import { Reaction } from '@sendbird/chat/message';
import { DEFAULT_LONG_PRESS_DELAY, UNKNOWN_USER_ID } from '../../constants';
import { useReaction, useSendbirdChat } from '../../hooks/useContext';
import ReactionRoundedButton from './ReactionRoundedButton';
const NUM_COL = 4;
const REACTION_MORE_KEY = 'reaction-more-button';
const getUserReacted = (reaction: SendbirdReaction, userId = UNKNOWN_USER_ID) => {
return reaction.userIds.indexOf(userId) > -1;
};
const createOnPressReaction = (
reaction: SendbirdReaction,
channel: SendbirdBaseChannel,
message: SendbirdBaseMessage,
reacted: boolean,
) => {
return () => {
if (reacted) {
return channel.deleteReaction(message, reaction.key);
} else {
return channel.addReaction(message, reaction.key);
}
};
};
const createReactionButtons = (
channel: SendbirdBaseChannel,
message: SendbirdBaseMessage,
getEmoji: (key: string) => Emoji,
emojiLimit: number,
onOpenReactionList: () => void,
onOpenReactionUserList: (focusIndex: number) => void,
currentUserId?: string,
) => {
const reactions = message.reactions ?? [];
const buttons = reactions.map((reaction, index) => {
const isNotLastOfRow = index % NUM_COL !== NUM_COL - 1;
const isNotLastOfCol = index < NUM_COL && reactions.length >= NUM_COL;
return (
onOpenReactionUserList(index)}
delayLongPress={DEFAULT_LONG_PRESS_DELAY}
>
{({ pressed }) => (
)}
);
});
if (buttons.length < emojiLimit) {
buttons.push(
{({ pressed }) => }
,
);
}
return buttons;
};
const MessageReactionAddon = ({ channel, message }: { channel: SendbirdBaseChannel; message: SendbirdBaseMessage }) => {
const { colors } = useUIKitTheme();
const { emojiManager, currentUser } = useSendbirdChat();
const { openReactionList, openReactionUserList } = useReaction();
const ctx = useContext(CustomComponentContext);
if (!message.reactions?.length) return null;
if (ctx?.renderMessageReactionsRenderProp) {
return ctx.renderMessageReactionsRenderProp({
message,
getEmoji: (key) => emojiManager.allEmojiMap[key],
currentUserId: currentUser?.userId,
openReactionUserList: (focusIndex: number) => openReactionUserList({ channel, message, focusIndex }),
onReactionPress: (reaction: Reaction) =>
createOnPressReaction(reaction, channel, message, getUserReacted(reaction, currentUser?.userId))(),
});
}
const reactionButtons = createReactionButtons(
channel,
message,
(key) => emojiManager.allEmojiMap[key],
emojiManager.allEmoji.length,
() => openReactionList({ channel, message }),
(focusIndex) => openReactionUserList({ channel, message, focusIndex }),
currentUser?.userId,
);
return (
{reactionButtons}
);
};
const styles = createStyleSheet({
reactionContainer: {
alignItems: 'stretch',
flexDirection: 'row',
flexWrap: 'wrap',
padding: 8,
borderRadius: 16,
borderWidth: 1,
},
marginRight: {
marginRight: 4.5,
},
marginBottom: {
marginBottom: 4,
},
});
export default MessageReactionAddon;