diff --git a/src/components/Apps/useQortalMessageListener.tsx b/src/components/Apps/useQortalMessageListener.tsx index c32bdbb..4cb08fd 100644 --- a/src/components/Apps/useQortalMessageListener.tsx +++ b/src/components/Apps/useQortalMessageListener.tsx @@ -4,6 +4,8 @@ import { executeEvent } from '../../utils/events'; import { useSetRecoilState } from 'recoil'; import { navigationControllerAtom } from '../../atoms/global'; import { extractComponents } from '../Chat/MessageDisplay'; +import { isRunningGateway } from '../../qortalRequests'; +import { MAX_SIZE_PUBLIC_NODE, MAX_SIZE_PUBLISH } from '../../constants/constants'; @@ -718,6 +720,67 @@ isDOMContentLoaded: false } } else if (event?.data?.action === 'PUBLISH_MULTIPLE_QDN_RESOURCES' || event?.data?.action === 'PUBLISH_QDN_RESOURCE' ) { let data; + if(event?.data?.action === 'PUBLISH_QDN_RESOURCE'){ + try { + const file = event?.data?.file + if (file && file.size > MAX_SIZE_PUBLISH) { + throw new Error( + "Maximum file size allowed is 2 GB per file" + ); + } + + if (file && file.size > MAX_SIZE_PUBLIC_NODE) { + const isPublicNode = await isRunningGateway(); + if (isPublicNode) { + throw new Error( + "Maximum file size allowed on the public node is 500 MB. Please use your local node for larger files." + ); + } + } + } catch (error) { + event.ports[0].postMessage({ + result: null, + error: error?.message, + }); + return; + } + } + if(event?.data?.action === 'PUBLISH_MULTIPLE_QDN_RESOURCES'){ + try { + const resources = event.data?.resources + const isPublicNode = await isRunningGateway(); + if (isPublicNode) { + const hasOversizedFilePublicNode = resources.some((resource) => { + const file = resource?.file; + return file instanceof File && file.size > MAX_SIZE_PUBLIC_NODE; + }); + + if (hasOversizedFilePublicNode) { + throw new Error( + "Maximum file size allowed on the public node is 500 MB. Please use your local node for larger files." + ); + } + } + + const hasOversizedFile = resources.some((resource) => { + const file = resource?.file; + return file instanceof File && file.size > MAX_SIZE_PUBLISH; + }); + + if (hasOversizedFile) { + throw new Error( + "Maximum file size allowed is 2 GB per file" + ); + } + } catch (error) { + event.ports[0].postMessage({ + result: null, + error: error?.message, + }); + return; + } + } + try { data = saveFileReferences(event.data); } catch (error) { diff --git a/src/components/Chat/ChatGroup.tsx b/src/components/Chat/ChatGroup.tsx index 5cbbf73..b41f4f4 100644 --- a/src/components/Chat/ChatGroup.tsx +++ b/src/components/Chat/ChatGroup.tsx @@ -121,7 +121,7 @@ export const ChatGroup = ({selectedGroup, secretKey, setSecretKey, getSecretKey, const onEdit = useCallback((message)=> { setOnEditMessage(message) setReplyMessage(null) - editorRef.current.chain().focus().setContent(message?.messageText || message?.text).run(); + editorRef?.current?.chain().focus().setContent(message?.messageText || message?.text || '
').run(); }, []) @@ -600,13 +600,28 @@ const sendMessage = async ()=> { if(+balance < 4) throw new Error('You need at least 4 QORT to send a message') pauseAllQueues() if (editorRef.current) { - const htmlContent = editorRef.current.getHTML(); - - if(!htmlContent?.trim() || htmlContent?.trim() === '') return - + let htmlContent = editorRef.current.getHTML(); + const deleteImage = + onEditMessage && isDeleteImage && messageHasImage(onEditMessage); - setIsSending(true) - const message = isPrivate === false ? editorRef.current.getJSON() : htmlContent + const hasImage = + chatImagesToSave?.length > 0 || onEditMessage?.images?.length > 0; + if ( + (!htmlContent?.trim() || htmlContent?.trim() === '') && + !hasImage && + !deleteImage + ) + return; + if (htmlContent?.trim() === '') { + htmlContent = null; + } + setIsSending(true); + const message = + isPrivate === false + ? !htmlContent + ? '' + : editorRef.current.getJSON() + : htmlContent; const secretKeyObject = await getSecretKey(false, true) let repliedTo = replyMessage?.signature @@ -620,8 +635,7 @@ const sendMessage = async ()=> { isEdited : chatReference ? true : false, } const imagesToPublish = []; - const deleteImage = - onEditMessage && isDeleteImage && messageHasImage(onEditMessage); + if (deleteImage) { const fee = await getFee('ARBITRARY'); diff --git a/src/components/Chat/ChatList.tsx b/src/components/Chat/ChatList.tsx index 64a78b5..4d5d615 100644 --- a/src/components/Chat/ChatList.tsx +++ b/src/components/Chat/ChatList.tsx @@ -267,20 +267,17 @@ export const ChatList = ({ if (chatReferences?.[message.signature]) { reactions = chatReferences[message.signature]?.reactions || null; - if (chatReferences[message.signature]?.edit?.message && message?.text) { - message.text = chatReferences[message.signature]?.edit?.message; - message.isEdit = true - message.editTimestamp = chatReferences[message.signature]?.edit?.timestamp - } - if (chatReferences[message.signature]?.edit?.messageText && message?.messageText) { - message.messageText = chatReferences[message.signature]?.edit?.messageText; - message.isEdit = true - message.editTimestamp = chatReferences[message.signature]?.edit?.timestamp - } - if (chatReferences[message.signature]?.edit?.images) { + if (chatReferences[message.signature]?.edit) { + message.text = + chatReferences[message.signature]?.edit?.message; + message.messageText = + chatReferences[message.signature]?.edit?.messageText; message.images = chatReferences[message.signature]?.edit?.images; + message.isEdit = true; + message.editTimestamp = + chatReferences[message.signature]?.edit?.timestamp; } } diff --git a/src/components/Chat/MessageItem.tsx b/src/components/Chat/MessageItem.tsx index 2ea09a6..9478c28 100644 --- a/src/components/Chat/MessageItem.tsx +++ b/src/components/Chat/MessageItem.tsx @@ -34,6 +34,7 @@ import level9Img from "../../assets/badges/level-9.png" import level10Img from "../../assets/badges/level-10.png" import { Embed } from "../Embeds/Embed"; import { buildImageEmbedLink, isHtmlString, messageHasImage } from "../../utils/chat"; +import CommentsDisabledIcon from '@mui/icons-material/CommentsDisabled'; const getBadgeImg = (level)=> { switch(level?.toString()){ @@ -71,6 +72,7 @@ export const MessageItem = React.memo(({ isPrivate }) => { + const {getIndividualUserInfo} = useContext(MyContext) const [anchorEl, setAnchorEl] = useState(null); const [selectedReaction, setSelectedReaction] = useState(null); @@ -130,6 +132,13 @@ const onSeenFunc = useCallback(()=> { onSeen(message.id); }, [message?.id]) +const hasNoMessage = +(!message.decryptedData?.data?.message || + message.decryptedData?.data?.message === '') && +(message?.images || [])?.length === 0 && +(!message?.messageText || message?.messageText === '') && +(!message?.text || message?.text === ''); + return (