From b2b7820017946984b941ccef1498b2168482b19d Mon Sep 17 00:00:00 2001 From: PhilReact Date: Wed, 18 Jun 2025 22:27:24 +0300 Subject: [PATCH] added txGroupId and chunk status --- src/background-cases.ts | 25 +++++---- src/background.ts | 23 +++++--- src/components/Apps/AppViewer.tsx | 45 +++++++++++++++- .../Apps/useQortalMessageListener.tsx | 4 +- src/qdn/publish/pubish.ts | 54 ++++++++++++++++++- src/qortalRequests.ts | 2 +- src/qortalRequests/get.ts | 33 ++++++++---- 7 files changed, 152 insertions(+), 34 deletions(-) diff --git a/src/background-cases.ts b/src/background-cases.ts index 0d88a53..45ca37b 100644 --- a/src/background-cases.ts +++ b/src/background-cases.ts @@ -358,11 +358,12 @@ export async function sendCoinCase(request, event) { export async function inviteToGroupCase(request, event) { try { - const { groupId, qortalAddress, inviteTime } = request.payload; + const { groupId, qortalAddress, inviteTime, txGroupId = 0 } = request.payload; const response = await inviteToGroup({ groupId, qortalAddress, inviteTime, + txGroupId }); event.source.postMessage( @@ -483,8 +484,8 @@ export async function createGroupCase(request, event) { export async function cancelInvitationToGroupCase(request, event) { try { - const { groupId, qortalAddress } = request.payload; - const response = await cancelInvitationToGroup({ groupId, qortalAddress }); + const { groupId, qortalAddress,txGroupId = 0 } = request.payload; + const response = await cancelInvitationToGroup({ groupId, qortalAddress, txGroupId }); event.source.postMessage( { @@ -564,11 +565,12 @@ export async function joinGroupCase(request, event) { export async function kickFromGroupCase(request, event) { try { - const { groupId, qortalAddress, rBanReason } = request.payload; + const { groupId, qortalAddress, rBanReason, txGroupId = 0 } = request.payload; const response = await kickFromGroup({ groupId, qortalAddress, rBanReason, + txGroupId }); event.source.postMessage( @@ -595,12 +597,13 @@ export async function kickFromGroupCase(request, event) { export async function banFromGroupCase(request, event) { try { - const { groupId, qortalAddress, rBanReason, rBanTime } = request.payload; + const { groupId, qortalAddress, rBanReason, rBanTime, txGroupId = 0 } = request.payload; const response = await banFromGroup({ groupId, qortalAddress, rBanReason, rBanTime, + txGroupId }); event.source.postMessage( @@ -734,8 +737,8 @@ export async function getUserSettingsCase(request, event) { export async function cancelBanCase(request, event) { try { - const { groupId, qortalAddress } = request.payload; - const response = await cancelBan({ groupId, qortalAddress }); + const { groupId, qortalAddress, txGroupId = 0 } = request.payload; + const response = await cancelBan({ groupId, qortalAddress, txGroupId }); event.source.postMessage( { @@ -788,8 +791,8 @@ export async function registerNameCase(request, event) { export async function makeAdminCase(request, event) { try { - const { groupId, qortalAddress } = request.payload; - const response = await makeAdmin({ groupId, qortalAddress }); + const { groupId, qortalAddress,txGroupId = 0 } = request.payload; + const response = await makeAdmin({ groupId, qortalAddress, txGroupId }); event.source.postMessage( { @@ -815,8 +818,8 @@ export async function makeAdminCase(request, event) { export async function removeAdminCase(request, event) { try { - const { groupId, qortalAddress } = request.payload; - const response = await removeAdmin({ groupId, qortalAddress }); + const { groupId, qortalAddress, txGroupId = 0 } = request.payload; + const response = await removeAdmin({ groupId, qortalAddress, txGroupId }); event.source.postMessage( { diff --git a/src/background.ts b/src/background.ts index 69a2ef9..bd32200 100644 --- a/src/background.ts +++ b/src/background.ts @@ -2034,7 +2034,7 @@ export async function joinGroup({ groupId }) { return res; } -export async function cancelInvitationToGroup({ groupId, qortalAddress }) { +export async function cancelInvitationToGroup({ groupId, qortalAddress, txGroupId = 0 }) { const lastReference = await getLastRef(); const resKeyPair = await getKeyPair(); const parsedData = resKeyPair; @@ -2051,6 +2051,7 @@ export async function cancelInvitationToGroup({ groupId, qortalAddress }) { recipient: qortalAddress, rGroupId: groupId, lastReference: lastReference, + groupID: txGroupId }); const signedBytes = Base58.encode(tx.signedBytes); @@ -2061,7 +2062,7 @@ export async function cancelInvitationToGroup({ groupId, qortalAddress }) { return res; } -export async function cancelBan({ groupId, qortalAddress }) { +export async function cancelBan({ groupId, qortalAddress, txGroupId = 0 }) { const lastReference = await getLastRef(); const resKeyPair = await getKeyPair(); const parsedData = resKeyPair; @@ -2078,6 +2079,7 @@ export async function cancelBan({ groupId, qortalAddress }) { recipient: qortalAddress, rGroupId: groupId, lastReference: lastReference, + groupID: txGroupId }); const signedBytes = Base58.encode(tx.signedBytes); @@ -2142,7 +2144,7 @@ export async function updateName({ newName, oldName, description }) { return res; } -export async function makeAdmin({ groupId, qortalAddress }) { +export async function makeAdmin({ groupId, qortalAddress, txGroupId = 0 }) { const lastReference = await getLastRef(); const resKeyPair = await getKeyPair(); const parsedData = resKeyPair; @@ -2159,6 +2161,7 @@ export async function makeAdmin({ groupId, qortalAddress }) { recipient: qortalAddress, rGroupId: groupId, lastReference: lastReference, + groupID: txGroupId }); const signedBytes = Base58.encode(tx.signedBytes); @@ -2169,7 +2172,7 @@ export async function makeAdmin({ groupId, qortalAddress }) { return res; } -export async function removeAdmin({ groupId, qortalAddress }) { +export async function removeAdmin({ groupId, qortalAddress, txGroupId = 0 }) { const lastReference = await getLastRef(); const resKeyPair = await getKeyPair(); const parsedData = resKeyPair; @@ -2186,6 +2189,7 @@ export async function removeAdmin({ groupId, qortalAddress }) { recipient: qortalAddress, rGroupId: groupId, lastReference: lastReference, + groupID: txGroupId }); const signedBytes = Base58.encode(tx.signedBytes); @@ -2201,6 +2205,7 @@ export async function banFromGroup({ qortalAddress, rBanReason = "", rBanTime, + txGroupId = 0 }) { const lastReference = await getLastRef(); const resKeyPair = await getKeyPair(); @@ -2220,6 +2225,7 @@ export async function banFromGroup({ rBanReason: rBanReason, rBanTime, lastReference: lastReference, + groupID: txGroupId }); const signedBytes = Base58.encode(tx.signedBytes); @@ -2234,6 +2240,7 @@ export async function kickFromGroup({ groupId, qortalAddress, rBanReason = "", + txGroupId = 0 }) { const lastReference = await getLastRef(); const resKeyPair = await getKeyPair(); @@ -2252,6 +2259,7 @@ export async function kickFromGroup({ rGroupId: groupId, rBanReason: rBanReason, lastReference: lastReference, + groupID: txGroupId }); const signedBytes = Base58.encode(tx.signedBytes); @@ -2409,7 +2417,8 @@ export async function updateGroup({ newDescription, newApprovalThreshold, newMinimumBlockDelay, - newMaximumBlockDelay + newMaximumBlockDelay, + txGroupId = 0 }) { const wallet = await getSaveWallet(); const address = wallet.address0; @@ -2435,6 +2444,7 @@ export async function updateGroup({ newMinimumBlockDelay, newMaximumBlockDelay, lastReference: lastReference, + groupID: txGroupId }); const signedBytes = Base58.encode(tx.signedBytes); @@ -2446,7 +2456,7 @@ export async function updateGroup({ } -export async function inviteToGroup({ groupId, qortalAddress, inviteTime }) { +export async function inviteToGroup({ groupId, qortalAddress, inviteTime, txGroupId = 0 }) { const address = await getNameOrAddress(qortalAddress); if (!address) throw new Error("Cannot find user"); const lastReference = await getLastRef(); @@ -2466,6 +2476,7 @@ export async function inviteToGroup({ groupId, qortalAddress, inviteTime }) { rGroupId: groupId, rInviteTime: inviteTime, lastReference: lastReference, + groupID: txGroupId }); const signedBytes = Base58.encode(tx.signedBytes); diff --git a/src/components/Apps/AppViewer.tsx b/src/components/Apps/AppViewer.tsx index eb16e8d..02c9387 100644 --- a/src/components/Apps/AppViewer.tsx +++ b/src/components/Apps/AppViewer.tsx @@ -1,4 +1,4 @@ -import React, { useContext, useEffect, useMemo, useState } from "react"; +import React, { useCallback, useContext, useEffect, useMemo, useState } from "react"; import { Avatar, Box, } from "@mui/material"; import { Add } from "@mui/icons-material"; @@ -100,6 +100,49 @@ export const AppViewer = React.forwardRef(({ app , hide, isDevMode, skipAuth}, i }; }, [app, path]); + const receiveChunksFunc = useCallback( + (e) => { + const iframe = iframeRef?.current; + if (!iframe || !iframe?.src) return; + if (app?.tabId !== e.detail?.tabId) return; + const publishLocation = e.detail?.publishLocation; + const chunksSubmitted = e.detail?.chunksSubmitted; + const totalChunks = e.detail?.totalChunks; + try { + if (publishLocation === undefined || publishLocation === null) return; + const dataToBeSent = {}; + if (chunksSubmitted !== undefined && chunksSubmitted !== null) { + dataToBeSent.chunks = chunksSubmitted; + } + if (totalChunks !== undefined && totalChunks !== null) { + dataToBeSent.totalChunks = totalChunks; + } + const targetOrigin = new URL(iframe.src).origin; + iframe.contentWindow?.postMessage( + { + action: 'PUBLISH_STATUS', + publishLocation, + ...dataToBeSent, + requestedHandler: 'UI', + processed: e.detail?.processed || false, + }, + targetOrigin + ); + } catch (err) { + console.error('Failed to send theme change to iframe:', err); + } + }, + [iframeRef, app?.tabId] + ); + + useEffect(() => { + subscribeToEvent('receiveChunks', receiveChunksFunc); + + return () => { + unsubscribeFromEvent('receiveChunks', receiveChunksFunc); + }; + }, [receiveChunksFunc]); + // Function to navigate back in iframe const navigateBackInIframe = async () => { if (iframeRef.current && iframeRef.current.contentWindow && history?.currentIndex > 0) { diff --git a/src/components/Apps/useQortalMessageListener.tsx b/src/components/Apps/useQortalMessageListener.tsx index 59b1283..d22d0c3 100644 --- a/src/components/Apps/useQortalMessageListener.tsx +++ b/src/components/Apps/useQortalMessageListener.tsx @@ -645,7 +645,7 @@ isDOMContentLoaded: false const sendMessageToRuntime = (message, eventPort) => { window.sendMessage(message.action, message.payload, 300000, message.isExtension, { - name: appName, service: appService + name: appName, service: appService, tabId, }, skipAuth) .then((response) => { if (response.error) { @@ -800,7 +800,7 @@ isDOMContentLoaded: false }; - }, [appName, appService]); // Empty dependency array to run once when the component mounts + }, [appName, appService, tabId]); // Empty dependency array to run once when the component mounts diff --git a/src/qdn/publish/pubish.ts b/src/qdn/publish/pubish.ts index 4934083..d00f7bf 100644 --- a/src/qdn/publish/pubish.ts +++ b/src/qdn/publish/pubish.ts @@ -6,6 +6,7 @@ import nacl from '../../deps/nacl-fast'; import utils from '../../utils/utils'; import { createEndpoint, getBaseApi } from '../../background'; import { getData } from '../../utils/chromeStorage'; +import { executeEvent } from '../../utils/events'; export async function reusableGet(endpoint) { const validApi = await getBaseApi(); @@ -98,6 +99,7 @@ export const publishData = async ({ tag4, tag5, feeAmount, + appInfo }: any) => { const validateName = async (receiverName: string) => { return await reusableGet(`/names/${receiverName}`); @@ -199,7 +201,17 @@ export const publishData = async ({ } else { myResponse = response; } - + if (appInfo?.tabId) { + executeEvent('receiveChunks', { + tabId: appInfo.tabId, + publishLocation: { + name: registeredName, + identifier, + service, + }, + processed: true, + }); + } return myResponse; }; @@ -312,6 +324,19 @@ export const publishData = async ({ uploadDataUrl = uploadDataUrl + urlSuffix; } uploadDataUrl = uploadDataUrl + paramQueries; + if (appInfo?.tabId) { + executeEvent('receiveChunks', { + tabId: appInfo.tabId, + publishLocation: { + name: registeredName, + identifier, + service, + }, + chunksSubmitted: 1, + totalChunks: 1, + processed: false, + }); + } return await reusablePost(uploadDataUrl, postBody); } @@ -328,7 +353,19 @@ export const publishData = async ({ const chunkSize = 1 * 1024 * 1024; // 1MB const totalChunks = Math.ceil(file.size / chunkSize); - + if (appInfo?.tabId) { + executeEvent('receiveChunks', { + tabId: appInfo.tabId, + publishLocation: { + name: registeredName, + identifier, + service, + }, + chunksSubmitted: 0, + totalChunks, + processed: false, + }); + } for (let index = 0; index < totalChunks; index++) { const start = index * chunkSize; const end = Math.min(start + chunkSize, file.size); @@ -338,6 +375,19 @@ export const publishData = async ({ formData.append('index', index); await uploadChunkWithRetry(chunkUrl, formData, index); + if (appInfo?.tabId) { + executeEvent('receiveChunks', { + tabId: appInfo.tabId, + publishLocation: { + name: registeredName, + identifier, + service, + }, + chunksSubmitted: index + 1, + totalChunks, + }); + } + } const finalizeUrl = uploadDataUrl + `/finalize` + paramQueries; diff --git a/src/qortalRequests.ts b/src/qortalRequests.ts index 858086e..055ad56 100644 --- a/src/qortalRequests.ts +++ b/src/qortalRequests.ts @@ -200,7 +200,7 @@ export const isRunningGateway = async ()=> { case "PUBLISH_QDN_RESOURCE": { try { - const res = await publishQDNResource(request.payload, event.source, isFromExtension); + const res = await publishQDNResource(request.payload, event.source, isFromExtension, appInfo); event.source.postMessage({ requestId: request.requestId, action: request.action, diff --git a/src/qortalRequests/get.ts b/src/qortalRequests/get.ts index 2e0c28f..7b784bf 100644 --- a/src/qortalRequests/get.ts +++ b/src/qortalRequests/get.ts @@ -914,7 +914,8 @@ export const deleteListItems = async (data, isFromExtension) => { export const publishQDNResource = async ( data: any, sender, - isFromExtension + isFromExtension, + appInfo ) => { const requiredFields = ['service']; const missingFields: string[] = []; @@ -1062,6 +1063,7 @@ export const publishQDNResource = async ( tag5, apiVersion: 2, withFee: true, + appInfo }); if (resPublish?.signature && hasAppFee && checkbox1) { sendCoinFunc( @@ -4237,7 +4239,7 @@ export const inviteToGroupRequest = async (data, isFromExtension) => { const groupId = data.groupId const qortalAddress = data?.inviteeAddress const inviteTime = data?.inviteTime - +const txGroupId = data?.txGroupId || 0; let groupInfo = null; try { const url = await createEndpoint(`/groups/${groupId}`); @@ -4267,6 +4269,7 @@ export const inviteToGroupRequest = async (data, isFromExtension) => { groupId, qortalAddress, inviteTime, + txGroupId }) return response @@ -4291,7 +4294,7 @@ export const kickFromGroupRequest = async (data, isFromExtension) => { const groupId = data.groupId const qortalAddress = data?.qortalAddress const reason = data?.reason - +const txGroupId = data?.txGroupId || 0; let groupInfo = null; try { const url = await createEndpoint(`/groups/${groupId}`); @@ -4320,7 +4323,8 @@ export const kickFromGroupRequest = async (data, isFromExtension) => { const response = await kickFromGroup({ groupId, qortalAddress, - rBanReason: reason + rBanReason: reason, + txGroupId }) return response @@ -4346,6 +4350,7 @@ export const banFromGroupRequest = async (data, isFromExtension) => { const qortalAddress = data?.qortalAddress const rBanTime = data?.banTime const reason = data?.reason + const txGroupId = data?.txGroupId || 0; let groupInfo = null; try { const url = await createEndpoint(`/groups/${groupId}`); @@ -4375,7 +4380,8 @@ export const banFromGroupRequest = async (data, isFromExtension) => { groupId, qortalAddress, rBanTime, - rBanReason: reason + rBanReason: reason, + txGroupId }) return response @@ -4399,7 +4405,7 @@ export const cancelGroupBanRequest = async (data, isFromExtension) => { } const groupId = data.groupId const qortalAddress = data?.qortalAddress - +const txGroupId = data?.txGroupId || 0; let groupInfo = null; try { const url = await createEndpoint(`/groups/${groupId}`); @@ -4428,6 +4434,7 @@ export const cancelGroupBanRequest = async (data, isFromExtension) => { const response = await cancelBan({ groupId, qortalAddress, + txGroupId }) return response @@ -4451,7 +4458,7 @@ export const addGroupAdminRequest = async (data, isFromExtension) => { } const groupId = data.groupId const qortalAddress = data?.qortalAddress - +const txGroupId = data?.txGroupId || 0; let groupInfo = null; try { const url = await createEndpoint(`/groups/${groupId}`); @@ -4480,6 +4487,7 @@ export const addGroupAdminRequest = async (data, isFromExtension) => { const response = await makeAdmin({ groupId, qortalAddress, + txGroupId }) return response @@ -4503,7 +4511,7 @@ export const removeGroupAdminRequest = async (data, isFromExtension) => { } const groupId = data.groupId const qortalAddress = data?.qortalAddress - +const txGroupId = data?.txGroupId || 0; let groupInfo = null; try { const url = await createEndpoint(`/groups/${groupId}`); @@ -4532,6 +4540,7 @@ export const removeGroupAdminRequest = async (data, isFromExtension) => { const response = await removeAdmin({ groupId, qortalAddress, + txGroupId }) return response @@ -4555,7 +4564,7 @@ export const cancelGroupInviteRequest = async (data, isFromExtension) => { } const groupId = data.groupId const qortalAddress = data?.qortalAddress - +const txGroupId = data?.txGroupId || 0; let groupInfo = null; try { const url = await createEndpoint(`/groups/${groupId}`); @@ -4584,6 +4593,7 @@ export const cancelGroupInviteRequest = async (data, isFromExtension) => { const response = await cancelInvitationToGroup({ groupId, qortalAddress, + txGroupId }) return response @@ -4713,7 +4723,7 @@ export const updateGroupRequest = async (data, isFromExtension) => { const approvalThreshold = +data?.approvalThreshold const minBlock = +data?.minBlock const maxBlock = +data.maxBlock - +const txGroupId = data?.txGroupId || 0; let groupInfo = null; try { const url = await createEndpoint(`/groups/${groupId}`); @@ -4748,7 +4758,8 @@ export const updateGroupRequest = async (data, isFromExtension) => { newDescription: description, newApprovalThreshold: approvalThreshold, newMinimumBlockDelay: minBlock, - newMaximumBlockDelay: maxBlock + newMaximumBlockDelay: maxBlock, + txGroupId }) return response