diff --git a/src/App.tsx b/src/App.tsx index 5200bec..0ebc465 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -100,6 +100,8 @@ import { Settings } from "./components/Group/Settings"; import { MainAvatar } from "./components/MainAvatar"; import { useRetrieveDataLocalStorage } from "./useRetrieveDataLocalStorage"; import { useQortalGetSaveSettings } from "./useQortalGetSaveSettings"; +import { useResetRecoilState } from "recoil"; +import { canSaveSettingToQdnAtom, oldPinnedAppsAtom, settingsLocalLastUpdatedAtom, settingsQDNLastUpdatedAtom, sortablePinnedAppsAtom } from "./atoms/global"; type extStates = | "not-authenticated" @@ -326,6 +328,21 @@ function App() { const qortalRequestCheckbox1Ref = useRef(null); useRetrieveDataLocalStorage() useQortalGetSaveSettings(userInfo?.name) + + //resets for recoil + const resetAtomSortablePinnedAppsAtom = useResetRecoilState(sortablePinnedAppsAtom); + const resetAtomCanSaveSettingToQdnAtom = useResetRecoilState(canSaveSettingToQdnAtom); + const resetAtomSettingsQDNLastUpdatedAtom = useResetRecoilState(settingsQDNLastUpdatedAtom); + const resetAtomSettingsLocalLastUpdatedAtom = useResetRecoilState(settingsLocalLastUpdatedAtom); + const resetAtomOldPinnedAppsAtom = useResetRecoilState(oldPinnedAppsAtom); + + const resetAllRecoil = () => { + resetAtomSortablePinnedAppsAtom(); + resetAtomCanSaveSettingToQdnAtom(); + resetAtomSettingsQDNLastUpdatedAtom(); + resetAtomSettingsLocalLastUpdatedAtom(); + resetAtomOldPinnedAppsAtom(); + }; useEffect(() => { if (!isMobile) return; // Function to set the height of the app to the viewport height @@ -595,6 +612,20 @@ function App() { } } }; + const qortalRequestPermissonFromExtension = async (message, sender, sendResponse) => { + if (message.action === "QORTAL_REQUEST_PERMISSION" && isMainWindow) { + try { + console.log("payloadbefore", message.payload); + + await show('do you accept?'); + + sendResponse({ accepted: true }); + } catch (error) { + console.log("error", error); + sendResponse({ accepted: false }); + } + } + }; useEffect(() => { // Listen for messages from the background script @@ -667,7 +698,12 @@ function App() { console.log("isMainWindow", isMainWindow, window?.location?.href); return true; // Return true to indicate an async response is coming } + if (message.action === "QORTAL_REQUEST_PERMISSION" && isMainWindow && message?.isFromExtension) { + qortalRequestPermissonFromExtension(message, sender, sendResponse); + return true; + } if (message.action === "QORTAL_REQUEST_PERMISSION" && isMainWindow) { + return; } }; @@ -1014,6 +1050,7 @@ function App() { setConfirmUseOfLocal(false); setTxList([]); setMemberGroups([]); + resetAllRecoil() }; function roundUpToDecimals(number, decimals = 8) { diff --git a/src/atoms/global.ts b/src/atoms/global.ts index 5e212c2..03cf7c9 100644 --- a/src/atoms/global.ts +++ b/src/atoms/global.ts @@ -19,4 +19,9 @@ export const settingsQDNLastUpdatedAtom = atom({ export const settingsLocalLastUpdatedAtom = atom({ key: 'settingsLocalLastUpdatedAtom', default: 0, +}); + +export const oldPinnedAppsAtom = atom({ + key: 'oldPinnedAppsAtom', + default: [], }); \ No newline at end of file diff --git a/src/components/Apps/AppsLibrary.tsx b/src/components/Apps/AppsLibrary.tsx index c1cc3ef..4338b15 100644 --- a/src/components/Apps/AppsLibrary.tsx +++ b/src/components/Apps/AppsLibrary.tsx @@ -205,9 +205,12 @@ export const AppsLibrary = ({ availableQapps, setMode, myName, hasPublishApp, i width: "60px", }} onClick={()=> { - executeEvent("addTab", { - data: qapp - }) + // executeEvent("addTab", { + // data: qapp + // }) + executeEvent("selectedAppInfo", { + data: qapp, + }); }} > diff --git a/src/components/Apps/useQortalMessageListener.tsx b/src/components/Apps/useQortalMessageListener.tsx index c9ace3f..169d0b5 100644 --- a/src/components/Apps/useQortalMessageListener.tsx +++ b/src/components/Apps/useQortalMessageListener.tsx @@ -344,7 +344,7 @@ export const useQortalMessageListener = (frameWindow) => { if (UIQortalRequests.includes(event.data.action)) { console.log('event?.data', event?.data); sendMessageToRuntime( - { action: event.data.action, type: 'qortalRequest', payload: event.data }, + { action: event.data.action, type: 'qortalRequest', payload: event.data, isExtension: true }, event.ports[0] ); } else if ( @@ -368,7 +368,7 @@ export const useQortalMessageListener = (frameWindow) => { console.log('data after', data) if (data) { sendMessageToRuntime( - { action: event.data.action, type: 'qortalRequest', payload: data }, + { action: event.data.action, type: 'qortalRequest', payload: data, isExtension: true }, event.ports[0] ); } else { diff --git a/src/components/Save/Save.tsx b/src/components/Save/Save.tsx index 8a11f52..4f007e2 100644 --- a/src/components/Save/Save.tsx +++ b/src/components/Save/Save.tsx @@ -1,7 +1,7 @@ import React, { useContext, useMemo, useState } from 'react' import { useRecoilState } from 'recoil'; import isEqual from 'lodash/isEqual'; // Import deep comparison utility -import { canSaveSettingToQdnAtom, settingsLocalLastUpdatedAtom, settingsQDNLastUpdatedAtom, sortablePinnedAppsAtom } from '../../atoms/global'; +import { canSaveSettingToQdnAtom, oldPinnedAppsAtom, settingsLocalLastUpdatedAtom, settingsQDNLastUpdatedAtom, sortablePinnedAppsAtom } from '../../atoms/global'; import { ButtonBase } from '@mui/material'; import { objectToBase64 } from '../../qdn/encryption/group-encryption'; import { MyContext } from '../../App'; @@ -17,7 +17,7 @@ export const Save = () => { const [openSnack, setOpenSnack] = useState(false); const [isLoading, setIsLoading] = useState(false) const [infoSnack, setInfoSnack] = useState(null); - const [oldPinnedApps, setOldPinnedApps] = useState(pinnedApps) + const [oldPinnedApps, setOldPinnedApps] = useRecoilState(oldPinnedAppsAtom) console.log('oldpin', {oldPinnedApps, pinnedApps}, settingsQdnLastUpdated, settingsLocalLastUpdated, settingsQdnLastUpdated < settingsLocalLastUpdated,) const { show } = useContext(MyContext); @@ -40,7 +40,7 @@ export const Save = () => { } console.log('!isEqual(oldChanges, newChanges)', !isEqual(oldChanges, newChanges)) if(settingsQdnLastUpdated === -100) return false - return !isEqual(oldChanges, newChanges) || settingsQdnLastUpdated < settingsLocalLastUpdated + return !isEqual(oldChanges, newChanges) && settingsQdnLastUpdated < settingsLocalLastUpdated }, [oldPinnedApps, pinnedApps, settingsQdnLastUpdated, settingsLocalLastUpdated]) const saveToQdn = async ()=> { diff --git a/src/qortalRequests.ts b/src/qortalRequests.ts index 8f1490a..4097e8c 100644 --- a/src/qortalRequests.ts +++ b/src/qortalRequests.ts @@ -63,6 +63,8 @@ function getLocalStorage(key) { chrome?.runtime?.onMessage.addListener((request, sender, sendResponse) => { if (request) { + console.log('rquest', request) + const isFromExtension = request?.isExtension switch (request.action) { case "GET_USER_ACCOUNT": { getUserAccount() @@ -169,7 +171,7 @@ chrome?.runtime?.onMessage.addListener((request, sender, sendResponse) => { case "VOTE_ON_POLL": { const data = request.payload; - voteOnPoll(data) + voteOnPoll(data, isFromExtension) .then((res) => { sendResponse(res); }) diff --git a/src/qortalRequests/get.ts b/src/qortalRequests/get.ts index 104c4e5..0b2e92a 100644 --- a/src/qortalRequests/get.ts +++ b/src/qortalRequests/get.ts @@ -139,7 +139,7 @@ const _deployAt = async ( } }; -const _voteOnPoll = async (pollName, optionIndex, optionName) => { +const _voteOnPoll = async ({pollName, optionIndex, optionName}, isFromExtension) => { const fee = await getFee("VOTE_ON_POLL"); const resPermission = await getUserPermission({ @@ -147,7 +147,7 @@ const _voteOnPoll = async (pollName, optionIndex, optionName) => { text2: `Poll: ${pollName}`, text3: `Option: ${optionName}`, fee: fee.fee, - }); + }, isFromExtension); const { accepted } = resPermission; if (accepted) { @@ -207,7 +207,22 @@ function sendToSaveFilePicker(data, sender) { }); } -async function getUserPermission(payload: any) { +async function responseFromExtension() { + return new Promise((resolve) => { + + // Send message to the content script to check focus + chrome.runtime.sendMessage({ action: "QORTAL_REQUEST_PERMISSION", payloa }, (response) => { + + if (chrome.runtime.lastError) { + resolve(false); // Error occurred, assume not focused + } else { + resolve(response); // Resolve based on the response + } + }); + }); +} + +async function getUserPermission(payload: any, isFromExtension?: boolean) { function waitForWindowReady(windowId) { return new Promise((resolve) => { const checkInterval = setInterval(() => { @@ -224,6 +239,33 @@ async function getUserPermission(payload: any) { }); } + console.log('isFromExtension', isFromExtension) + if(isFromExtension){ + + + return new Promise((resolve) => { + // Set a timeout for 1 second + const timeout = setTimeout(() => { + resolve(false); + }, 30000); + + // Send message to the content script to check focus + chrome.runtime.sendMessage( + { action: "QORTAL_REQUEST_PERMISSION", payload, isFromExtension }, + (response) => { + console.log("permission response", response); + if (response === undefined) return; + clearTimeout(timeout); // Clear the timeout if we get a response + + if (chrome.runtime.lastError) { + resolve(false); // Error occurred, assume not focused + } else { + resolve(response); // Resolve based on the response + } + } + ); + }); + } await new Promise((res) => { const popupUrl = chrome.runtime.getURL("index.html?secondary=true"); console.log("popupUrl", popupUrl); @@ -294,7 +336,7 @@ async function getUserPermission(payload: any) { return new Promise((resolve) => { // Set a timeout for 1 second const timeout = setTimeout(() => { - resolve(false); // No response within 10 second, assume not focused + resolve(false); }, 30000); // Send message to the content script to check focus @@ -909,7 +951,7 @@ export const publishMultipleQDNResources = async (data: any, sender) => { return true; }; -export const voteOnPoll = async (data) => { +export const voteOnPoll = async (data, isFromExtension) => { const requiredFields = ["pollName", "optionIndex"]; const missingFields: string[] = []; requiredFields.forEach((field) => { @@ -941,7 +983,7 @@ export const voteOnPoll = async (data) => { } try { const optionName = pollInfo.pollOptions[optionIndex].optionName; - const resVoteOnPoll = await _voteOnPoll(pollName, optionIndex, optionName); + const resVoteOnPoll = await _voteOnPoll({pollName, optionIndex, optionName}, isFromExtension); return resVoteOnPoll; } catch (error) { throw new Error(error?.message || "Failed to vote on the poll."); diff --git a/src/useQortalGetSaveSettings.tsx b/src/useQortalGetSaveSettings.tsx index da1fb37..4809b59 100644 --- a/src/useQortalGetSaveSettings.tsx +++ b/src/useQortalGetSaveSettings.tsx @@ -1,6 +1,6 @@ import React, { useCallback, useEffect } from 'react' import { useRecoilState, useSetRecoilState } from 'recoil'; -import { canSaveSettingToQdnAtom, settingsLocalLastUpdatedAtom, settingsQDNLastUpdatedAtom, sortablePinnedAppsAtom } from './atoms/global'; +import { canSaveSettingToQdnAtom, oldPinnedAppsAtom, settingsLocalLastUpdatedAtom, settingsQDNLastUpdatedAtom, sortablePinnedAppsAtom } from './atoms/global'; import { getArbitraryEndpointReact, getBaseApiReact } from './App'; import { decryptResource } from './components/Group/Group'; import { base64ToUint8Array, uint8ArrayToObject } from './backgroundFunctions/encryption'; @@ -58,13 +58,19 @@ export const useQortalGetSaveSettings = (myName) => { const setCanSave = useSetRecoilState(canSaveSettingToQdnAtom); const setSettingsQDNLastUpdated = useSetRecoilState(settingsQDNLastUpdatedAtom); const [settingsLocalLastUpdated] = useRecoilState(settingsLocalLastUpdatedAtom); + const [oldPinnedApps, setOldPinnedApps] = useRecoilState(oldPinnedAppsAtom) + const getSavedSettings = useCallback(async (myName, settingsLocalLastUpdated)=> { try { const {hasPublishRecord, timestamp} = await getPublishRecord(myName) if(hasPublishRecord){ const settings = await getPublish(myName) + console.log('settings', settings, timestamp, settingsLocalLastUpdated ) if(settings?.sortablePinnedApps && timestamp > settingsLocalLastUpdated){ setSortablePinnedApps(settings.sortablePinnedApps) + setOldPinnedApps(settings.sortablePinnedApps) + setSettingsQDNLastUpdated(timestamp || 0) + } else if(settings?.sortablePinnedApps){ setSettingsQDNLastUpdated(timestamp || 0) } if(!settings){