From 1671899bfdb84c301e97182a2cbd4a668d09d30d Mon Sep 17 00:00:00 2001 From: Antoine Jaussoin Date: Sun, 27 Mar 2022 20:17:22 +0100 Subject: [PATCH] Replace the column icons by emojis (#379) --- .github/workflows/alpha.yml | 2 +- backend/package.json | 1 + backend/src/common/types.ts | 22 +---- backend/src/db/entities/ColumnDefinition.ts | 10 +-- .../migrations/1648400473646-MigrateEmojis.ts | 51 +++++++++++ frontend/package.json | 2 + frontend/src/common/types.ts | 22 +---- frontend/src/components/Icon/Icon.tsx | 18 ++++ frontend/src/components/Icon/IconInner.tsx | 10 +++ frontend/src/index.tsx | 1 + frontend/src/state/columns.ts | 34 ++++---- frontend/src/state/icons.tsx | 87 ------------------- frontend/src/state/types.ts | 4 +- frontend/src/views/game/board/Board.tsx | 7 +- frontend/src/views/game/board/Column.tsx | 13 ++- .../summary/__tests__/SummaryMode.test.tsx | 4 +- .../sections/template/ColumnEditor.tsx | 14 +-- .../sections/template/IconPicker.tsx | 70 ++++++++------- frontend/yarn.lock | 31 +++++-- 19 files changed, 194 insertions(+), 209 deletions(-) create mode 100644 backend/src/db/migrations/1648400473646-MigrateEmojis.ts create mode 100644 frontend/src/components/Icon/Icon.tsx create mode 100644 frontend/src/components/Icon/IconInner.tsx delete mode 100644 frontend/src/state/icons.tsx diff --git a/.github/workflows/alpha.yml b/.github/workflows/alpha.yml index 17429480d..173e9b814 100644 --- a/.github/workflows/alpha.yml +++ b/.github/workflows/alpha.yml @@ -2,7 +2,7 @@ name: 'Alpha Build' on: push: - branches: [v4120/node-fetch] + branches: [v4140/emoji] jobs: build: diff --git a/backend/package.json b/backend/package.json index 9f792a48f..fc05b7b8e 100644 --- a/backend/package.json +++ b/backend/package.json @@ -7,6 +7,7 @@ "build": "rimraf dist && tsc --build", "start": "nodemon --exec 'yarn fix & ts-node' --files ./src/index.ts", "create-migration": "ts-node ./node_modules/typeorm/cli.js --config src/db/orm-config.ts migration:generate -n ", + "create-empty-migration": "ts-node ./node_modules/typeorm/cli.js --config src/db/orm-config.ts migration:create -n ", "migrate": "ts-node ./node_modules/typeorm/cli.js --config src/db/orm-config.ts migration:run", "revert": "ts-node ./node_modules/typeorm/cli.js --config src/db/orm-config.ts migration:revert", "lint": "eslint 'src/**/*.ts'", diff --git a/backend/src/common/types.ts b/backend/src/common/types.ts index d7c0d9731..6812799f3 100644 --- a/backend/src/common/types.ts +++ b/backend/src/common/types.ts @@ -43,7 +43,7 @@ export interface ColumnDefinition extends Entity { index: number; label: string; color: string; - icon: IconName | null; + icon: string | null; } export interface SessionOptions { @@ -222,26 +222,6 @@ export type ColumnDefinitionType = | 'wind' | 'rock'; -export type IconName = - | 'satisfied' - | 'disatisfied' - | 'sunny' - | 'announcement' - | 'file' - | 'money' - | 'renew' - | 'play' - | 'pause' - | 'fast-forward' - | 'liked' - | 'books' - | 'help' - | 'cocktail' - | 'link' - | 'boat' - | 'fitness' - | 'gesture'; - export type StripeLocales = | 'ar-AR' | 'da-DK' diff --git a/backend/src/db/entities/ColumnDefinition.ts b/backend/src/db/entities/ColumnDefinition.ts index cece958b9..878c9c6a8 100644 --- a/backend/src/db/entities/ColumnDefinition.ts +++ b/backend/src/db/entities/ColumnDefinition.ts @@ -7,7 +7,7 @@ import { UpdateDateColumn, Index, } from 'typeorm'; -import { IconName, ColumnDefinition, ColumnDefinitionType } from '../../common'; +import { ColumnDefinition, ColumnDefinitionType } from '../../common'; import SessionEntity from './Session'; import SessionTemplateEntity from './SessionTemplate'; @@ -23,7 +23,7 @@ class ColumnDefinitionEntityBase { @Column() public color: string; @Column({ nullable: true, type: 'character varying' }) - public icon: IconName | null; + public icon: string | null; @CreateDateColumn({ type: 'timestamp with time zone' }) public created: Date | undefined; @UpdateDateColumn({ type: 'timestamp with time zone' }) @@ -46,7 +46,7 @@ class ColumnDefinitionEntityBase { index: number, label: string, color: string, - icon?: IconName | null + icon?: string | null ) { this.id = id; this.type = type; @@ -69,7 +69,7 @@ export class ColumnDefinitionEntity extends ColumnDefinitionEntityBase { index: number, label: string, color: string, - icon?: IconName | null + icon?: string | null ) { super(id, type, index, label, color, icon); this.session = session; @@ -88,7 +88,7 @@ export class TemplateColumnDefinitionEntity extends ColumnDefinitionEntityBase { index: number, label: string, color: string, - icon?: IconName | null + icon?: string | null ) { super(id, type, index, label, color, icon); this.template = template; diff --git a/backend/src/db/migrations/1648400473646-MigrateEmojis.ts b/backend/src/db/migrations/1648400473646-MigrateEmojis.ts new file mode 100644 index 000000000..19e7d5db9 --- /dev/null +++ b/backend/src/db/migrations/1648400473646-MigrateEmojis.ts @@ -0,0 +1,51 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +type Mapping = { + from: string; + to: string; +}; + +const mappings: Mapping[] = [ + { from: 'satisfied', to: 'grinning' }, + { from: 'disatisfied', to: 'unamused' }, + { from: 'sunny', to: 'sunny' }, + { from: 'announcement', to: 'loudspeaker' }, + { from: 'file', to: 'paperclip' }, + { from: 'money', to: 'dollar' }, + { from: 'renew', to: 'arrows_clockwise' }, + { from: 'play', to: 'arrow_forward' }, + { from: 'pause', to: 'black_square_for_stop' }, + { from: 'fast-forward', to: 'fast_forward' }, + { from: 'liked', to: 'thumbsup' }, + { from: 'books', to: 'book' }, + { from: 'help', to: 'question' }, + { from: 'cocktail', to: 'desert_island' }, + { from: 'boat', to: 'motor_boat' }, + { from: 'link', to: 'linked_paperclips' }, + { from: 'gesture', to: 'wind_blowing_face' }, + { from: 'fitness', to: 'moyai' }, +]; + +export class MigrateEmojis1648400473646 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + for (const mapping of mappings) { + await queryRunner.query( + `UPDATE templates_columns SET icon = '${mapping.to}' WHERE icon = '${mapping.from}';` + ); + await queryRunner.query( + `UPDATE columns SET icon = '${mapping.to}' WHERE icon = '${mapping.from}';` + ); + } + } + + public async down(queryRunner: QueryRunner): Promise { + for (const mapping of mappings) { + await queryRunner.query( + `UPDATE templates_columns SET icon = '${mapping.from}' WHERE icon = '${mapping.to}';` + ); + await queryRunner.query( + `UPDATE columns SET icon = '${mapping.from}' WHERE icon = '${mapping.to}';` + ); + } + } +} diff --git a/frontend/package.json b/frontend/package.json index b71d937b7..06889c7db 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -18,6 +18,7 @@ "@testing-library/react": "12.1.4", "@testing-library/react-hooks": "7.0.2", "@types/crypto-js": "4.1.1", + "@types/emoji-mart": "^3.0.9", "@types/jest": "27.4.1", "@types/lodash": "4.14.180", "@types/md5": "2.3.2", @@ -36,6 +37,7 @@ "core-js": "3.21.1", "crypto-js": "4.1.1", "date-fns": "2.28.0", + "emoji-mart": "^3.0.1", "flag-icons": "6.1.1", "http-proxy-middleware": "2.0.4", "isemail": "3.2.0", diff --git a/frontend/src/common/types.ts b/frontend/src/common/types.ts index d7c0d9731..6812799f3 100644 --- a/frontend/src/common/types.ts +++ b/frontend/src/common/types.ts @@ -43,7 +43,7 @@ export interface ColumnDefinition extends Entity { index: number; label: string; color: string; - icon: IconName | null; + icon: string | null; } export interface SessionOptions { @@ -222,26 +222,6 @@ export type ColumnDefinitionType = | 'wind' | 'rock'; -export type IconName = - | 'satisfied' - | 'disatisfied' - | 'sunny' - | 'announcement' - | 'file' - | 'money' - | 'renew' - | 'play' - | 'pause' - | 'fast-forward' - | 'liked' - | 'books' - | 'help' - | 'cocktail' - | 'link' - | 'boat' - | 'fitness' - | 'gesture'; - export type StripeLocales = | 'ar-AR' | 'da-DK' diff --git a/frontend/src/components/Icon/Icon.tsx b/frontend/src/components/Icon/Icon.tsx new file mode 100644 index 000000000..54332ad27 --- /dev/null +++ b/frontend/src/components/Icon/Icon.tsx @@ -0,0 +1,18 @@ +import { lazy, Suspense } from 'react'; + +const IconInner = lazy( + () => import('./IconInner' /* webpackChunkName: "icon" */) +); + +type IconProps = { + icon: string | null; + size?: number; +}; + +export default function Icon(props: IconProps) { + return ( + }> + + + ); +} diff --git a/frontend/src/components/Icon/IconInner.tsx b/frontend/src/components/Icon/IconInner.tsx new file mode 100644 index 000000000..911195bb7 --- /dev/null +++ b/frontend/src/components/Icon/IconInner.tsx @@ -0,0 +1,10 @@ +import { Emoji } from 'emoji-mart'; + +type IconProps = { + icon: string | null; + size?: number; +}; + +export default function IconInner({ icon, size }: IconProps) { + return ; +} diff --git a/frontend/src/index.tsx b/frontend/src/index.tsx index 202e801e9..b0f05ac78 100644 --- a/frontend/src/index.tsx +++ b/frontend/src/index.tsx @@ -4,6 +4,7 @@ import ReactDOM from 'react-dom'; import App from './App'; import { initialiseAnalytics, initialiseSentry } from './track'; import * as serviceWorker from './serviceWorker'; +import 'emoji-mart/css/emoji-mart.css'; (window as any).global = window; // @ts-ignore diff --git a/frontend/src/state/columns.ts b/frontend/src/state/columns.ts index 1608de313..ddfbc15f4 100644 --- a/frontend/src/state/columns.ts +++ b/frontend/src/state/columns.ts @@ -1,4 +1,4 @@ -import { ColumnDefinition, IconName, ColumnDefinitionType } from 'common'; +import { ColumnDefinition, ColumnDefinitionType } from 'common'; import { Translation } from '../translations'; import { v4 } from 'uuid'; import keyBy from 'lodash/keyBy'; @@ -39,7 +39,7 @@ export function extrapolate( return { color: colDef.color || defaultDef.color, label: colDef.label || defaultDef.label, - icon: (colDef.icon as IconName | null) || defaultDef.icon, + icon: (colDef.icon as string | null) || defaultDef.icon, type: colDef.type, }; } @@ -60,19 +60,19 @@ export const getTemplateColumnByType = [ { color: '#D1C4E9', - icon: 'help', + icon: 'question', label: translations.PostBoard.customQuestion, type: 'custom', }, { color: '#E8F5E9', - icon: 'satisfied', + icon: 'grinning', label: translations.PostBoard.wellQuestion, type: 'well', }, { color: '#FFEBEE', - icon: 'disatisfied', + icon: 'unamused', label: translations.PostBoard.notWellQuestion, type: 'notWell', }, @@ -84,73 +84,73 @@ export const getTemplateColumnByType = }, { color: '#E8F5E9', - icon: 'play', + icon: 'arrow_forward', label: translations.PostBoard.startQuestion, type: 'start', }, { color: '#FFEBEE', - icon: 'pause', + icon: 'black_square_for_stop', label: translations.PostBoard.stopQuestion, type: 'stop', }, { color: '#BBDEFB', - icon: 'fast-forward', + icon: 'fast_forward', label: translations.PostBoard.continueQuestion, type: 'continue', }, { color: '#E8F5E9', - icon: 'liked', + icon: 'thumbsup', label: translations.PostBoard.likedQuestion, type: 'liked', }, { color: '#FFEBEE', - icon: 'disatisfied', + icon: 'unamused', label: translations.PostBoard.learnedQuestion, type: 'learned', }, { color: '#BBDEFB', - icon: 'help', + icon: 'question', label: translations.PostBoard.lackedQuestion, type: 'lacked', }, { color: '#E1BEE7', - icon: 'cocktail', + icon: 'desert_island', label: translations.PostBoard.longedForQuestion, type: 'longedFor', }, { color: '#E8F5E9', - icon: 'link', + icon: 'linked_paperclips', label: translations.PostBoard.anchorQuestion, type: 'anchor', }, { color: '#FFEBEE', - icon: 'boat', + icon: 'motor_boat', label: translations.PostBoard.boatQuestion, type: 'cargo', }, { color: '#BBDEFB', - icon: 'cocktail', + icon: 'desert_island', label: translations.PostBoard.islandQuestion, type: 'island', }, { color: '#E1BEE7', - icon: 'gesture', + icon: 'wind_blowing_face', label: translations.PostBoard.windQuestion, type: 'wind', }, { color: '#FFE0B2', - icon: 'fitness', + icon: 'moyai', label: translations.PostBoard.rockQuestion, type: 'rock', }, diff --git a/frontend/src/state/icons.tsx b/frontend/src/state/icons.tsx deleted file mode 100644 index 39be76337..000000000 --- a/frontend/src/state/icons.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import { - SentimentSatisfied, - SentimentVeryDissatisfied, - WbSunny, - Announcement, - AttachFile, - AttachMoney, - Autorenew, - PlayArrow, - FastForward, - Pause, - ThumbUpAlt, - LocalLibrary, - LiveHelp, - LocalBar, - Link, - DirectionsBoat, - Gesture, - FitnessCenter, -} from '@mui/icons-material'; -import { IconName } from 'common'; - -export function getIcon(name: IconName | null): React.ComponentType | null { - switch (name) { - case 'satisfied': - return SentimentSatisfied; - case 'disatisfied': - return SentimentVeryDissatisfied; - case 'sunny': - return WbSunny; - case 'announcement': - return Announcement; - case 'file': - return AttachFile; - case 'money': - return AttachMoney; - case 'renew': - return Autorenew; - case 'play': - return PlayArrow; - case 'pause': - return Pause; - case 'fast-forward': - return FastForward; - case 'liked': - return ThumbUpAlt; - case 'books': - return LocalLibrary; - case 'help': - return LiveHelp; - case 'cocktail': - return LocalBar; - case 'boat': - return DirectionsBoat; - case 'link': - return Link; - case 'gesture': - return Gesture; - case 'fitness': - return FitnessCenter; - default: - return null; - } -} - -export function getAllIcons(): IconName[] { - return [ - 'satisfied', - 'disatisfied', - 'sunny', - 'announcement', - 'file', - 'money', - 'renew', - 'play', - 'pause', - 'fast-forward', - 'liked', - 'books', - 'help', - 'cocktail', - 'boat', - 'link', - 'gesture', - 'fitness', - ]; -} diff --git a/frontend/src/state/types.ts b/frontend/src/state/types.ts index f0c2690dc..0f2eec227 100644 --- a/frontend/src/state/types.ts +++ b/frontend/src/state/types.ts @@ -1,9 +1,9 @@ -import { IconName, ColumnDefinitionType } from 'common'; +import { ColumnDefinitionType } from 'common'; export interface ColumnSettings { color: string; label: string; - icon: IconName | null; + icon: string | null; type: ColumnDefinitionType; } diff --git a/frontend/src/views/game/board/Board.tsx b/frontend/src/views/game/board/Board.tsx index 7514e1080..ccb0f775b 100644 --- a/frontend/src/views/game/board/Board.tsx +++ b/frontend/src/views/game/board/Board.tsx @@ -6,7 +6,6 @@ import { DropResult, ResponderProvided, } from 'react-beautiful-dnd'; -import { getIcon } from '../../../state/icons'; import Column from './Column'; import { Page } from '../../../components/Page'; import { ColumnContent } from '../types'; @@ -18,6 +17,7 @@ import { import { getNext, getMiddle, getPrevious } from '../lexorank'; import BoardHeader from './header/BoardHeader'; import useSession from '../useSession'; +import Icon from 'components/Icon/Icon'; interface GameModeProps { columns: ColumnContent[]; @@ -145,7 +145,7 @@ function GameMode({ posts={column.posts} groups={column.groups} question={column.label} - icon={getIcon(column.icon)} + icon={} color={column.color} onAdd={(content) => onAddPost( @@ -175,8 +175,7 @@ const Columns = styled.div<{ numberOfColumns: number }>` display: flex; margin-top: 30px; - @media screen and (max-width: ${(props) => - props.numberOfColumns * 320 + 100}px) { + @media screen and (max-width: ${(props) => props.numberOfColumns * 320 + 100}px) { margin-top: 10px; flex-direction: column; diff --git a/frontend/src/views/game/board/Column.tsx b/frontend/src/views/game/board/Column.tsx index 6cc25de01..35c1aed24 100644 --- a/frontend/src/views/game/board/Column.tsx +++ b/frontend/src/views/game/board/Column.tsx @@ -24,7 +24,7 @@ interface ColumnProps { column: ColumnContent; posts: Post[]; groups: PostGroup[]; - icon: React.ComponentType> | null; + icon: React.ReactElement | null; question: string; color: string; search: string; @@ -42,7 +42,7 @@ const Column: React.FC = ({ column, posts, groups, - icon: Icon, + icon, question, color, search, @@ -96,9 +96,9 @@ const Column: React.FC = ({ onKeyDown={handleAddKeyboard} readOnly={!permissions.canCreatePost} startAdornment={ - Icon ? ( + icon ? ( - + {icon} ) : null } @@ -286,4 +286,9 @@ const EnterIcon = styled.div` } `; +const IconContainer = styled.div` + position: relative; + top: 4px; +`; + export default Column; diff --git a/frontend/src/views/game/summary/__tests__/SummaryMode.test.tsx b/frontend/src/views/game/summary/__tests__/SummaryMode.test.tsx index 6cd97bc22..14c4ba812 100644 --- a/frontend/src/views/game/summary/__tests__/SummaryMode.test.tsx +++ b/frontend/src/views/game/summary/__tests__/SummaryMode.test.tsx @@ -61,7 +61,7 @@ const data: ColumnContent[] = [ label: 'First column', index: 0, color: 'red', - icon: 'satisfied', + icon: 'grinning', type: 'well', posts: [ buildPost(4, 0), @@ -76,7 +76,7 @@ const data: ColumnContent[] = [ label: 'Second column', index: 1, color: 'green', - icon: 'disatisfied', + icon: 'unamused', type: 'notWell', posts: [], groups: [], diff --git a/frontend/src/views/session-editor/sections/template/ColumnEditor.tsx b/frontend/src/views/session-editor/sections/template/ColumnEditor.tsx index aecab3d35..9322366a3 100644 --- a/frontend/src/views/session-editor/sections/template/ColumnEditor.tsx +++ b/frontend/src/views/session-editor/sections/template/ColumnEditor.tsx @@ -1,17 +1,19 @@ -import { useCallback, useState } from 'react'; +import { lazy, Suspense, useCallback, useState } from 'react'; import styled from '@emotion/styled'; import Typography from '@mui/material/Typography'; import ClickAwayListener from '@mui/material/ClickAwayListener'; import EditableLabel from '../../../../components/EditableLabel'; import { ColumnSettings } from '../../../../state/types'; -import { IconName } from 'common'; import { TwitterPicker, ColorResult } from 'react-color'; -import IconPicker from './IconPicker'; import IconButton from '@mui/material/IconButton'; import { colors } from '@mui/material'; import useMediaQuery from '@mui/material/useMediaQuery'; import { DeleteForeverOutlined } from '@mui/icons-material'; +const IconPicker = lazy( + () => import('./IconPicker' /* webpackChunkName: "icon-picker" */) +); + interface ColumnEditorProps { value: ColumnSettings; canDelete: boolean; @@ -50,7 +52,7 @@ const ColumnEditor = ({ ); const handleIconChange = useCallback( - (icon: IconName) => { + (icon: string) => { onChange({ ...value, icon, @@ -94,7 +96,9 @@ const ColumnEditor = ({ )} - + }> + + {fullScreen && canDelete ? ( diff --git a/frontend/src/views/session-editor/sections/template/IconPicker.tsx b/frontend/src/views/session-editor/sections/template/IconPicker.tsx index 409d42ea0..28ca52a76 100644 --- a/frontend/src/views/session-editor/sections/template/IconPicker.tsx +++ b/frontend/src/views/session-editor/sections/template/IconPicker.tsx @@ -1,46 +1,52 @@ -import { useCallback } from 'react'; -import { getIcon, getAllIcons } from '../../../../state/icons'; -import { IconName } from 'common'; -import Select from '@mui/material/Select'; -import MenuItem from '@mui/material/MenuItem'; -import { SelectChangeEvent } from '@mui/material'; +import { useCallback, useRef } from 'react'; +import { Button, Popover } from '@mui/material'; +import styled from '@emotion/styled'; +import { Picker, EmojiData } from 'emoji-mart'; +import useModal from 'hooks/useModal'; +import Icon from 'components/Icon/Icon'; interface IconPickerProps { - value: IconName | null; - onChange: (value: IconName) => void; + value: string | null; + onChange: (value: string) => void; } const IconPicker = ({ value, onChange }: IconPickerProps) => { - const icons = getAllIcons(); + const ref = useRef(null); + const [opened, open, close] = useModal(); const handleChange = useCallback( - (event: SelectChangeEvent) => { - onChange(event.target.value as IconName); + (emoji: EmojiData) => { + if (emoji.id) { + onChange(emoji.id); + close(); + } }, - [onChange] + [onChange, close] ); - const actualValue: IconName = value || 'help'; return ( - + + + + + + ); }; -function renderIcon(icon: unknown): React.ReactNode { - const Icon = getIcon(icon as IconName); - return Icon ? : null; -} +const Container = styled.div``; export default IconPicker; diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 1161aba3d..88a28c7ea 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -1024,6 +1024,13 @@ core-js-pure "^3.20.2" regenerator-runtime "^0.13.4" +"@babel/runtime@^7.0.0", "@babel/runtime@^7.7.6": + version "7.17.8" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.8.tgz#3e56e4aff81befa55ac3ac6a0967349fd1c5bca2" + integrity sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.17.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.2.tgz#66f68591605e59da47523c631416b18508779941" @@ -1031,13 +1038,6 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.7.6": - version "7.17.8" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.8.tgz#3e56e4aff81befa55ac3ac6a0967349fd1c5bca2" - integrity sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA== - dependencies: - regenerator-runtime "^0.13.4" - "@babel/template@^7.16.7", "@babel/template@^7.3.3": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" @@ -2024,6 +2024,13 @@ resolved "https://registry.yarnpkg.com/@types/crypto-js/-/crypto-js-4.1.1.tgz#602859584cecc91894eb23a4892f38cfa927890d" integrity sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA== +"@types/emoji-mart@^3.0.9": + version "3.0.9" + resolved "https://registry.yarnpkg.com/@types/emoji-mart/-/emoji-mart-3.0.9.tgz#2f7ef5d9ec194f28029c46c81a5fc1e5b0efa73c" + integrity sha512-qdBo/2Y8MXaJ/2spKjDZocuq79GpnOhkwMHnK2GnVFa8WYFgfA+ei6sil3aeWQPCreOKIx9ogPpR5+7MaOqYAA== + dependencies: + "@types/react" "*" + "@types/eslint-scope@^3.7.3": version "3.7.3" resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224" @@ -4275,6 +4282,14 @@ emittery@^0.8.1: resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== +emoji-mart@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/emoji-mart/-/emoji-mart-3.0.1.tgz#9ce86706e02aea0506345f98464814a662ca54c6" + integrity sha512-sxpmMKxqLvcscu6mFn9ITHeZNkGzIvD0BSNFE/LJESPbCA8s1jM6bCDPjWbV31xHq7JXaxgpHxLB54RCbBZSlg== + dependencies: + "@babel/runtime" "^7.0.0" + prop-types "^15.6.0" + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -8028,7 +8043,7 @@ prop-types@15.7.2: object-assign "^4.1.1" react-is "^16.8.1" -prop-types@15.8.1, prop-types@^15.5.10, prop-types@^15.5.6, prop-types@^15.5.8, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@15.8.1, prop-types@^15.5.10, prop-types@^15.5.6, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==