dappros/ethora

View on GitHub
client-web/build/static/js/986.6df302da.chunk.js.map

Summary

Maintainability
Test Coverage
{"version":3,"file":"static/js/986.6df302da.chunk.js","mappings":"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","sources":["helpers/chat/createPrivateChat.ts","components/Chat/Messages/Message.tsx","components/Chat/Messages/SystemMessage.tsx","components/MetaNavigation/CompassItem.tsx","components/MetaNavigation/MetaHeader.tsx","components/MetaNavigation/MetaNavigation.tsx","components/Chat/Threads/CustomMessageInput.tsx","components/Chat/Threads/ThreadContainer.tsx","components/Chat/ChatTransferDialog.tsx","components/Chat/ChatMediaModal.tsx","components/Chat/ChatAudioRecorder.tsx","pages/ChatInRoom/Chat.tsx","pages/ChatInRoom/index.tsx","pages/Profile/QrModal.tsx"],"sourcesContent":["import xmpp from \"../../xmpp\";\nimport {useStoreState} from \"../../store\";\nimport { CONFERENCEDOMAIN } from \"../../constants\";\n\nexport const underscoreManipulation = (str:string) => {\n    if(str){\n        return str.replace(/([A-Z])/g, '_$1').toLowerCase()\n    }else{\n        return 'invalid string passed'\n    }\n};\n\nexport const createPrivateChat = async (\n    myWalletAddress: string,\n    otherUserWalletAddress: string,\n    myFirstName: string,\n    otherFirstName: string,\n    userJID?: string\n) => {\n    const combinedWalletAddress = [myWalletAddress, otherUserWalletAddress]\n        .sort()\n        .join('.');\n\n    const roomJid = combinedWalletAddress.toLowerCase() + CONFERENCEDOMAIN;\n    const combinedUsersName = [myFirstName, otherFirstName].sort().join(' and ');\n\n    const currentChatRooms = useStoreState.getState().userChatRooms;\n\n    let isNewRoom = false;\n    if(currentChatRooms.filter((el) => el.jid === roomJid).length === 0){\n        isNewRoom = true;\n        xmpp.createNewRoom(combinedWalletAddress.toLowerCase());\n        xmpp.setOwner(combinedWalletAddress.toLowerCase());\n        xmpp.roomConfig(\n            combinedWalletAddress.toLowerCase(),\n            {roomName: combinedUsersName},\n        );\n        xmpp.subsribe(roomJid);\n        xmpp.presenceInRoom(roomJid);\n\n        setTimeout(() => {\n            xmpp.sendInvite(\n                underscoreManipulation(myWalletAddress),\n                roomJid.toLowerCase(),\n                underscoreManipulation(otherUserWalletAddress),\n            );\n        }, 1000);\n    }\n\n    return {roomJid, roomName: combinedUsersName, isNewRoom};\n};\n","import React, { useEffect, useMemo, useState } from \"react\";\nimport {\n  Message as KitMessage,\n  MessageModel,\n  MessageSeparator,\n} from \"@chatscope/chat-ui-kit-react\";\nimport { differenceInHours, format, formatDistance, subDays } from \"date-fns\";\nimport { TMessageHistory } from \"../../../store\";\nimport { useHistory } from \"react-router\";\nimport {\n  Card,\n  CardActionArea,\n  CardMedia,\n  Button,\n  IconButton,\n  Typography,\n  Divider,\n} from \"@mui/material\";\nimport MoreVertIcon from \"@mui/icons-material/MoreVert\";\nimport coin from \"../../../assets/images/coin.png\";\nimport { Box } from \"@mui/system\";\nimport {\n  audioMimetypes,\n  imageMimetypes,\n  videoMimetypes,\n} from \"../../../constants\";\nimport xmpp from \"../../../xmpp\";\nimport { IButtons } from \"../../../pages/ChatInRoom/Chat\";\n\nconst avatarPreviewUrl = \"https://icotar.com/initials/\";\n\nexport interface IMessage {\n  message: TMessageHistory;\n  position: {\n    type: string;\n    position: MessageModel[\"position\"];\n    separator?: string;\n  };\n  is?: string;\n  onMessageButtonClick: (button: IButtons) => void;\n  toggleTransferDialog: (value: boolean, message: TMessageHistory) => void;\n  onMediaMessageClick: (value: boolean, message: TMessageHistory) => void;\n\n  onThreadClick?: () => void;\n  isThread?: boolean;\n}\n\ntype IDirection = \"outgoing\" | \"incoming\";\n\nexport const Message: React.FC<IMessage> = ({\n  message,\n  position,\n  onMessageButtonClick,\n  toggleTransferDialog,\n  onMediaMessageClick,\n  onThreadClick,\n  isThread,\n}) => {\n  const firstName = message.data.senderFirstName;\n  const lastName = message.data.senderLastName;\n  const messageJid = message.data.senderJID.split(\"/\")[0];\n  const userJid = useMemo(() => xmpp.client?.jid?.toString().split(\"/\")[0], []);\n  const isSameUser = userJid === messageJid;\n  const history = useHistory();\n  const [buttons, setButtons] = useState<IButtons[]>();\n\n  const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\n  const openMenu = Boolean(anchorEl);\n\n  const [messageDirection, setMessageDirection] =\n    useState<IDirection>(\"incoming\");\n\n  const openDialogMenu = () => {\n    setAnchorEl(null);\n    toggleTransferDialog(true, message);\n  };\n\n  const openThreadView = () => {\n    onThreadClick();\n  };\n\n  const fullViewImage = () => {\n    onMediaMessageClick(true, message);\n  };\n\n  const rightClick = (event: React.SyntheticEvent<HTMLElement>) => {\n    // if (messageDirection !== \"incoming\") {\n    //   return;\n    //\n    event.preventDefault();\n    openDialogMenu();\n  };\n\n  const ReplyComponent = () => {\n    return (\n      <Button\n        variant=\"text\"\n        style={{\n          flexDirection: \"row\",\n          display: \"flex\",\n          textTransform: \"none\",\n          textAlign: \"left\",\n        }}\n      >\n        <Divider\n          style={{\n            borderWidth: \"3px\",\n            borderRadius: \"5px\",\n            marginRight: \"5px\",\n          }}\n          variant=\"middle\"\n          orientation=\"vertical\"\n          flexItem\n        />\n\n        <div>\n          <strong style={{ cursor: \"pointer\" }}>\n            {message.data.mainMessage?.userName || \"N/A\"}\n            <br />\n          </strong>\n          {message.data.mainMessage?.imageLocation &&\n            imageMimetypes[message.data.mainMessage.mimeType] && (\n              <Card sx={{ maxWidth: 200 }}>\n                <CardActionArea onClick={fullViewImage}>\n                  <CardMedia\n                    style={{\n                      height: 150,\n                      objectFit: \"cover\",\n                      objectPosition: \"left\",\n                    }}\n                    component=\"img\"\n                    height=\"150\"\n                    image={message.data.mainMessage.imageLocation}\n                    alt={message.data.mainMessage?.originalName}\n                  />\n                </CardActionArea>\n              </Card>\n            )}\n\n          {/* {message.data.mainMessage.ImageLocation &&\n          message.data.mainMessage.MimeType.split(\"/\")[0] === \"application\" ? (\n            <a target=\"_blank\" href={message.data.location}>\n              <KitMessage.ImageContent\n                src={message.data.mainMessage.ImageLocation}\n                alt={message.data.mainMessage.OriginalName}\n                width={150}\n              />\n              {message.data.mainMessage.MimeType.split(\"/\")[1]}\n            </a>\n          ) : null} */}\n\n          {message.data.mainMessage?.imageLocation &&\n            videoMimetypes[message.data.mainMessage?.mimeType] && (\n              <video controls width=\"200px\">\n                <source\n                  src={message.data.mainMessage.imageLocation}\n                  type={message.data.mainMessage.mimeType}\n                  title={message.data.mainMessage.originalName}\n                />\n                Sorry, your browser doesn't support videos.\n              </video>\n            )}\n\n          {message.data.mainMessage?.imageLocation &&\n            audioMimetypes[message.data.mainMessage?.mimeType] && (\n              <audio controls>\n                <source\n                  src={message.data.mainMessage.imageLocation}\n                  type={message.data.mainMessage.mimeType}\n                />\n                Your browser does not support the audio element.\n              </audio>\n            )}\n\n          <span\n            dangerouslySetInnerHTML={{\n              __html: message.data?.mainMessage?.text.replace(\n                /\\b(https?\\:\\/\\/\\S+)/gm,\n                '<a href=\"$1\">$1</a>'\n              ),\n            }}\n          ></span>\n        </div>\n      </Button>\n    );\n  };\n\n  useEffect(() => {\n    if (message.data.quickReplies) {\n      setButtons(JSON.parse(message.data.quickReplies));\n    }\n    setMessageDirection(isSameUser ? \"outgoing\" : \"incoming\");\n  }, []);\n\n  return (\n    <div is={\"Message\"}>\n      {!!position.separator && (\n        <MessageSeparator>{position.separator}</MessageSeparator>\n      )}\n      <KitMessage\n        onContextMenu={\n          !message.data.isReply && !isThread ? rightClick : () => {}\n        }\n        style={{\n          marginBottom:\n            position.type === \"last\" || position.type === \"single\" ? 15 : null,\n        }}\n        model={{\n          sender: firstName + \" \" + lastName,\n          direction: messageDirection,\n          position: position.position,\n        }}\n        avatarPosition={isSameUser ? \"tr\" : \"tl\"}\n        avatarSpacer={position.type !== \"first\" && position.type !== \"single\"}\n      >\n        {(position.type === \"first\" || position.type === \"single\") && (\n          <img\n            style={{\n              borderRadius: \"50%\",\n              boxSizing: \"border-box\",\n              width: \"42px\",\n              height: \"42px\",\n              cursor: \"pointer\",\n            }}\n            onClick={() =>\n              history.push(\"/profile/\" + message.data.senderWalletAddress)\n            }\n            is={\"Avatar\"}\n            src={\n              message.data.photoURL\n                ? message.data.photoURL\n                : +firstName + \" \" + lastName\n            }\n            onError={({ currentTarget }) => {\n              currentTarget.onerror = null;\n              currentTarget.src = avatarPreviewUrl + firstName + \" \" + lastName;\n            }}\n            alt={firstName}\n          />\n        )}\n\n        <KitMessage.CustomContent>\n          {/* Main Message */}\n          {message.data.isReply && !isThread && <ReplyComponent />}\n          {(position.type === \"first\" || position.type === \"single\") && (\n            <span\n              style={{\n                display: \"flex\",\n                justifyContent: \"space-between\",\n                alignItems: \"center\",\n              }}\n            >\n              <strong\n                style={{ cursor: \"pointer\" }}\n                onClick={() =>\n                  history.push(\"/profile/\" + message.data.senderWalletAddress)\n                }\n              >\n                {firstName} {lastName}\n                <br />\n              </strong>\n              {!isThread && !message.data.isReply && (\n                <IconButton\n                  aria-label=\"more\"\n                  id=\"long-button\"\n                  aria-controls={openMenu ? \"long-menu\" : undefined}\n                  aria-expanded={openMenu ? \"true\" : undefined}\n                  aria-haspopup=\"true\"\n                  onClick={openDialogMenu}\n                >\n                  <MoreVertIcon />\n                </IconButton>\n              )}\n            </span>\n          )}\n\n          {message.data.isMediafile &&\n            !!imageMimetypes[message.data.mimetype] && (\n              <Card sx={{ maxWidth: 200 }}>\n                <CardActionArea onClick={fullViewImage}>\n                  <CardMedia\n                    style={{\n                      height: 150,\n                      objectFit: \"cover\",\n                      objectPosition: \"left\",\n                    }}\n                    component=\"img\"\n                    height=\"150\"\n                    image={message.data.location}\n                    alt={message.data.originalName}\n                  />\n                </CardActionArea>\n              </Card>\n            )}\n\n          {message.data.isMediafile &&\n            !!videoMimetypes[message.data.mimetype] && (\n              <video controls width=\"200px\">\n                <source\n                  src={message.data.location}\n                  type={message.data.mimetype}\n                  title={message.data.originalName}\n                />\n                Sorry, your browser doesn't support videos.\n              </video>\n            )}\n\n          {message.data.isMediafile &&\n            !!audioMimetypes[message.data.mimetype] && (\n              <audio controls>\n                <source\n                  src={message.data.location}\n                  type={message.data.mimetype}\n                />\n                Your browser does not support the audio element.\n              </audio>\n            )}\n\n          {!message.data.isMediafile && (\n            <div>\n              <span\n                dangerouslySetInnerHTML={{\n                  __html: message.body.replace(\n                    /\\b(https?\\:\\/\\/\\S+)/gm,\n                    '<a href=\"$1\">$1</a>'\n                  ),\n                }}\n              />\n              {/*FOOTER */}\n              <div\n                style={{\n                  display: \"flex\",\n                  justifyContent: \"space-between\",\n                  alignItems: \"center\",\n                  marginTop: 5,\n                  minWidth: 200,\n                  color:\n                    messageDirection === \"incoming\"\n                      ? \"rgb(110, 169, 215)\"\n                      : \"#c6e3fa\",\n                  flexDirection:\n                    messageDirection === \"incoming\" ? \"row\" : \"row-reverse\",\n                }}\n              >\n                <div\n                  style={{\n                    fontSize: 12,\n                  }}\n                >\n                  {differenceInHours(new Date(), new Date(message.date)) > 5\n                    ? format(new Date(message.date), \"h:mm a\")\n                    : formatDistance(\n                        subDays(new Date(message.date), 0),\n                        new Date(),\n                        {\n                          addSuffix: true,\n                        }\n                      )}\n                </div>\n                {message.coinsInMessage > 0 && (\n                  <div style={{ display: \"flex\", alignItems: \"center\" }}>\n                    <div style={{ fontSize: 12 }}>\n                      {message?.coinsInMessage}\n                    </div>\n                    <img\n                      src={coin}\n                      style={{ width: 25, height: 25 }}\n                      alt={\"coin\"}\n                    />\n                  </div>\n                )}\n                {message.data.isEdited && (\n                  <div\n                    style={{\n                      display: \"flex\",\n                      alignItems: \"flex-end\",\n                      marginLeft: 3,\n                      marginRight: 3,\n                    }}\n                  >\n                    <Typography fontSize={12}>edited</Typography>\n                  </div>\n                )}\n              </div>\n            </div>\n          )}\n        </KitMessage.CustomContent>\n\n        {/*{(position.type === \"last\" || position.type === \"single\") && (*/}\n        {/*  <KitMessage.Footer*/}\n        {/*    sentTime={*/}\n        {/*      differenceInHours(new Date(), new Date(message.date)) > 5*/}\n        {/*        ? format(new Date(message.date), \"h:mm a\")*/}\n        {/*        : formatDistance(*/}\n        {/*            subDays(new Date(message.date), 0),*/}\n        {/*            new Date(),*/}\n        {/*            {*/}\n        {/*              addSuffix: true,*/}\n        {/*            }*/}\n        {/*          )*/}\n        {/*    }*/}\n        {/*  />*/}\n        {/*)}*/}\n        <KitMessage.Footer>\n          {message.numberOfReplies > 0 &&\n            messageDirection === \"incoming\" &&\n            !isThread && (\n              <Button onClick={() => openThreadView()} variant=\"text\">\n                <Typography fontSize={\"12px\"} textTransform={\"none\"}>\n                  {message.numberOfReplies}{\" \"}\n                  {message.numberOfReplies === 1 ? \"Reply\" : \"Replies\"} (tap to\n                  review)\n                </Typography>\n              </Button>\n            )}\n        </KitMessage.Footer>\n      </KitMessage>\n      {!!buttons && (\n        <Box sx={{ \"& button\": { m: 0.5 } }}>\n          <div\n            style={{\n              display: \"flex\",\n              flexDirection: \"column\",\n              width: \"max-content\",\n              marginLeft: \"45px\",\n            }}\n          >\n            {buttons.map((button, index) => {\n              return (\n                <Button\n                  variant=\"outlined\"\n                  size=\"small\"\n                  onClick={() => onMessageButtonClick(button)}\n                  key={index}\n                >\n                  {button.name}\n                </Button>\n              );\n            })}\n          </div>\n        </Box>\n      )}\n    </div>\n  );\n};\n","import {TMessageHistory} from \"../../../store\";\nimport React from \"react\";\n\nexport interface IMessage {\n    message: TMessageHistory;\n    userJid: string;\n    is?: string;\n}\n\nexport const SystemMessage: React.FC<IMessage> = ({message, userJid}) => {\n    return (\n        <div style={{\n            textAlign: \"center\",\n            color: \"#6ea9d7\",\n            fontSize: \".8em\",\n            boxSizing: \"border-box\",\n            fontFamily: \"Helvetica Neue,Segoe UI,Helvetica,Arial,sans-serif\"\n        }} key={message.key}>\n            {message.body}\n        </div>\n    );\n}","import { Box, Button } from \"@mui/material\";\nimport { useHistory } from \"react-router\";\nimport { CONFERENCEDOMAIN } from \"../../constants\";\nimport { IApiMetaRoom } from \"./MetaNavigation\";\n\nconst CHAT = \"/chat/\";\n\nexport const CompassItem = ({\n  room,\n  name,\n  chatId,\n  setDirection,\n}: {\n  room: IApiMetaRoom | undefined;\n  name: string;\n  chatId: string;\n  setDirection: () => void;\n}) => {\n  const history = useHistory();\n  if (!room) {\n    return (\n      <Box\n        justifyContent={\"center\"}\n        alignItems={\"center\"}\n        style={{ padding: \"10px 0\" }}\n      >\n        <Button\n          disabled={!chatId}\n          onClick={() => {\n            setDirection();\n            history.push(CHAT + 'none');\n          }}\n        >\n          {\"Empty\"}\n        </Button>\n      </Box>\n    );\n  }\n  return (\n    <Box\n      justifyContent={\"center\"}\n      alignItems={\"center\"}\n      style={{ padding: \"10px 0\", maxWidth: 170 }}\n    >\n      <Button\n        onClick={() => {\n          setDirection();\n          history.push(CHAT + room.roomJid + CONFERENCEDOMAIN);\n        }}\n      >\n        {name}\n      </Button>\n    </Box>\n  );\n};\n","import { Box, Button, Typography } from \"@mui/material\";\nimport { IApiMetaRoom } from \"./MetaNavigation\";\nimport coin from \"../../assets/images/coin.png\";\nimport { useHistory } from \"react-router\";\nexport const MetaHeader = ({\n  room,\n  direction,\n  previousRoom,\n}: {\n  room: IApiMetaRoom | undefined;\n  direction: string;\n  previousRoom: IApiMetaRoom | undefined;\n}) => {\n  const history = useHistory();\n  const onCreateClick = () => {\n    history.push(\"/newchat\", {\n      metaDirection: direction,\n      metaRoom: previousRoom,\n    });\n  };\n  if (!room?.name) {\n    return (\n      <Box\n        sx={{ display: \"flex\", flexDirection: \"column\", alignItems: \"center\" }}\n      >\n        <Box sx={{ alignItems: \"center\", display: \"flex\" }}>\n          <Typography>\n            This space is empty. You can build your own room here for{\" \"}\n            <b>120 </b>\n          </Typography>\n          <img src={coin} style={{ width: 20, height: 20 }} alt={\"coin\"} />\n\n          {/* <CreateNewChatButton\n            onPress={() =>\n              navigation.navigate(ROUTES.NEWCHAT, {\n                metaDirection: direction,\n                metaRoom: previousRoom,\n              })\n            }\n          /> */}\n        </Box>\n        <Button onClick={onCreateClick}>Create Meta Room</Button>\n      </Box>\n    );\n  }\n  return (\n    <Box\n      sx={{\n        display: \"flex\",\n        justifyContent: \"center\",\n        alignItems: \"center\",\n        flexDirection: \"column\",\n      }}\n    >\n      <Typography sx={{ fontWeight: \"bold\", fontSize: 18 }}>\n        {room.name}\n      </Typography>\n      <Typography>{room.description}</Typography>\n    </Box>\n  );\n};\n","import React, { useEffect, useState } from \"react\";\n\nimport { CompassItem } from \"./CompassItem\";\nimport {\n  Box,\n  CircularProgress,\n  IconButton,\n  Modal,\n  useTheme,\n} from \"@mui/material\";\nimport { MetaHeader } from \"./MetaHeader\";\nimport xmpp, { walletToUsername } from \"../../xmpp\";\nimport { httpWithAuth } from \"../../http\";\nimport { CONFERENCEDOMAIN, DOMAIN } from \"../../constants\";\nimport { useStoreState } from \"../../store\";\nimport ExploreIcon from \"@mui/icons-material/Explore\";\ntype IRoom = {\n  _id: string;\n  contractAddress: string;\n  createdAt: string;\n  description: string;\n  name: string;\n  ownerId: string;\n};\n\nexport interface IApiMetaRoom {\n  _id: string;\n  contractAddress: string;\n  createdAt: Date;\n  description: string;\n  name: string;\n  ownerId: string;\n  ownerNavLinks: {\n    east: IRoom | null;\n    north: IRoom | null;\n    south: IRoom | null;\n    west: IRoom | null;\n  };\n  roomJid: string;\n  updatedAt: Date;\n  userNavLinks: {\n    east: IRoom | null;\n    north: IRoom | null;\n    south: IRoom | null;\n    west: IRoom | null;\n  };\n}\n\nexport interface IMetaNavigation {\n  chatId: string;\n  open: boolean;\n  onClose: () => void;\n}\nconst DIRECTIONS = {\n  NORTH: \"north\",\n  WEST: \"west\",\n  SOUTH: \"south\",\n  EAST: \"east\",\n};\nconst SHORT_DIRECTIONS: Record<string, string> = {\n  north: \"n\",\n  west: \"w\",\n  south: \"s\",\n  east: \"e\",\n};\n\nconst OPOSITE_DIRECTIONS: Record<string, string> = {\n  [DIRECTIONS.WEST]: DIRECTIONS.EAST,\n  [DIRECTIONS.EAST]: DIRECTIONS.WEST,\n  [DIRECTIONS.SOUTH]: DIRECTIONS.NORTH,\n  [DIRECTIONS.NORTH]: DIRECTIONS.SOUTH,\n};\n\nconst getOpositeDirection = (direction: string) => {\n  return OPOSITE_DIRECTIONS[direction];\n};\n\n// const findRoom = (id: string | undefined, arr: IApiMetaRoom[]) => {\n//   if (!id) {\n//     return null;\n//   }\n//   const room = arr.find((item) => item.idAddress === id);\n//   if (!room) {\n//     return null;\n//   }\n//   return room;\n// };\n\nconst emptyMetaRoom = {\n  name: \"\",\n  description: \"\",\n  ownerNavLinks: { west: null, east: null, north: null, south: null },\n  ownerId: \"\",\n  contractAddress: \"\",\n  createdAt: new Date(),\n  _id: \"\",\n  roomJid: \"\",\n  updatedAt: new Date(),\n  userNavLinks: { west: null, east: null, north: null, south: null },\n};\n\nconst style = {\n  position: \"absolute\" as \"absolute\",\n  top: \"50%\",\n  left: \"50%\",\n  transform: \"translate(-50%, -50%)\",\n  p: 2,\n  outline: \"none\",\n};\nconst roomRoute = \"/room\";\nexport const MetaNavigation: React.FC<IMetaNavigation> = ({\n  chatId,\n  open,\n  onClose,\n}) => {\n  const [previousDirection, setPreviousDirection] = useState(\"\");\n  const [loading, setLoading] = useState(false);\n\n  const [previousRoom, setPreviuosRoom] = useState<IApiMetaRoom | undefined>();\n  const [currentMetaRoom, setCurrentMetaRoom] =\n    useState<IApiMetaRoom>(emptyMetaRoom);\n  const user = useStoreState((state) => state.user);\n\n  const theme = useTheme();\n\n  const getCurrentRoom = async () => {\n    setLoading(true);\n    try {\n      const res = await httpWithAuth().get(roomRoute + \"/getRoom/\" + chatId);\n      setCurrentMetaRoom(res.data.result);\n    } catch (error) {\n      setCurrentMetaRoom(emptyMetaRoom);\n      console.log(error);\n    }\n    setLoading(false);\n  };\n\n  useEffect(() => {\n    if (!chatId) {\n      setCurrentMetaRoom(emptyMetaRoom);\n    }\n    if (chatId) {\n      getCurrentRoom();\n    }\n  }, [chatId]);\n  const checkEmptyDirections = () => {\n    return (\n      !currentMetaRoom?.ownerNavLinks?.south &&\n      !currentMetaRoom?.ownerNavLinks?.east &&\n      !currentMetaRoom?.ownerNavLinks?.west &&\n      !currentMetaRoom?.ownerNavLinks?.north &&\n      !currentMetaRoom?.userNavLinks?.south &&\n      !currentMetaRoom?.userNavLinks?.east &&\n      !currentMetaRoom?.userNavLinks?.west &&\n      !currentMetaRoom?.userNavLinks?.north\n    );\n  };\n\n  const sendMessage = (chatName: string, jid: string, isPrevious: boolean) => {\n    const manipulatedWalletAddress = walletToUsername(user.walletAddress);\n    const textEnter =\n      user.firstName + \" \" + user.lastName + \" \" + \"has joined\" + \" \" + \"<-\";\n    const textLeave =\n      user.firstName + \" \" + user.lastName + \" \" + \"has left\" + \" \" + \"->\";\n    const data = {\n      senderFirstName: user.firstName,\n      senderLastName: user.lastName,\n      senderWalletAddress: user.walletAddress,\n      isSystemMessage: true,\n      tokenAmount: 0,\n      receiverMessageId: \"\",\n      mucname: chatName,\n      photoURL: user.profileImage,\n      roomJid: jid,\n      isReply: false,\n      mainMessage: undefined,\n    };\n    xmpp.sendMessageStanza(jid, isPrevious ? textLeave : textEnter, data);\n  };\n  const sendRoomJoin = async () => {\n    try {\n      const res = await httpWithAuth().post(roomRoute + \"/join/\" + chatId, {});\n      console.log(res.data);\n    } catch (error) {\n      console.log(error);\n    }\n  };\n  useEffect(() => {\n    if (previousRoom?.name) {\n      sendMessage(\n        previousRoom.name,\n        previousRoom.roomJid + CONFERENCEDOMAIN,\n        true\n      );\n    }\n  }, [previousRoom]);\n  useEffect(() => {\n    if (currentMetaRoom.name) {\n      sendMessage(\n        currentMetaRoom.name,\n        currentMetaRoom.roomJid + CONFERENCEDOMAIN,\n        false\n      );\n      sendRoomJoin();\n    }\n  }, [currentMetaRoom]);\n\n  if (!currentMetaRoom.roomJid && !previousDirection) {\n    return null;\n  }\n\n  const renderDirections = (direction: string) => {\n    const oppositePreviousDirection = getOpositeDirection(previousDirection);\n    if (checkEmptyDirections() && direction === oppositePreviousDirection) {\n      return (\n        <CompassItem\n          name={oppositePreviousDirection + \":\" + previousRoom?.name}\n          chatId={chatId}\n          room={previousRoom}\n          setDirection={() => {\n            setPreviousDirection(oppositePreviousDirection);\n            setPreviuosRoom(previousRoom);\n          }}\n        />\n      );\n    }\n    return (\n      <CompassItem\n        name={\n          SHORT_DIRECTIONS[direction] +\n          \":\" +\n          (currentMetaRoom.ownerNavLinks[direction]?.name ||\n            currentMetaRoom.userNavLinks[direction]?.name)\n        }\n        chatId={chatId}\n        room={\n          currentMetaRoom?.ownerNavLinks?.[direction] ||\n          currentMetaRoom?.userNavLinks?.[direction]\n        }\n        setDirection={() => {\n          setPreviousDirection(direction);\n          setPreviuosRoom(currentMetaRoom);\n        }}\n      />\n    );\n  };\n  return (\n    <Modal open={open} onClose={onClose}>\n      <Box sx={style}>\n        {loading ? (\n          <CircularProgress size={50} />\n        ) : (\n          <Box>\n            <Box\n              sx={{ bgcolor: \"white\", mb: \"10px\", borderRadius: \"10px\", p: 2 }}\n            >\n              <MetaHeader\n                room={currentMetaRoom}\n                direction={previousDirection}\n                previousRoom={previousRoom}\n              />\n            </Box>\n            <Box\n              sx={{\n                display: \"flex\",\n                flexDirection: \"column\",\n                justifyContent: \"center\",\n                alignItems: \"center\",\n                bgcolor: \"white\",\n                borderRadius: \"10px\",\n                p: 2,\n              }}\n            >\n              {renderDirections(DIRECTIONS.NORTH)}\n              <Box\n                sx={{\n                  display: \"grid\",\n                  gridTemplateColumns: \"repeat(3, 1fr)\",\n                  alignItems: \"center\",\n                  justifyContent: \"center\",\n                }}\n              >\n                <Box sx={{ display: \"flex\" }}>\n                  {renderDirections(DIRECTIONS.WEST)}\n                </Box>\n                <Box\n                  sx={{\n                    display: \"flex\",\n                    justifyContent: \"center\",\n                    alignItems: \"center\",\n                  }}\n                >\n                  <IconButton sx={{ color: theme.palette.primary.main }}>\n                    <ExploreIcon fontSize=\"large\" />\n                  </IconButton>\n                </Box>\n                <Box sx={{ display: \"flex\" }}>\n                  {renderDirections(DIRECTIONS.EAST)}\n                </Box>\n              </Box>\n              {renderDirections(DIRECTIONS.SOUTH)}\n            </Box>\n          </Box>\n        )}\n      </Box>\n    </Modal>\n  );\n};\n","import { MessageInput } from '@chatscope/chat-ui-kit-react';\nimport * as React from 'react';\n\n\ninterface CustomMessageInputProps {\n    onPaste:any;\n    placeholder:string;\n    onChange:(innerHtml: string, textContent: string, innerText: string, nodes: NodeList) => void;\n    onSend:(innerHtml: string, textContent: string, innerText: string, nodes: NodeList) => void;\n    sendFile:(file: File, isReply: boolean) => void\n}\n\nconst CustomMessageInput = (props: CustomMessageInputProps) => {\n\n    const {\n        onPaste,\n        placeholder,\n        onChange,\n        onSend,\n        sendFile\n    } = props;\n\n    const fileRef = React.useRef(null);\n\n    return (\n        <div>\n            <MessageInput\n            onPaste={onPaste}\n            placeholder={placeholder}\n            onChange={onChange}\n            onSend={onSend}\n            onAttachClick={() => fileRef.current.click()}\n            />\n            <input\n            type=\"file\"\n            name=\"file\"\n            id=\"file\"\n            onChange={(event) => sendFile(event.target.files[0], true)}\n            ref={fileRef}\n            style={{ display: \"none\" }}\n            />\n        </div>\n    );\n};\n\nexport default CustomMessageInput;\n\n","import React, { useState } from \"react\";\nimport {\n  ChatContainer,\n  ConversationHeader,\n  MessageInput,\n  MessageList,\n  TypingIndicator,\n} from \"@chatscope/chat-ui-kit-react\";\nimport { Box, Checkbox, Divider, IconButton, Typography } from \"@mui/material\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport { Message } from \"../Messages/Message\";\nimport { TMessageHistory, TUserChatRooms, useStoreState } from \"../../../store\";\nimport xmpp, { createMainMessageForThread } from \"../../../xmpp\";\nimport * as DOMPurify from \"dompurify\";\nimport { SystemMessage } from \"../Messages/SystemMessage\";\nimport CustomMessageInput from \"./CustomMessageInput\";\nimport { TProfile } from \"../../../pages/Profile/types\";\nimport { IMessagePosition } from \"../../../pages/ChatInRoom/Chat\";\nimport { getPosition, stripHtml } from \"../../../utils\";\nimport { useHistory, useParams } from \"react-router\";\n\ninterface ThreadContainerProps {\n  roomData: {\n    jid: string;\n    name: string;\n    room_background: string;\n    room_thumbnail: string;\n    users_cnt: string;\n  };\n  handleSetThreadView: (value: boolean) => void;\n  isThreadView: boolean;\n  chooseRoom: (jid: string) => void;\n  profile: TProfile;\n  currentPickedRoom: TUserChatRooms;\n  currentRoom: string;\n  onYReachStart: () => void;\n  sendFile: (file: File, isReply: boolean) => void;\n  showInChannel: boolean;\n  toggleMediaModal: (value: boolean, message?: TMessageHistory) => void;\n  handleShowInChannel: (event: React.ChangeEvent<HTMLInputElement>) => void;\n  toggleTransferDialog: (value: boolean, message?: TMessageHistory) => void;\n}\n\nconst ThreadContainer: React.FC<ThreadContainerProps> = ({\n  roomData,\n  handleSetThreadView,\n  isThreadView,\n  profile,\n  currentPickedRoom,\n  currentRoom,\n  onYReachStart,\n  sendFile,\n  toggleMediaModal,\n  toggleTransferDialog,\n  handleShowInChannel,\n  showInChannel,\n}) => {\n  const currentThreadViewMessage = useStoreState(\n    (store) => store.currentThreadViewMessage\n  );\n  const [myThreadMessage, setMyThreadMessage] = useState(\"\");\n\n  const user = useStoreState((store) => store.user);\n  const userChatRooms = useStoreState((store) => store.userChatRooms);\n  const messages = useStoreState((state) => state.historyMessages);\n\n  const { roomJID } = useParams<{ roomJID: string }>();\n\n  const threadWindowMessages = messages.filter(\n    (item: TMessageHistory) =>\n      item.roomJID.includes(roomJID) &&\n      item.data.isReply &&\n      item.data?.mainMessage?.id === currentThreadViewMessage.id\n  );\n  const currentUntrackedChatRoom = useStoreState(\n    (store) => store.currentUntrackedChatRoom\n  );\n  const loaderArchive = useStoreState((store) => store.loaderArchive);\n  const history = useHistory();\n  const setThreadMessage = (value: string) => {\n    setMyThreadMessage(value);\n    xmpp.isComposing(\n      user.walletAddress,\n      roomData.jid,\n      user.firstName + \" \" + user.lastName\n    );\n  };\n  const handleChatDetailClick = () => {\n    history.push(\"/chatDetails/\" + currentUntrackedChatRoom);\n  };\n\n  const handlePaste = (event: any) => {\n    let item = Array.from(event.clipboardData.items).find((x: any) =>\n      /^image\\//.test(x.type)\n    );\n    if (item) {\n      // @ts-ignore\n      let blob = item.getAsFile();\n      sendFile(blob, false);\n    }\n  };\n  const sendThreadMessage = (button: any) => {\n    if (myThreadMessage.trim().length > 0) {\n      let userAvatar = \"\";\n      if (profile?.profileImage) {\n        userAvatar = profile?.profileImage;\n      }\n      const clearMessageFromHtml = DOMPurify.sanitize(myThreadMessage);\n      const finalMessageTxt = stripHtml(clearMessageFromHtml);\n\n      if (finalMessageTxt.trim().length > 0) {\n        const data = {\n          senderFirstName: user.firstName,\n          senderLastName: user.lastName,\n          senderWalletAddress: user.walletAddress,\n          isSystemMessage: false,\n          tokenAmount: 0,\n          receiverMessageId: currentThreadViewMessage.data.receiverMessageId,\n          mucname: roomData.name,\n          photoURL: user.profileImage,\n          roomJid: roomData.jid,\n          isReply: true,\n          mainMessage: createMainMessageForThread(currentThreadViewMessage),\n          showInChannel: showInChannel,\n          push: true,\n        };\n\n        xmpp.sendMessageStanza(currentRoom, finalMessageTxt, data);\n      }\n    }\n  };\n\n  return (\n    <ChatContainer\n      style={{\n        borderLeftWidth: \"2px\",\n      }}\n    >\n      {!!roomData && (\n        <div is=\"ConversationHeader\">\n          <ConversationHeader\n            style={{\n              height: \"70px\",\n            }}\n          >\n            <ConversationHeader.Content\n              datatype=\"dad\"\n              userName={\n                <div>\n                  <Typography fontWeight={\"bold\"}>Thread</Typography>\n                  <Typography>{roomData.name}</Typography>\n                </div>\n              }\n              onClick={handleChatDetailClick}\n            />\n            <ConversationHeader.Actions>\n              <IconButton\n                sx={{ color: \"black\" }}\n                onClick={() => handleSetThreadView(false)}\n              >\n                <CloseIcon />\n              </IconButton>\n            </ConversationHeader.Actions>\n          </ConversationHeader>\n          {/* Main Message Preview */}\n          <Box width={\"100%\"} padding={2}>\n            <span>\n              <div>\n                <Message\n                  onMediaMessageClick={toggleMediaModal}\n                  toggleTransferDialog={toggleTransferDialog}\n                  isThread={isThreadView}\n                  key={currentThreadViewMessage.id}\n                  is={\"Message\"}\n                  position={{ position: \"single\", type: \"single\" }}\n                  message={currentThreadViewMessage}\n                  onMessageButtonClick={sendThreadMessage}\n                />\n              </div>\n            </span>\n          </Box>\n          <Divider>{currentThreadViewMessage.numberOfReplies}</Divider>\n        </div>\n      )}\n\n      <MessageList\n        style={{\n          backgroundImage: currentPickedRoom?.room_background\n            ? `url(${currentPickedRoom.room_background})`\n            : \"white\",\n          backgroundRepeat: \"no-repeat\",\n          backgroundSize: \"100% 100%\",\n        }}\n        disableOnYReachWhenNoScroll={true}\n        typingIndicator={\n          !!userChatRooms.filter((e) => e.jid === currentRoom)[0]\n            ?.composing && (\n            <TypingIndicator\n              style={{ opacity: \".6\" }}\n              content={\n                userChatRooms.filter((e) => e.jid === currentRoom)[0]?.composing\n              }\n            />\n          )\n        }\n      >\n        {threadWindowMessages.map((message, index, arr) =>\n          message.data.isSystemMessage === \"false\" ? (\n            <Message\n              onMediaMessageClick={toggleMediaModal}\n              toggleTransferDialog={toggleTransferDialog}\n              isThread={true}\n              key={message.id}\n              is={\"Message\"}\n              position={getPosition(arr, message, index)}\n              message={message}\n              onMessageButtonClick={sendThreadMessage}\n            />\n          ) : (\n            <SystemMessage\n              key={message.id}\n              is={\"Message\"}\n              message={message}\n              userJid={xmpp.client?.jid?.toString()}\n            />\n          )\n        )}\n        {threadWindowMessages.length <= 0 ||\n          (!currentRoom && (\n            <MessageList.Content\n              style={{\n                display: \"flex\",\n                flexDirection: \"column\",\n                justifyContent: \"center\",\n                height: \"100%\",\n                textAlign: \"center\",\n                fontSize: \"1.2em\",\n              }}\n            >\n              {!loaderArchive ? (\n                <span>\n                  {!currentRoom && \"To get started, please select a chat room.\"}\n                </span>\n              ) : (\n                \"Loading...\"\n              )}\n            </MessageList.Content>\n          ))}\n        {!loaderArchive && currentRoom && threadWindowMessages.length <= 0 && (\n          <MessageList.Content\n            style={{\n              display: \"flex\",\n              flexDirection: \"column\",\n              justifyContent: \"center\",\n              height: \"100%\",\n              textAlign: \"center\",\n              fontSize: \"1.2em\",\n            }}\n          >\n            Message list is empty\n          </MessageList.Content>\n        )}\n      </MessageList>\n\n      {!!roomData?.name && (\n        <div is={\"MessageInput\"}>\n          <Divider />\n          <Box\n            borderColor={\"#D3D3D3\"}\n            height=\"30px\"\n            alignItems={\"center\"}\n            flexDirection={\"row\"}\n            display=\"flex\"\n            width={\"100%\"}\n          >\n            <Checkbox\n              checked={showInChannel}\n              onChange={handleShowInChannel}\n              inputProps={{ \"aria-label\": \"controlled\" }}\n            />\n            <Typography>Also send to room</Typography>\n          </Box>\n\n          <CustomMessageInput\n            onChange={setThreadMessage}\n            onPaste={handlePaste}\n            onSend={sendThreadMessage}\n            placeholder=\"Type message here\"\n            sendFile={sendFile}\n          />\n        </div>\n      )}\n    </ChatContainer>\n  );\n};\n\nexport default ThreadContainer;\n","import React, { useEffect, useMemo, useState } from \"react\";\n\nimport {\n  Dialog,\n  DialogContent,\n  Divider,\n  Button,\n  Typography,\n  TextField,\n} from \"@mui/material\";\nimport { transferCoin } from \"../../http\";\n\nimport coin from \"../../assets/images/coin.png\";\nimport SendIcon from \"@mui/icons-material/Send\";\nimport BlockIcon from \"@mui/icons-material/Block\";\nimport xmpp, { walletToUsername } from \"../../xmpp\";\nimport { TMessageHistory, useStoreState } from \"../../store\";\nimport { coinReplacedName, coinsMainName } from \"../../config/config\";\nimport { DOMAIN } from \"../../constants\";\nimport { createPrivateChat } from \"../../helpers/chat/createPrivateChat\";\nimport { useSnackbar } from \"../../context/SnackbarContext\";\nimport ReplyIcon from '@mui/icons-material/Reply';\nimport EditIcon from '@mui/icons-material/Edit';\n\nconst dialogItems = [1, 3, 5, \"x\"];\ninterface IProps {\n  open: boolean;\n  onClose: () => void;\n  loading?: boolean;\n  message: TMessageHistory | null;\n  onPrivateRoomClick: (jid: string) => void;\n  onThreadClick:() => void;\n  onEditClick:(value:boolean, message:TMessageHistory) => void;\n}\ntype IDialog = \"dialog\" | \"error\" | \"clarification\" | \"transfer\";\n\nconst dialogTypes: Record<IDialog, IDialog> = {\n  dialog: \"dialog\",\n  error: \"error\",\n  clarification: \"clarification\",\n  transfer: \"transfer\",\n};\n\nexport function ChatTransferDialog({\n  open,\n  onClose,\n  loading,\n  message,\n  onPrivateRoomClick,\n  onThreadClick,\n  onEditClick\n}: IProps) {\n  const user = useStoreState((state) => state.user);\n\n  const [coinAmount, setCoinAmount] = useState(1);\n  const [dialogType, setDialogType] = useState<IDialog>(dialogTypes.dialog);\n\n  const balance = useStoreState((store) => store.balance);\n  const setNewUserChatRoom = useStoreState((store) => store.setNewUserChatRoom);\n  const { showSnackbar } = useSnackbar();\n\n  const messageJid = message?.data?.senderJID.split('/')[0];\n  const userJid = useMemo(() => walletToUsername(user.walletAddress) + DOMAIN, []);\n  const isSameUser = userJid === messageJid;\n  const coinData = balance.filter(\n    (el) => !el.tokenType && el.contractAddress.length > 10\n  );\n\n  const openThreadView = () => {\n    onThreadClick()\n    onClose()\n  }\n  \n  const openEditView = () => {\n    onEditClick(true, message);\n    onClose()\n  }\n\n  const userToBlackList = (step: \"clarify\" | \"block\") => {\n    if (step === \"clarify\") {\n      setDialogType(dialogTypes.clarification);\n      return;\n    }\n\n    if (step === \"block\") {\n      xmpp.blacklistUser(message.data.senderJID);\n      xmpp.getBlackList();\n      useStoreState\n        .getState()\n        .removeAllInMessageHistory(message.data.senderJID);\n    }\n    onClose();\n  };\n\n  const sendCoins = async (amount?: number) => {\n    const currentCoinAmount = amount ? Number(amount) : Number(coinAmount);\n    try {\n      const res = await transferCoin(\n        \"DPT\",\n        coinData[0].tokenName,\n        currentCoinAmount,\n        message.data.senderWalletAddress\n      );\n      const coinName =\n        coinData[0].tokenName === coinsMainName\n          ? coinReplacedName\n          : coinData[0].tokenName;\n      const sender = user.firstName + \" \" + user.lastName;\n      const receiver =\n        message.data.senderFirstName + \" \" + message.data.senderLastName;\n      const textMessage = `${sender} -> ${coinAmount} ${coinName} -> ${receiver}`;\n      const transactionId = res.data.transaction._id;\n      xmpp.sendSystemMessage(\n        message.roomJID,\n        user.firstName,\n        user.lastName,\n        user.walletAddress,\n        textMessage,\n        currentCoinAmount,\n        message.id,\n        transactionId\n      );\n\n      onClose();\n    } catch (error) {\n      console.log(error);\n      showSnackbar(\"error\", \"An error occurred during the coin transfer.\");\n      onClose();\n    }\n  };\n\n  const openPrivateRoom = () => {\n    createPrivateChat(\n      user.walletAddress,\n      message.data.senderWalletAddress,\n      user.firstName,\n      message.data.senderFirstName,\n      message.data.senderJID\n    )\n      .then((result) => {\n        if (result.isNewRoom) {\n          const temporaryRoomData = {\n            jid: result.roomJid,\n            name: result.roomName,\n            room_background: \"none\",\n            room_thumbnail: \"none\",\n            users_cnt: \"2\",\n            unreadMessages: 0,\n            composing: \"\",\n            toUpdate: true,\n            description: \"\",\n          };\n          setNewUserChatRoom(temporaryRoomData);\n          onPrivateRoomClick(result.roomJid);\n        } else {\n          onPrivateRoomClick(result.roomJid);\n        }\n      })\n      .catch((error) => {\n        console.log(\"openPrivateRoom Error: \", error);\n      });\n    onClose();\n  };\n\n  const renderDialogContent = () => {\n    if (!message) return null;\n    switch (dialogType) {\n      case dialogTypes.clarification:\n        return (\n          <div\n            style={{\n              display: \"flex\",\n              flexDirection: \"column\",\n            }}\n          >\n            {\"Are you sure you want to block the user?\"}\n            <Button\n              onClick={() => userToBlackList(\"block\")}\n              variant=\"outlined\"\n              size=\"small\"\n            >\n              To block list\n            </Button>\n          </div>\n        );\n      case dialogTypes.dialog:\n        return (\n          <div\n            style={{\n              display: \"flex\",\n              flexDirection: \"column\",\n            }}\n          >\n            {!isSameUser&&<div>\n              Reward{\" \"}\n              <strong>\n                {message.data.senderFirstName +\n                  \" \" +\n                  message.data.senderLastName}\n              </strong>{\" \"}\n              with coins\n            </div>}\n\n            {!isSameUser&&<div\n              style={{\n                display: \"flex\",\n                justifyContent: \"space-between\",\n                alignItems: \"center\",\n                margin: \"10px 0px 10px 0px\",\n              }}\n            >\n              {dialogItems.map((item) => (\n                <div\n                  key={item}\n                  style={{\n                    textAlign: \"center\",\n                    cursor: \"pointer\",\n                  }}\n                  onClick={() => {\n                    typeof item === \"number\"\n                      ? sendCoins(item)\n                      : setDialogType(dialogTypes.transfer);\n                  }}\n                >\n                  <img\n                    src={coin}\n                    style={{\n                      width: 25,\n                      height: 25,\n                    }}\n                    alt={\"coin\"}\n                  />\n                  <Typography\n                    sx={{\n                      fontWeight: \"bold\",\n                    }}\n                  >\n                    {item}\n                  </Typography>\n                </div>\n              ))}\n            </div>}\n            {!isSameUser&&<Divider\n              style={{\n                margin: \"10px\",\n              }}\n            />}\n            {!isSameUser&&<Button\n              onClick={openPrivateRoom}\n              variant=\"outlined\"\n              startIcon={<SendIcon />}\n            >\n              Direct message\n            </Button>}\n            <Button\n              style={{\n                margin: \"10px 0px 0px 0px\",\n              }}\n              onClick={openThreadView}\n              variant=\"outlined\"\n              startIcon={<ReplyIcon />}\n            >\n              Reply\n            </Button>\n\n            {isSameUser&&\n              <Button\n                style={{\n                  margin: \"10px 0px 0px 0px\",\n                }}\n                onClick={openEditView}\n                variant=\"outlined\"\n                startIcon={<EditIcon />}\n              >\n                Edit\n              </Button>\n            }\n              \n              {!isSameUser&&<Divider\n              style={{\n                margin: \"10px\",\n              }}\n            />}\n            {!isSameUser&&<div\n            style={{\n              display:'flex',\n              alignItems:\"center\",\n              flexDirection:\"column\"\n            }}\n            >\n              <Button\n                onClick={() => userToBlackList(\"clarify\")}\n                variant=\"contained\"\n                startIcon={<BlockIcon />}\n              >\n                Block this user\n              </Button>\n              <Typography\n                style={{\n                  textAlign: \"center\",\n                }}\n                variant=\"caption\"\n                display=\"block\"\n                gutterBottom\n              >\n                Stop seeing this user.\n              </Typography>\n            </div>}\n          </div>\n        );\n      case dialogTypes.transfer:\n        return (\n          <div\n            style={{\n              display: \"flex\",\n              flexDirection: \"column\",\n            }}\n          >\n            <TextField\n              id=\"standard-basic\"\n              type={\"number\"}\n              label=\"Enter transfer amount\"\n              variant=\"standard\"\n              onChange={(event) => setCoinAmount(Number(event.target.value))}\n            />\n            <Button\n              style={{\n                marginTop: 10,\n              }}\n              onClick={() => sendCoins()}\n              variant=\"outlined\"\n              size=\"small\"\n            >\n              Send coins\n            </Button>\n          </div>\n        );\n\n      default:\n        return null;\n    }\n  };\n  return (\n    <Dialog open={open} onClose={onClose} maxWidth={\"xl\"}>\n      <DialogContent>{renderDialogContent()}</DialogContent>\n    </Dialog>\n  );\n}\n","import React from \"react\";\nimport Box from \"@mui/material/Box\";\n\nimport Modal from \"@mui/material/Modal\";\nimport { TCombinedMimeType } from \"../../constants\";\nimport { IconButton } from \"@mui/material\";\nimport CloseIcon from '@mui/icons-material/Close';\n\nconst style = {\n  position: \"absolute\" as \"absolute\",\n  top: \"50%\",\n  left: \"50%\",\n  transform: \"translate(-50%, -50%)\",\n  bgcolor: \"background.paper\",\n  boxShadow: 24,\n  p: 4,\n  borderRadius: '10px'\n};\n\ninterface IChatMediaModal {\n  open: boolean;\n  onClose: () => void;\n  mimetype: TCombinedMimeType;\n  url: string;\n}\n\nexport const ChatMediaModal: React.FC<IChatMediaModal> = ({\n  open,\n  onClose,\n  mimetype,\n  url,\n}) => {\n  const renderMediaContent = () => {\n    switch (mimetype) {\n      case \"image/jpeg\":\n      case \"image/png\":\n      case \"image/jpg\":\n        return <img src={url} alt={\"image1\"} style={{ maxWidth: \"100%\", maxHeight: '90vh' }} />;\n\n      default:\n        return null;\n    }\n  };\n  return (\n    <Modal\n      open={open}\n      onClose={onClose}\n      aria-labelledby=\"modal-modal-title\"\n      aria-describedby=\"modal-modal-description\"\n    >\n      <Box sx={style}>\n        <IconButton onClick={onClose} sx={{position: 'absolute', top: 0, right: 0, color: 'black'}}>\n          <CloseIcon />\n        </IconButton>\n        {renderMediaContent()}\n      </Box>\n    </Modal>\n  );\n};\n","import React, { useCallback, useState } from \"react\";\nimport xmpp from \"../../xmpp\";\nimport { AudioRecorder, useAudioRecorder } from \"react-audio-voice-recorder\";\nimport { uploadFile } from \"../../http\";\nimport { TProfile } from \"../../pages/Profile/types\";\nimport { useStoreState } from \"../../store\";\nimport { Box, CircularProgress } from \"@mui/material\";\nimport { useSnackbar } from \"../../context/SnackbarContext\";\n\ninterface IProps {\n  profile: TProfile;\n  currentRoom: string;\n  roomData: any;\n}\n\nexport function ChatAudioMessageDialog({\n  profile,\n  currentRoom,\n  roomData,\n}: IProps) {\n  const user = useStoreState((store) => store.user);\n  const [loading, setLoading] = useState(false);\n  const recorderControls = useAudioRecorder();\n  const { showSnackbar } = useSnackbar();\n  const addAudioElement = (blob: Blob) => {\n    setLoading(true);\n    let formData = new FormData();\n    formData.append(\"files\", blob);\n    uploadFile(formData)\n      .then((result) => {\n        let userAvatar = \"\";\n        if (profile?.profileImage) {\n          userAvatar = profile?.profileImage;\n        }\n\n        result.data.results.map(async (item: any) => {\n          const data = {\n            firstName: user.firstName,\n            lastName: user.lastName,\n            walletAddress: user.walletAddress,\n            chatName: roomData.name,\n            userAvatar: userAvatar,\n            createdAt: item.createdAt,\n            expiresAt: item.expiresAt,\n            fileName: item.filename,\n            isVisible: item.isVisible,\n            location: item.location,\n            locationPreview: item.locationPreview,\n            mimetype: item.mimetype,\n            originalName: item.originalname,\n            ownerKey: item.ownerKey,\n            size: item.size,\n            duration: item?.duration,\n            updatedAt: item.updatedAt,\n            userId: item.userId,\n            waveForm: \"\",\n            attachmentId: item._id,\n            wrappable: true,\n          };\n          xmpp.sendMediaMessageStanza(currentRoom, data);\n        });\n      })\n      .catch((error) => {\n        console.log(error);\n        showSnackbar(\"error\", \"An error occurred while loading your audio.\");\n      });\n    setLoading(false);\n\n  };\n\n  return (\n    <Box>\n      <Box style={{ display: loading ? \"none\" : \"block\" }}>\n        <AudioRecorder\n          recorderControls={recorderControls}\n          onRecordingComplete={addAudioElement}\n        />\n      </Box>\n      {loading && <CircularProgress color={\"secondary\"} size={\"20px\"} />}\n    </Box>\n  );\n}\n","import React, {\n  useCallback,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n} from \"react\";\nimport xmpp, { createMainMessageForThread } from \"../../xmpp\";\nimport {\n  TActiveRoomFilter,\n  TMessageHistory,\n  TUserChatRooms,\n  useStoreState,\n} from \"../../store\";\nimport { getPublicProfile, uploadFile } from \"../../http\";\nimport { TProfile } from \"../Profile/types\";\nimport { format, formatDistance, subDays } from \"date-fns\";\nimport * as DOMPurify from \"dompurify\";\n\nimport {\n  MainContainer,\n  Avatar,\n  ChatContainer,\n  MessageList,\n  MessageInput,\n  Conversation,\n  ConversationList,\n  Sidebar,\n  Search,\n  ConversationHeader,\n  TypingIndicator,\n  MessageModel,\n} from \"@chatscope/chat-ui-kit-react\";\nimport { Message } from \"../../components/Chat/Messages/Message\";\nimport { SystemMessage } from \"../../components/Chat/Messages/SystemMessage\";\nimport {\n  Button,\n  CircularProgress,\n  Dialog,\n  DialogActions,\n  DialogContent,\n  DialogContentText,\n  DialogTitle,\n  IconButton,\n  useMediaQuery,\n  useTheme,\n  Box,\n  Slide,\n  Stack,\n  Typography,\n  Divider,\n} from \"@mui/material\";\nimport { useParams, useHistory } from \"react-router-dom\";\nimport { useDropzone } from \"react-dropzone\";\nimport { MetaNavigation } from \"../../components/MetaNavigation/MetaNavigation\";\nimport QrCodeIcon from \"@mui/icons-material/QrCode\";\nimport { QrModal } from \"../Profile/QrModal\";\nimport { CONFERENCEDOMAIN } from \"../../constants\";\nimport { ROOMS_FILTERS } from \"../../config/config\";\nimport ThreadContainer from \"../../components/Chat/Threads/ThreadContainer\";\nimport { ChatTransferDialog } from \"../../components/Chat/ChatTransferDialog\";\nimport { ChatMediaModal } from \"../../components/Chat/ChatMediaModal\";\nimport { ChatAudioMessageDialog } from \"../../components/Chat/ChatAudioRecorder\";\nimport { generateChatLink, getPosition, stripHtml } from \"../../utils\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport EditIcon from \"@mui/icons-material/Edit\";\n\nexport type IMessagePosition = {\n  position: MessageModel[\"position\"];\n  type: string;\n  separator?: string;\n};\n\nexport interface IButtons {\n  name: string;\n  notDisplayedValue: string;\n  value: string;\n}\n\nconst NO_ROOM_PICKED = \"none\" + CONFERENCEDOMAIN;\nconst filterChatRooms = (\n  rooms: TUserChatRooms[],\n  filter: TActiveRoomFilter\n) => {\n  if (filter === ROOMS_FILTERS.official || filter === ROOMS_FILTERS.favourite) {\n    return rooms.filter(\n      (item) =>\n        item.group === ROOMS_FILTERS.official ||\n        item.group === ROOMS_FILTERS.favourite\n    );\n  }\n\n  return rooms.filter(\n    (item) =>\n      item.group !== ROOMS_FILTERS.official &&\n      item.group !== ROOMS_FILTERS.favourite\n  );\n};\n\nexport function ChatInRoom() {\n  const messages = useStoreState((state) => state.historyMessages);\n  const user = useStoreState((store) => store.user);\n  const userChatRooms = useStoreState((store) => store.userChatRooms);\n  const currentThreadViewMessage = useStoreState(\n    (store) => store.currentThreadViewMessage\n  );\n  const setCurrentThreadViewMessage = useStoreState(\n    (store) => store.setCurrentThreadViewMessage\n  );\n  const loaderArchive = useStoreState((store) => store.loaderArchive);\n  const currentUntrackedChatRoom = useStoreState(\n    (store) => store.currentUntrackedChatRoom\n  );\n  const { roomJID } = useParams<{ roomJID: string }>();\n\n  const [profile, setProfile] = useState<TProfile>();\n  const [myMessage, setMyMessage] = useState(\"\");\n\n  const [showMetaNavigation, setShowMetaNavigation] = useState(true);\n  const [isThreadView, setThreadView] = useState(false);\n  const [showInChannel, setShowInChannel] = React.useState(false);\n  const [isEditing, setIsEditing] = React.useState(false);\n  const [currentEditMessage, setCurrentEditMessage] =\n    React.useState<TMessageHistory>();\n\n  const handleSetThreadView = (value: boolean) => setThreadView(value);\n  const handleSetCurrentThreadViewMessage = (threadMessage: TMessageHistory) =>\n    setCurrentThreadViewMessage(threadMessage);\n  const handleShowInChannel = (event: React.ChangeEvent<HTMLInputElement>) =>\n    setShowInChannel(event.target.checked);\n\n  const handleCurrentEditMessage = (message: TMessageHistory) =>\n    setCurrentEditMessage(message);\n\n  const [currentRoom, setCurrentRoom] = useState(\"\");\n  const currentPickedRoom = useMemo(() => {\n    return userChatRooms.find((item) => item.jid === currentRoom);\n  }, [userChatRooms, currentRoom]);\n\n  const mainWindowMessages = messages.filter((item: TMessageHistory) => item.data.roomJid === roomJID + CONFERENCEDOMAIN && (item.data.showInChannel || !item.data.isReply) )\n\n  const [roomData, setRoomData] = useState<{\n    jid: string;\n    name: string;\n    room_background: string;\n    room_thumbnail: string;\n    users_cnt: string;\n  }>({\n    jid: \"\",\n    name: \"\",\n    room_background: \"\",\n    room_thumbnail: \"\",\n    users_cnt: \"\",\n  });\n\n  const [transferDialogData, setTransferDialogData] = useState<{\n    open: boolean;\n    message: TMessageHistory | null;\n  }>({ open: false, message: null });\n\n  const [mediaDialogData, setMediaDialogData] = useState<{\n    open: boolean;\n    message: TMessageHistory | null;\n  }>({ open: false, message: null });\n\n  const [isQrModalVisible, setQrModalVisible] = useState(false);\n\n  const [uploadFileDialogData, setUploadFileDialogData] = useState<{\n    open: boolean;\n    headline: string;\n    description: string;\n  }>({ headline: \"\", description: \"\", open: false });\n\n  const [firstLoadMessages, setFirstLoadMessages] = useState(true);\n  const activeRoomFilter = useStoreState((state) => state.activeRoomFilter);\n  const setActiveRoomFilter = useStoreState(\n    (state) => state.setActiveRoomFilter\n  );\n  const openLastMetaRoom = activeRoomFilter === ROOMS_FILTERS.meta;\n  const closeQrModal = () => {\n    setQrModalVisible(false);\n  };\n  const history = useHistory();\n  const fileRef = useRef(null);\n  const theme = useTheme();\n  const fullScreen = useMediaQuery(theme.breakpoints.down(\"md\"));\n  const onDrop = useCallback(\n    (acceptedFiles: File[]) => {\n      sendFile(acceptedFiles[0], false);\n    },\n    [roomData]\n  );\n  const { getRootProps } = useDropzone({\n    onDrop,\n    noClick: true,\n    maxFiles: 1,\n  });\n  const onYReachStart = () => {\n    const filteredMessages = messages.filter(\n      (item: TMessageHistory) => item.roomJID === currentRoom\n    );\n\n    if (loaderArchive) {\n      return;\n    } else {\n      const lastMessageID = filteredMessages[0].id;\n      xmpp.getPaginatedArchive(currentRoom, String(lastMessageID), 10);\n    }\n  };\n\n  useEffect(() => {\n    if (roomJID) {\n      loadMessages(roomJID);\n      setShowMetaNavigation(true);\n    }\n  }, [roomJID]);\n\n  useEffect(() => {\n    getPublicProfile(user.walletAddress).then((result) => {\n      setProfile(result.data.result);\n    });\n  }, []);\n\n  const toggleTransferDialog = (\n    value: boolean,\n    message: TMessageHistory = null\n  ) => {\n    setTransferDialogData({ open: value, message });\n  };\n  const toggleMediaModal = (\n    value: boolean,\n    message: TMessageHistory = null\n  ) => {\n    setMediaDialogData({ open: value, message });\n  };\n\n  const chooseRoom = (jid: string) => {\n    history.push(\"/chat/\" + jid.split(\"@\")[0]);\n    loadMessages(jid);\n  };\n  const loadMessages = (jid: string) => {\n    setCurrentRoom(jid);\n    const currentRoomData = userChatRooms.filter((e) => e.jid === jid)[0];\n    setRoomData(currentRoomData);\n    useStoreState.getState().clearCounterChatRoom(jid);\n    useStoreState.getState().setCurrentUntrackedChatRoom(jid);\n\n    const filteredMessages = messages.filter(\n      (item: TMessageHistory) => item.roomJID === jid\n    );\n    setFirstLoadMessages(true);\n\n    if (\n      !loaderArchive &&\n      filteredMessages.length <= 10 &&\n      filteredMessages.length > 0\n    ) {\n      const lastMessageID = filteredMessages[0].id;\n      xmpp.getPaginatedArchive(jid, String(lastMessageID), 50);\n    }\n  };\n\n  const getConversationInfo = (roomJID: string) => {\n    const messagesInRoom = messages\n      .filter((item: TMessageHistory) => item.roomJID === roomJID)\n      .slice(-1);\n    if (loaderArchive && messagesInRoom.length <= 0) {\n      return \"Loading...\";\n    }\n\n    if (messagesInRoom.length > 0) {\n      return messagesInRoom[0].body;\n    }\n    return \"No messages yet\";\n  };\n\n  const getLastActiveTime = (roomJID: string) => {\n    const messagesInRoom = messages\n      .filter((item: TMessageHistory) => item.roomJID === roomJID)\n      .slice(-1);\n    if (messagesInRoom.length <= 0) {\n      return \"\";\n    }\n\n    return format(new Date(messagesInRoom[0].date), \"H:mm\");\n  };\n\n  const sendMessage = (button: any) => {\n    if (myMessage.trim().length > 0) {\n      let userAvatar = \"\";\n      if (profile?.profileImage) {\n        userAvatar = profile?.profileImage;\n      }\n      const clearMessageFromHtml = DOMPurify.sanitize(myMessage);\n      const finalMessageTxt = stripHtml(clearMessageFromHtml);\n\n      if (finalMessageTxt.trim().length > 0) {\n        if (isEditing) {\n          const data = {\n            senderFirstName: user.firstName,\n            senderLastName: user.lastName,\n            senderWalletAddress: user.walletAddress,\n            isSystemMessage: false,\n            tokenAmount: 0,\n            receiverMessageId: currentEditMessage.data.receiverMessageId,\n            mucname: roomData.name,\n            photoURL: userAvatar,\n            roomJid: roomJID,\n            isReply: false,\n            mainMessage: undefined,\n            push: true,\n          };\n          xmpp.sendReplaceMessageStanza(\n            currentUntrackedChatRoom,\n            finalMessageTxt,\n            currentEditMessage.id.toString(),\n            data\n          );\n          setIsEditing(false);\n        } else {\n          xmpp.sendMessage(\n            currentRoom,\n            user.firstName,\n            user.lastName,\n            userAvatar,\n            user.walletAddress,\n            typeof button === \"object\" ? button.value : finalMessageTxt,\n            typeof button === \"object\" ? button.notDisplayedValue : null\n          );\n        }\n      }\n    }\n  };\n\n  const sendFile = (file: File, isReply: boolean) => {\n    setUploadFileDialogData({\n      headline: \"File is loading, please wait...\",\n      description: \"\",\n      open: true,\n    });\n\n    const formData = new FormData();\n    formData.append(\"files\", file);\n\n    uploadFile(formData)\n      .then((result) => {\n        let userAvatar = \"\";\n        if (profile?.profileImage) {\n          userAvatar = profile?.profileImage;\n        }\n\n        result.data.results.map(async (item: any) => {\n          let data = {\n            firstName: user.firstName,\n            lastName: user.lastName,\n            walletAddress: user.walletAddress,\n            chatName: roomData.name,\n            userAvatar: userAvatar,\n            createdAt: item.createdAt,\n            expiresAt: item.expiresAt,\n            fileName: item.filename,\n            isVisible: item.isVisible,\n            location: item.location,\n            locationPreview: item.locationPreview,\n            mimetype: item.mimetype,\n            originalName: item.originalname,\n            ownerKey: item.ownerKey,\n            size: item.size,\n            duration: item?.duration,\n            updatedAt: item.updatedAt,\n            userId: item.userId,\n            waveForm: \"\",\n            attachmentId: item._id,\n            wrappable: true,\n          };\n\n          const additionalDataForThread = {\n            isReply: isReply,\n            mainMessage: createMainMessageForThread(currentThreadViewMessage),\n            showInChannel: showInChannel,\n          };\n\n          data = { ...data, ...additionalDataForThread };\n          xmpp.sendMediaMessageStanza(currentRoom, data);\n          setUploadFileDialogData({\n            open: false,\n            description: \"\",\n            headline: \"\",\n          });\n        });\n      })\n      .catch((error) => {\n        console.log(error);\n        setUploadFileDialogData({\n          headline: \"Error\",\n          description: \"An error occurred while uploading the file\",\n          open: true,\n        });\n      });\n    if (fileRef.current) {\n      fileRef.current.value = \"\";\n    }\n  };\n\n  const setMessage = (value) => {\n    setMyMessage(value);\n    xmpp.isComposing(\n      user.walletAddress,\n      roomData.jid,\n      user.firstName + \" \" + user.lastName\n    );\n  };\n\n  const handlePaste = (event: any) => {\n    let item = Array.from(event.clipboardData.items).find((x: any) =>\n      /^image\\//.test(x.type)\n    );\n    if (item) {\n      // @ts-ignore\n      let blob = item.getAsFile();\n      sendFile(blob, false);\n    }\n  };\n\n  useEffect(() => {\n    const timeoutId = setTimeout(() => {\n      xmpp.pausedComposing(user.walletAddress, roomData.jid);\n    }, 1000);\n    return () => clearTimeout(timeoutId);\n  }, [myMessage]);\n\n  const onBlur = () => {\n    useStoreState.getState().setCurrentUntrackedChatRoom(\"\");\n  };\n  const onFocus = () => {\n    if (currentRoom) {\n      useStoreState.getState().setCurrentUntrackedChatRoom(currentRoom);\n      useStoreState.getState().clearCounterChatRoom(currentRoom);\n    }\n  };\n\n  useEffect(() => {\n    if (currentUntrackedChatRoom) {\n      if (\n        !roomJID ||\n        roomJID === \"none\" ||\n        roomJID === \"\" ||\n        currentUntrackedChatRoom.split(\"@\")[0] === roomJID\n      ) {\n        if (currentUntrackedChatRoom.split(\"@\")[1]) {\n          chooseRoom(currentUntrackedChatRoom);\n        } else {\n          chooseRoom(currentUntrackedChatRoom + CONFERENCEDOMAIN);\n        }\n      }\n    }\n\n    if (\n      currentUntrackedChatRoom.split(\"@\")[0] !== roomJID &&\n      roomJID !== \"none\" &&\n      roomJID !== \"\"\n    ) {\n      useStoreState.getState().setCurrentUntrackedChatRoom(roomJID);\n      chooseRoom(roomJID);\n    }\n\n    window.addEventListener(\"blur\", onBlur);\n    window.addEventListener(\"focus\", onFocus);\n\n    return () => {\n      window.removeEventListener(\"blur\", onBlur);\n      window.removeEventListener(\"focus\", onFocus);\n    };\n  }, [currentRoom]);\n\n  useEffect(() => {\n    const filteredMessages = messages.filter(\n      (item: TMessageHistory) => item.roomJID === currentRoom\n    );\n    if (\n      !loaderArchive &&\n      filteredMessages.length > 0 &&\n      filteredMessages.length <= 51 &&\n      currentRoom &&\n      firstLoadMessages\n    ) {\n      const lastUpFilteredMessage = filteredMessages[0];\n\n      if (\n        filteredMessages.length >= 10 &&\n        filteredMessages.length < 15 &&\n        lastUpFilteredMessage.data.isSystemMessage\n      ) {\n        setFirstLoadMessages(false);\n        xmpp.getPaginatedArchive(\n          currentRoom,\n          String(lastUpFilteredMessage.id),\n          5\n        );\n      } else if (filteredMessages.length === 1) {\n        setFirstLoadMessages(false);\n        xmpp.getPaginatedArchive(\n          currentRoom,\n          String(lastUpFilteredMessage.id),\n          50\n        );\n      }\n    }\n    if (filteredMessages.length === 0 && firstLoadMessages) {\n      xmpp.getRoomArchiveStanza(currentRoom, 50);\n    }\n  }, [messages]);\n\n  const handleChatDetailClick = () => {\n    history.push(\"/chatDetails/\" + currentUntrackedChatRoom);\n  };\n\n  const onMenuThreadClick = () => {\n    setThreadView(true);\n    handleSetCurrentThreadViewMessage(transferDialogData.message);\n  };\n\n  const onMenuEditClick = (value: boolean, message: TMessageHistory) => {\n    setIsEditing(value);\n    handleCurrentEditMessage(message);\n  };\n\n  const onMessageThreadClick = (message: TMessageHistory) => {\n    setThreadView(true);\n    handleSetCurrentThreadViewMessage(message);\n  };\n\n  return (\n    <Box style={{ paddingBlock: \"20px\", height: \"100%\" }}>\n      <MainContainer responsive>\n        <Sidebar position=\"left\" scrollable={false}>\n          <Search placeholder=\"Search...\" />\n          <ConversationList loading={loaderArchive}>\n            {filterChatRooms(userChatRooms, activeRoomFilter).map((room) => (\n              <Conversation\n                active={room.jid === currentRoom}\n                key={room.jid}\n                unreadCnt={room.unreadMessages}\n                onClick={() => {\n                  chooseRoom(room.jid);\n                  setThreadView(false);\n                }}\n                name={room.name}\n                info={getConversationInfo(room.jid)}\n                lastActivityTime={getLastActiveTime(room.jid)}\n              >\n                <Avatar\n                  src={\n                    room.room_thumbnail !== \"none\"\n                      ? room.room_thumbnail\n                      : \"https://icotar.com/initials/\" + room.name\n                  }\n                />\n              </Conversation>\n            ))}\n          </ConversationList>\n        </Sidebar>\n\n        <div\n          {...getRootProps()}\n          style={{\n            width: \"100%\",\n            height: \"100%\",\n            flexDirection: \"row\",\n            display: \"flex\",\n          }}\n        >\n          <ChatContainer>\n            {!!roomData && (\n              <ConversationHeader\n                style={{\n                  height: \"70px\",\n                }}\n              >\n                <ConversationHeader.Back />\n                {mainWindowMessages.length > 0 && (\n                  <ConversationHeader.Content\n                    userName={roomData.name}\n                    onClick={handleChatDetailClick}\n                    info={\n                      messages.filter(\n                        (item: TMessageHistory) => item.roomJID === currentRoom\n                      ).length > 0 &&\n                      \"Active \" +\n                        formatDistance(\n                          subDays(\n                            new Date(mainWindowMessages.slice(-1)[0].date),\n                            0\n                          ),\n                          new Date(),\n                          { addSuffix: true }\n                        )\n                    }\n                  />\n                )}\n                <ConversationHeader.Actions>\n                  <ChatAudioMessageDialog\n                    profile={profile}\n                    currentRoom={currentRoom}\n                    roomData={roomData}\n                  />\n                  <IconButton\n                    sx={{ color: \"black\" }}\n                    onClick={() => setQrModalVisible(true)}\n                  >\n                    <QrCodeIcon />\n                  </IconButton>\n                </ConversationHeader.Actions>\n              </ConversationHeader>\n            )}\n            <MessageList\n              style={{\n                backgroundImage: currentPickedRoom?.room_background\n                  ? `url(${currentPickedRoom.room_background})`\n                  : \"white\",\n                backgroundRepeat: \"no-repeat\",\n                backgroundSize: \"100% 100%\",\n              }}\n              loadingMore={loaderArchive}\n              onYReachStart={onYReachStart}\n              disableOnYReachWhenNoScroll={true}\n              typingIndicator={\n                !!userChatRooms.filter((e) => e.jid === currentRoom)[0]\n                  ?.composing && (\n                  <TypingIndicator\n                    style={{ opacity: \".6\" }}\n                    content={\n                      userChatRooms.filter((e) => e.jid === currentRoom)[0]\n                        ?.composing\n                    }\n                  />\n                )\n              }\n            >\n              {mainWindowMessages.map((message, index, arr) => {\n                const position = getPosition(arr, message, index);\n                return message.data.isSystemMessage === \"false\" ? (\n                  <Message\n                    onThreadClick={() => onMessageThreadClick(message)}\n                    key={message.id}\n                    is={\"Message\"}\n                    position={position}\n                    message={message}\n                    onMessageButtonClick={sendMessage}\n                    toggleTransferDialog={toggleTransferDialog}\n                    onMediaMessageClick={toggleMediaModal}\n                  />\n                ) : (\n                  <SystemMessage\n                    key={message.id}\n                    is={\"Message\"}\n                    message={message}\n                    userJid={xmpp.client?.jid?.toString()}\n                  />\n                );\n              })}\n              {mainWindowMessages.length <= 0 ||\n                !currentRoom ||\n                (currentRoom === NO_ROOM_PICKED && (\n                  <MessageList.Content\n                    style={{\n                      display: \"flex\",\n                      flexDirection: \"column\",\n                      justifyContent: \"center\",\n                      height: \"100%\",\n                      textAlign: \"center\",\n                      fontSize: \"1.2em\",\n                    }}\n                  >\n                    {!loaderArchive ? (\n                      <span>\n                        {!currentRoom || currentRoom === NO_ROOM_PICKED\n                          ? \"Choose a chat room or create one to start a conversation.\"\n                          : null}\n                      </span>\n                    ) : (\n                      \"Loading...\"\n                    )}\n                  </MessageList.Content>\n                ))}\n              {!loaderArchive &&\n                currentRoom &&\n                currentRoom !== NO_ROOM_PICKED &&\n                mainWindowMessages.length <= 0 && (\n                  <MessageList.Content\n                    style={{\n                      display: \"flex\",\n                      flexDirection: \"column\",\n                      justifyContent: \"center\",\n                      height: \"100%\",\n                      textAlign: \"center\",\n                      fontSize: \"1.2em\",\n                    }}\n                  >\n                    Message list is empty\n                  </MessageList.Content>\n                )}\n            </MessageList>\n            {!!roomData?.name && (\n              <div is={\"MessageInput\"}>\n                {/* Edit message component */}\n                {isEditing && <Divider />}\n                <Slide direction=\"up\" in={isEditing} mountOnEnter unmountOnExit>\n                  <Stack\n                    display={\"flex\"}\n                    height={\"50px\"}\n                    width={\"100%\"}\n                    direction={\"row\"}\n                  >\n                    <div\n                      style={{\n                        display: \"flex\",\n                        flex: \"0.05\",\n                        justifyContent: \"center\",\n                        alignItems: \"center\",\n                      }}\n                    >\n                      <EditIcon color=\"info\" />\n                    </div>\n                    <div\n                      style={{\n                        display: \"flex\",\n                        flex: \"0.90\",\n                        flexDirection: \"column\",\n                      }}\n                    >\n                      <Typography color={\"#1976d2\"} fontWeight={\"bold\"}>\n                        Edit Message\n                      </Typography>\n                      <Typography>{currentEditMessage?.body}</Typography>\n                    </div>\n                    <div\n                      style={{\n                        display: \"flex\",\n                        flex: \"0.05\",\n                        justifyContent: \"center\",\n                        alignItems: \"center\",\n                      }}\n                    >\n                      <IconButton\n                        onClick={() => onMenuEditClick(false, undefined)}\n                        aria-label=\"close\"\n                      >\n                        <CloseIcon />\n                      </IconButton>\n                    </div>\n                  </Stack>\n                </Slide>\n\n                <MessageInput\n                  onPaste={handlePaste}\n                  placeholder=\"Type message here\"\n                  onChange={setMessage}\n                  onSend={sendMessage}\n                  onAttachClick={() => fileRef.current.click()}\n                />\n                <input\n                  type=\"file\"\n                  name=\"file\"\n                  id=\"file\"\n                  onChange={(event) => sendFile(event.target.files[0], false)}\n                  ref={fileRef}\n                  style={{ display: \"none\" }}\n                />\n              </div>\n            )}\n          </ChatContainer>\n          {isThreadView && (\n            <ThreadContainer\n              chooseRoom={chooseRoom}\n              currentPickedRoom={currentPickedRoom}\n              currentRoom={currentRoom}\n              handleSetThreadView={handleSetThreadView}\n              handleShowInChannel={handleShowInChannel}\n              isThreadView={isThreadView}\n              onYReachStart={onYReachStart}\n              profile={profile}\n              roomData={roomData}\n              sendFile={sendFile}\n              showInChannel={showInChannel}\n              toggleMediaModal={toggleMediaModal}\n              toggleTransferDialog={toggleTransferDialog}\n            />\n          )}\n        </div>\n      </MainContainer>\n\n      <ChatTransferDialog\n        open={transferDialogData.open}\n        onClose={() => toggleTransferDialog(false)}\n        loading={false}\n        onPrivateRoomClick={chooseRoom}\n        message={transferDialogData.message}\n        onThreadClick={onMenuThreadClick}\n        onEditClick={onMenuEditClick}\n      />\n      <ChatMediaModal\n        open={mediaDialogData.open}\n        onClose={() => toggleMediaModal(false)}\n        mimetype={mediaDialogData.message?.data?.mimetype}\n        url={mediaDialogData.message?.data?.location}\n      />\n\n      <Dialog\n        fullScreen={fullScreen}\n        open={uploadFileDialogData.open}\n        onClose={() =>\n          setUploadFileDialogData({\n            open: false,\n            description: \"\",\n            headline: \"\",\n          })\n        }\n        aria-labelledby=\"responsive-dialog-title\"\n      >\n        <DialogTitle id=\"responsive-dialog-title\">\n          {uploadFileDialogData.headline}\n        </DialogTitle>\n        <DialogContent>\n          {!!uploadFileDialogData.description ? (\n            <DialogContentText>\n              {uploadFileDialogData.description}\n            </DialogContentText>\n          ) : (\n            <Box sx={{ display: \"flex\", justifyContent: \"center\" }}>\n              <CircularProgress />\n            </Box>\n          )}\n        </DialogContent>\n        <DialogActions>\n          <Button\n            onClick={() =>\n              setUploadFileDialogData({\n                open: false,\n                description: \"\",\n                headline: \"\",\n              })\n            }\n            autoFocus\n          >\n            Close\n          </Button>\n        </DialogActions>\n      </Dialog>\n      <QrModal\n        open={isQrModalVisible}\n        link={generateChatLink({ roomAddress: currentPickedRoom?.jid })}\n        onClose={closeQrModal}\n        title={\"Share Chatroom\"}\n      />\n      <MetaNavigation\n        open={showMetaNavigation || openLastMetaRoom}\n        chatId={currentRoom.split(\"@\")[0]}\n        onClose={() => {\n          setShowMetaNavigation(false);\n\n          openLastMetaRoom && setActiveRoomFilter(\"\");\n        }}\n      />\n    </Box>\n  );\n}\n","import React from \"react\";\nimport Container from \"@mui/material/Container\";\nimport { ChatInRoom } from \"./Chat\";\n\nexport default function Chat() {\n  return (\n    <Container maxWidth=\"xl\" style={{ height: \"calc(100vh - 68px)\" }}>\n      <ChatInRoom />\n    </Container>\n  );\n}\n","import React from \"react\";\nimport { Button, Dialog, DialogTitle, IconButton } from \"@mui/material\";\nimport { Box } from \"@mui/system\";\nimport QRCode from \"react-qr-code\";\nimport { truncateString } from \"../../utils\";\nimport CloseIcon from \"@mui/icons-material/Close\";\n\nexport interface IQrModal {\n  open: boolean;\n  link: string;\n  onClose: () => void;\n  title?: string;\n}\n\nexport const QrModal: React.FC<IQrModal> = ({ title, open, link, onClose }) => {\n  return (\n    <Dialog maxWidth={false} open={open} onClose={onClose}>\n      {!!title && (\n        <DialogTitle sx={{ padding: \"0 24px\", paddingTop: \"20px\" }}>\n          {title}\n        </DialogTitle>\n      )}\n      <Box sx={{ padding: \"20px\" }}>\n        <QRCode\n          size={256}\n          style={{ height: \"50vh\", maxWidth: \"100%\", width: \"100%\" }}\n          value={link}\n          viewBox={`0 0 256 256`}\n        />\n        <Box\n          sx={{\n            boxShadow: \"0px 0px 10px -5px rgba(0,0,0,0.75)\",\n            borderRadius: \"10px\",\n            display: \"flex\",\n            justifyContent: \"space-between\",\n            alignItems: \"center\",\n            pl: \"10px\",\n            my: \"10px\",\n          }}\n        >\n          <span>{truncateString(link, 50)}</span>\n          <Button\n            variant=\"contained\"\n            sx={{ borderRadius: \"10px\", marginLeft: '5px' }}\n            onClick={() => navigator.clipboard.writeText(link)}\n          >\n            Copy\n          </Button>\n        </Box>\n        <IconButton\n          onClick={onClose}\n          sx={{\n            color: \"black\",\n            position: \"absolute\",\n            top: 10,\n            right: 10,\n            fontSize: \"30px\",\n          }}\n        >\n          <CloseIcon fontSize=\"inherit\" />\n        </IconButton>\n      </Box>\n    </Dialog>\n  );\n};\n"],"names":["underscoreManipulation","str","replace","toLowerCase","createPrivateChat","myWalletAddress","otherUserWalletAddress","myFirstName","otherFirstName","userJID","combinedWalletAddress","sort","join","roomJid","CONFERENCEDOMAIN","combinedUsersName","currentChatRooms","useStoreState","userChatRooms","isNewRoom","filter","el","jid","length","xmpp","roomName","setTimeout","Message","message","position","onMessageButtonClick","toggleTransferDialog","onMediaMessageClick","onThreadClick","isThread","firstName","data","senderFirstName","lastName","senderLastName","messageJid","senderJID","split","isSameUser","useMemo","toString","history","useHistory","useState","buttons","setButtons","React","anchorEl","setAnchorEl","openMenu","Boolean","messageDirection","setMessageDirection","openDialogMenu","fullViewImage","ReplyComponent","Button","variant","style","flexDirection","display","textTransform","textAlign","Divider","borderWidth","borderRadius","marginRight","orientation","flexItem","cursor","mainMessage","userName","imageLocation","imageMimetypes","mimeType","Card","sx","maxWidth","CardActionArea","onClick","CardMedia","height","objectFit","objectPosition","component","image","alt","originalName","videoMimetypes","controls","width","src","type","title","audioMimetypes","dangerouslySetInnerHTML","__html","text","useEffect","quickReplies","JSON","parse","is","separator","onContextMenu","isReply","event","preventDefault","marginBottom","model","sender","direction","avatarPosition","avatarSpacer","boxSizing","push","senderWalletAddress","photoURL","onError","currentTarget","onerror","justifyContent","alignItems","IconButton","id","undefined","MoreVert","isMediafile","mimetype","location","body","marginTop","minWidth","color","fontSize","differenceInHours","Date","date","format","formatDistance","subDays","addSuffix","coinsInMessage","coin","isEdited","marginLeft","Typography","numberOfReplies","Box","m","map","button","index","size","name","SystemMessage","userJid","fontFamily","key","CHAT","CompassItem","room","chatId","setDirection","padding","disabled","MetaHeader","previousRoom","fontWeight","description","metaDirection","metaRoom","DIRECTIONS","SHORT_DIRECTIONS","north","west","south","east","OPOSITE_DIRECTIONS","emptyMetaRoom","ownerNavLinks","ownerId","contractAddress","createdAt","_id","updatedAt","userNavLinks","top","left","transform","p","outline","MetaNavigation","open","onClose","previousDirection","setPreviousDirection","loading","setLoading","setPreviuosRoom","currentMetaRoom","setCurrentMetaRoom","user","state","theme","useTheme","getCurrentRoom","httpWithAuth","get","roomRoute","res","result","console","log","sendMessage","chatName","isPrevious","walletToUsername","walletAddress","textEnter","textLeave","isSystemMessage","tokenAmount","receiverMessageId","mucname","profileImage","sendRoomJoin","post","renderDirections","oppositePreviousDirection","getOpositeDirection","checkEmptyDirections","Modal","CircularProgress","bgcolor","mb","gridTemplateColumns","palette","primary","main","Explore","props","onPaste","placeholder","onChange","onSend","sendFile","fileRef","onAttachClick","current","click","target","files","ref","roomData","handleSetThreadView","isThreadView","profile","currentPickedRoom","currentRoom","onYReachStart","toggleMediaModal","handleShowInChannel","showInChannel","currentThreadViewMessage","store","myThreadMessage","setMyThreadMessage","messages","historyMessages","roomJID","useParams","threadWindowMessages","item","includes","currentUntrackedChatRoom","loaderArchive","sendThreadMessage","trim","clearMessageFromHtml","DOMPurify","finalMessageTxt","stripHtml","createMainMessageForThread","borderLeftWidth","datatype","Close","backgroundImage","room_background","backgroundRepeat","backgroundSize","disableOnYReachWhenNoScroll","typingIndicator","e","composing","opacity","content","arr","getPosition","borderColor","Checkbox","checked","inputProps","value","Array","from","clipboardData","items","find","x","test","blob","getAsFile","dialogItems","dialogTypes","ChatTransferDialog","onPrivateRoomClick","onEditClick","coinAmount","setCoinAmount","dialogType","setDialogType","balance","setNewUserChatRoom","showSnackbar","useSnackbar","DOMAIN","coinData","tokenType","openThreadView","openEditView","userToBlackList","step","removeAllInMessageHistory","sendCoins","amount","currentCoinAmount","Number","transferCoin","tokenName","coinName","coinsMainName","coinReplacedName","receiver","textMessage","transactionId","transaction","openPrivateRoom","then","temporaryRoomData","room_thumbnail","users_cnt","unreadMessages","toUpdate","catch","error","Dialog","DialogContent","margin","startIcon","Send","Reply","Edit","Block","gutterBottom","TextField","label","renderDialogContent","boxShadow","ChatMediaModal","url","right","maxHeight","renderMediaContent","ChatAudioMessageDialog","recorderControls","useAudioRecorder","onRecordingComplete","formData","FormData","append","uploadFile","userAvatar","results","expiresAt","fileName","filename","isVisible","locationPreview","originalname","ownerKey","duration","userId","waveForm","attachmentId","wrappable","NO_ROOM_PICKED","ChatInRoom","setCurrentThreadViewMessage","setProfile","myMessage","setMyMessage","showMetaNavigation","setShowMetaNavigation","setThreadView","setShowInChannel","isEditing","setIsEditing","currentEditMessage","setCurrentEditMessage","handleSetCurrentThreadViewMessage","threadMessage","setCurrentRoom","mainWindowMessages","setRoomData","transferDialogData","setTransferDialogData","mediaDialogData","setMediaDialogData","isQrModalVisible","setQrModalVisible","headline","uploadFileDialogData","setUploadFileDialogData","firstLoadMessages","setFirstLoadMessages","activeRoomFilter","setActiveRoomFilter","openLastMetaRoom","ROOMS_FILTERS","useRef","fullScreen","useMediaQuery","breakpoints","down","onDrop","useCallback","acceptedFiles","getRootProps","useDropzone","noClick","maxFiles","filteredMessages","lastMessageID","String","loadMessages","getPublicProfile","chooseRoom","currentRoomData","clearCounterChatRoom","setCurrentUntrackedChatRoom","getConversationInfo","messagesInRoom","slice","getLastActiveTime","notDisplayedValue","file","additionalDataForThread","timeoutId","clearTimeout","onBlur","onFocus","window","addEventListener","removeEventListener","lastUpFilteredMessage","rooms","onMenuEditClick","handleCurrentEditMessage","paddingBlock","responsive","scrollable","group","active","unreadCnt","info","lastActivityTime","QrCode","loadingMore","onMessageThreadClick","Slide","in","mountOnEnter","unmountOnExit","Stack","flex","DialogTitle","DialogContentText","DialogActions","autoFocus","QrModal","link","generateChatLink","roomAddress","Chat","Container","paddingTop","viewBox","pl","my","truncateString","navigator","clipboard","writeText"],"sourceRoot":""}