fixes and added qortal request

This commit is contained in:
PhilReact 2025-03-16 22:42:55 +02:00
parent 4a35661ebd
commit 694ace2190
6 changed files with 203 additions and 14 deletions

View File

@ -14,6 +14,7 @@ import {
Input, Input,
styled, styled,
Switch, Switch,
TextField,
Typography, Typography,
} from "@mui/material"; } from "@mui/material";
import Logo1 from "../assets/svgs/Logo1.svg"; import Logo1 from "../assets/svgs/Logo1.svg";
@ -71,12 +72,14 @@ export const NotAuthenticated = ({
const [customNodeToSaveIndex, setCustomNodeToSaveIndex] = const [customNodeToSaveIndex, setCustomNodeToSaveIndex] =
React.useState(null); React.useState(null);
const { showTutorial, hasSeenGettingStarted } = useContext(GlobalContext); const { showTutorial, hasSeenGettingStarted } = useContext(GlobalContext);
const [showSelectApiKey, setShowSelectApiKey] = useState(false)
const [enteredApiKey, setEnteredApiKey] = useState('')
const importedApiKeyRef = useRef(null); const importedApiKeyRef = useRef(null);
const currentNodeRef = useRef(null); const currentNodeRef = useRef(null);
const hasLocalNodeRef = useRef(null); const hasLocalNodeRef = useRef(null);
const isLocal = cleanUrl(currentNode?.url) === "127.0.0.1:12391"; const isLocal = cleanUrl(currentNode?.url) === "127.0.0.1:12391";
const handleFileChangeApiKey = (event) => { const handleFileChangeApiKey = (event) => {
setShowSelectApiKey(false)
const file = event.target.files[0]; // Get the selected file const file = event.target.files[0]; // Get the selected file
if (file) { if (file) {
const reader = new FileReader(); const reader = new FileReader();
@ -241,6 +244,57 @@ export const NotAuthenticated = ({
apikey: importedApiKeyRef.current || key?.apikey, apikey: importedApiKeyRef.current || key?.apikey,
url: currentNodeRef.current?.url, url: currentNodeRef.current?.url,
}; };
if(!payload?.apikey){
try {
const generateUrl = "http://127.0.0.1:12391/admin/apikey/generate";
const generateRes = await fetch(generateUrl, {
method: "POST",
})
let res;
try {
res = await generateRes.clone().json();
} catch (e) {
res = await generateRes.text();
}
if (res != null && !res.error && res.length >= 8) {
payload = {
apikey: res,
url: currentNodeRef.current?.url,
};
setImportedApiKey(res); // Store the file content in the state
setCustomNodes((prev)=> {
const copyPrev = [...prev]
const findLocalIndex = copyPrev?.findIndex((item)=> item?.url === 'http://127.0.0.1:12391')
if(findLocalIndex === -1){
copyPrev.unshift({
url: "http://127.0.0.1:12391",
apikey: res
})
} else {
copyPrev[findLocalIndex] = {
url: "http://127.0.0.1:12391",
apikey: res
}
}
window
.sendMessage("setCustomNodes", copyPrev)
.catch((error) => {
console.error(
"Failed to set custom nodes:",
error.message || "An error occurred"
);
});
return copyPrev
})
}
} catch (error) {
console.error(error)
}
}
} else if (currentNodeRef.current) { } else if (currentNodeRef.current) {
payload = currentNodeRef.current; payload = currentNodeRef.current;
} }
@ -540,14 +594,8 @@ export const NotAuthenticated = ({
</Box> </Box>
{currentNode?.url === "http://127.0.0.1:12391" && ( {currentNode?.url === "http://127.0.0.1:12391" && (
<> <>
<Button size="small" variant="contained" component="label"> <Button onClick={()=> setShowSelectApiKey(true)} size="small" variant="contained" component="label">
{apiKey ? "Change " : "Import "} apiKey.txt {apiKey ? "Change " : "Import "} apikey
<input
type="file"
accept=".txt"
hidden
onChange={handleFileChangeApiKey} // File input handler
/>
</Button> </Button>
<Typography <Typography
sx={{ sx={{
@ -584,6 +632,94 @@ export const NotAuthenticated = ({
info={infoSnack} info={infoSnack}
setInfo={setInfoSnack} setInfo={setInfoSnack}
/> />
{showSelectApiKey && (
<Dialog
open={showSelectApiKey}
aria-labelledby="alert-dialog-title"
aria-describedby="alert-dialog-description"
>
<DialogTitle id="alert-dialog-title">{"Enter apikey"}</DialogTitle>
<DialogContent>
<Box
sx={{
display: "flex",
flexDirection: "column",
gap: '20px'
}}
>
<TextField value={enteredApiKey} onChange={(e)=> setEnteredApiKey(e.target.value)}/>
<Button disabled={!!enteredApiKey} variant="contained" component="label">Alternative: File select
<input
type="file"
accept=".txt"
hidden
onChange={handleFileChangeApiKey} // File input handler
/>
</Button>
</Box>
</DialogContent>
<DialogActions>
<Button
variant="contained"
onClick={() => {
setEnteredApiKey("")
setShowSelectApiKey(false)
}}
>
Close
</Button>
<Button
variant="contained"
disabled={!enteredApiKey}
onClick={() => {
try {
setImportedApiKey(enteredApiKey); // Store the file content in the state
if(customNodes){
setCustomNodes((prev)=> {
const copyPrev = [...prev]
const findLocalIndex = copyPrev?.findIndex((item)=> item?.url === 'http://127.0.0.1:12391')
if(findLocalIndex === -1){
copyPrev.unshift({
url: "http://127.0.0.1:12391",
apikey: enteredApiKey
})
} else {
copyPrev[findLocalIndex] = {
url: "http://127.0.0.1:12391",
apikey: enteredApiKey
}
}
window
.sendMessage("setCustomNodes", copyPrev)
.catch((error) => {
console.error(
"Failed to set custom nodes:",
error.message || "An error occurred"
);
});
return copyPrev
})
}
setUseLocalNode(false);
setShowSelectApiKey(false)
setEnteredApiKey("")
} catch (error) {
console.error(error)
}
}}
autoFocus
>
Save
</Button>
</DialogActions>
</Dialog>
)}
{show && ( {show && (
<Dialog <Dialog
open={show} open={show}

View File

@ -35,7 +35,8 @@ const AppViewerContainer = React.forwardRef(({ app, isSelected, hide, customHeig
</> </>
} }
style={{ style={{
display: (!isSelected || hide) && 'none', position: (!isSelected || hide) && 'absolute',
left: (!isSelected || hide) && '10000000px',
height: customHeight ? customHeight : !isMobile ? '100vh' : `calc(${rootHeight} - 60px - 45px)`, height: customHeight ? customHeight : !isMobile ? '100vh' : `calc(${rootHeight} - 60px - 45px)`,
border: 'none', border: 'none',
width: '100%', width: '100%',

View File

@ -292,7 +292,8 @@ export const Apps = ({ mode, setMode, show , myName}) => {
return ( return (
<AppsParent <AppsParent
sx={{ sx={{
display: !show && "none", position: !show && 'absolute',
left: !show && '10000000px',
}} }}
> >
{mode !== "viewer" && !selectedTab && <Spacer height="30px" />} {mode !== "viewer" && !selectedTab && <Spacer height="30px" />}

View File

@ -253,7 +253,8 @@ export function openIndexedDB() {
'CREATE_GROUP', 'CREATE_GROUP',
'GET_USER_WALLET_TRANSACTIONS', 'GET_USER_WALLET_TRANSACTIONS',
'GET_NODE_INFO', 'GET_NODE_INFO',
'GET_NODE_STATUS' 'GET_NODE_STATUS',
'GET_ARRR_SYNC_STATUS'
] ]
@ -267,7 +268,7 @@ const UIQortalRequests = [
'GET_SERVER_CONNECTION_HISTORY', 'SET_CURRENT_FOREIGN_SERVER', 'GET_SERVER_CONNECTION_HISTORY', 'SET_CURRENT_FOREIGN_SERVER',
'ADD_FOREIGN_SERVER', 'REMOVE_FOREIGN_SERVER', 'GET_DAY_SUMMARY', 'CREATE_TRADE_BUY_ORDER', 'ADD_FOREIGN_SERVER', 'REMOVE_FOREIGN_SERVER', 'GET_DAY_SUMMARY', 'CREATE_TRADE_BUY_ORDER',
'CREATE_TRADE_SELL_ORDER', 'CANCEL_TRADE_SELL_ORDER', 'IS_USING_PUBLIC_NODE', 'SIGN_TRANSACTION', 'ADMIN_ACTION', 'OPEN_NEW_TAB', 'CREATE_AND_COPY_EMBED_LINK', 'DECRYPT_QORTAL_GROUP_DATA', 'DECRYPT_DATA_WITH_SHARING_KEY', 'DELETE_HOSTED_DATA', 'GET_HOSTED_DATA', 'SHOW_ACTIONS', 'REGISTER_NAME', 'UPDATE_NAME', 'LEAVE_GROUP', 'INVITE_TO_GROUP', 'KICK_FROM_GROUP', 'BAN_FROM_GROUP', 'CANCEL_GROUP_BAN', 'ADD_GROUP_ADMIN', 'REMOVE_GROUP_ADMIN','DECRYPT_AESGCM', 'CANCEL_GROUP_INVITE', 'CREATE_GROUP', 'GET_USER_WALLET_TRANSACTIONS', 'GET_NODE_INFO', 'CREATE_TRADE_SELL_ORDER', 'CANCEL_TRADE_SELL_ORDER', 'IS_USING_PUBLIC_NODE', 'SIGN_TRANSACTION', 'ADMIN_ACTION', 'OPEN_NEW_TAB', 'CREATE_AND_COPY_EMBED_LINK', 'DECRYPT_QORTAL_GROUP_DATA', 'DECRYPT_DATA_WITH_SHARING_KEY', 'DELETE_HOSTED_DATA', 'GET_HOSTED_DATA', 'SHOW_ACTIONS', 'REGISTER_NAME', 'UPDATE_NAME', 'LEAVE_GROUP', 'INVITE_TO_GROUP', 'KICK_FROM_GROUP', 'BAN_FROM_GROUP', 'CANCEL_GROUP_BAN', 'ADD_GROUP_ADMIN', 'REMOVE_GROUP_ADMIN','DECRYPT_AESGCM', 'CANCEL_GROUP_INVITE', 'CREATE_GROUP', 'GET_USER_WALLET_TRANSACTIONS', 'GET_NODE_INFO',
'GET_NODE_STATUS' 'GET_NODE_STATUS', 'GET_ARRR_SYNC_STATUS'
]; ];

View File

@ -1,6 +1,6 @@
import { gateways, getApiKeyFromStorage } from "./background"; import { gateways, getApiKeyFromStorage } from "./background";
import { listOfAllQortalRequests } from "./components/Apps/useQortalMessageListener"; import { listOfAllQortalRequests } from "./components/Apps/useQortalMessageListener";
import { addForeignServer, addGroupAdminRequest, addListItems, adminAction, banFromGroupRequest, cancelGroupBanRequest, cancelGroupInviteRequest, cancelSellOrder, createAndCopyEmbedLink, createBuyOrder, createGroupRequest, createPoll, decryptAESGCMRequest, decryptData, decryptDataWithSharingKey, decryptQortalGroupData, deleteHostedData, deleteListItems, deployAt, encryptData, encryptDataWithSharingKey, encryptQortalGroupData, getCrossChainServerInfo, getDaySummary, getForeignFee, getHostedData, getListItems, getNodeInfo, getNodeStatus, getServerConnectionHistory, getTxActivitySummary, getUserAccount, getUserWallet, getUserWalletInfo, getUserWalletTransactions, getWalletBalance, inviteToGroupRequest, joinGroup, kickFromGroupRequest, leaveGroupRequest, openNewTab, publishMultipleQDNResources, publishQDNResource, registerNameRequest, removeForeignServer, removeGroupAdminRequest, saveFile, sendChatMessage, sendCoin, setCurrentForeignServer, signTransaction, updateForeignFee, updateNameRequest, voteOnPoll } from "./qortalRequests/get"; import { addForeignServer, addGroupAdminRequest, addListItems, adminAction, banFromGroupRequest, cancelGroupBanRequest, cancelGroupInviteRequest, cancelSellOrder, createAndCopyEmbedLink, createBuyOrder, createGroupRequest, createPoll, decryptAESGCMRequest, decryptData, decryptDataWithSharingKey, decryptQortalGroupData, deleteHostedData, deleteListItems, deployAt, encryptData, encryptDataWithSharingKey, encryptQortalGroupData, getArrrSyncStatus, getCrossChainServerInfo, getDaySummary, getForeignFee, getHostedData, getListItems, getNodeInfo, getNodeStatus, getServerConnectionHistory, getTxActivitySummary, getUserAccount, getUserWallet, getUserWalletInfo, getUserWalletTransactions, getWalletBalance, inviteToGroupRequest, joinGroup, kickFromGroupRequest, leaveGroupRequest, openNewTab, publishMultipleQDNResources, publishQDNResource, registerNameRequest, removeForeignServer, removeGroupAdminRequest, saveFile, sendChatMessage, sendCoin, setCurrentForeignServer, signTransaction, updateForeignFee, updateNameRequest, voteOnPoll } from "./qortalRequests/get";
import { getData, storeData } from "./utils/chromeStorage"; import { getData, storeData } from "./utils/chromeStorage";
@ -1162,6 +1162,26 @@ export const isRunningGateway = async ()=> {
} }
break; break;
} }
case "GET_ARRR_SYNC_STATUS": {
try {
const res = await getArrrSyncStatus(request.payload);
event.source.postMessage({
requestId: request.requestId,
action: request.action,
payload: res,
type: "backgroundMessageResponse",
}, event.origin);
} catch (error) {
event.source.postMessage({
requestId: request.requestId,
action: request.action,
error: error.message,
type: "backgroundMessageResponse",
}, event.origin);
}
break;
}
default: default:
break; break;
} }

View File

@ -4482,3 +4482,33 @@ export const getNodeStatus = async () => {
throw new Error(error?.message || "Error in retrieving node status"); throw new Error(error?.message || "Error in retrieving node status");
} }
}; };
export const getArrrSyncStatus = async () => {
const resKeyPair = await getKeyPair();
const parsedData = resKeyPair;
const arrrSeed = parsedData.arrrSeed58;
const url = `/crosschain/arrr/syncstatus`; // Simplified endpoint URL
try {
const endpoint = await createEndpoint(url); // Assuming createEndpoint is available for constructing the full URL
const response = await fetch(endpoint, {
method: "POST",
headers: {
Accept: "*/*",
},
body: arrrSeed
});
let res;
try {
res = await response.clone().json();
} catch (e) {
res = await response.text();
}
return res; // Return the full response
} catch (error) {
throw new Error(error?.message || "Error in retrieving arrr sync status");
}
};