mirror of
https://github.com/Qortal/Qortal-Hub.git
synced 2025-04-23 19:37:52 +00:00
update send chat message qortalRequest
This commit is contained in:
parent
7b17039ee8
commit
83ebfff611
@ -189,7 +189,8 @@ export const AppViewer = React.forwardRef(({ app , hide, isDevMode}, iframeRef)
|
|||||||
height: !isMobile ? '100vh' : `calc(${rootHeight} - 60px - 45px )`,
|
height: !isMobile ? '100vh' : `calc(${rootHeight} - 60px - 45px )`,
|
||||||
border: 'none',
|
border: 'none',
|
||||||
width: '100%'
|
width: '100%'
|
||||||
}} id="browser-iframe" src={defaultUrl} sandbox="allow-scripts allow-same-origin allow-forms allow-downloads allow-modals" allow="fullscreen">
|
}} id="browser-iframe" src={defaultUrl} sandbox="allow-scripts allow-same-origin allow-forms allow-downloads allow-modals"
|
||||||
|
allow="fullscreen; clipboard-read; clipboard-write">
|
||||||
|
|
||||||
</iframe>
|
</iframe>
|
||||||
</Box>
|
</Box>
|
||||||
|
@ -376,7 +376,7 @@ export const isRunningGateway = async ()=> {
|
|||||||
|
|
||||||
case "GET_USER_WALLET": {
|
case "GET_USER_WALLET": {
|
||||||
try {
|
try {
|
||||||
const res = await getUserWallet(request.payload, isFromExtension);
|
const res = await getUserWallet(request.payload, isFromExtension, appInfo);
|
||||||
event.source.postMessage({
|
event.source.postMessage({
|
||||||
requestId: request.requestId,
|
requestId: request.requestId,
|
||||||
action: request.action,
|
action: request.action,
|
||||||
@ -416,7 +416,7 @@ export const isRunningGateway = async ()=> {
|
|||||||
|
|
||||||
case "GET_USER_WALLET_INFO": {
|
case "GET_USER_WALLET_INFO": {
|
||||||
try {
|
try {
|
||||||
const res = await getUserWalletInfo(request.payload, isFromExtension);
|
const res = await getUserWalletInfo(request.payload, isFromExtension, appInfo);
|
||||||
event.source.postMessage({
|
event.source.postMessage({
|
||||||
requestId: request.requestId,
|
requestId: request.requestId,
|
||||||
action: request.action,
|
action: request.action,
|
||||||
|
@ -1416,15 +1416,42 @@ export const createPoll = async (data, isFromExtension) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
function isBase64(str) {
|
||||||
|
const base64Regex = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/;
|
||||||
|
return base64Regex.test(str) && str.length % 4 === 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkValue(value) {
|
||||||
|
if (typeof value === "string") {
|
||||||
|
if (isBase64(value)) {
|
||||||
|
return 'string'
|
||||||
|
} else {
|
||||||
|
return 'string'
|
||||||
|
}
|
||||||
|
} else if (typeof value === "object" && value !== null) {
|
||||||
|
return 'object'
|
||||||
|
} else {
|
||||||
|
throw new Error('Field fullContent is in an invalid format. Either use a string, base64 or an object.')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
export const sendChatMessage = async (data, isFromExtension, appInfo) => {
|
export const sendChatMessage = async (data, isFromExtension, appInfo) => {
|
||||||
const message = data?.message;
|
const message = data?.message;
|
||||||
const fullMessageObject = data?.fullMessageObject
|
const fullMessageObject = data?.fullMessageObject || data?.fullContent
|
||||||
const recipient = data.destinationAddress;
|
const recipient = data?.destinationAddress || data.recipient;
|
||||||
const groupId = data.groupId;
|
const groupId = data.groupId;
|
||||||
const isRecipient = !groupId;
|
const isRecipient = groupId === undefined;
|
||||||
|
const chatReference = data?.chatReference
|
||||||
const value =
|
if(groupId === undefined && recipient === undefined){
|
||||||
(await getPermission(`qAPPSendChatMessage-${appInfo?.name}`)) || false;
|
throw new Error('Please provide a recipient or groupId')
|
||||||
|
}
|
||||||
|
let fullMessageObjectType
|
||||||
|
if(fullMessageObject){
|
||||||
|
fullMessageObjectType = checkValue(fullMessageObject)
|
||||||
|
}
|
||||||
|
const value = (await getPermission(`qAPPSendChatMessage-${appInfo?.name}`)) || false;
|
||||||
let skip = false;
|
let skip = false;
|
||||||
if (value) {
|
if (value) {
|
||||||
skip = true;
|
skip = true;
|
||||||
@ -1436,7 +1463,7 @@ if (!skip) {
|
|||||||
text1:
|
text1:
|
||||||
"Do you give this application permission to send this chat message?",
|
"Do you give this application permission to send this chat message?",
|
||||||
text2: `To: ${isRecipient ? recipient : `group ${groupId}`}`,
|
text2: `To: ${isRecipient ? recipient : `group ${groupId}`}`,
|
||||||
text3: `${message?.slice(0, 25)}${message?.length > 25 ? "..." : ""}`,
|
text3: fullMessageObject ? fullMessageObjectType === 'string' ? `${fullMessageObject?.slice(0, 25)}${fullMessageObject?.length > 25 ? "..." : ""}` : `${JSON.stringify(fullMessageObject)?.slice(0, 25)}${JSON.stringify(fullMessageObject)?.length > 25 ? "..." : ""}` : `${message?.slice(0, 25)}${message?.length > 25 ? "..." : ""}`,
|
||||||
checkbox1: {
|
checkbox1: {
|
||||||
value: false,
|
value: false,
|
||||||
label: "Always allow chat messages from this app",
|
label: "Always allow chat messages from this app",
|
||||||
@ -1471,7 +1498,10 @@ if (!skip) {
|
|||||||
version: 3,
|
version: 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
const stringifyMessageObject = JSON.stringify(messageObject);
|
let stringifyMessageObject = JSON.stringify(messageObject);
|
||||||
|
if(fullMessageObjectType === 'string'){
|
||||||
|
stringifyMessageObject = messageObject
|
||||||
|
}
|
||||||
|
|
||||||
const balance = await getBalanceInfo();
|
const balance = await getBalanceInfo();
|
||||||
const hasEnoughBalance = +balance < 4 ? false : true;
|
const hasEnoughBalance = +balance < 4 ? false : true;
|
||||||
@ -1527,16 +1557,22 @@ if (!skip) {
|
|||||||
publicKey: uint8PublicKey,
|
publicKey: uint8PublicKey,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let handleDynamicValues = {}
|
||||||
|
if(chatReference){
|
||||||
|
handleDynamicValues['chatReference'] = chatReference
|
||||||
|
}
|
||||||
|
|
||||||
const tx = await createTransaction(18, keyPair, {
|
const tx = await createTransaction(18, keyPair, {
|
||||||
timestamp: sendTimestamp,
|
timestamp: sendTimestamp,
|
||||||
recipient: recipient,
|
recipient: recipient,
|
||||||
recipientPublicKey: key,
|
recipientPublicKey: key,
|
||||||
hasChatReference: 0,
|
hasChatReference: chatReference ? 1 : 0,
|
||||||
message: stringifyMessageObject,
|
message: stringifyMessageObject,
|
||||||
lastReference: reference,
|
lastReference: reference,
|
||||||
proofOfWorkNonce: 0,
|
proofOfWorkNonce: 0,
|
||||||
isEncrypted: 1,
|
isEncrypted: 1,
|
||||||
isText: 1,
|
isText: 1,
|
||||||
|
...handleDynamicValues
|
||||||
});
|
});
|
||||||
|
|
||||||
const chatBytes = tx.chatBytes;
|
const chatBytes = tx.chatBytes;
|
||||||
@ -1565,16 +1601,22 @@ if (!skip) {
|
|||||||
publicKey: uint8PublicKey,
|
publicKey: uint8PublicKey,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let handleDynamicValues = {}
|
||||||
|
if(chatReference){
|
||||||
|
handleDynamicValues['chatReference'] = chatReference
|
||||||
|
}
|
||||||
|
|
||||||
const txBody = {
|
const txBody = {
|
||||||
timestamp: Date.now(),
|
timestamp: Date.now(),
|
||||||
groupID: Number(groupId),
|
groupID: Number(groupId),
|
||||||
hasReceipient: 0,
|
hasReceipient: 0,
|
||||||
hasChatReference: 0,
|
hasChatReference: chatReference ? 1 : 0,
|
||||||
message: stringifyMessageObject,
|
message: stringifyMessageObject,
|
||||||
lastReference: reference,
|
lastReference: reference,
|
||||||
proofOfWorkNonce: 0,
|
proofOfWorkNonce: 0,
|
||||||
isEncrypted: 0, // Set default to not encrypted for groups
|
isEncrypted: 0, // Set default to not encrypted for groups
|
||||||
isText: 1,
|
isText: 1,
|
||||||
|
...handleDynamicValues
|
||||||
};
|
};
|
||||||
|
|
||||||
const tx = await createTransaction(181, keyPair, txBody);
|
const tx = await createTransaction(181, keyPair, txBody);
|
||||||
@ -1771,7 +1813,7 @@ export const deployAt = async (data, isFromExtension) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getUserWallet = async (data, isFromExtension) => {
|
export const getUserWallet = async (data, isFromExtension, appInfo) => {
|
||||||
const requiredFields = ["coin"];
|
const requiredFields = ["coin"];
|
||||||
const missingFields: string[] = [];
|
const missingFields: string[] = [];
|
||||||
requiredFields.forEach((field) => {
|
requiredFields.forEach((field) => {
|
||||||
@ -1790,17 +1832,43 @@ export const getUserWallet = async (data, isFromExtension) => {
|
|||||||
throw new Error(
|
throw new Error(
|
||||||
"Cannot view ARRR wallet info through the gateway. Please use your local node."
|
"Cannot view ARRR wallet info through the gateway. Please use your local node."
|
||||||
);
|
);
|
||||||
const resPermission = await getUserPermission(
|
|
||||||
|
const value =
|
||||||
|
(await getPermission(
|
||||||
|
`qAPPAutoGetUserWallet-${appInfo?.name}-${data.coin}`
|
||||||
|
)) || false;
|
||||||
|
let skip = false;
|
||||||
|
if (value) {
|
||||||
|
skip = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
let resPermission;
|
||||||
|
|
||||||
|
if (!skip) {
|
||||||
|
resPermission = await getUserPermission(
|
||||||
{
|
{
|
||||||
text1:
|
text1:
|
||||||
"Do you give this application permission to get your wallet information?",
|
"Do you give this application permission to get your wallet information?",
|
||||||
highlightedText: `coin: ${data.coin}`,
|
highlightedText: `coin: ${data.coin}`,
|
||||||
|
checkbox1: {
|
||||||
|
value: true,
|
||||||
|
label: "Always allow wallet to be retrieved automatically",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
isFromExtension
|
isFromExtension
|
||||||
);
|
);
|
||||||
const { accepted } = resPermission;
|
|
||||||
|
|
||||||
if (accepted) {
|
}
|
||||||
|
const { accepted = false, checkbox1 = false } = resPermission || {};
|
||||||
|
|
||||||
|
if (resPermission) {
|
||||||
|
setPermission(
|
||||||
|
`qAPPAutoGetUserWallet-${appInfo?.name}-${data.coin}`,
|
||||||
|
checkbox1
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (accepted || skip) {
|
||||||
let coin = data.coin;
|
let coin = data.coin;
|
||||||
let userWallet = {};
|
let userWallet = {};
|
||||||
let arrrAddress = "";
|
let arrrAddress = "";
|
||||||
@ -2086,7 +2154,7 @@ export const getUserWalletFunc = async (coin) => {
|
|||||||
return userWallet;
|
return userWallet;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getUserWalletInfo = async (data, isFromExtension) => {
|
export const getUserWalletInfo = async (data, isFromExtension, appInfo) => {
|
||||||
const requiredFields = ["coin"];
|
const requiredFields = ["coin"];
|
||||||
const missingFields: string[] = [];
|
const missingFields: string[] = [];
|
||||||
requiredFields.forEach((field) => {
|
requiredFields.forEach((field) => {
|
||||||
@ -2105,17 +2173,41 @@ export const getUserWalletInfo = async (data, isFromExtension) => {
|
|||||||
"ARRR is not supported for this call."
|
"ARRR is not supported for this call."
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
const resPermission = await getUserPermission(
|
const value =
|
||||||
|
(await getPermission(
|
||||||
|
`getUserWalletInfo-${appInfo?.name}-${data.coin}`
|
||||||
|
)) || false;
|
||||||
|
let skip = false;
|
||||||
|
if (value) {
|
||||||
|
skip = true;
|
||||||
|
}
|
||||||
|
let resPermission;
|
||||||
|
|
||||||
|
if (!skip) {
|
||||||
|
|
||||||
|
resPermission = await getUserPermission(
|
||||||
{
|
{
|
||||||
text1:
|
text1:
|
||||||
"Do you give this application permission to retrieve your wallet information",
|
"Do you give this application permission to retrieve your wallet information",
|
||||||
highlightedText: `coin: ${data.coin}`,
|
highlightedText: `coin: ${data.coin}`,
|
||||||
|
checkbox1: {
|
||||||
|
value: true,
|
||||||
|
label: "Always allow wallet info to be retrieved automatically",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
isFromExtension
|
isFromExtension
|
||||||
);
|
);
|
||||||
const { accepted } = resPermission;
|
}
|
||||||
|
const { accepted = false, checkbox1 = false } = resPermission || {};
|
||||||
|
|
||||||
if (accepted) {
|
if (resPermission) {
|
||||||
|
setPermission(
|
||||||
|
`getUserWalletInfo-${appInfo?.name}-${data.coin}`,
|
||||||
|
checkbox1
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (accepted || skip) {
|
||||||
let coin = data.coin;
|
let coin = data.coin;
|
||||||
let walletKeys = await getUserWalletFunc(coin);
|
let walletKeys = await getUserWalletFunc(coin);
|
||||||
|
|
||||||
@ -2579,7 +2671,7 @@ export const getDaySummary = async () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const sendCoin = async (data, isFromExtension) => {
|
export const sendCoin = async (data, isFromExtension) => {
|
||||||
const requiredFields = ["coin", "destinationAddress", "amount"];
|
const requiredFields = ["coin", "amount"];
|
||||||
const missingFields: string[] = [];
|
const missingFields: string[] = [];
|
||||||
requiredFields.forEach((field) => {
|
requiredFields.forEach((field) => {
|
||||||
if (!data[field]) {
|
if (!data[field]) {
|
||||||
@ -2591,6 +2683,9 @@ export const sendCoin = async (data, isFromExtension) => {
|
|||||||
const errorMsg = `Missing fields: ${missingFieldsString}`;
|
const errorMsg = `Missing fields: ${missingFieldsString}`;
|
||||||
throw new Error(errorMsg);
|
throw new Error(errorMsg);
|
||||||
}
|
}
|
||||||
|
if(!data?.destinationAddress && !data?.recipient){
|
||||||
|
throw new Error('Missing fields: recipient')
|
||||||
|
}
|
||||||
let checkCoin = data.coin;
|
let checkCoin = data.coin;
|
||||||
const wallet = await getSaveWallet();
|
const wallet = await getSaveWallet();
|
||||||
const address = wallet.address0;
|
const address = wallet.address0;
|
||||||
@ -2603,12 +2698,12 @@ export const sendCoin = async (data, isFromExtension) => {
|
|||||||
"Cannot send a non-QORT coin through the gateway. Please use your local node."
|
"Cannot send a non-QORT coin through the gateway. Please use your local node."
|
||||||
);
|
);
|
||||||
if (checkCoin === "QORT") {
|
if (checkCoin === "QORT") {
|
||||||
// Params: data.coin, data.destinationAddress, data.amount, data.fee
|
// Params: data.coin, data.recipient, data.amount, data.fee
|
||||||
// TODO: prompt user to send. If they confirm, call `POST /crosschain/:coin/send`, or for QORT, broadcast a PAYMENT transaction
|
// TODO: prompt user to send. If they confirm, call `POST /crosschain/:coin/send`, or for QORT, broadcast a PAYMENT transaction
|
||||||
// then set the response string from the core to the `response` variable (defined above)
|
// then set the response string from the core to the `response` variable (defined above)
|
||||||
// If they decline, send back JSON that includes an `error` key, such as `{"error": "User declined request"}`
|
// If they decline, send back JSON that includes an `error` key, such as `{"error": "User declined request"}`
|
||||||
const amount = Number(data.amount);
|
const amount = Number(data.amount);
|
||||||
const recipient = data.destinationAddress;
|
const recipient = data?.recipient || data.destinationAddress;
|
||||||
|
|
||||||
const url = await createEndpoint(`/addresses/balance/${address}`);
|
const url = await createEndpoint(`/addresses/balance/${address}`);
|
||||||
const response = await fetch(url);
|
const response = await fetch(url);
|
||||||
@ -2665,7 +2760,7 @@ export const sendCoin = async (data, isFromExtension) => {
|
|||||||
}
|
}
|
||||||
} else if (checkCoin === "BTC") {
|
} else if (checkCoin === "BTC") {
|
||||||
const amount = Number(data.amount);
|
const amount = Number(data.amount);
|
||||||
const recipient = data.destinationAddress;
|
const recipient = data?.recipient || data.destinationAddress;
|
||||||
const xprv58 = parsedData.btcPrivateKey;
|
const xprv58 = parsedData.btcPrivateKey;
|
||||||
const feePerByte = data.fee ? data.fee : btcFeePerByte;
|
const feePerByte = data.fee ? data.fee : btcFeePerByte;
|
||||||
|
|
||||||
@ -2722,7 +2817,7 @@ export const sendCoin = async (data, isFromExtension) => {
|
|||||||
}
|
}
|
||||||
} else if (checkCoin === "LTC") {
|
} else if (checkCoin === "LTC") {
|
||||||
const amount = Number(data.amount);
|
const amount = Number(data.amount);
|
||||||
const recipient = data.destinationAddress;
|
const recipient = data?.recipient || data.destinationAddress;
|
||||||
const xprv58 = parsedData.ltcPrivateKey;
|
const xprv58 = parsedData.ltcPrivateKey;
|
||||||
const feePerByte = data.fee ? data.fee : ltcFeePerByte;
|
const feePerByte = data.fee ? data.fee : ltcFeePerByte;
|
||||||
const ltcWalletBalance = await getWalletBalance({ coin: checkCoin }, true);
|
const ltcWalletBalance = await getWalletBalance({ coin: checkCoin }, true);
|
||||||
@ -2777,7 +2872,7 @@ export const sendCoin = async (data, isFromExtension) => {
|
|||||||
}
|
}
|
||||||
} else if (checkCoin === "DOGE") {
|
} else if (checkCoin === "DOGE") {
|
||||||
const amount = Number(data.amount);
|
const amount = Number(data.amount);
|
||||||
const recipient = data.destinationAddress;
|
const recipient = data?.recipient || data.destinationAddress;
|
||||||
const xprv58 = parsedData.dogePrivateKey;
|
const xprv58 = parsedData.dogePrivateKey;
|
||||||
const feePerByte = data.fee ? data.fee : dogeFeePerByte;
|
const feePerByte = data.fee ? data.fee : dogeFeePerByte;
|
||||||
const dogeWalletBalance = await getWalletBalance({ coin: checkCoin }, true);
|
const dogeWalletBalance = await getWalletBalance({ coin: checkCoin }, true);
|
||||||
@ -2834,7 +2929,7 @@ export const sendCoin = async (data, isFromExtension) => {
|
|||||||
}
|
}
|
||||||
} else if (checkCoin === "DGB") {
|
} else if (checkCoin === "DGB") {
|
||||||
const amount = Number(data.amount);
|
const amount = Number(data.amount);
|
||||||
const recipient = data.destinationAddress;
|
const recipient = data?.recipient || data.destinationAddress;
|
||||||
const xprv58 = parsedData.dbgPrivateKey;
|
const xprv58 = parsedData.dbgPrivateKey;
|
||||||
const feePerByte = data.fee ? data.fee : dgbFeePerByte;
|
const feePerByte = data.fee ? data.fee : dgbFeePerByte;
|
||||||
const dgbWalletBalance = await getWalletBalance({ coin: checkCoin }, true);
|
const dgbWalletBalance = await getWalletBalance({ coin: checkCoin }, true);
|
||||||
@ -2891,7 +2986,7 @@ export const sendCoin = async (data, isFromExtension) => {
|
|||||||
}
|
}
|
||||||
} else if (checkCoin === "RVN") {
|
} else if (checkCoin === "RVN") {
|
||||||
const amount = Number(data.amount);
|
const amount = Number(data.amount);
|
||||||
const recipient = data.destinationAddress;
|
const recipient = data?.recipient || data.destinationAddress;
|
||||||
const xprv58 = parsedData.rvnPrivateKey;
|
const xprv58 = parsedData.rvnPrivateKey;
|
||||||
const feePerByte = data.fee ? data.fee : rvnFeePerByte;
|
const feePerByte = data.fee ? data.fee : rvnFeePerByte;
|
||||||
const rvnWalletBalance = await getWalletBalance({ coin: checkCoin }, true);
|
const rvnWalletBalance = await getWalletBalance({ coin: checkCoin }, true);
|
||||||
@ -2948,7 +3043,7 @@ export const sendCoin = async (data, isFromExtension) => {
|
|||||||
}
|
}
|
||||||
} else if (checkCoin === "ARRR") {
|
} else if (checkCoin === "ARRR") {
|
||||||
const amount = Number(data.amount);
|
const amount = Number(data.amount);
|
||||||
const recipient = data.destinationAddress;
|
const recipient = data?.recipient || data.destinationAddress;
|
||||||
const memo = data?.memo;
|
const memo = data?.memo;
|
||||||
const arrrWalletBalance = await getWalletBalance({ coin: checkCoin }, true);
|
const arrrWalletBalance = await getWalletBalance({ coin: checkCoin }, true);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user