Files
Pranav MeneandGitHub db338e6fb8 feat(mobile): new Emoji Picker (#1551)
* feat: add emoji-picker

* feat: add custom emoji icon

* remove: delete utils file

* fix: side-effect in QuickReactions

* feat: add new category icons

* remove: CATEGORIES import

* fix: Replace useEffect with useMemo for JSON data processing

* remove: console from MessageReactions
2025-03-28 21:02:39 +05:30

52 lines
1.6 KiB
TypeScript

import { View } from "react-native";
import Picker, { CustomEmoji, Emoji } from "./Picker";
import { useFrappeGetCall } from "frappe-react-sdk";
import { RavenCustomEmoji } from "@raven/types/RavenMessaging/RavenCustomEmoji";
import { useMemo } from "react";
interface EmojiPickerProps {
onReact: (emoji: Emoji) => void;
allowCustomEmojis?: boolean;
}
const EmojiPicker = ({ onReact, allowCustomEmojis = true }: EmojiPickerProps) => {
const { data, mutate, error, isLoading } = useFrappeGetCall<{ message: RavenCustomEmoji[] }>(
"frappe.client.get_list", {
doctype: "Raven Custom Emoji",
fields: ["name", "image", "keywords"],
limit: 1000,
}, allowCustomEmojis ? 'custom-emojis' : null, {
revalidateOnFocus: false,
revalidateIfStale: false,
revalidateOnReconnect: false
});
const customEmojis = useMemo(() => {
if (!allowCustomEmojis || !data) {
return [];
}
return [{
id: "Custom",
name: "Custom",
emojis: data.message.map((emoji) => ({
id: emoji.name,
name: emoji.name,
keywords: emoji.keywords?.split(",") || [],
skins: [{ src: emoji.image }],
})),
}];
}, [data, allowCustomEmojis]);
return (
<View className="flex-1 px-3">
<Picker
customEmojis={customEmojis as CustomEmoji[]}
onSelect={onReact}
perLine={9}
/>
</View>
);
};
export default EmojiPicker;