diff --git a/apps/remix-ide/src/app/files/fileManager.js b/apps/remix-ide/src/app/files/fileManager.js
index af188cd1bf..2736353a15 100644
--- a/apps/remix-ide/src/app/files/fileManager.js
+++ b/apps/remix-ide/src/app/files/fileManager.js
@@ -271,6 +271,7 @@ class FileManager extends Plugin {
this._deps.browserExplorer.event.register('fileRenamed', (oldName, newName, isFolder) => { this.fileRenamedEvent(oldName, newName, isFolder) })
this._deps.localhostExplorer.event.register('fileRenamed', (oldName, newName, isFolder) => { this.fileRenamedEvent(oldName, newName, isFolder) })
this._deps.browserExplorer.event.register('fileRemoved', (path) => { this.fileRemovedEvent(path) })
+ this._deps.browserExplorer.event.register('fileAdded', (path) => { this.fileAddedEvent(path) })
this._deps.localhostExplorer.event.register('fileRemoved', (path) => { this.fileRemovedEvent(path) })
this._deps.localhostExplorer.event.register('errored', (event) => { this.removeTabsOf(this._deps.localhostExplorer) })
this._deps.localhostExplorer.event.register('closed', (event) => { this.removeTabsOf(this._deps.localhostExplorer) })
@@ -281,9 +282,12 @@ class FileManager extends Plugin {
this.switchFile = this.open
}
+ fileAddedEvent (path) {
+ this.emit('fileAdded', path)
+ }
+
fileChangedEvent (path) {
- // @todo(#2386) use only for discard changes function.
- // this.syncEditor(path)
+ this.emit('currentFileChanged', path)
}
fileRenamedEvent (oldName, newName, isFolder) {
diff --git a/apps/remix-ide/src/app/panels/file-panel.js b/apps/remix-ide/src/app/panels/file-panel.js
index ca5e94417e..d51fc0d97f 100644
--- a/apps/remix-ide/src/app/panels/file-panel.js
+++ b/apps/remix-ide/src/app/panels/file-panel.js
@@ -34,7 +34,7 @@ var canUpload = window.File || window.FileReader || window.FileList || window.Bl
const profile = {
name: 'fileExplorers',
displayName: 'File explorers',
- methods: [],
+ methods: ['createNewFile', 'uploadFile'],
events: [],
icon: 'assets/img/fileManager.webp',
description: ' - ',
@@ -67,6 +67,8 @@ module.exports = class Filepanel extends ViewPlugin {
}
this.reset = false
this.registeredMenuItems = []
+ this.displayNewFile = false
+ this.uploadFileEvent = null
this.el = yo`
@@ -99,6 +101,26 @@ module.exports = class Filepanel extends ViewPlugin {
this.renderComponent()
}
+ createNewFile () {
+ this.displayNewFile = true
+ this.renderComponent()
+ }
+
+ resetNewFile () {
+ this.displayNewFile = false
+ this.renderComponent()
+ }
+
+ uploadFile (target) {
+ this.uploadFileEvent = target
+ this.renderComponent()
+ }
+
+ resetUploadFile () {
+ this.uploadFileEvent = null
+ this.renderComponent()
+ }
+
render () {
return this.el
}
@@ -132,6 +154,8 @@ module.exports = class Filepanel extends ViewPlugin {
plugin={this}
focusRoot={this.reset}
contextMenuItems={this.registeredMenuItems}
+ displayInput={this.displayNewFile}
+ externalUploads={this.uploadFileEvent}
/>
diff --git a/apps/remix-ide/src/app/tabs/staticanalysis/staticAnalysisView.js b/apps/remix-ide/src/app/tabs/staticanalysis/staticAnalysisView.js
index f761a49116..51804ae985 100644
--- a/apps/remix-ide/src/app/tabs/staticanalysis/staticAnalysisView.js
+++ b/apps/remix-ide/src/app/tabs/staticanalysis/staticAnalysisView.js
@@ -211,6 +211,9 @@ staticAnalysisView.prototype.checkModule = function (event) {
}
}
staticAnalysisView.prototype.correctRunBtnDisabled = function () {
+ if (!this.view) {
+ return
+ }
const selected = this.view.querySelectorAll('[name="staticanalysismodule"]:checked')
if (this.lastCompilationResult && selected.length !== 0) {
this.runBtn.removeAttribute('disabled')
diff --git a/apps/remix-ide/src/app/ui/landing-page/landing-page.js b/apps/remix-ide/src/app/ui/landing-page/landing-page.js
index 3c4202f3fe..2553704a91 100644
--- a/apps/remix-ide/src/app/ui/landing-page/landing-page.js
+++ b/apps/remix-ide/src/app/ui/landing-page/landing-page.js
@@ -281,9 +281,13 @@ export class LandingPage extends ViewPlugin {
}
const createNewFile = () => {
- const fileExplorer = globalRegistry.get('fileexplorer/browser').api
- fileExplorer.createNewFile()
+ this.call('fileExplorers', 'createNewFile')
}
+
+ const uploadFile = (target) => {
+ this.call('fileExplorers', 'uploadFile', target)
+ }
+
const connectToLocalhost = () => {
this.appManager.activatePlugin('remixd')
}
@@ -382,8 +386,7 @@ export class LandingPage extends ViewPlugin {
diff --git a/libs/remix-ui/file-explorer/src/lib/file-explorer-menu.tsx b/libs/remix-ui/file-explorer/src/lib/file-explorer-menu.tsx
index c5b4e944fb..19bb68b89f 100644
--- a/libs/remix-ui/file-explorer/src/lib/file-explorer-menu.tsx
+++ b/libs/remix-ui/file-explorer/src/lib/file-explorer-menu.tsx
@@ -60,6 +60,7 @@ export const FileExplorerMenu = (props: FileExplorerMenuProps) => {
{
e.stopPropagation()
props.uploadFile(e.target)
+ e.target.value = null
}}
multiple />
diff --git a/libs/remix-ui/file-explorer/src/lib/file-explorer.tsx b/libs/remix-ui/file-explorer/src/lib/file-explorer.tsx
index ba0b47ceb6..5a07fe5bde 100644
--- a/libs/remix-ui/file-explorer/src/lib/file-explorer.tsx
+++ b/libs/remix-ui/file-explorer/src/lib/file-explorer.tsx
@@ -16,7 +16,7 @@ import './css/file-explorer.css'
const queryParams = new QueryParams()
export const FileExplorer = (props: FileExplorerProps) => {
- const { filesProvider, name, registry, plugin, focusRoot, contextMenuItems } = props
+ const { filesProvider, name, registry, plugin, focusRoot, contextMenuItems, displayInput, externalUploads } = props
const [state, setState] = useState({
focusElement: [{
key: name,
@@ -182,6 +182,20 @@ export const FileExplorer = (props: FileExplorerProps) => {
}
}, [contextMenuItems])
+ useEffect(() => {
+ if (displayInput) {
+ handleNewFileInput()
+ plugin.resetNewFile()
+ }
+ }, [displayInput])
+
+ useEffect(() => {
+ if (externalUploads) {
+ uploadFile(externalUploads)
+ plugin.resetUploadFile()
+ }
+ }, [externalUploads])
+
const resolveDirectory = async (folderPath, dir: File[], isChild = false): Promise => {
if (!isChild && (state.focusEdit.element === 'browser/blank') && state.focusEdit.isNew && (dir.findIndex(({ path }) => path === 'browser/blank') === -1)) {
dir = state.focusEdit.type === 'file' ? [...dir, {
@@ -454,8 +468,6 @@ export const FileExplorer = (props: FileExplorerProps) => {
// pick that up via the 'fileAdded' event from the files module.
[...target.files].forEach((file) => {
- const files = filesProvider
-
const loadFile = (name: string): void => {
const fileReader = new FileReader()
@@ -467,7 +479,7 @@ export const FileExplorer = (props: FileExplorerProps) => {
}, null)
return
}
- const success = await files.set(name, event.target.result)
+ const success = await filesProvider.set(name, event.target.result)
if (!success) {
modal('File Upload Failed', 'Failed to create file ' + name, {
@@ -478,9 +490,9 @@ export const FileExplorer = (props: FileExplorerProps) => {
}
fileReader.readAsText(file)
}
- const name = files.type + '/' + file.name
+ const name = filesProvider.type + '/' + file.name
- files.exists(name, (error, exist) => {
+ filesProvider.exists(name, (error, exist) => {
if (error) console.log(error)
if (!exist) {
loadFile(name)
diff --git a/libs/remix-ui/file-explorer/src/lib/types/index.ts b/libs/remix-ui/file-explorer/src/lib/types/index.ts
index caa203ab7b..1396d1ec1e 100644
--- a/libs/remix-ui/file-explorer/src/lib/types/index.ts
+++ b/libs/remix-ui/file-explorer/src/lib/types/index.ts
@@ -6,7 +6,9 @@ export interface FileExplorerProps {
menuItems?: string[],
plugin: any,
focusRoot: boolean,
- contextMenuItems: { name: string, type: string[], path: string[], extension: string[], pattern: string[] }[]
+ contextMenuItems: { name: string, type: string[], path: string[], extension: string[], pattern: string[] }[],
+ displayInput?: boolean,
+ externalUploads?: EventTarget & HTMLInputElement
}
export interface File {