From 7a7013de59cef60428894e5dc1d9616109dc75da Mon Sep 17 00:00:00 2001 From: PhilReact Date: Thu, 5 Jun 2025 16:25:53 +0300 Subject: [PATCH] added conditions for publish limit and fix image chat --- .../Apps/useQortalMessageListener.tsx | 63 +++++++++++++++++++ src/components/Chat/ChatGroup.tsx | 32 +++++++--- src/components/Chat/ChatList.tsx | 19 +++--- src/components/Chat/MessageItem.tsx | 52 +++++++++++---- src/components/Embeds/ImageEmbed.tsx | 17 ++++- src/components/Home/NewUsersCTA.tsx | 4 +- src/constants/constants.ts | 3 + 7 files changed, 155 insertions(+), 35 deletions(-) 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 ( @@ -312,16 +321,36 @@ const onSeenFunc = useCallback(()=> { )} - - - {message?.decryptedData?.type === "notification" ? ( - - ) : ( - - )} - {message?.images && messageHasImage(message) && ( + {htmlText && !hasNoMessage && ( + + )} + + {message?.decryptedData?.type === 'notification' ? ( + + ) : hasNoMessage ? null : ( + + )} + {hasNoMessage && ( + + + + No message + + + )} + {message?.images && messageHasImage(message) && ( )} { export const ReplyPreview = ({message, isEdit})=> { const replyMessageText = useMemo(() => { + if (!message?.messageText) return null; const isHtml = isHtmlString(message?.messageText); if (isHtml) return message?.messageText; return generateHTML(message?.messageText, [ @@ -543,7 +573,7 @@ export const ReplyPreview = ({message, isEdit})=> { }}>Replied to {message?.senderName || message?.senderAddress} )} - {message?.messageText && ( + {replyMessageText && ( diff --git a/src/components/Embeds/ImageEmbed.tsx b/src/components/Embeds/ImageEmbed.tsx index f1cc859..f0e9ca2 100644 --- a/src/components/Embeds/ImageEmbed.tsx +++ b/src/components/Embeds/ImageEmbed.tsx @@ -50,6 +50,8 @@ export const ImageCard = ({ backgroundColor: "#1F2023", height: height, transition: "height 0.6s ease-in-out", + display: 'flex', + flexDirection: 'column', }} > - - + + @@ -192,6 +204,7 @@ export const ImageCard = ({ display: "flex", justifyContent: "center", cursor: "pointer", + height: '100%', }} onClick={handleOpenFullscreen} > diff --git a/src/components/Home/NewUsersCTA.tsx b/src/components/Home/NewUsersCTA.tsx index 486c4da..297504b 100644 --- a/src/components/Home/NewUsersCTA.tsx +++ b/src/components/Home/NewUsersCTA.tsx @@ -55,7 +55,7 @@ export const NewUsersCTA = ({ balance }) => { }} onClick={() => { if (chrome && chrome.tabs) { - chrome.tabs.create({ url: "https://link.qortal.dev/telegram-invite" }, (tab) => { + chrome.tabs.create({ url: "https://link.qortal.dev/support" }, (tab) => { if (chrome.runtime.lastError) { console.error("Error opening tab:", chrome.runtime.lastError); } else { @@ -66,7 +66,7 @@ export const NewUsersCTA = ({ balance }) => { }} > - Telegram + Nextcloud