client-web/build/static/js/986.6df302da.chunk.js.map
{"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":""}