setShowAction(true)}
onMouseLeave={() => setShowAction(false)}
>
-
- {isMe ? null : (
-
-
-
- )}
+
+
-
- {showAction ? (
-
-
setReply(message)}
- />
+
+ {renderNamePositions()}
+
+
+
+ {relatedMessage &&
+ messageReplySection(messageContent(relatedMessage.content))}
+
+
+ {messageSection(messageContent(content))}
+ {showAction ? (
+
+
+ setReply(message)} />
+
{" "}
+
+ {message.isPinned ? (
+
pinMessage(message._id)}
+ />
+ ) : (
+ pinMessage(message._id)} />
+ )}
+
+
+
+ ) : null}
- ) : null}
-
-
- {attachments && attachments.length > 0 ? (
- <>
-
-
-
-
- >
- ) : (
-
-
-
- )}
+ {attachments && attachments.length > 0 && (
+
+ )}
-
+
+ {message.seenList.map((item) => {
+ if (currentUser._id === item.user._id) {
+ return null
+ }
+ return (
+
+ )
+ })}
+
+ >
)
}
diff --git a/exm-web/modules/chat/component/messages/Messages.tsx b/exm-web/modules/chat/component/messages/Messages.tsx
index cd30c1026a..d065ae768e 100644
--- a/exm-web/modules/chat/component/messages/Messages.tsx
+++ b/exm-web/modules/chat/component/messages/Messages.tsx
@@ -1,16 +1,20 @@
"use client"
import React, { useEffect, useRef, useState } from "react"
+import { ChevronLeft } from "lucide-react"
import { useInView } from "react-intersection-observer"
+import Image from "@/components/ui/image"
import Loader from "@/components/ui/loader"
+import { useChatDetail } from "../../hooks/useChatDetail"
import { useChatMessages } from "../../hooks/useChatMessages"
import Editor from "./Editor"
import MessageItem from "./MessageItem"
-import ReplyInfo from "./ReplyInfo"
+import MessagesHeader from "./MessagesHeader"
+import TypingIndicator from "./TypingIndicator"
-const Messages = () => {
+const Messages = ({ setShowSidebar, showSidebar }: { setShowSidebar: () => void, showSidebar: boolean }) => {
const {
chatMessages,
loading,
@@ -19,6 +23,8 @@ const Messages = () => {
handleLoadMore,
messagesTotalCount,
} = useChatMessages()
+
+ const { chatDetail } = useChatDetail()
const chatContainerRef = useRef(null) as any
const [reply, setReply] = useState
(null)
@@ -32,12 +38,6 @@ const Messages = () => {
}
}, [inView, handleLoadMore])
- useEffect(() => {
- if (chatContainerRef.current) {
- chatContainerRef.current.scrollTop = chatContainerRef.current.scrollHeight
- }
- }, [chatMessages])
-
if (error) {
return Something went wrong
}
@@ -48,15 +48,27 @@ const Messages = () => {
return (
+
+
+
+ {/*
+ {chatDetail.participantUsers && (
+
+ )}
+
*/}
{chatMessages.map((message) => (
))}
@@ -66,10 +78,8 @@ const Messages = () => {
)}
-
-
-
-
+
+
)
}
diff --git a/exm-web/modules/chat/component/messages/MessagesHeader.tsx b/exm-web/modules/chat/component/messages/MessagesHeader.tsx
new file mode 100644
index 0000000000..3883b6034b
--- /dev/null
+++ b/exm-web/modules/chat/component/messages/MessagesHeader.tsx
@@ -0,0 +1,74 @@
+import React from "react"
+import { ChevronLeft } from "lucide-react"
+
+import Image from "@/components/ui/image"
+
+type Props = {
+ chatDetail: any
+ setShowSidebar: () => void
+}
+
+const MessagesHeader = ({ chatDetail, setShowSidebar }: Props) => {
+ const renderAvatar = () => {
+ if (chatDetail.type === "direct") {
+ return (
+
+ )
+ }
+
+ return chatDetail.participantUsers
+ ?.slice(0, 2)
+ ?.map((participant: any, index: number) => (
+
+ ))
+ }
+
+ return (
+ <>
+
+
+
+
+ {chatDetail.type === "direct"
+ ? chatDetail
+ ? chatDetail.participantUsers[0].details.fullName
+ : ""
+ : chatDetail.name}
+
+
Active Now
+
+
+
+ >
+ )
+}
+
+export default MessagesHeader
diff --git a/exm-web/modules/chat/component/messages/PinnedMessages.tsx b/exm-web/modules/chat/component/messages/PinnedMessages.tsx
new file mode 100644
index 0000000000..a4e8c7627c
--- /dev/null
+++ b/exm-web/modules/chat/component/messages/PinnedMessages.tsx
@@ -0,0 +1,110 @@
+"use client"
+
+import { useState } from "react"
+import dayjs from "dayjs"
+import relativeTime from "dayjs/plugin/relativeTime"
+import { ChevronRight, MessageCircle } from "lucide-react"
+
+import {
+ Dialog,
+ DialogContent,
+ DialogHeader,
+ DialogTitle,
+ DialogTrigger,
+} from "@/components/ui/dialog"
+import Image from "@/components/ui/image"
+
+import { useChatMessages } from "../../hooks/useChatMessages"
+import MessageAttachmentSection from "./MessageAttachment"
+
+dayjs.extend(relativeTime)
+
+export const PinnedMessages = () => {
+ const { chatPinnedMessages } = useChatMessages()
+ const [open, setOpen] = useState(false)
+
+ const renderPinnedMessages = () => {
+ if (chatPinnedMessages.length === 0) {
+ return (
+
+
+
There is no pinned message
+
+ )
+ }
+
+ return chatPinnedMessages.map((message) => {
+ const { createdAt, createdUser, _id, content, attachments } = message
+
+ const renderContent = () => {
+ if (content === "
") {
+ return null
+ }
+
+ return (
+
+ )
+ }
+ return (
+
+
+
+
+
+
+ {createdUser?.details.fullName || createdUser?.email}
+
+
+ {createdAt && dayjs(createdAt).format("MMM D")}
+
+
+
({createdUser?.details.position})
+
+
+ {renderContent()}
+ {attachments && attachments.length > 0 && (
+
+ )}
+
+ )
+ })
+ }
+
+ return (
+
+ )
+}
diff --git a/exm-web/modules/chat/component/messages/ReplyInfo.tsx b/exm-web/modules/chat/component/messages/ReplyInfo.tsx
index 50e14fbe94..298fa63a65 100644
--- a/exm-web/modules/chat/component/messages/ReplyInfo.tsx
+++ b/exm-web/modules/chat/component/messages/ReplyInfo.tsx
@@ -1,5 +1,5 @@
import React from "react"
-import { XCircleIcon } from "lucide-react"
+import { ReplyIcon, XCircleIcon } from "lucide-react"
const ReplyInfo = ({
reply,
@@ -10,22 +10,25 @@ const ReplyInfo = ({
}) => {
if (reply) {
return (
-
+
-
- Replying to{" "}
-
- {reply?.createdUser?.details?.fullName ||
- reply?.createdUser?.email}
-
-
+
+
+
+ Replying to{" "}
+
+ {reply?.createdUser?.details?.fullName ||
+ reply?.createdUser?.email}
+
+
+
setReply(null)}
/>
-
{reply.content}
+
{reply.content}
)
} else {
diff --git a/exm-web/modules/chat/component/messages/TypingIndicator.tsx b/exm-web/modules/chat/component/messages/TypingIndicator.tsx
new file mode 100644
index 0000000000..acd7be128a
--- /dev/null
+++ b/exm-web/modules/chat/component/messages/TypingIndicator.tsx
@@ -0,0 +1,39 @@
+import React, { ReactNode } from "react"
+
+import Image from "@/components/ui/image"
+
+type Props = {
+ participants: any[]
+}
+
+const TypingIndicator = ({ participants }: Props) => {
+ return (
+
+
+ {participants?.map((participant, index) => (
+
+ ))}
+
+
+
+ )
+}
+
+export default TypingIndicator
diff --git a/exm-web/modules/chat/graphql/mutations.ts b/exm-web/modules/chat/graphql/mutations.ts
index 41f929015e..98c14cc887 100644
--- a/exm-web/modules/chat/graphql/mutations.ts
+++ b/exm-web/modules/chat/graphql/mutations.ts
@@ -89,6 +89,12 @@ const chatToggleIsPinned = gql`
}
`
+const chatToggleIsWithNotification = gql`
+ mutation chatToggleIsWithNotification($id: String!) {
+ chatToggleIsWithNotification(_id: $id)
+ }
+`
+
const emojiReact = gql`
mutation emojiReact(
$contentId: String!
@@ -141,6 +147,12 @@ const chatForward = gql`
}
`
+const pinMessage = gql`
+ mutation ChatMessageToggleIsPinned($id: String!) {
+ chatMessageToggleIsPinned(_id: $id)
+ }
+`
+
export default {
chatAdd,
chatEdit,
@@ -154,4 +166,6 @@ export default {
commentAdd,
commentRemove,
chatForward,
+ chatToggleIsWithNotification,
+ pinMessage
}
diff --git a/exm-web/modules/chat/graphql/queries.ts b/exm-web/modules/chat/graphql/queries.ts
index 6a725277aa..c1d4309135 100644
--- a/exm-web/modules/chat/graphql/queries.ts
+++ b/exm-web/modules/chat/graphql/queries.ts
@@ -15,6 +15,7 @@ const chats = gql`
isPinned
isPinnedUserIds
featuredImage
+ muteUserIds
lastMessage {
content
createdAt
@@ -68,6 +69,7 @@ const chatsPinned = gql`
isPinned
isPinnedUserIds
featuredImage
+ muteUserIds
lastMessage {
content
createdAt
@@ -118,6 +120,7 @@ const chatDetail = gql`
type
isSeen
featuredImage
+ muteUserIds
lastMessage {
createdAt
content
@@ -157,18 +160,20 @@ const chatDetail = gql`
`
const chatMessages = gql`
- query chatMessages($chatId: String, $limit: Int, $skip: Int) {
- chatMessages(chatId: $chatId, limit: $limit, skip: $skip) {
+ query chatMessages($chatId: String, $limit: Int, $skip: Int, $isPinned: Boolean) {
+ chatMessages(chatId: $chatId, limit: $limit, skip: $skip, isPinned: $isPinned) {
list {
_id
content
attachments
+ isPinned
createdUser {
_id
email
details {
avatar
fullName
+ position
}
}
createdAt
@@ -181,11 +186,18 @@ const chatMessages = gql`
details {
avatar
fullName
+ position
}
}
}
seenList {
lastSeenMessageId
+ user {
+ _id
+ details {
+ avatar
+ }
+ }
}
}
totalCount
diff --git a/exm-web/modules/chat/hooks/useChatMessages.tsx b/exm-web/modules/chat/hooks/useChatMessages.tsx
index 437ed369bf..ec5c4903d8 100644
--- a/exm-web/modules/chat/hooks/useChatMessages.tsx
+++ b/exm-web/modules/chat/hooks/useChatMessages.tsx
@@ -6,10 +6,12 @@ import { useAtomValue } from "jotai"
import { mutations, queries, subscriptions } from "../graphql"
import { IChatMessage } from "../types"
+import { IAttachment } from "@/modules/types"
export interface IUseChats {
loading: boolean
chatMessages: IChatMessage[]
+ chatPinnedMessages: IChatMessage[]
error: any
handleLoadMore: () => void
sendMessage: ({
@@ -21,6 +23,18 @@ export interface IUseChats {
relatedId?: string
attachments?: string[]
}) => void
+ pinMessage: (id: string) => void
+ chatForward: ({
+ id,
+ type,
+ content,
+ attachments,
+ }: {
+ id?: string
+ type?: string
+ content?: string
+ attachments?: any[]
+ }) => void
messagesTotalCount: number
}
@@ -37,13 +51,17 @@ export const useChatMessages = (): IUseChats => {
}
)
+ const chatPinnedMessagesQuery = useQuery(queries.chatMessages, {
+ variables: { chatId: id, isPinned: true, skip: 0, limit: 30 },
+ })
+
useEffect(() => {
refetch()
}, [id])
const [sendMessageMutation] = useMutation(mutations.chatMessageAdd, {
update(cache, { data }: any) {
- let messagesQuery = queries.chatMessages
+ const messagesQuery = queries.chatMessages
const chatMessageAdd = data.chatMessageAdd ? data.chatMessageAdd : data
@@ -77,6 +95,16 @@ export const useChatMessages = (): IUseChats => {
refetchQueries: ["chatMessages", "chats"],
})
+ const [pinMessageMutation] = useMutation(mutations.pinMessage)
+
+ const [chatForwardMutation] = useMutation(mutations.chatForward)
+
+ const pinMessage = (id: string) => {
+ pinMessageMutation({ variables: { id } })
+ .then(() => refetch())
+ .catch((e) => console.log(e))
+ }
+
const sendMessage = ({
content,
relatedId,
@@ -110,6 +138,34 @@ export const useChatMessages = (): IUseChats => {
}).catch((e) => console.log(e))
}
+ const chatForward = ({
+ id,
+ type,
+ content,
+ attachments,
+ }: {
+ id?: string
+ type?: string
+ content?: string
+ attachments?: IAttachment[]
+ }) => {
+ console.log(type)
+
+ if (type === "group") {
+ chatForwardMutation({
+ variables: { chatId: id, content, attachments },
+ refetchQueries: ["chatMessages", "chats"],
+ }).catch((e) => console.log(e))
+ }
+
+ if (type === "direct") {
+ chatForwardMutation({
+ variables: { userIds: [id], content, attachments },
+ refetchQueries: ["chatMessages", "chats"],
+ }).catch((e) => console.log(e))
+ }
+ }
+
useSubscription(subscriptions.chatMessageInserted, {
variables: { chatId: id },
onSubscriptionData: ({ subscriptionData: { data } }) => {
@@ -154,6 +210,10 @@ export const useChatMessages = (): IUseChats => {
? (data || {}).chatMessages.list
: []
+ const chatPinnedMessages = chatPinnedMessagesQuery.data && chatPinnedMessagesQuery.data.chatMessages
+ ? chatPinnedMessagesQuery.data.chatMessages.list
+ : []
+
const messagesTotalCount = (data || {}).chatMessages
? (data || {}).chatMessages.totalCount
: 0
@@ -165,6 +225,9 @@ export const useChatMessages = (): IUseChats => {
handleLoadMore,
sendMessage,
messagesTotalCount,
+ chatPinnedMessages,
+ pinMessage,
+ chatForward,
}
}
diff --git a/exm-web/modules/chat/hooks/useChatsMutation.tsx b/exm-web/modules/chat/hooks/useChatsMutation.tsx
index 0687f65e8b..962d7d08fa 100644
--- a/exm-web/modules/chat/hooks/useChatsMutation.tsx
+++ b/exm-web/modules/chat/hooks/useChatsMutation.tsx
@@ -23,6 +23,11 @@ const useChatsMutation = ({
mutations.chatRemove
)
+ const [muteChatMutation, { loading: loadingMute }] = useMutation(
+ mutations.chatToggleIsWithNotification,
+ { refetchQueries: ["chats", "chatDetail"] }
+ )
+
const [adminMutation, { loading: loadingAdmin }] = useMutation(
mutations.chatMakeOrRemoveAdmin
)
@@ -46,6 +51,14 @@ const useChatsMutation = ({
})
}
+ const toggleMute = (chatId: string) => {
+ muteChatMutation({
+ variables: { id: chatId },
+ }).then(() => {
+ callBack("success")
+ })
+ }
+
const makeOrRemoveAdmin = (chatId: string, userId: string) => {
adminMutation({
variables: { id: chatId, userId },
@@ -96,8 +109,9 @@ const useChatsMutation = ({
addOrRemoveMember,
chatEdit,
chatDelete,
+ toggleMute,
loading:
- loading || loadingEdit || loadingDelete || loadingAdmin || loadingMember,
+ loading || loadingEdit || loadingDelete || loadingAdmin || loadingMember || loadingMute,
}
}
diff --git a/exm-web/modules/chat/types.ts b/exm-web/modules/chat/types.ts
index 8371ff49a4..62cdbb7a72 100644
--- a/exm-web/modules/chat/types.ts
+++ b/exm-web/modules/chat/types.ts
@@ -1,6 +1,12 @@
import { IUser } from "../auth/types"
import { IAttachment } from "../types"
+
+export interface ISeenList {
+ lastSeenMessageId: string
+ user: IUser
+
+}
export interface IChatMessage {
_id: string
content: string
@@ -8,8 +14,9 @@ export interface IChatMessage {
attachments: IAttachment[]
createdAt: string
createdUser: IUser
-
+ seenList: ISeenList[]
relatedMessage: IChatMessage
+ isPinned: boolean
}
export interface IChat {
diff --git a/exm-web/modules/feed/component/CommentItem.tsx b/exm-web/modules/feed/component/CommentItem.tsx
index 151828295d..df4bce525e 100644
--- a/exm-web/modules/feed/component/CommentItem.tsx
+++ b/exm-web/modules/feed/component/CommentItem.tsx
@@ -116,16 +116,16 @@ const CommentItem = ({
onMouseEnter={() => setShowAction(true)}
onMouseLeave={() => setShowAction(false)}
>
-
+
-
+
{userDetail?.fullName || user?.username || user?.email}
diff --git a/exm-web/modules/feed/component/PostItem.tsx b/exm-web/modules/feed/component/PostItem.tsx
index e7a44c2827..8cf15e0ea0 100644
--- a/exm-web/modules/feed/component/PostItem.tsx
+++ b/exm-web/modules/feed/component/PostItem.tsx
@@ -313,11 +313,11 @@ const PostItem = ({ postId }: { postId: string }): JSX.Element => {
diff --git a/exm-web/modules/feed/component/RightSideBar.tsx b/exm-web/modules/feed/component/RightSideBar.tsx
index af5014992c..7508b0a6c0 100644
--- a/exm-web/modules/feed/component/RightSideBar.tsx
+++ b/exm-web/modules/feed/component/RightSideBar.tsx
@@ -52,12 +52,12 @@ const RightSideBar = () => {
src={
currentUser.details && currentUser.details.avatar
? currentUser?.details?.avatar
- : "/user.png"
+ : "/avatar-colored.svg"
}
alt="User Profile"
width={100}
height={100}
- className="w-10 h-10 rounded-full"
+ className="w-10 h-10 rounded-full object-cover"
/>
diff --git a/exm-web/modules/feed/component/form/CommentForm.tsx b/exm-web/modules/feed/component/form/CommentForm.tsx
index b12ef60dad..0bd83898d4 100644
--- a/exm-web/modules/feed/component/form/CommentForm.tsx
+++ b/exm-web/modules/feed/component/form/CommentForm.tsx
@@ -153,13 +153,13 @@ const CommentForm = ({
{feed?.title || ""}
-
+
@@ -172,7 +172,7 @@ const CommentForm = ({
-
+
diff --git a/exm-web/modules/feed/component/form/FeedForm.tsx b/exm-web/modules/feed/component/form/FeedForm.tsx
index 213ffe5daf..cfb4d3fcf4 100644
--- a/exm-web/modules/feed/component/form/FeedForm.tsx
+++ b/exm-web/modules/feed/component/form/FeedForm.tsx
@@ -66,12 +66,12 @@ const FeedForm = ({ contentType }: { contentType: string }) => {
src={
userDetail.avatar
? readFile(userDetail.avatar)
- : "/user.png"
+ : "/avatar-colored.svg"
}
alt="User Profile"
width={500}
height={500}
- className="w-10 h-10 rounded-full"
+ className="w-10 h-10 rounded-full object-cover"
/>
diff --git a/exm-web/modules/feed/types.ts b/exm-web/modules/feed/types.ts
index 88fff88e70..6ff2ac52f7 100644
--- a/exm-web/modules/feed/types.ts
+++ b/exm-web/modules/feed/types.ts
@@ -86,6 +86,7 @@ export interface IFeed {
branchIds?: string[]
unitId?: string
createdUser?: IUser
+ commentCount?: boolean
}
export interface IFeedVariable {
diff --git a/exm-web/package.json b/exm-web/package.json
index 39f1dd510c..94ca69d92c 100644
--- a/exm-web/package.json
+++ b/exm-web/package.json
@@ -15,6 +15,8 @@
},
"dependencies": {
"@apollo/client": "^3.8.3",
+ "@emoji-mart/data": "^1.1.2",
+ "@emoji-mart/react": "^1.1.1",
"@hookform/resolvers": "^3.1.0",
"@radix-ui/react-alert-dialog": "^1.0.4",
"@radix-ui/react-aspect-ratio": "^1.0.3",
@@ -42,6 +44,7 @@
"date-fns": "^2.30.0",
"date-fns-tz": "^2.0.0",
"dayjs": "^1.11.10",
+ "emoji-mart": "^5.5.2",
"framer-motion": "^10.12.16",
"graphql": "^16.6.0",
"graphql-ws": "^5.13.1",
diff --git a/exm-web/styles/globals.css b/exm-web/styles/globals.css
index 3764cafb2c..f81dddd754 100644
--- a/exm-web/styles/globals.css
+++ b/exm-web/styles/globals.css
@@ -28,6 +28,7 @@
--primary: 257 63% 44%;
--primary-foreground: 210 40% 98%;
+ --primary-light: 254 55% 64%;
--secondary: 210 40% 96.1%;
--secondary-foreground: 222.2 47.4% 11.2%;
@@ -36,7 +37,10 @@
--accent-foreground: 222.2 47.4% 11.2%;
--warning: 40 100% 50%;
- --warning-foreground: 43 96% 56%;
+ --warning-foreground: 43 96% 80%;
+
+ --success: 140 50% 85%;
+ --success-foreground: 141 77% 42%;
--destructive: 0 100% 50%;
--destructive-foreground: 210 40% 98%;
@@ -109,3 +113,78 @@
color: #fff !important;
font-size: 8px !important;
}
+
+.p-1px {
+ padding: 1px;
+}
+
+.bg-black\/25 {
+ background-color: rgb(0 0 0 / 0.25);
+}
+
+.bg-success {
+ background-color: hsl(var(--success));
+}
+
+.bg-success-foreground {
+ background-color: hsl(var(--success-foreground));
+}
+
+.text-success-foreground {
+ color: hsl(var(--success-foreground));
+}
+
+.text-primary-light {
+ color: hsl(var(--primary-light));
+}
+
+.bg-primary-light {
+ background-color: hsl(var(--primary-light));
+}
+
+.chat-list-max-height {
+ max-height: calc(100vh - 230px);
+}
+.chat-list-search-max-height {
+ max-height: calc(100vh - 195px);
+}
+
+.user-shared-files-max-height {
+ max-height: calc(100vh - 510px);
+}
+.group-shared-files-max-height {
+ max-height: calc(100vh - 460px);
+}
+
+.w-300 {
+ width: 300px;
+}
+
+.css-13cymwt-control{
+ border-radius: 8px !important;
+}
+
+.css-t3ipsp-control {
+ border-radius: 8px !important;
+ border-color: hsl(0, 0%, 80%) !important;
+ box-shadow: none !important;
+}
+
+.css-1p3m7a8-multiValue {
+ background-color: rgba(238, 216, 255, 1) !important;
+ border-radius: 5px !important;
+}
+.css-1p3m7a8-multiValue svg{
+ background-color: rgba(245, 246, 255, 1);
+ border-radius: 50%;
+ color: rgba(238, 216, 255, 1);
+}
+.gap-0 {
+ gap: 0;
+}
+.max-h-\[60vh\] {
+ max-height: 60vh;
+}
+.w-message {
+ width: calc(75% - 90px);
+}
\ No newline at end of file
diff --git a/exm-web/yarn.lock b/exm-web/yarn.lock
index 356d2bb883..3ff08741f9 100644
--- a/exm-web/yarn.lock
+++ b/exm-web/yarn.lock
@@ -225,6 +225,16 @@
"@babel/helper-validator-identifier" "^7.22.20"
to-fast-properties "^2.0.0"
+"@emoji-mart/data@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@emoji-mart/data/-/data-1.1.2.tgz#777c976f8f143df47cbb23a7077c9ca9fe5fc513"
+ integrity sha512-1HP8BxD2azjqWJvxIaWAMyTySeZY0Osr83ukYjltPVkNXeJvTz7yDrPLBtnrD5uqJ3tg4CcLuuBW09wahqL/fg==
+
+"@emoji-mart/react@^1.1.1":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@emoji-mart/react/-/react-1.1.1.tgz#ddad52f93a25baf31c5383c3e7e4c6e05554312a"
+ integrity sha512-NMlFNeWgv1//uPsvLxvGQoIerPuVdXwK/EUek8OOkJ6wVOWPUizRBJU0hDqWZCOROVpfBgCemaC3m6jDOXi03g==
+
"@emotion/babel-plugin@^11.11.0":
version "11.11.0"
resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz#c2d872b6a7767a9d176d007f5b31f7d504bb5d6c"
@@ -2037,6 +2047,11 @@ electron-to-chromium@^1.4.535:
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.539.tgz#5ce6b161e252132cc84501bc35d084995a2a9840"
integrity sha512-wRmWJ8F7rgmINuI32S6r2SLrw/h/bJQsDSvBiq9GBfvc2Lh73qTOwn73r3Cf67mjVgFGJYcYtmERzySa5jIWlg==
+emoji-mart@^5.5.2:
+ version "5.5.2"
+ resolved "https://registry.yarnpkg.com/emoji-mart/-/emoji-mart-5.5.2.tgz#3ddbaf053139cf4aa217650078bc1c50ca8381af"
+ integrity sha512-Sqc/nso4cjxhOwWJsp9xkVm8OF5c+mJLZJFoFfzRuKO+yWiN7K8c96xmtughYb0d/fZ8UC6cLIQ/p4BR6Pv3/A==
+
emoji-regex@^9.2.2:
version "9.2.2"
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"