|
|
|
@ -2,6 +2,12 @@ import React from 'react' |
|
|
|
|
import { File } from '../types' |
|
|
|
|
import { extractNameFromKey, extractParentFromKey } from '../utils' |
|
|
|
|
|
|
|
|
|
const queuedEvents = [] |
|
|
|
|
const pendingEvents = {} |
|
|
|
|
let provider = null |
|
|
|
|
let plugin = null |
|
|
|
|
let dispatch: React.Dispatch<any> = null |
|
|
|
|
|
|
|
|
|
export const fetchDirectoryError = (error: any) => { |
|
|
|
|
return { |
|
|
|
|
type: 'FETCH_DIRECTORY_ERROR', |
|
|
|
@ -183,35 +189,25 @@ export const fileRenamedSuccess = (path: string, removePath: string, files) => { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export const init = (provider, workspaceName: string, plugin, registry) => (dispatch: React.Dispatch<any>) => { |
|
|
|
|
export const init = (fileProvider, filePanel, registry) => (reducerDispatch: React.Dispatch<any>) => { |
|
|
|
|
provider = fileProvider |
|
|
|
|
plugin = filePanel |
|
|
|
|
dispatch = reducerDispatch |
|
|
|
|
if (provider) { |
|
|
|
|
provider.event.on('fileAdded', async (filePath) => { |
|
|
|
|
if (extractParentFromKey(filePath) === '/.workspaces') return |
|
|
|
|
const path = extractParentFromKey(filePath) || provider.workspace || provider.type || '' |
|
|
|
|
const data = await fetchDirectoryContent(provider, path) |
|
|
|
|
|
|
|
|
|
dispatch(fileAddedSuccess(path, data)) |
|
|
|
|
if (filePath.includes('_test.sol')) { |
|
|
|
|
plugin.emit('newTestFileCreated', filePath) |
|
|
|
|
} |
|
|
|
|
await executeEvent('fileAdded', filePath) |
|
|
|
|
}) |
|
|
|
|
provider.event.on('folderAdded', async (folderPath) => { |
|
|
|
|
if (extractParentFromKey(folderPath) === '/.workspaces') return |
|
|
|
|
const path = extractParentFromKey(folderPath) || provider.workspace || provider.type || '' |
|
|
|
|
const data = await fetchDirectoryContent(provider, path) |
|
|
|
|
|
|
|
|
|
dispatch(folderAddedSuccess(path, data)) |
|
|
|
|
await executeEvent('folderAdded', folderPath) |
|
|
|
|
}) |
|
|
|
|
provider.event.on('fileRemoved', async (removePath) => { |
|
|
|
|
const path = extractParentFromKey(removePath) || provider.workspace || provider.type || '' |
|
|
|
|
|
|
|
|
|
dispatch(fileRemovedSuccess(path, removePath)) |
|
|
|
|
await executeEvent('fileRemoved', removePath) |
|
|
|
|
}) |
|
|
|
|
provider.event.on('fileRenamed', async (oldPath) => { |
|
|
|
|
const path = extractParentFromKey(oldPath) || provider.workspace || provider.type || '' |
|
|
|
|
const data = await fetchDirectoryContent(provider, path) |
|
|
|
|
|
|
|
|
|
dispatch(fileRenamedSuccess(path, oldPath, data)) |
|
|
|
|
await executeEvent('fileRenamed', oldPath) |
|
|
|
|
}) |
|
|
|
|
provider.event.on('rootFolderChanged', async () => { |
|
|
|
|
await executeEvent('rootFolderChanged') |
|
|
|
|
}) |
|
|
|
|
provider.event.on('fileExternallyChanged', async (path: string, file: { content: string }) => { |
|
|
|
|
const config = registry.get('config').api |
|
|
|
@ -232,10 +228,6 @@ export const init = (provider, workspaceName: string, plugin, registry) => (disp |
|
|
|
|
provider.event.on('fileRenamedError', async () => { |
|
|
|
|
dispatch(displayNotification('File Renamed Failed', '', 'Ok', 'Cancel')) |
|
|
|
|
}) |
|
|
|
|
provider.event.on('rootFolderChanged', async () => { |
|
|
|
|
workspaceName = provider.workspace || provider.type || '' |
|
|
|
|
fetchDirectory(provider, workspaceName)(dispatch) |
|
|
|
|
}) |
|
|
|
|
dispatch(fetchProviderSuccess(provider)) |
|
|
|
|
} else { |
|
|
|
|
dispatch(fetchProviderError('No provider available')) |
|
|
|
@ -294,3 +286,99 @@ export const hideNotification = () => { |
|
|
|
|
export const closeNotificationModal = () => (dispatch: React.Dispatch<any>) => { |
|
|
|
|
dispatch(hideNotification()) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const fileAdded = async (filePath: string) => { |
|
|
|
|
if (extractParentFromKey(filePath) === '/.workspaces') return |
|
|
|
|
const path = extractParentFromKey(filePath) || provider.workspace || provider.type || '' |
|
|
|
|
const data = await fetchDirectoryContent(provider, path) |
|
|
|
|
|
|
|
|
|
await dispatch(fileAddedSuccess(path, data)) |
|
|
|
|
if (filePath.includes('_test.sol')) { |
|
|
|
|
plugin.emit('newTestFileCreated', filePath) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const folderAdded = async (folderPath: string) => { |
|
|
|
|
if (extractParentFromKey(folderPath) === '/.workspaces') return |
|
|
|
|
const path = extractParentFromKey(folderPath) || provider.workspace || provider.type || '' |
|
|
|
|
const data = await fetchDirectoryContent(provider, path) |
|
|
|
|
|
|
|
|
|
await dispatch(folderAddedSuccess(path, data)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const fileRemoved = async (removePath: string) => { |
|
|
|
|
const path = extractParentFromKey(removePath) || provider.workspace || provider.type || '' |
|
|
|
|
|
|
|
|
|
await dispatch(fileRemovedSuccess(path, removePath)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const fileRenamed = async (oldPath: string) => { |
|
|
|
|
const path = extractParentFromKey(oldPath) || provider.workspace || provider.type || '' |
|
|
|
|
const data = await fetchDirectoryContent(provider, path) |
|
|
|
|
|
|
|
|
|
await dispatch(fileRenamedSuccess(path, oldPath, data)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const rootFolderChanged = async () => { |
|
|
|
|
const workspaceName = provider.workspace || provider.type || '' |
|
|
|
|
|
|
|
|
|
await fetchDirectory(provider, workspaceName)(dispatch) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const executeEvent = async (eventName: 'fileAdded' | 'folderAdded' | 'fileRemoved' | 'fileRenamed' | 'rootFolderChanged', path?: string) => { |
|
|
|
|
if (Object.keys(pendingEvents).length) { |
|
|
|
|
return queuedEvents.push({ eventName, path }) |
|
|
|
|
} |
|
|
|
|
pendingEvents[eventName + path] = { eventName, path } |
|
|
|
|
switch (eventName) { |
|
|
|
|
case 'fileAdded': |
|
|
|
|
await fileAdded(path) |
|
|
|
|
delete pendingEvents[eventName + path] |
|
|
|
|
if (queuedEvents.length) { |
|
|
|
|
const next = queuedEvents.pop() |
|
|
|
|
|
|
|
|
|
await executeEvent(next.eventName, next.path) |
|
|
|
|
} |
|
|
|
|
break |
|
|
|
|
|
|
|
|
|
case 'folderAdded': |
|
|
|
|
await folderAdded(path) |
|
|
|
|
delete pendingEvents[eventName + path] |
|
|
|
|
if (queuedEvents.length) { |
|
|
|
|
const next = queuedEvents.pop() |
|
|
|
|
|
|
|
|
|
await executeEvent(next.eventName, next.path) |
|
|
|
|
} |
|
|
|
|
break |
|
|
|
|
|
|
|
|
|
case 'fileRemoved': |
|
|
|
|
await fileRemoved(path) |
|
|
|
|
delete pendingEvents[eventName + path] |
|
|
|
|
if (queuedEvents.length) { |
|
|
|
|
const next = queuedEvents.pop() |
|
|
|
|
|
|
|
|
|
await executeEvent(next.eventName, next.path) |
|
|
|
|
} |
|
|
|
|
break |
|
|
|
|
|
|
|
|
|
case 'fileRenamed': |
|
|
|
|
await fileRenamed(path) |
|
|
|
|
delete pendingEvents[eventName + path] |
|
|
|
|
if (queuedEvents.length) { |
|
|
|
|
const next = queuedEvents.pop() |
|
|
|
|
|
|
|
|
|
await executeEvent(next.eventName, next.path) |
|
|
|
|
} |
|
|
|
|
break |
|
|
|
|
|
|
|
|
|
case 'rootFolderChanged': |
|
|
|
|
await rootFolderChanged() |
|
|
|
|
delete pendingEvents[eventName + path] |
|
|
|
|
if (queuedEvents.length) { |
|
|
|
|
const next = queuedEvents.pop() |
|
|
|
|
|
|
|
|
|
await executeEvent(next.eventName, next.path) |
|
|
|
|
} |
|
|
|
|
break |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|