diff --git a/apps/remix-ide-e2e/src/tests/fileManager_api.test.ts b/apps/remix-ide-e2e/src/tests/fileManager_api.test.ts index 26a2e7cffd7..89e79bce3bb 100644 --- a/apps/remix-ide-e2e/src/tests/fileManager_api.test.ts +++ b/apps/remix-ide-e2e/src/tests/fileManager_api.test.ts @@ -42,6 +42,25 @@ module.exports = { }) }, + 'Should execute `writeMultipleFiles` api from file manager external api #group1': function (browser: NightwatchBrowser) { + browser + .addFile('writeMultipleFiles.js', { content: executeWriteMultipleFiles }) + .executeScriptInTerminal('remix.exeCurrent()') + .pause(2000) + .openFile('contracts/new_contract_1.sol') + .getEditorValue((content) => { + browser.assert.ok(content.indexOf('pragma solidity ^0.6.0') !== -1, 'content does not contain "pragma solidity ^0.6.0"') + }) + .openFile('new_contract_2.sol') + .getEditorValue((content) => { + browser.assert.ok(content.indexOf('pragma solidity ^0.8.0') !== -1, 'content does not contain "pragma solidity ^0.8.0"') + }) + .openFile('testing.txt') + .getEditorValue((content) => { + browser.assert.ok(content.indexOf('test') !== -1, 'content does not contain "test"') + }) + }, + 'Should execute `readFile` api from file manager external api #group2': function (browser: NightwatchBrowser) { browser .addFile('writeFile.js', { content: executeWriteFile }) @@ -143,6 +162,14 @@ const executeWriteFile = ` run() ` +const executeWriteMultipleFiles = ` + const run = async () => { + await remix.call('fileManager', 'writeMultipleFiles', ['contracts/new_contract_1.sol', 'new_contract_2.sol', 'testing.txt'], ['pragma solidity ^0.6.0', 'pragma solidity ^0.8.0', 'test'], '/') + } + + run() +` + const executeReadFile = ` const run = async () => { const result = await remix.call('fileManager', 'readFile', 'new_contract.sol') @@ -204,4 +231,4 @@ const executeRemoveOnFolder = `(async () => { } catch (e) { console.log(e.message) } -})()` +})()` \ No newline at end of file diff --git a/apps/remix-ide/src/app/files/fileManager.ts b/apps/remix-ide/src/app/files/fileManager.ts index 00ecb3b4e06..cb4d5505afb 100644 --- a/apps/remix-ide/src/app/files/fileManager.ts +++ b/apps/remix-ide/src/app/files/fileManager.ts @@ -225,23 +225,25 @@ class FileManager extends Plugin { * @param {string} folderPath base folder path * @returns {void} */ - async writeMultipleFiles(filePaths, fileData, folderPath) { + async writeMultipleFiles(filePaths: string[], fileData: string[], folderPath: string) { + if (this.currentRequest) { + const canCall = await this.askUserPermission(`writeFile`, `will write multiple files to ${folderPath}...`) + const required = this.appManager.isRequired(this.currentRequest.from) + if (canCall && !required) { + this.call('notification', 'toast', fileChangedToastMsg(this.currentRequest.from, folderPath)) + } + } try { - let alert = true for (let i = 0; i < filePaths.length; i++) { const installPath = folderPath + "/" + filePaths[i] let path = this.normalize(installPath) path = this.limitPluginScope(path) - if (await this.exists(path)) { - await this._handleIsFile(path, `Cannot write file ${path}`) - await this.setMultipleFileContent(path, fileData[i], folderPath, alert) - } else { - await this.setMultipleFileContent(path, fileData[i], folderPath, alert) + if (!await this.exists(path)) { + await this._setFileInternal(path, fileData[i]) this.emit('fileAdded', path) } - alert = false } } catch (e) { throw new Error(e) @@ -603,18 +605,6 @@ class FileManager extends Plugin { return await this._setFileInternal(path, content) } - async setMultipleFileContent(path, content, folderPath, alert) { - if (this.currentRequest) { - const canCall = await this.askUserPermission(`writeFile`, `modifying ${folderPath} ...`) - const required = this.appManager.isRequired(this.currentRequest.from) - if (canCall && !required && alert) { - // inform the user about modification after permission is granted and even if permission was saved before - this.call('notification', 'toast', fileChangedToastMsg(this.currentRequest.from, folderPath)) - } - } - return await this._setFileInternal(path, content) - } - _setFileInternal(path, content) { const provider = this.fileProviderOf(path) if (!provider) throw createError({ code: 'ENOENT', message: `${path} not available` })