|
import Picker from "@emoji-mart/react"; |
|
import data from "@emoji-mart/data"; |
|
import { FC } from "react"; |
|
import { useMediaQuery } from "react-responsive"; |
|
|
|
const emojis = (data as unknown as any).emojis as { [key: string]: EmojiSkin }; |
|
export interface EmojiData { |
|
id: string; |
|
name: string; |
|
native: string; |
|
unified: string; |
|
keywords: string[]; |
|
shortcodes: string; |
|
skin: number; |
|
aliases: string[]; |
|
} |
|
|
|
const exceptEmojis = [ |
|
"bat", |
|
"feet", |
|
"coral", |
|
"snail", |
|
"bug", |
|
"ant", |
|
"bee", |
|
"beetle", |
|
"ladybug", |
|
"cricket", |
|
"cockroach", |
|
"spider", |
|
"scorpion", |
|
"mosquito", |
|
"fly", |
|
"worm", |
|
"microbe", |
|
"gorilla", |
|
"orangutan", |
|
"tiger2", |
|
"leopard", |
|
"zebra_face", |
|
"pig_nose", |
|
"camel", |
|
"black_cat", |
|
"water_buffalo", |
|
"rat", |
|
"spider_web", |
|
"service_dog", |
|
"mammoth", |
|
"frog", |
|
"crocodile", |
|
"lizard", |
|
"snake", |
|
"t-rex", |
|
"dragon", |
|
"empty_nest", |
|
"octopus", |
|
"ox", |
|
"wolf", |
|
"headstone", |
|
"moyai", |
|
"new_moon", |
|
"new_moon_with_face", |
|
"shrimp", |
|
"lobster", |
|
"fried_shrimp", |
|
"coffin", |
|
"drop_of_blood", |
|
"pinata", |
|
"performing_arts", |
|
"rock", |
|
"clubs", |
|
"chess_pawn", |
|
"spades", |
|
"knot", |
|
"bathtub", |
|
"shower", |
|
"white_flower", |
|
"hammer", |
|
"nazar_amulet", |
|
"hamsa", |
|
"hammer_and_wrench", |
|
"squid", |
|
"crab", |
|
"smoking", |
|
"dna", |
|
"musical_score", |
|
"musical_note", |
|
"notes", |
|
"dark_sunglasses", |
|
"kaaba", |
|
"old_key", |
|
"bikini", |
|
"one-piece_swimsuit", |
|
"sari", |
|
"sloth", |
|
"x-ray", |
|
]; |
|
|
|
interface EmojiSkin { |
|
id: string; |
|
name: string; |
|
keywords: string[]; |
|
skins: { native: string; shortcodes: string; unified: string }[]; |
|
} |
|
|
|
const categoryIcons = { |
|
categoryIcons: { |
|
"new-people": { |
|
svg: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path d="M57.89 397.2c-6.262-8.616-16.02-13.19-25.92-13.19c-23.33 0-31.98 20.68-31.98 32.03c0 6.522 1.987 13.1 6.115 18.78l46.52 64C58.89 507.4 68.64 512 78.55 512c23.29 0 31.97-20.66 31.97-32.03c0-6.522-1.988-13.1-6.115-18.78L57.89 397.2zM496.1 352c-44.13 0-79.72 35.75-79.72 80s35.59 80 79.72 80s79.91-35.75 79.91-80S540.2 352 496.1 352zM640 99.38c0-13.61-4.133-27.34-12.72-39.2l-23.63-32.5c-13.44-18.5-33.77-27.68-54.12-27.68c-13.89 0-27.79 4.281-39.51 12.8L307.8 159.7C262.2 192.8 220.4 230.9 183.4 273.4c-24.22 27.88-59.18 63.99-103.5 99.63l56.34 77.52c53.79-35.39 99.15-55.3 127.1-67.27c51.88-22 101.3-49.87 146.9-82.1l202.3-146.7C630.5 140.4 640 120 640 99.38z"/></svg>', |
|
}, |
|
}, |
|
}; |
|
const custom = [ |
|
{ |
|
id: "recommend", |
|
name: "Recommend", |
|
emojis: [ |
|
emojis["baby_chick"], |
|
emojis["hatched_chick"], |
|
emojis["dog"], |
|
emojis["fox_face"], |
|
emojis["lion_face"], |
|
emojis["tiger"], |
|
emojis["hamster"], |
|
emojis["panda_face"], |
|
emojis["rabbit"], |
|
emojis["polar_bear"], |
|
emojis["tangerine"], |
|
emojis["watermelon"], |
|
emojis["pineapple"], |
|
emojis["beer"], |
|
emojis["curry"], |
|
emojis["cake"], |
|
emojis["snow_capped_mountain"], |
|
emojis["volcano"], |
|
emojis["bridge_at_night"], |
|
emojis["kiwifruit"], |
|
emojis["stadium"], |
|
emojis["foggy"], |
|
emojis["night_with_stars"], |
|
emojis["cityscape"], |
|
emojis["sunrise_over_mountains"], |
|
emojis["sunrise"], |
|
emojis["city_sunset"], |
|
emojis["city_sunrise"], |
|
], |
|
}, |
|
{ |
|
id: "new-people", |
|
name: "People", |
|
emojis: [ |
|
emojis["child"], |
|
emojis["boy"], |
|
emojis["girl"], |
|
emojis["adult"], |
|
emojis["person_with_blond_hair"], |
|
emojis["man"], |
|
emojis["bearded_person"], |
|
emojis["man_with_beard"], |
|
emojis["woman_with_beard"], |
|
emojis["red_haired_man"], |
|
emojis["curly_haired_man"], |
|
emojis["white_haired_man"], |
|
emojis["bald_man"], |
|
emojis["woman"], |
|
emojis["red_haired_woman"], |
|
emojis["red_haired_person"], |
|
emojis["curly_haired_woman"], |
|
emojis["curly_haired_person"], |
|
emojis["white_haired_woman"], |
|
emojis["white_haired_person"], |
|
emojis["bald_woman"], |
|
emojis["bald_person"], |
|
emojis["blond-haired-woman"], |
|
emojis["blond-haired-man"], |
|
emojis["older_adult"], |
|
emojis["older_man"], |
|
emojis["older_woman"], |
|
emojis["person_frowning"], |
|
emojis["man-frowning"], |
|
emojis["woman-frowning"], |
|
emojis["person_with_pouting_face"], |
|
emojis["man-pouting"], |
|
emojis["woman-pouting"], |
|
emojis["health_worker"], |
|
emojis["male-doctor"], |
|
emojis["female-doctor"], |
|
emojis["student"], |
|
emojis["male-student"], |
|
emojis["female-student"], |
|
emojis["teacher"], |
|
emojis["male-teacher"], |
|
emojis["female-teacher"], |
|
emojis["judge"], |
|
emojis["male-judge"], |
|
emojis["female-judge"], |
|
emojis["farmer"], |
|
emojis["male-farmer"], |
|
emojis["female-farmer"], |
|
emojis["cook"], |
|
emojis["male-cook"], |
|
emojis["female-cook"], |
|
emojis["mechanic"], |
|
emojis["male-mechanic"], |
|
emojis["female-mechanic"], |
|
emojis["office_worker"], |
|
emojis["male-office-worker"], |
|
emojis["female-office-worker"], |
|
emojis["scientist"], |
|
emojis["male-scientist"], |
|
emojis["female-scientist"], |
|
emojis["technologist"], |
|
emojis["male-technologist"], |
|
emojis["female-technologist"], |
|
emojis["artist"], |
|
emojis["male-artist"], |
|
emojis["female-artist"], |
|
emojis["astronaut"], |
|
emojis["male-astronaut"], |
|
emojis["female-astronaut"], |
|
emojis["sleuth_or_spy"], |
|
emojis["male-detective"], |
|
emojis["female-detective"], |
|
emojis["construction_worker"], |
|
emojis["male-construction-worker"], |
|
emojis["female-construction-worker"], |
|
emojis["person_with_crown"], |
|
emojis["prince"], |
|
emojis["princess"], |
|
emojis["person_in_tuxedo"], |
|
emojis["man_in_tuxedo"], |
|
emojis["woman_in_tuxedo"], |
|
emojis["bride_with_veil"], |
|
emojis["man_with_veil"], |
|
emojis["woman_with_veil"], |
|
], |
|
}, |
|
]; |
|
export const EmojiSelector: FC<{ onSelect: (e: EmojiData) => void }> = ({ |
|
onSelect, |
|
}) => { |
|
const isSmallScreen = useMediaQuery({ query: "(max-width: 768px)" }); |
|
|
|
return ( |
|
<Picker |
|
exceptEmojis={exceptEmojis} |
|
dynamicWidth={true} |
|
custom={custom} |
|
categories={[ |
|
"recommend", |
|
"new-people", |
|
"nature", |
|
"foods", |
|
"activity", |
|
"places", |
|
"objects", |
|
]} |
|
theme="dark" |
|
categoryIcons={categoryIcons} |
|
searchPosition={isSmallScreen ? "none" : "bottom"} |
|
navPosition={isSmallScreen ? "none" : "top"} |
|
previewPosition={isSmallScreen ? "none" : "bottom"} |
|
data={data} |
|
onEmojiSelect={onSelect} |
|
/> |
|
); |
|
}; |
|
|