Skip to content

Commit b021c59

Browse files
authored
Merge pull request #219 from sendbird/fix/emoji-fallback
fix: add emoji fallback icon
2 parents d981ebe + 3d30123 commit b021c59

File tree

4 files changed

+35
-15
lines changed

4 files changed

+35
-15
lines changed

packages/uikit-react-native/src/components/ReactionAddons/MessageReactionAddon.tsx

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import React from 'react';
2-
import { Pressable } from 'react-native';
2+
import { ImageProps, Pressable } from 'react-native';
33

4-
import type { Emoji } from '@sendbird/chat';
54
import { createStyleSheet, useUIKitTheme } from '@sendbird/uikit-react-native-foundation';
65
import { useForceUpdate, useGroupChannelHandler } from '@sendbird/uikit-tools';
76
import type { SendbirdBaseChannel, SendbirdBaseMessage, SendbirdReaction } from '@sendbird/uikit-utils';
@@ -33,7 +32,7 @@ const createOnPressReaction = (
3332
const createReactionButtons = (
3433
channel: SendbirdBaseChannel,
3534
message: SendbirdBaseMessage,
36-
getEmoji: (key: string) => Emoji,
35+
getIconSource: (reactionKey: string) => ImageProps['source'],
3736
emojiLimit: number,
3837
onOpenReactionList: () => void,
3938
onOpenReactionUserList: (focusIndex: number) => void,
@@ -52,7 +51,7 @@ const createReactionButtons = (
5251
>
5352
{({ pressed }) => (
5453
<ReactionRoundedButton
55-
url={getEmoji(reaction.key).url}
54+
source={getIconSource(reaction.key)}
5655
count={getReactionCount(reaction)}
5756
reacted={pressed || reaction.hasCurrentUserReacted}
5857
style={
@@ -104,7 +103,10 @@ const MessageReactionAddon = ({
104103
const reactionButtons = createReactionButtons(
105104
channel,
106105
message,
107-
(key) => emojiManager.allEmojiMap[key],
106+
(reactionKey) => {
107+
const emoji = emojiManager.allEmojiMap[reactionKey];
108+
return emojiManager.getEmojiIconSource(emoji);
109+
},
108110
emojiManager.allEmoji.length,
109111
() => openReactionList({ channel, message }),
110112
(focusIndex) => openReactionUserList({ channel, message, focusIndex }),

packages/uikit-react-native/src/components/ReactionAddons/ReactionRoundedButton.tsx

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
11
import React from 'react';
2-
import { StyleProp, View, ViewStyle } from 'react-native';
2+
import { ImageProps, StyleProp, View, ViewStyle } from 'react-native';
33

44
import { Icon, Image, Text, createStyleSheet, useUIKitTheme } from '@sendbird/uikit-react-native-foundation';
55
import { truncatedCount } from '@sendbird/uikit-utils';
66

77
type Props = {
8-
url: string;
8+
source: ImageProps['source'];
99
count: number;
1010
reacted: boolean;
1111
style: StyleProp<ViewStyle>;
12+
/**
13+
* @deprecated Please use `source` instead
14+
* */
15+
url?: string;
1216
};
1317

14-
const ReactionRoundedButton = ({ url, count, reacted, style }: Props) => {
18+
const ReactionRoundedButton = ({ source, count, reacted, style, url }: Props) => {
1519
const { colors } = useUIKitTheme();
1620
const color = colors.ui.reaction.rounded;
1721

@@ -23,7 +27,7 @@ const ReactionRoundedButton = ({ url, count, reacted, style }: Props) => {
2327
style,
2428
]}
2529
>
26-
<Image source={{ uri: url }} style={styles.emoji} />
30+
<Image source={source ? source : { uri: url }} style={styles.emoji} />
2731
<Text caption4 color={colors.onBackground01} numberOfLines={1} style={styles.count}>
2832
{truncatedCount(count, 99, '')}
2933
</Text>

packages/uikit-react-native/src/components/ReactionBottomSheets/ReactionUserListBottomSheet.tsx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,13 @@ import {
1010
createStyleSheet,
1111
useUIKitTheme,
1212
} from '@sendbird/uikit-react-native-foundation';
13-
import { SendbirdReaction, getReactionCount, truncatedCount, useSafeAreaPadding } from '@sendbird/uikit-utils';
13+
import {
14+
SendbirdEmoji,
15+
SendbirdReaction,
16+
getReactionCount,
17+
truncatedCount,
18+
useSafeAreaPadding,
19+
} from '@sendbird/uikit-utils';
1420

1521
import type { ReactionBottomSheetProps } from './index';
1622

@@ -81,7 +87,7 @@ const ReactionUserListBottomSheet = ({
8187
{reactions.map((reaction, index) => {
8288
const isFocused = focusedReaction?.key === reaction.key;
8389
const isLastItem = reactions.length - 1 === index;
84-
const emoji = emojiManager.allEmojiMap[reaction.key];
90+
const emoji = emojiManager.allEmojiMap[reaction.key] as SendbirdEmoji | undefined;
8591

8692
return (
8793
<Pressable
@@ -102,7 +108,7 @@ const ReactionUserListBottomSheet = ({
102108
}
103109
}}
104110
>
105-
<Image source={{ uri: emoji.url }} style={styles.tabEmoji} />
111+
<Image source={emojiManager.getEmojiIconSource(emoji)} style={styles.tabEmoji} />
106112
<Text button color={isFocused ? color.selected.highlight : color.enabled.highlight}>
107113
{truncatedCount(getReactionCount(reaction))}
108114
</Text>

packages/uikit-react-native/src/libs/EmojiManager.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
import { ImageProps } from 'react-native';
2+
3+
import { Icon } from '@sendbird/uikit-react-native-foundation';
14
import type { SendbirdEmoji, SendbirdEmojiCategory, SendbirdEmojiContainer } from '@sendbird/uikit-utils';
25

36
import type { AsyncLocalCacheStorage } from '../types';
@@ -22,7 +25,8 @@ class MemoryStorage implements AsyncLocalCacheStorage {
2225
this._data[key] = value;
2326
}
2427
}
25-
28+
type EmojiCategoryId = string;
29+
type EmojiKey = string;
2630
class EmojiManager {
2731
static key = 'sendbird-uikit@emoji-manager';
2832

@@ -45,12 +49,12 @@ class EmojiManager {
4549
},
4650
};
4751

48-
private _emojiCategoryMap: Record<string, SendbirdEmojiCategory> = {};
52+
private _emojiCategoryMap: Record<EmojiCategoryId, SendbirdEmojiCategory> = {};
4953
public get emojiCategoryMap() {
5054
return this._emojiCategoryMap;
5155
}
5256

53-
private _allEmojiMap: Record<string, SendbirdEmoji> = {};
57+
private _allEmojiMap: Record<EmojiKey, SendbirdEmoji> = {};
5458
public get allEmojiMap() {
5559
return this._allEmojiMap;
5660
}
@@ -60,6 +64,10 @@ class EmojiManager {
6064
return this._allEmoji;
6165
}
6266

67+
public getEmojiIconSource(emoji?: SendbirdEmoji | null | undefined): ImageProps['source'] {
68+
return emoji?.url ? { uri: emoji.url } : Icon.Assets.question;
69+
}
70+
6371
public init = async (emojiContainer?: SendbirdEmojiContainer) => {
6472
if (emojiContainer) await this.emojiStorage.set(emojiContainer);
6573

0 commit comments

Comments
 (0)