Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
B
baas-ide
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
guxukai
baas-ide
Commits
daf50154
Commit
daf50154
authored
Sep 10, 2021
by
ioedeveloper
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Switch to workspaces
parent
38b9bbf5
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
276 additions
and
44 deletions
+276
-44
toaster.tsx
libs/remix-ui/toaster/src/lib/toaster.tsx
+3
-1
workspace.ts
libs/remix-ui/workspace/src/lib/actions/workspace.ts
+102
-0
index.ts
libs/remix-ui/workspace/src/lib/contexts/index.ts
+5
-1
FileSystemProvider.tsx
...mix-ui/workspace/src/lib/providers/FileSystemProvider.tsx
+45
-2
workspace.ts
libs/remix-ui/workspace/src/lib/reducers/workspace.ts
+112
-3
remix-ui-workspace.tsx
libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx
+9
-36
index.ts
libs/remix-ui/workspace/src/lib/types/index.ts
+0
-1
No files found.
libs/remix-ui/toaster/src/lib/toaster.tsx
View file @
daf50154
...
@@ -6,7 +6,8 @@ import './toaster.css'
...
@@ -6,7 +6,8 @@ import './toaster.css'
/* eslint-disable-next-line */
/* eslint-disable-next-line */
export
interface
ToasterProps
{
export
interface
ToasterProps
{
message
:
string
message
:
string
timeOut
?:
number
timeOut
?:
number
,
handleHide
?:
()
=>
void
}
}
export
const
Toaster
=
(
props
:
ToasterProps
)
=>
{
export
const
Toaster
=
(
props
:
ToasterProps
)
=>
{
...
@@ -59,6 +60,7 @@ export const Toaster = (props: ToasterProps) => {
...
@@ -59,6 +60,7 @@ export const Toaster = (props: ToasterProps) => {
if
(
state
.
timeOutId
)
{
if
(
state
.
timeOutId
)
{
clearTimeout
(
state
.
timeOutId
)
clearTimeout
(
state
.
timeOutId
)
}
}
props
.
handleHide
&&
props
.
handleHide
()
setState
(
prevState
=>
{
setState
(
prevState
=>
{
return
{
...
prevState
,
message
:
''
,
hide
:
true
,
hiding
:
false
,
timeOutId
:
null
,
showModal
:
false
}
return
{
...
prevState
,
message
:
''
,
hide
:
true
,
hiding
:
false
,
timeOutId
:
null
,
showModal
:
false
}
})
})
...
...
libs/remix-ui/workspace/src/lib/actions/workspace.ts
View file @
daf50154
...
@@ -7,6 +7,8 @@ const QueryParams = require('../../../../../../apps/remix-ide/src/lib/query-para
...
@@ -7,6 +7,8 @@ const QueryParams = require('../../../../../../apps/remix-ide/src/lib/query-para
const
examples
=
require
(
'../../../../../../apps/remix-ide/src/app/editor/examples'
)
const
examples
=
require
(
'../../../../../../apps/remix-ide/src/app/editor/examples'
)
const
queuedEvents
=
[]
const
queuedEvents
=
[]
const
pendingEvents
=
{}
const
pendingEvents
=
{}
const
LOCALHOST
=
' - connect to localhost - '
const
NO_WORKSPACE
=
' - none - '
let
plugin
,
dispatch
:
React
.
Dispatch
<
any
>
let
plugin
,
dispatch
:
React
.
Dispatch
<
any
>
...
@@ -121,6 +123,48 @@ const setReadOnlyMode = (mode: boolean) => {
...
@@ -121,6 +123,48 @@ const setReadOnlyMode = (mode: boolean) => {
}
}
}
}
const
createWorkspaceError
=
(
error
:
any
)
=>
{
return
{
type
:
'CREATE_WORKSPACE_ERROR'
,
payload
:
error
}
}
const
createWorkspaceRequest
=
(
promise
:
Promise
<
any
>
)
=>
{
return
{
type
:
'CREATE_WORKSPACE_REQUEST'
,
payload
:
promise
}
}
const
createWorkspaceSuccess
=
(
workspaceName
:
string
)
=>
{
return
{
type
:
'CREATE_WORKSPACE_SUCCESS'
,
payload
:
workspaceName
}
}
const
fetchWorkspaceDirectoryError
=
(
error
:
any
)
=>
{
return
{
type
:
'FETCH_WORKSPACE_DIRECTORY_ERROR'
,
payload
:
error
}
}
const
fetchWorkspaceDirectoryRequest
=
(
promise
:
Promise
<
any
>
)
=>
{
return
{
type
:
'FETCH_WORKSPACE_DIRECTORY_REQUEST'
,
payload
:
promise
}
}
const
fetchWorkspaceDirectorySuccess
=
(
path
:
string
,
fileTree
)
=>
{
return
{
type
:
'FETCH_WORKSPACE_DIRECTORY_SUCCESS'
,
payload
:
{
path
,
fileTree
}
}
}
const
createWorkspaceTemplate
=
async
(
workspaceName
:
string
,
setDefaults
=
true
,
template
:
'gist-template'
|
'code-template'
|
'default-template'
=
'default-template'
)
=>
{
const
createWorkspaceTemplate
=
async
(
workspaceName
:
string
,
setDefaults
=
true
,
template
:
'gist-template'
|
'code-template'
|
'default-template'
=
'default-template'
)
=>
{
if
(
!
workspaceName
)
throw
new
Error
(
'workspace name cannot be empty'
)
if
(
!
workspaceName
)
throw
new
Error
(
'workspace name cannot be empty'
)
if
(
checkSpecialChars
(
workspaceName
)
||
checkSlash
(
workspaceName
))
throw
new
Error
(
'special characters are not allowed'
)
if
(
checkSpecialChars
(
workspaceName
)
||
checkSlash
(
workspaceName
))
throw
new
Error
(
'special characters are not allowed'
)
...
@@ -244,6 +288,7 @@ const listenOnEvents = (provider) => {
...
@@ -244,6 +288,7 @@ const listenOnEvents = (provider) => {
})
})
provider
.
event
.
on
(
'folderAdded'
,
async
(
folderPath
:
string
)
=>
{
provider
.
event
.
on
(
'folderAdded'
,
async
(
folderPath
:
string
)
=>
{
if
(
folderPath
.
indexOf
(
'/.workspaces'
)
===
0
)
return
await
executeEvent
(
'folderAdded'
,
folderPath
)
await
executeEvent
(
'folderAdded'
,
folderPath
)
})
})
...
@@ -322,6 +367,7 @@ export const initWorkspace = (filePanelPlugin) => async (reducerDispatch: React.
...
@@ -322,6 +367,7 @@ export const initWorkspace = (filePanelPlugin) => async (reducerDispatch: React.
const
params
=
queryParams
.
get
()
const
params
=
queryParams
.
get
()
const
workspaces
=
await
getWorkspaces
()
||
[]
const
workspaces
=
await
getWorkspaces
()
||
[]
dispatch
(
setWorkspaces
(
workspaces
))
if
(
params
.
gist
)
{
if
(
params
.
gist
)
{
await
createWorkspaceTemplate
(
'gist-sample'
,
true
,
'gist-template'
)
await
createWorkspaceTemplate
(
'gist-sample'
,
true
,
'gist-template'
)
dispatch
(
setCurrentWorkspace
(
'gist-sample'
))
dispatch
(
setCurrentWorkspace
(
'gist-sample'
))
...
@@ -405,6 +451,62 @@ export const removeInputField = (path: string) => (dispatch: React.Dispatch<any>
...
@@ -405,6 +451,62 @@ export const removeInputField = (path: string) => (dispatch: React.Dispatch<any>
return
promise
return
promise
}
}
export
const
createWorkspace
=
(
workspaceName
:
string
)
=>
(
dispatch
:
React
.
Dispatch
<
any
>
)
=>
{
const
promise
=
createWorkspaceTemplate
(
workspaceName
,
true
,
'default-template'
)
dispatch
(
createWorkspaceRequest
(
promise
))
promise
.
then
(
async
()
=>
{
await
plugin
.
fileManager
.
closeAllFiles
()
dispatch
(
createWorkspaceSuccess
(
workspaceName
))
}).
catch
((
error
)
=>
{
dispatch
(
createWorkspaceError
({
error
}))
})
return
promise
}
export
const
fetchWorkspaceDirectory
=
(
path
:
string
)
=>
(
dispatch
:
React
.
Dispatch
<
any
>
)
=>
{
const
provider
=
plugin
.
fileManager
.
currentFileProvider
()
const
promise
=
new
Promise
((
resolve
)
=>
{
provider
.
resolveDirectory
(
path
,
(
error
,
fileTree
)
=>
{
if
(
error
)
console
.
error
(
error
)
resolve
(
fileTree
)
})
})
dispatch
(
fetchWorkspaceDirectoryRequest
(
promise
))
promise
.
then
((
fileTree
)
=>
{
dispatch
(
fetchWorkspaceDirectorySuccess
(
path
,
fileTree
))
}).
catch
((
error
)
=>
{
dispatch
(
fetchWorkspaceDirectoryError
({
error
}))
})
return
promise
}
export
const
switchToWorkspace
=
(
name
:
string
)
=>
async
(
dispatch
:
React
.
Dispatch
<
any
>
)
=>
{
await
plugin
.
fileManager
.
closeAllFiles
()
if
(
name
===
LOCALHOST
)
{
plugin
.
fileProviders
.
workspace
.
clearWorkspace
()
const
isActive
=
await
plugin
.
call
(
'manager'
,
'isActive'
,
'remixd'
)
if
(
!
isActive
)
plugin
.
call
(
'manager'
,
'activatePlugin'
,
'remixd'
)
plugin
.
fileManager
.
setMode
(
'localhost'
)
dispatch
(
setMode
(
'localhost'
))
plugin
.
emit
(
'setWorkspace'
,
{
name
:
LOCALHOST
,
isLocalhost
:
true
})
}
else
if
(
name
===
NO_WORKSPACE
)
{
plugin
.
fileProviders
.
workspace
.
clearWorkspace
()
}
else
{
const
isActive
=
await
plugin
.
call
(
'manager'
,
'isActive'
,
'remixd'
)
if
(
isActive
)
plugin
.
call
(
'manager'
,
'deactivatePlugin'
,
'remixd'
)
await
plugin
.
fileProviders
.
workspace
.
setWorkspace
(
name
)
plugin
.
fileManager
.
setMode
(
'browser'
)
dispatch
(
setMode
(
'browser'
))
dispatch
(
setCurrentWorkspace
(
name
))
plugin
.
emit
(
'setWorkspace'
,
{
name
,
isLocalhost
:
false
})
}
}
const
fileAdded
=
async
(
filePath
:
string
)
=>
{
const
fileAdded
=
async
(
filePath
:
string
)
=>
{
await
dispatch
(
fileAddedSuccess
(
filePath
))
await
dispatch
(
fileAddedSuccess
(
filePath
))
if
(
filePath
.
includes
(
'_test.sol'
))
{
if
(
filePath
.
includes
(
'_test.sol'
))
{
...
...
libs/remix-ui/workspace/src/lib/contexts/index.ts
View file @
daf50154
...
@@ -7,5 +7,9 @@ export const FileSystemContext = createContext<{
...
@@ -7,5 +7,9 @@ export const FileSystemContext = createContext<{
dispatchInitWorkspace
:()
=>
Promise
<
void
>
,
dispatchInitWorkspace
:()
=>
Promise
<
void
>
,
dispatchFetchDirectory
:(
path
:
string
)
=>
Promise
<
void
>
,
dispatchFetchDirectory
:(
path
:
string
)
=>
Promise
<
void
>
,
dispatchAddInputField
:(
path
:
string
,
type
:
'file'
|
'folder'
)
=>
Promise
<
void
>
,
dispatchAddInputField
:(
path
:
string
,
type
:
'file'
|
'folder'
)
=>
Promise
<
void
>
,
dispatchRemoveInputField
:(
path
:
string
)
=>
Promise
<
void
>
dispatchRemoveInputField
:(
path
:
string
)
=>
Promise
<
void
>
,
dispatchCreateWorkspace
:
(
workspaceName
:
string
)
=>
Promise
<
void
>
,
toast
:
(
toasterMsg
:
string
)
=>
void
,
dispatchFetchWorkspaceDirectory
:
(
path
:
string
)
=>
void
,
dispatchSwitchToWorkspace
:
(
name
:
string
)
=>
void
}
>
(
null
)
}
>
(
null
)
libs/remix-ui/workspace/src/lib/providers/FileSystemProvider.tsx
View file @
daf50154
// eslint-disable-next-line @typescript-eslint/no-unused-vars
// eslint-disable-next-line @typescript-eslint/no-unused-vars
import
React
,
{
useReducer
,
useState
,
useEffect
}
from
'react'
import
React
,
{
useReducer
,
useState
,
useEffect
}
from
'react'
import
{
ModalDialog
}
from
'@remix-ui/modal-dialog'
// eslint-disable-line
import
{
ModalDialog
}
from
'@remix-ui/modal-dialog'
// eslint-disable-line
import
{
Toaster
}
from
'@remix-ui/toaster'
// eslint-disable-line
// eslint-disable-next-line @typescript-eslint/no-unused-vars
// eslint-disable-next-line @typescript-eslint/no-unused-vars
import
{
FileSystemContext
}
from
'../contexts'
import
{
FileSystemContext
}
from
'../contexts'
import
{
browserReducer
,
browserInitialState
}
from
'../reducers/workspace'
import
{
browserReducer
,
browserInitialState
}
from
'../reducers/workspace'
import
{
initWorkspace
,
fetchDirectory
,
addInputField
,
removeInputField
}
from
'../actions/workspace'
import
{
initWorkspace
,
fetchDirectory
,
addInputField
,
removeInputField
,
createWorkspace
,
fetchWorkspaceDirectory
,
switchToWorkspace
}
from
'../actions/workspace'
import
{
Modal
,
WorkspaceProps
}
from
'../types'
import
{
Modal
,
WorkspaceProps
}
from
'../types'
// eslint-disable-next-line @typescript-eslint/no-unused-vars
// eslint-disable-next-line @typescript-eslint/no-unused-vars
import
{
Workspace
}
from
'../remix-ui-workspace'
import
{
Workspace
}
from
'../remix-ui-workspace'
...
@@ -22,6 +23,8 @@ export const FileSystemProvider = (props: WorkspaceProps) => {
...
@@ -22,6 +23,8 @@ export const FileSystemProvider = (props: WorkspaceProps) => {
cancelFn
:
()
=>
{}
cancelFn
:
()
=>
{}
})
})
const
[
modals
,
setModals
]
=
useState
<
Modal
[]
>
([])
const
[
modals
,
setModals
]
=
useState
<
Modal
[]
>
([])
const
[
focusToaster
,
setFocusToaster
]
=
useState
<
string
>
(
''
)
const
[
toasters
,
setToasters
]
=
useState
<
string
[]
>
([])
const
dispatchInitWorkspace
=
async
()
=>
{
const
dispatchInitWorkspace
=
async
()
=>
{
await
initWorkspace
(
plugin
)(
fsDispatch
)
await
initWorkspace
(
plugin
)(
fsDispatch
)
...
@@ -39,6 +42,18 @@ export const FileSystemProvider = (props: WorkspaceProps) => {
...
@@ -39,6 +42,18 @@ export const FileSystemProvider = (props: WorkspaceProps) => {
await
removeInputField
(
path
)(
fsDispatch
)
await
removeInputField
(
path
)(
fsDispatch
)
}
}
const
dispatchCreateWorkspace
=
async
(
workspaceName
:
string
)
=>
{
await
createWorkspace
(
workspaceName
)(
fsDispatch
)
}
const
dispatchFetchWorkspaceDirectory
=
async
(
path
:
string
)
=>
{
await
fetchWorkspaceDirectory
(
path
)(
fsDispatch
)
}
const
dispatchSwitchToWorkspace
=
async
(
name
:
string
)
=>
{
await
switchToWorkspace
(
name
)(
fsDispatch
)
}
useEffect
(()
=>
{
useEffect
(()
=>
{
if
(
modals
.
length
>
0
)
{
if
(
modals
.
length
>
0
)
{
setFocusModal
(()
=>
{
setFocusModal
(()
=>
{
...
@@ -61,6 +76,18 @@ export const FileSystemProvider = (props: WorkspaceProps) => {
...
@@ -61,6 +76,18 @@ export const FileSystemProvider = (props: WorkspaceProps) => {
},
[
modals
])
},
[
modals
])
useEffect
(()
=>
{
useEffect
(()
=>
{
if
(
toasters
.
length
>
0
)
{
setFocusToaster
(()
=>
{
return
toasters
[
0
]
})
const
toasterList
=
toasters
.
slice
()
toasterList
.
shift
()
setToasters
(
toasterList
)
}
},
[
toasters
])
useEffect
(()
=>
{
if
(
fs
.
notification
.
title
)
{
if
(
fs
.
notification
.
title
)
{
modal
(
fs
.
notification
.
title
,
fs
.
notification
.
message
,
fs
.
notification
.
labelOk
,
fs
.
notification
.
actionOk
,
fs
.
notification
.
labelCancel
,
fs
.
notification
.
actionCancel
)
modal
(
fs
.
notification
.
title
,
fs
.
notification
.
message
,
fs
.
notification
.
labelOk
,
fs
.
notification
.
actionOk
,
fs
.
notification
.
labelCancel
,
fs
.
notification
.
actionCancel
)
}
}
...
@@ -79,18 +106,34 @@ export const FileSystemProvider = (props: WorkspaceProps) => {
...
@@ -79,18 +106,34 @@ export const FileSystemProvider = (props: WorkspaceProps) => {
})
})
}
}
const
handleToaster
=
()
=>
{
setFocusToaster
(
''
)
}
const
toast
=
(
toasterMsg
:
string
)
=>
{
setToasters
(
messages
=>
{
messages
.
push
(
toasterMsg
)
return
[...
messages
]
})
}
const
value
=
{
const
value
=
{
fs
,
fs
,
modal
,
modal
,
toast
,
dispatchInitWorkspace
,
dispatchInitWorkspace
,
dispatchFetchDirectory
,
dispatchFetchDirectory
,
dispatchAddInputField
,
dispatchAddInputField
,
dispatchRemoveInputField
dispatchRemoveInputField
,
dispatchCreateWorkspace
,
dispatchFetchWorkspaceDirectory
,
dispatchSwitchToWorkspace
}
}
return
(
return
(
<
FileSystemContext
.
Provider
value=
{
value
}
>
<
FileSystemContext
.
Provider
value=
{
value
}
>
<
Workspace
plugin=
{
plugin
}
/>
<
Workspace
plugin=
{
plugin
}
/>
<
ModalDialog
id=
'fileSystem'
{
...
focusModal
}
handleHide=
{
handleHideModal
}
/>
<
ModalDialog
id=
'fileSystem'
{
...
focusModal
}
handleHide=
{
handleHideModal
}
/>
<
Toaster
message=
{
focusToaster
}
handleHide=
{
handleToaster
}
/>
</
FileSystemContext
.
Provider
>
</
FileSystemContext
.
Provider
>
)
)
}
}
...
...
libs/remix-ui/workspace/src/lib/reducers/workspace.ts
View file @
daf50154
import
{
extractNameFromKey
,
File
}
from
'@remix-ui/file-explorer'
import
{
extractNameFromKey
,
File
}
from
'@remix-ui/file-explorer'
import
{
extractParentFromKey
}
from
'@remix-ui/helper'
import
*
as
_
from
'lodash'
import
*
as
_
from
'lodash'
interface
Action
{
interface
Action
{
type
:
string
type
:
string
...
@@ -159,6 +158,57 @@ export const browserReducer = (state = browserInitialState, action: Action) => {
...
@@ -159,6 +158,57 @@ export const browserReducer = (state = browserInitialState, action: Action) => {
}
}
}
}
case
'FETCH_WORKSPACE_DIRECTORY_REQUEST'
:
{
return
{
...
state
,
browser
:
{
...
state
.
browser
,
isRequesting
:
state
.
mode
===
'browser'
,
isSuccessful
:
false
,
error
:
null
},
localhost
:
{
...
state
.
localhost
,
isRequesting
:
state
.
mode
===
'localhost'
,
isSuccessful
:
false
,
error
:
null
}
}
}
case
'FETCH_WORKSPACE_DIRECTORY_SUCCESS'
:
{
const
payload
=
action
.
payload
as
{
path
:
string
,
fileTree
}
return
{
...
state
,
browser
:
{
...
state
.
browser
,
files
:
state
.
mode
===
'browser'
?
fetchWorkspaceDirectoryContent
(
state
,
payload
)
:
state
.
browser
.
files
,
isRequesting
:
false
,
isSuccessful
:
true
,
error
:
null
}
}
}
case
'FETCH_WORKSPACE_DIRECTORY_ERROR'
:
{
return
{
...
state
,
browser
:
{
...
state
.
browser
,
isRequesting
:
false
,
isSuccessful
:
false
,
error
:
state
.
mode
===
'browser'
?
action
.
payload
:
null
},
localhost
:
{
...
state
.
localhost
,
isRequesting
:
false
,
isSuccessful
:
false
,
error
:
state
.
mode
===
'localhost'
?
action
.
payload
:
null
}
}
}
case
'DISPLAY_NOTIFICATION'
:
{
case
'DISPLAY_NOTIFICATION'
:
{
const
payload
=
action
.
payload
as
{
title
:
string
,
message
:
string
,
actionOk
:
()
=>
void
,
actionCancel
:
()
=>
void
,
labelOk
:
string
,
labelCancel
:
string
}
const
payload
=
action
.
payload
as
{
title
:
string
,
message
:
string
,
actionOk
:
()
=>
void
,
actionCancel
:
()
=>
void
,
labelOk
:
string
,
labelCancel
:
string
}
...
@@ -208,12 +258,12 @@ export const browserReducer = (state = browserInitialState, action: Action) => {
...
@@ -208,12 +258,12 @@ export const browserReducer = (state = browserInitialState, action: Action) => {
browser
:
{
browser
:
{
...
state
.
browser
,
...
state
.
browser
,
files
:
state
.
mode
===
'browser'
?
fetchDirectoryContent
(
state
,
payload
)
:
state
.
browser
.
files
,
files
:
state
.
mode
===
'browser'
?
fetchDirectoryContent
(
state
,
payload
)
:
state
.
browser
.
files
,
expandPath
:
state
.
mode
===
'browser'
?
[...
new
Set
([...
state
.
browser
.
expandPath
,
payload
])]
:
state
.
browser
.
expandPath
expandPath
:
state
.
mode
===
'browser'
?
[...
new
Set
([...
state
.
browser
.
expandPath
,
payload
.
path
])]
:
state
.
browser
.
expandPath
},
},
localhost
:
{
localhost
:
{
...
state
.
localhost
,
...
state
.
localhost
,
files
:
state
.
mode
===
'localhost'
?
fetchDirectoryContent
(
state
,
payload
)
:
state
.
localhost
.
files
,
files
:
state
.
mode
===
'localhost'
?
fetchDirectoryContent
(
state
,
payload
)
:
state
.
localhost
.
files
,
expandPath
:
state
.
mode
===
'localhost'
?
[...
new
Set
([...
state
.
localhost
.
expandPath
,
payload
])]
:
state
.
localhost
.
expandPath
expandPath
:
state
.
mode
===
'localhost'
?
[...
new
Set
([...
state
.
localhost
.
expandPath
,
payload
.
path
])]
:
state
.
localhost
.
expandPath
}
}
}
}
}
}
...
@@ -305,6 +355,46 @@ export const browserReducer = (state = browserInitialState, action: Action) => {
...
@@ -305,6 +355,46 @@ export const browserReducer = (state = browserInitialState, action: Action) => {
}
}
}
}
case
'CREATE_WORKSPACE_REQUEST'
:
{
return
{
...
state
,
browser
:
{
...
state
.
browser
,
isRequesting
:
true
,
isSuccessful
:
false
,
error
:
null
}
}
}
case
'CREATE_WORKSPACE_SUCCESS'
:
{
const
payload
=
action
.
payload
as
string
return
{
...
state
,
browser
:
{
...
state
.
browser
,
currentWorkspace
:
payload
,
workspaces
:
state
.
browser
.
workspaces
.
includes
(
payload
)
?
state
.
browser
.
workspaces
:
[...
state
.
browser
.
workspaces
,
action
.
payload
],
isRequesting
:
false
,
isSuccessful
:
true
,
error
:
null
}
}
}
case
'CREATE_WORKSPACE_ERROR'
:
{
return
{
...
state
,
browser
:
{
...
state
.
browser
,
isRequesting
:
false
,
isSuccessful
:
false
,
error
:
action
.
payload
}
}
}
default
:
default
:
throw
new
Error
()
throw
new
Error
()
}
}
...
@@ -333,6 +423,7 @@ const fileRemoved = (state: BrowserState, path: string): { [x: string]: Record<s
...
@@ -333,6 +423,7 @@ const fileRemoved = (state: BrowserState, path: string): { [x: string]: Record<s
// IDEA: Modify function to remove blank input field without fetching content
// IDEA: Modify function to remove blank input field without fetching content
const
fetchDirectoryContent
=
(
state
:
BrowserState
,
payload
:
{
fileTree
,
path
:
string
,
type
?:
'file'
|
'folder'
},
deletePath
?:
string
)
=>
{
const
fetchDirectoryContent
=
(
state
:
BrowserState
,
payload
:
{
fileTree
,
path
:
string
,
type
?:
'file'
|
'folder'
},
deletePath
?:
string
)
=>
{
if
(
!
payload
.
fileTree
)
return
state
.
mode
===
'browser'
?
state
.
browser
.
files
:
state
[
state
.
mode
].
files
if
(
state
.
mode
===
'browser'
)
{
if
(
state
.
mode
===
'browser'
)
{
if
(
payload
.
path
===
state
.
browser
.
currentWorkspace
)
{
if
(
payload
.
path
===
state
.
browser
.
currentWorkspace
)
{
let
files
=
normalize
(
payload
.
fileTree
,
payload
.
path
,
payload
.
type
)
let
files
=
normalize
(
payload
.
fileTree
,
payload
.
path
,
payload
.
type
)
...
@@ -345,9 +436,13 @@ const fetchDirectoryContent = (state: BrowserState, payload: { fileTree, path: s
...
@@ -345,9 +436,13 @@ const fetchDirectoryContent = (state: BrowserState, payload: { fileTree, path: s
const
_path
=
splitPath
(
state
,
payload
.
path
)
const
_path
=
splitPath
(
state
,
payload
.
path
)
const
prevFiles
=
_
.
get
(
files
,
_path
)
const
prevFiles
=
_
.
get
(
files
,
_path
)
if
(
prevFiles
)
{
prevFiles
.
child
=
_
.
merge
(
normalize
(
payload
.
fileTree
,
payload
.
path
,
payload
.
type
),
prevFiles
.
child
)
prevFiles
.
child
=
_
.
merge
(
normalize
(
payload
.
fileTree
,
payload
.
path
,
payload
.
type
),
prevFiles
.
child
)
if
(
deletePath
)
delete
prevFiles
.
child
[
deletePath
]
if
(
deletePath
)
delete
prevFiles
.
child
[
deletePath
]
files
=
_
.
set
(
files
,
_path
,
prevFiles
)
files
=
_
.
set
(
files
,
_path
,
prevFiles
)
}
else
if
(
payload
.
fileTree
&&
payload
.
path
)
{
files
=
{
[
payload
.
path
]:
normalize
(
payload
.
fileTree
,
payload
.
path
,
payload
.
type
)
}
}
return
files
return
files
}
}
}
else
{
}
else
{
...
@@ -362,14 +457,28 @@ const fetchDirectoryContent = (state: BrowserState, payload: { fileTree, path: s
...
@@ -362,14 +457,28 @@ const fetchDirectoryContent = (state: BrowserState, payload: { fileTree, path: s
const
_path
=
splitPath
(
state
,
payload
.
path
)
const
_path
=
splitPath
(
state
,
payload
.
path
)
const
prevFiles
=
_
.
get
(
files
,
_path
)
const
prevFiles
=
_
.
get
(
files
,
_path
)
if
(
prevFiles
)
{
prevFiles
.
child
=
_
.
merge
(
normalize
(
payload
.
fileTree
,
payload
.
path
,
payload
.
type
),
prevFiles
.
child
)
prevFiles
.
child
=
_
.
merge
(
normalize
(
payload
.
fileTree
,
payload
.
path
,
payload
.
type
),
prevFiles
.
child
)
if
(
deletePath
)
delete
prevFiles
.
child
[
deletePath
]
if
(
deletePath
)
delete
prevFiles
.
child
[
deletePath
]
files
=
_
.
set
(
files
,
_path
,
prevFiles
)
files
=
_
.
set
(
files
,
_path
,
prevFiles
)
}
else
{
files
=
{
[
payload
.
path
]:
normalize
(
payload
.
fileTree
,
payload
.
path
,
payload
.
type
)
}
}
return
files
return
files
}
}
}
}
}
}
const
fetchWorkspaceDirectoryContent
=
(
state
:
BrowserState
,
payload
:
{
fileTree
,
path
:
string
}):
{
[
x
:
string
]:
Record
<
string
,
File
>
}
=>
{
if
(
state
.
mode
===
'browser'
)
{
const
files
=
normalize
(
payload
.
fileTree
,
payload
.
path
)
return
{
[
payload
.
path
]:
files
}
}
else
{
return
fetchDirectoryContent
(
state
,
payload
)
}
}
const
normalize
=
(
filesList
,
directory
?:
string
,
newInputType
?:
'folder'
|
'file'
):
Record
<
string
,
File
>
=>
{
const
normalize
=
(
filesList
,
directory
?:
string
,
newInputType
?:
'folder'
|
'file'
):
Record
<
string
,
File
>
=>
{
const
folders
=
{}
const
folders
=
{}
const
files
=
{}
const
files
=
{}
...
...
libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx
View file @
daf50154
import
React
,
{
useState
,
useEffect
,
useRef
,
useContext
}
from
'react'
// eslint-disable-line
import
React
,
{
useState
,
useEffect
,
useRef
,
useContext
}
from
'react'
// eslint-disable-line
import
{
FileExplorer
}
from
'@remix-ui/file-explorer'
// eslint-disable-line
import
{
FileExplorer
}
from
'@remix-ui/file-explorer'
// eslint-disable-line
import
'./remix-ui-workspace.css'
import
'./remix-ui-workspace.css'
import
{
Toaster
}
from
'@remix-ui/toaster'
// eslint-disable-line
import
{
WorkspaceProps
,
WorkspaceState
}
from
'./types'
import
{
WorkspaceProps
,
WorkspaceState
}
from
'./types'
import
{
FileSystemContext
}
from
'./contexts'
import
{
FileSystemContext
}
from
'./contexts'
...
@@ -16,8 +15,7 @@ export function Workspace (props: WorkspaceProps) {
...
@@ -16,8 +15,7 @@ export function Workspace (props: WorkspaceProps) {
displayNewFile
:
false
,
displayNewFile
:
false
,
externalUploads
:
null
,
externalUploads
:
null
,
uploadFileEvent
:
null
,
uploadFileEvent
:
null
,
loadingLocalhost
:
false
,
loadingLocalhost
:
false
toasterMsg
:
''
})
})
const
[
currentWorkspace
,
setCurrentWorkspace
]
=
useState
<
string
>
(
NO_WORKSPACE
)
const
[
currentWorkspace
,
setCurrentWorkspace
]
=
useState
<
string
>
(
NO_WORKSPACE
)
const
global
=
useContext
(
FileSystemContext
)
const
global
=
useContext
(
FileSystemContext
)
...
@@ -29,11 +27,11 @@ export function Workspace (props: WorkspaceProps) {
...
@@ -29,11 +27,11 @@ export function Workspace (props: WorkspaceProps) {
useEffect
(()
=>
{
useEffect
(()
=>
{
if
(
global
.
fs
.
mode
===
'browser'
)
{
if
(
global
.
fs
.
mode
===
'browser'
)
{
setCurrentWorkspace
(
global
.
fs
.
browser
.
currentWorkspace
)
setCurrentWorkspace
(
global
.
fs
.
browser
.
currentWorkspace
)
global
.
dispatchFetchDirectory
(
global
.
fs
.
browser
.
currentWorkspace
)
global
.
dispatchFetch
Workspace
Directory
(
global
.
fs
.
browser
.
currentWorkspace
)
}
else
if
(
global
.
fs
.
mode
===
'localhost'
)
{
}
else
if
(
global
.
fs
.
mode
===
'localhost'
)
{
global
.
dispatchFetchDirectory
(
'localhost'
)
global
.
dispatchFetch
Workspace
Directory
(
'localhost'
)
}
}
},
[
global
.
fs
.
browser
.
currentWorkspace
,
global
.
fs
.
localhost
.
sharedFolder
])
},
[
global
.
fs
.
browser
.
currentWorkspace
,
global
.
fs
.
localhost
.
sharedFolder
,
global
.
fs
.
mode
])
useEffect
(()
=>
{
useEffect
(()
=>
{
if
(
global
.
fs
.
mode
===
'localhost'
)
setCurrentWorkspace
(
LOCALHOST
)
if
(
global
.
fs
.
mode
===
'localhost'
)
setCurrentWorkspace
(
LOCALHOST
)
...
@@ -50,10 +48,6 @@ export function Workspace (props: WorkspaceProps) {
...
@@ -50,10 +48,6 @@ export function Workspace (props: WorkspaceProps) {
return
createWorkspace
()
return
createWorkspace
()
}
}
props
.
plugin
.
request
.
setWorkspace
=
(
workspaceName
)
=>
{
return
setWorkspace
(
workspaceName
)
}
// props.plugin.request.createNewFile = async () => {
// props.plugin.request.createNewFile = async () => {
// if (!state.workspaces.length) await createNewWorkspace('default_workspace')
// if (!state.workspaces.length) await createNewWorkspace('default_workspace')
// props.plugin.resetNewFile()
// props.plugin.resetNewFile()
...
@@ -76,19 +70,13 @@ export function Workspace (props: WorkspaceProps) {
...
@@ -76,19 +70,13 @@ export function Workspace (props: WorkspaceProps) {
await
props
.
plugin
.
fileManager
.
closeAllFiles
()
await
props
.
plugin
.
fileManager
.
closeAllFiles
()
await
props
.
plugin
.
createWorkspace
(
workspaceName
)
await
props
.
plugin
.
createWorkspace
(
workspaceName
)
await
setWorkspace
(
workspaceName
)
await
setWorkspace
(
workspaceName
)
toast
(
'New default workspace has been created.'
)
global
.
toast
(
'New default workspace has been created.'
)
}
catch
(
e
)
{
}
catch
(
e
)
{
global
.
modal
(
'Create Default Workspace'
,
e
.
message
,
'OK'
,
onFinishRenameWorkspace
,
''
)
global
.
modal
(
'Create Default Workspace'
,
e
.
message
,
'OK'
,
onFinishRenameWorkspace
,
''
)
console
.
error
(
e
)
console
.
error
(
e
)
}
}
}
}
const
toast
=
(
message
:
string
)
=>
{
setState
(
prevState
=>
{
return
{
...
prevState
,
toasterMsg
:
message
}
})
}
/* workspace creation, renaming and deletion */
/* workspace creation, renaming and deletion */
const
renameCurrentWorkspace
=
()
=>
{
const
renameCurrentWorkspace
=
()
=>
{
...
@@ -127,9 +115,7 @@ export function Workspace (props: WorkspaceProps) {
...
@@ -127,9 +115,7 @@ export function Workspace (props: WorkspaceProps) {
const
workspaceName
=
workspaceCreateInput
.
current
.
value
const
workspaceName
=
workspaceCreateInput
.
current
.
value
try
{
try
{
await
props
.
plugin
.
fileManager
.
closeAllFiles
()
await
global
.
dispatchCreateWorkspace
(
workspaceName
)
await
props
.
plugin
.
createWorkspace
(
workspaceName
)
await
setWorkspace
(
workspaceName
)
}
catch
(
e
)
{
}
catch
(
e
)
{
global
.
modal
(
'Create Workspace'
,
e
.
message
,
'OK'
,
()
=>
{},
''
)
global
.
modal
(
'Create Workspace'
,
e
.
message
,
'OK'
,
()
=>
{},
''
)
console
.
error
(
e
)
console
.
error
(
e
)
...
@@ -152,20 +138,8 @@ export function Workspace (props: WorkspaceProps) {
...
@@ -152,20 +138,8 @@ export function Workspace (props: WorkspaceProps) {
})
})
}
}
const
setWorkspace
=
async
(
name
)
=>
{
const
switchWorkspace
=
async
(
name
:
string
)
=>
{
await
props
.
plugin
.
fileManager
.
closeAllFiles
()
global
.
dispatchSwitchToWorkspace
(
name
)
if
(
name
===
LOCALHOST
)
{
props
.
plugin
.
workspace
.
clearWorkspace
()
}
else
if
(
name
===
NO_WORKSPACE
)
{
props
.
plugin
.
workspace
.
clearWorkspace
()
}
else
{
await
props
.
plugin
.
workspace
.
setWorkspace
(
name
)
}
await
props
.
plugin
.
setWorkspace
({
name
,
isLocalhost
:
name
===
LOCALHOST
},
!
(
name
===
LOCALHOST
||
name
===
NO_WORKSPACE
))
props
.
plugin
.
getWorkspaces
()
setState
(
prevState
=>
{
return
{
...
prevState
,
currentWorkspace
:
name
}
})
}
}
const
createModalMessage
=
()
=>
{
const
createModalMessage
=
()
=>
{
...
@@ -186,7 +160,6 @@ export function Workspace (props: WorkspaceProps) {
...
@@ -186,7 +160,6 @@ export function Workspace (props: WorkspaceProps) {
return
(
return
(
<
div
className=
'remixui_container'
>
<
div
className=
'remixui_container'
>
<
Toaster
message=
{
state
.
toasterMsg
}
/>
<
div
className=
'remixui_fileexplorer'
onClick=
{
()
=>
resetFocus
(
true
)
}
>
<
div
className=
'remixui_fileexplorer'
onClick=
{
()
=>
resetFocus
(
true
)
}
>
<
div
>
<
div
>
<
header
>
<
header
>
...
@@ -228,7 +201,7 @@ export function Workspace (props: WorkspaceProps) {
...
@@ -228,7 +201,7 @@ export function Workspace (props: WorkspaceProps) {
title=
'Delete'
>
title=
'Delete'
>
</
span
>
</
span
>
</
span
>
</
span
>
<
select
id=
"workspacesSelect"
value=
{
currentWorkspace
}
data
-
id=
"workspacesSelect"
onChange=
{
(
e
)
=>
s
et
Workspace
(
e
.
target
.
value
)
}
className=
"form-control custom-select"
>
<
select
id=
"workspacesSelect"
value=
{
currentWorkspace
}
data
-
id=
"workspacesSelect"
onChange=
{
(
e
)
=>
s
witch
Workspace
(
e
.
target
.
value
)
}
className=
"form-control custom-select"
>
{
{
global
.
fs
.
browser
.
workspaces
global
.
fs
.
browser
.
workspaces
.
map
((
folder
,
index
)
=>
{
.
map
((
folder
,
index
)
=>
{
...
...
libs/remix-ui/workspace/src/lib/types/index.ts
View file @
daf50154
...
@@ -34,7 +34,6 @@ export interface WorkspaceState {
...
@@ -34,7 +34,6 @@ export interface WorkspaceState {
externalUploads
:
EventTarget
&
HTMLInputElement
externalUploads
:
EventTarget
&
HTMLInputElement
uploadFileEvent
:
EventTarget
&
HTMLInputElement
uploadFileEvent
:
EventTarget
&
HTMLInputElement
loadingLocalhost
:
boolean
loadingLocalhost
:
boolean
toasterMsg
:
string
}
}
export
interface
Modal
{
export
interface
Modal
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment