diff --git a/apps/remix-ide/src/app/tabs/locales/en/udapp.json b/apps/remix-ide/src/app/tabs/locales/en/udapp.json index 0638936cb6..1db24ca378 100644 --- a/apps/remix-ide/src/app/tabs/locales/en/udapp.json +++ b/apps/remix-ide/src/app/tabs/locales/en/udapp.json @@ -71,8 +71,8 @@ "udapp.tooltipText6": "Autogenerated generic user interfaces for interaction with deployed/unpinned contracts", "udapp.savedContracts": "Pinned Contracts", - "udapp.tooltipTextPinnedContracts": "List of pinned contracts for selected network", - "udapp.NoSavedInstanceText": "No contracts pinned yet. Pinned contracts stay after reloading Remix IDE.", + "udapp.tooltipTextPinnedContracts": "List of pinned contracts for selected workspace & network", + "udapp.NoSavedInstanceText": "No pinned contracts found for selected workspace & network", "udapp.tooltipTextDelete": "Delete pinned contract", "udapp.tooltipTextUnpin": "Unpin contract", "udapp.savedOn": "Pinned at", diff --git a/libs/remix-ui/run-tab/src/lib/components/instanceContainerUI.tsx b/libs/remix-ui/run-tab/src/lib/components/instanceContainerUI.tsx index ec47b31f79..9383875477 100644 --- a/libs/remix-ui/run-tab/src/lib/components/instanceContainerUI.tsx +++ b/libs/remix-ui/run-tab/src/lib/components/instanceContainerUI.tsx @@ -17,14 +17,41 @@ export function InstanceContainerUI(props: InstanceContainerProps) { if (enableSave.current) { const { network } = await props.plugin.call('blockchain', 'getCurrentNetworkStatus') chainId.current = network.id + // Move contract saved in localstorage to Remix FE const allSavedContracts = localStorage.getItem('savedContracts') if (allSavedContracts) { - await props.plugin.call('udapp', 'clearAllSavedInstances') const savedContracts = JSON.parse(allSavedContracts) - if (savedContracts && savedContracts[network.id]) { - const instances = savedContracts[network.id] - for (const inst of instances) - if (inst) await props.plugin.call('udapp', 'addSavedInstance', inst.address, inst.abi || inst.contractData.abi, inst.name, inst.savedOn, inst.filePath) + for (const networkId in savedContracts) { + if (savedContracts[networkId].length > 0) { + for (const contractDetails of savedContracts[networkId]) { + const objToSave = { + name: contractDetails.name, + address: contractDetails.address, + abi: contractDetails.abi || contractDetails.contractData.abi, + filePath: contractDetails.filePath, + pinnedAt: contractDetails.savedOn + } + await props.plugin.call('fileManager', 'writeFile', `.deploys/pinned-contracts/${networkId}/${contractDetails.address}.json`, JSON.stringify(objToSave, null, 2)) + } + } + } + localStorage.removeItem('savedContracts') + } + // Clear existing saved instance state + await props.plugin.call('udapp', 'clearAllSavedInstances') + // Load contracts from FE + const isPinnedAvailable = await props.plugin.call('fileManager', 'exists', `.deploys/pinned-contracts/${chainId.current}`) + if (isPinnedAvailable) { + try { + const list = await props.plugin.call('fileManager', 'readdir', `.deploys/pinned-contracts/${chainId.current}`) + const filePaths = Object.keys(list) + for (const file of filePaths) { + const pinnedContract = await props.plugin.call('fileManager', 'readFile', file) + const pinnedContractObj = JSON.parse(pinnedContract) + if (pinnedContractObj) await props.plugin.call('udapp', 'addSavedInstance', pinnedContractObj.address, pinnedContractObj.abi, pinnedContractObj.name, pinnedContractObj.pinnedAt, pinnedContractObj.filePath) + } + } catch(err) { + console.log(err) } } } diff --git a/libs/remix-ui/run-tab/src/lib/components/universalDappUI.tsx b/libs/remix-ui/run-tab/src/lib/components/universalDappUI.tsx index 77c511be90..33503df919 100644 --- a/libs/remix-ui/run-tab/src/lib/components/universalDappUI.tsx +++ b/libs/remix-ui/run-tab/src/lib/components/universalDappUI.tsx @@ -114,12 +114,7 @@ export function UniversalDappUI(props: UdappProps) { const unsavePinnedContract = async () => { const {network} = await props.plugin.call('blockchain', 'getCurrentNetworkStatus') - const savedContracts = localStorage.getItem('savedContracts') - const savedContractsJson = JSON.parse(savedContracts) - const instanceIndex = savedContractsJson[network.id].findIndex(instance => instance && instance.address === props.instance.address) - delete savedContractsJson[network.id][instanceIndex] - savedContractsJson[network.id] = savedContractsJson[network.id].filter(Boolean) - localStorage.setItem('savedContracts', JSON.stringify(savedContractsJson)) + await props.plugin.call('fileManager', 'remove', `.deploys/pinned-contracts/${network.id}/${props.instance.address}.json`) } const remove = async() => { @@ -139,24 +134,17 @@ export function UniversalDappUI(props: UdappProps) { const pinContract = async() => { const workspace = await props.plugin.call('filePanel', 'getCurrentWorkspace') const {network} = await props.plugin.call('blockchain', 'getCurrentNetworkStatus') - const savedContracts = localStorage.getItem('savedContracts') - let objToSave - if (!savedContracts) { - objToSave = {} - objToSave[network.id] = [] - } else { - objToSave = JSON.parse(savedContracts) - if (!objToSave[network.id]) { - objToSave[network.id] = [] - } + const objToSave = { + name: props.instance.name, + address: props.instance.address, + abi: props.instance.abi || props.instance.contractData.abi, + filePath: props.instance.filePath || `${workspace.name}/${props.instance.contractData.contract.file}`, + pinnedAt: Date.now() } - props.instance.savedOn = Date.now() - props.instance.filePath = props.instance.filePath || `${workspace.name}/${props.instance.contractData.contract.file}` - objToSave[network.id].push(props.instance) - localStorage.setItem('savedContracts', JSON.stringify(objToSave)) + await props.plugin.call('fileManager', 'writeFile', `.deploys/pinned-contracts/${network.id}/${props.instance.address}.json`, JSON.stringify(objToSave, null, 2)) // Add contract to saved contracts list on UI - await props.plugin.call('udapp', 'addSavedInstance', props.instance.address, props.instance.abi || props.instance.contractData.abi, props.instance.name, props.instance.savedOn, props.instance.filePath) - _paq.push(['trackEvent', 'udapp', 'pinContracts', 'pinned']) + await props.plugin.call('udapp', 'addSavedInstance', objToSave.address, objToSave.abi, objToSave.name, objToSave.pinnedAt, objToSave.filePath) + _paq.push(['trackEvent', 'udapp', 'pinContracts', `pinned at ${network.id}`]) // Remove contract from deployed contracts list on UI props.removeInstance(props.index, false, false) }