diff --git a/apps/remix-ide/src/app/panels/tab-proxy.js b/apps/remix-ide/src/app/panels/tab-proxy.js index dc571258e4..6af15ad7c3 100644 --- a/apps/remix-ide/src/app/panels/tab-proxy.js +++ b/apps/remix-ide/src/app/panels/tab-proxy.js @@ -194,7 +194,7 @@ export class TabProxy extends Plugin { } this._view.filetabs.addTab({ - id: name, + id: name.split(' ').join(''), title, icon, tooltip: name 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 8efcd45f6d..ffcabbf199 100644 --- a/libs/remix-ui/file-explorer/src/lib/file-explorer.tsx +++ b/libs/remix-ui/file-explorer/src/lib/file-explorer.tsx @@ -1,9 +1,10 @@ import React, { useEffect, useState, useRef } from 'react' // eslint-disable-line -import { TreeView, TreeViewItem } from '@remix-ui/tree-view' // eslint-disable-line import { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd' // eslint-disable-line +import { TreeView, TreeViewItem } from '@remix-ui/tree-view' // eslint-disable-line +import { ModalDialog } from '@remix-ui/modal-dialog' // eslint-disable-line +import { Toaster } from '@remix-ui/toaster' // eslint-disable-line import { FileExplorerMenu } from './file-explorer-menu' // eslint-disable-line import { FileExplorerContextMenu } from './file-explorer-context-menu' // eslint-disable-line -import { ModalDialog } from '@remix-ui/modal-dialog' // eslint-disable-line import { FileExplorerProps, File } from './types' import * as helper from '../../../../../apps/remix-ide/src/lib/helper' @@ -49,7 +50,8 @@ export const FileExplorer = (props: FileExplorerProps) => { fn: null }, handleHide: null - } + }, + toasterMsg: '' }) const editRef = useRef(null) @@ -83,6 +85,10 @@ export const FileExplorer = (props: FileExplorerProps) => { setState(prevState => { return { ...prevState, fileManager, accessToken, files, actions } }) + + if (props.filesProvider) { + props.filesProvider.event.register('fileAdded', fileAdded) + } })() }, []) @@ -166,7 +172,7 @@ export const FileExplorer = (props: FileExplorerProps) => { } } - const createNewFile = (parentFolder: string, newFilePath: string) => { + const createNewFile = (newFilePath: string) => { const fileManager = state.fileManager helper.createNonClashingName(newFilePath, filesProvider, async (error, newName) => { @@ -179,20 +185,17 @@ export const FileExplorer = (props: FileExplorerProps) => { const createFile = await fileManager.writeFile(newName, '') if (!createFile) { - // tooltip('Failed to create file ' + newName) - } else { - addFile(parentFolder, newName) - await fileManager.open(newName) + setState(prevState => { + return { ...prevState, toasterMsg: 'Failed to create file ' + newName } + }) } } }) - // }, null, true) } const createNewFolder = async (parentFolder: string, newFolderPath: string) => { const fileManager = state.fileManager const dirName = newFolderPath + '/' - // if (error) return tooltip('Unexpected error while creating folder: ' + error) const exists = fileManager.exists(dirName) if (exists) return @@ -200,13 +203,18 @@ export const FileExplorer = (props: FileExplorerProps) => { await fileManager.mkdir(dirName) addFolder(parentFolder, newFolderPath) } catch (e) { - // tooltip('Failed to create file ' + newName) + setState(prevState => { + return { ...prevState, toasterMsg: 'Failed to create folder: ' + newFolderPath } + }) } } const deletePath = async (path: string) => { - // if (self.files.isReadOnly(key)) { return tooltip('cannot delete file. ' + self.files.type + ' is a read only explorer') } - if (filesProvider.isReadOnly(path)) return + if (filesProvider.isReadOnly(path)) { + return setState(prevState => { + return { ...prevState, toasterMsg: 'cannot delete file. ' + name + ' is a read only explorer' } + }) + } const isDir = state.fileManager.isDirectory(path) modal('Delete file', `Are you sure you want to delete ${path} ${isDir ? 'folder' : 'file'}?`, { @@ -222,7 +230,9 @@ export const FileExplorer = (props: FileExplorerProps) => { return { ...prevState, files: updatedFiles } }) } catch (e) { - // tooltip(`Failed to remove file ${key}.`) + setState(prevState => { + return { ...prevState, toasterMsg: `Failed to remove file ${path}.` } + }) } } }, { @@ -421,49 +431,12 @@ export const FileExplorer = (props: FileExplorerProps) => { // // modalDialogCustom.alert(error) // }) - // props.filesProvider.event.register('fileAdded', async (filePath: string) => { - // const pathArr = filePath.split('/') - // const hasChild = pathArr.length > 2 - - // if (hasChild) { - // const expandPath = pathArr.map((path, index) => { - // return [...pathArr.slice(0, index)].join('/') - // }).filter(path => path && (path !== name)) - - // if (state.files.findIndex(item => item.path === expandPath[0]) === -1) { - // const dir = buildTree(expandPath) - // let files = [dir, ...state.files] - - // await Promise.all(expandPath.map(async path => { - // files = await resolveDirectory(path, files) - // })) - // setState(prevState => { - // return { ...prevState, files, expandPath: [...state.expandPath, ...expandPath] } - // }) - // } else { - // console.log('called here again') - // console.log('expandPath[expandPath.length - 1]: ', expandPath[expandPath.length - 1]) - // if (state.expandPath.findIndex(path => path === expandPath[expandPath.length - 1]) !== -1) return - // const dir = state.files.find(item => item.path === expandPath[0]) - // let files = [{ - // ...dir, - // child: [...(await fetchDirectoryContent(dir.path))] - // }, ...state.files.filter(item => item.path !== expandPath[0])] - // console.log('files: ', files) + const fileAdded = async (filePath: string) => { + const parentFolder = extractParentFromKey(filePath) - // await Promise.all(expandPath.map(async path => { - // files = await resolveDirectory(path, files) - // })) - // const updatedPath = [state.expandPath.filter(key => key && (typeof key === 'string') && !key.startsWith(expandPath[0]))] - - // setState(prevState => { - // return { ...prevState, files, expandPath: [...updatedPath, ...expandPath] } - // }) - // } - // } else { - // addFile(pathArr[0], filePath) - // } - // }) + addFile(parentFolder, filePath) + await state.fileManager.open(filePath) + } // props.filesProvider.event.register('folderAdded', async (folderpath: string) => { // const pathArr = folderpath.split('/') @@ -620,7 +593,7 @@ export const FileExplorer = (props: FileExplorerProps) => { }, null) } else { if (state.focusEdit.isNew) { - state.focusEdit.type === 'file' ? createNewFile(parentFolder, parentFolder + '/' + content) : createNewFolder(parentFolder, parentFolder + '/' + content) + state.focusEdit.type === 'file' ? createNewFile(parentFolder + '/' + content) : createNewFolder(parentFolder, parentFolder + '/' + content) const files = removePath(state.focusEdit.element, state.files) const updatedFiles = files.filter(file => file) @@ -824,6 +797,7 @@ export const FileExplorer = (props: FileExplorerProps) => { cancel={ state.modalOptions.cancel } handleHide={ handleHideModal } /> + ) } diff --git a/libs/remix-ui/toaster/src/lib/toaster.tsx b/libs/remix-ui/toaster/src/lib/toaster.tsx index 6d3039dbc4..b7573f72cc 100644 --- a/libs/remix-ui/toaster/src/lib/toaster.tsx +++ b/libs/remix-ui/toaster/src/lib/toaster.tsx @@ -89,7 +89,15 @@ export const Toaster = (props: ToasterProps) => { return ( <> - {/* */} + {} + }} + hide={!state.showModal} + handleHide={hideFullMessage} + /> { !state.hide &&