From 88d624c003d2e14a3e665e820db0abb76d5ed754 Mon Sep 17 00:00:00 2001 From: PhilReact Date: Sat, 24 May 2025 22:24:14 +0300 Subject: [PATCH 1/3] fetch primary name --- src/background/background.ts | 11 +++++---- src/components/Group/Group.tsx | 6 ++--- src/components/Minting/Minting.tsx | 6 ++--- src/encryption/encryption.ts | 6 ++--- src/hooks/useQortalMessageListener.tsx | 2 ++ src/qdn/publish/publish.ts | 2 +- src/qortal/qortal-requests.ts | 33 +++++++++++++++++++++++++- 7 files changed, 50 insertions(+), 16 deletions(-) diff --git a/src/background/background.ts b/src/background/background.ts index 2a7b158..c95c7c7 100644 --- a/src/background/background.ts +++ b/src/background/background.ts @@ -805,9 +805,9 @@ export async function getNameInfo() { const wallet = await getSaveWallet(); const address = wallet.address0; const validApi = await getBaseApi(); - const response = await fetch(validApi + '/names/address/' + address); + const response = await fetch(validApi + '/names/primary/' + address); const nameData = await response.json(); - if (nameData?.length > 0) { + if (nameData?.name) { return nameData[0].name; } else { return ''; @@ -815,11 +815,12 @@ export async function getNameInfo() { } export async function getNameInfoForOthers(address) { + if (!address) return ''; const validApi = await getBaseApi(); - const response = await fetch(validApi + '/names/address/' + address); + const response = await fetch(validApi + '/names/primary/' + address); const nameData = await response.json(); - if (nameData?.length > 0) { - return nameData[0].name; + if (nameData?.name) { + return nameData?.name; } else { return ''; } diff --git a/src/components/Group/Group.tsx b/src/components/Group/Group.tsx index fa534f9..694d35d 100644 --- a/src/components/Group/Group.tsx +++ b/src/components/Group/Group.tsx @@ -265,11 +265,11 @@ export const getDataPublishesFunc = async (groupId, type) => { }; export async function getNameInfo(address: string) { - const response = await fetch(`${getBaseApiReact()}/names/address/` + address); + const response = await fetch(`${getBaseApiReact()}/names/primary/` + address); const nameData = await response.json(); - if (nameData?.length > 0) { - return nameData[0]?.name; + if (nameData?.name) { + return nameData?.name; } else { return ''; } diff --git a/src/components/Minting/Minting.tsx b/src/components/Minting/Minting.tsx index cddd67c..b812a66 100644 --- a/src/components/Minting/Minting.tsx +++ b/src/components/Minting/Minting.tsx @@ -85,14 +85,14 @@ export const Minting = ({ setIsOpenMinting, myAddress, show }) => { const getName = async (address) => { try { const response = await fetch( - `${getBaseApiReact()}/names/address/${address}` + `${getBaseApiReact()}/names/primary/${address}` ); const nameData = await response.json(); - if (nameData?.length > 0) { + if (nameData?.name) { setNames((prev) => { return { ...prev, - [address]: nameData[0].name, + [address]: nameData?.name, }; }); } else { diff --git a/src/encryption/encryption.ts b/src/encryption/encryption.ts index ab0a36d..2bf82f6 100644 --- a/src/encryption/encryption.ts +++ b/src/encryption/encryption.ts @@ -26,10 +26,10 @@ export async function getNameInfo() { const wallet = await getSaveWallet(); const address = wallet.address0; const validApi = await getBaseApi(); - const response = await fetch(validApi + '/names/address/' + address); + const response = await fetch(validApi + '/names/primary/' + address); const nameData = await response.json(); - if (nameData?.length > 0) { - return nameData[0].name; + if (nameData?.name) { + return nameData?.name; } else { return ''; } diff --git a/src/hooks/useQortalMessageListener.tsx b/src/hooks/useQortalMessageListener.tsx index 29549dc..d2a54c4 100644 --- a/src/hooks/useQortalMessageListener.tsx +++ b/src/hooks/useQortalMessageListener.tsx @@ -256,6 +256,7 @@ export const listOfAllQortalRequests = [ 'UPDATE_GROUP', 'UPDATE_NAME', 'VOTE_ON_POLL', + 'GET_PRIMARY_NAME', ]; export const UIQortalRequests = [ @@ -319,6 +320,7 @@ export const UIQortalRequests = [ 'UPDATE_GROUP', 'UPDATE_NAME', 'VOTE_ON_POLL', + 'GET_PRIMARY_NAME', ]; async function retrieveFileFromIndexedDB(fileId) { diff --git a/src/qdn/publish/publish.ts b/src/qdn/publish/publish.ts index 3bb3307..782ecdd 100644 --- a/src/qdn/publish/publish.ts +++ b/src/qdn/publish/publish.ts @@ -317,7 +317,7 @@ export const publishData = async ({ } const file = data; - const urlCheck = `/arbitrary/check-tmp-space?totalSize=${file.size}`; + const urlCheck = `/arbitrary/check/tmp?totalSize=${file.size}`; const checkEndpoint = await createEndpoint(urlCheck); const checkRes = await fetch(checkEndpoint); diff --git a/src/qortal/qortal-requests.ts b/src/qortal/qortal-requests.ts index 9681790..32a4186 100644 --- a/src/qortal/qortal-requests.ts +++ b/src/qortal/qortal-requests.ts @@ -1,4 +1,8 @@ -import { gateways, getApiKeyFromStorage } from '../background/background.ts'; +import { + gateways, + getApiKeyFromStorage, + getNameInfoForOthers, +} from '../background/background.ts'; import { listOfAllQortalRequests } from '../hooks/useQortalMessageListener.tsx'; import { addForeignServer, @@ -1932,6 +1936,33 @@ function setupMessageListenerQortalRequest() { break; } + case 'GET_PRIMARY_NAME': { + try { + const res = await getNameInfoForOthers(request.payload?.address); + const resData = res ? res : null; + event.source.postMessage( + { + requestId: request.requestId, + action: request.action, + payload: resData, + type: 'backgroundMessageResponse', + }, + event.origin + ); + } catch (error) { + event.source.postMessage( + { + requestId: request.requestId, + action: request.action, + error: error.message, + type: 'backgroundMessageResponse', + }, + event.origin + ); + } + break; + } + default: break; } From 25695c87b01e127ee45b148cf93383259b250687 Mon Sep 17 00:00:00 2001 From: PhilReact Date: Wed, 28 May 2025 18:54:52 +0300 Subject: [PATCH 2/3] fixes --- src/App.tsx | 20 +++++++++++++++++++- src/background/background.ts | 2 +- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 5138080..fb60be6 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -766,6 +766,24 @@ function App() { balanceSetInterval(); }); }; + + const refetchUserInfo = () => { + window + .sendMessage('userInfo') + .then((response) => { + if (response && !response.error) { + setUserInfo(response); + } + }) + .catch((error) => { + console.error('Failed to get user info:', error); + }); + }; + + const getBalanceAndUserInfoFunc = () => { + getBalanceFunc(); + refetchUserInfo(); + }; const getLtcBalanceFunc = () => { setLtcBalanceLoading(true); window @@ -1502,7 +1520,7 @@ function App() { Date: Thu, 29 May 2025 21:20:12 +0300 Subject: [PATCH 3/3] add ability to enter html for public group chat --- src/components/Chat/ChatOptions.tsx | 16 +++++++++------ src/components/Chat/MessageItem.tsx | 32 ++++++++++++++++++++--------- src/utils/chat.ts | 4 ++++ 3 files changed, 36 insertions(+), 16 deletions(-) diff --git a/src/components/Chat/ChatOptions.tsx b/src/components/Chat/ChatOptions.tsx index 59124a0..2d2c352 100644 --- a/src/components/Chat/ChatOptions.tsx +++ b/src/components/Chat/ChatOptions.tsx @@ -35,6 +35,7 @@ import { convert } from 'html-to-text'; import { generateHTML } from '@tiptap/react'; import ErrorBoundary from '../../common/ErrorBoundary'; import { useTranslation } from 'react-i18next'; +import { isHtmlString } from '../../utils/chat'; const extractTextFromHTML = (htmlString = '') => { return convert(htmlString, { @@ -76,13 +77,16 @@ export const ChatOptions = ({ return untransformedMessages?.map((item) => { if (item?.messageText) { let transformedMessage = item?.messageText; + const isHtml = isHtmlString(item?.messageText); try { - transformedMessage = generateHTML(item?.messageText, [ - StarterKit, - Underline, - Highlight, - Mention, - ]); + transformedMessage = isHtml + ? item?.messageText + : generateHTML(item?.messageText, [ + StarterKit, + Underline, + Highlight, + Mention, + ]); return { ...item, messageText: transformedMessage, diff --git a/src/components/Chat/MessageItem.tsx b/src/components/Chat/MessageItem.tsx index 3151fc5..29a6a88 100644 --- a/src/components/Chat/MessageItem.tsx +++ b/src/components/Chat/MessageItem.tsx @@ -47,7 +47,11 @@ import level8Img from '../../assets/badges/level-8.png'; import level9Img from '../../assets/badges/level-9.png'; import level10Img from '../../assets/badges/level-10.png'; import { Embed } from '../Embeds/Embed'; -import { buildImageEmbedLink, messageHasImage } from '../../utils/chat'; +import { + buildImageEmbedLink, + isHtmlString, + messageHasImage, +} from '../../utils/chat'; import { useTranslation } from 'react-i18next'; const getBadgeImg = (level) => { @@ -135,6 +139,8 @@ export const MessageItem = memo( const htmlText = useMemo(() => { if (message?.messageText) { + const isHtml = isHtmlString(message?.messageText); + if (isHtml) return message?.messageText; return generateHTML(message?.messageText, [ StarterKit, Underline, @@ -147,6 +153,8 @@ export const MessageItem = memo( const htmlReply = useMemo(() => { if (reply?.messageText) { + const isHtml = isHtmlString(reply?.messageText); + if (isHtml) return reply?.messageText; return generateHTML(reply?.messageText, [ StarterKit, Underline, @@ -616,6 +624,18 @@ export const ReplyPreview = ({ message, isEdit = false }) => { 'tutorial', ]); + const replyMessageText = useMemo(() => { + const isHtml = isHtmlString(message?.messageText); + if (isHtml) return message?.messageText; + return generateHTML(message?.messageText, [ + StarterKit, + Underline, + Highlight, + Mention, + TextStyle, + ]); + }, [message?.messageText]); + return ( { )} {message?.messageText && ( - + )} {message?.decryptedData?.type === 'notification' ? ( diff --git a/src/utils/chat.ts b/src/utils/chat.ts index c7099c0..fed287d 100644 --- a/src/utils/chat.ts +++ b/src/utils/chat.ts @@ -20,3 +20,7 @@ export const messageHasImage = (message) => { message.images[0]?.service ); }; + +export function isHtmlString(value) { + return typeof value === 'string' && /<[^>]+>/.test(value.trim()); +}