tryemoji / src /components /emoji-selector.tsx
yadongxie's picture
feat: add web
89682f8
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}
/>
);
};