chore: implementing renaming project
This commit is contained in:
@ -13,7 +13,7 @@ export const useProjectDirectoryPath = () =>
|
|||||||
export function SystemIOMachineLogicListener() {
|
export function SystemIOMachineLogicListener() {
|
||||||
const requestedProjectName = useRequestedProjectName()
|
const requestedProjectName = useRequestedProjectName()
|
||||||
const requestedFileName = useRequestedFileName()
|
const requestedFileName = useRequestedFileName()
|
||||||
console.log(requestedFileName,'okay')
|
console.log(requestedFileName, 'okay')
|
||||||
const projectDirectoryPath = useProjectDirectoryPath()
|
const projectDirectoryPath = useProjectDirectoryPath()
|
||||||
const navigate = useNavigate()
|
const navigate = useNavigate()
|
||||||
|
|
||||||
@ -42,10 +42,7 @@ export function SystemIOMachineLogicListener() {
|
|||||||
projectDirectoryPath,
|
projectDirectoryPath,
|
||||||
requestedFileName.project
|
requestedFileName.project
|
||||||
)
|
)
|
||||||
const filePath = window.electron.join(
|
const filePath = window.electron.join(projectPath, requestedFileName.file)
|
||||||
projectPath,
|
|
||||||
requestedFileName.file
|
|
||||||
)
|
|
||||||
const requestedPath = `${PATHS.FILE}/${encodeURIComponent(filePath)}`
|
const requestedPath = `${PATHS.FILE}/${encodeURIComponent(filePath)}`
|
||||||
navigate(requestedPath)
|
navigate(requestedPath)
|
||||||
}, [requestedFileName])
|
}, [requestedFileName])
|
||||||
|
@ -36,10 +36,18 @@ export const systemIOMachine = setup({
|
|||||||
| {
|
| {
|
||||||
type: SystemIOMachineEvents.navigateToProject
|
type: SystemIOMachineEvents.navigateToProject
|
||||||
data: { requestedProjectName: string }
|
data: { requestedProjectName: string }
|
||||||
}
|
}
|
||||||
| {
|
| {
|
||||||
type: SystemIOMachineEvents.navigateToFile
|
type: SystemIOMachineEvents.navigateToFile
|
||||||
data: { requestedProjectName: string, requestedFileName: string }
|
data: { requestedProjectName: string; requestedFileName: string }
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
type: SystemIOMachineEvents.createProject
|
||||||
|
data: { requestedProjectName: string }
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
type: SystemIOMachineEvents.renameProject
|
||||||
|
data: { requestedProjectName: string, projectName: string }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
actions: {
|
actions: {
|
||||||
@ -67,7 +75,10 @@ export const systemIOMachine = setup({
|
|||||||
[SystemIOMachineActions.setRequestedFileName]: assign({
|
[SystemIOMachineActions.setRequestedFileName]: assign({
|
||||||
requestedFileName: ({ event }) => {
|
requestedFileName: ({ event }) => {
|
||||||
assertEvent(event, SystemIOMachineEvents.navigateToFile)
|
assertEvent(event, SystemIOMachineEvents.navigateToFile)
|
||||||
return { project: event.data.requestedProjectName, file: event.data.requestedFileName }
|
return {
|
||||||
|
project: event.data.requestedProjectName,
|
||||||
|
file: event.data.requestedFileName,
|
||||||
|
}
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
@ -77,6 +88,13 @@ export const systemIOMachine = setup({
|
|||||||
return []
|
return []
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
|
[SystemIOMachineActors.createProject]: fromPromise(
|
||||||
|
async ({
|
||||||
|
input: context,
|
||||||
|
}: {
|
||||||
|
input: { context: SystemIOContext; requestProjectName: string }
|
||||||
|
}) => {}
|
||||||
|
),
|
||||||
},
|
},
|
||||||
}).createMachine({
|
}).createMachine({
|
||||||
initial: SystemIOMachineStates.idle,
|
initial: SystemIOMachineStates.idle,
|
||||||
@ -89,14 +107,17 @@ export const systemIOMachine = setup({
|
|||||||
projectDirectoryPath: NO_PROJECT_DIRECTORY,
|
projectDirectoryPath: NO_PROJECT_DIRECTORY,
|
||||||
hasListedProjects: false,
|
hasListedProjects: false,
|
||||||
requestedProjectName: { name: NO_PROJECT_DIRECTORY },
|
requestedProjectName: { name: NO_PROJECT_DIRECTORY },
|
||||||
requestedFileName: { name: NO_PROJECT_DIRECTORY },
|
requestedFileName: {
|
||||||
|
project: NO_PROJECT_DIRECTORY,
|
||||||
|
file: NO_PROJECT_DIRECTORY,
|
||||||
|
},
|
||||||
}),
|
}),
|
||||||
states: {
|
states: {
|
||||||
[SystemIOMachineStates.idle]: {
|
[SystemIOMachineStates.idle]: {
|
||||||
on: {
|
on: {
|
||||||
// on can be an action
|
// on can be an action
|
||||||
[SystemIOMachineEvents.readFoldersFromProjectDirectory]:
|
[SystemIOMachineEvents.readFoldersFromProjectDirectory]:
|
||||||
SystemIOMachineStates.readingFolders,
|
SystemIOMachineStates.readingFolders,
|
||||||
[SystemIOMachineEvents.setProjectDirectoryPath]: {
|
[SystemIOMachineEvents.setProjectDirectoryPath]: {
|
||||||
target: SystemIOMachineStates.readingFolders,
|
target: SystemIOMachineStates.readingFolders,
|
||||||
actions: [SystemIOMachineActions.setProjectDirectoryPath],
|
actions: [SystemIOMachineActions.setProjectDirectoryPath],
|
||||||
@ -107,6 +128,12 @@ export const systemIOMachine = setup({
|
|||||||
[SystemIOMachineEvents.navigateToFile]: {
|
[SystemIOMachineEvents.navigateToFile]: {
|
||||||
actions: [SystemIOMachineActions.setRequestedFileName],
|
actions: [SystemIOMachineActions.setRequestedFileName],
|
||||||
},
|
},
|
||||||
|
[SystemIOMachineEvents.createProject]: {
|
||||||
|
target: SystemIOMachineStates.creatingProject,
|
||||||
|
},
|
||||||
|
[SystemIOMachineEvents.renameProject]: {
|
||||||
|
target: SystemIOMachineStates.renamingProject,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
[SystemIOMachineStates.readingFolders]: {
|
[SystemIOMachineStates.readingFolders]: {
|
||||||
@ -125,6 +152,45 @@ export const systemIOMachine = setup({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
[SystemIOMachineStates.creatingProject]: {
|
||||||
|
invoke: {
|
||||||
|
id: SystemIOMachineActors.createProject,
|
||||||
|
src: SystemIOMachineActors.createProject,
|
||||||
|
input: ({ context, event }) => {
|
||||||
|
assertEvent(event, SystemIOMachineEvents.createProject)
|
||||||
|
return {
|
||||||
|
context,
|
||||||
|
requestedProjectName: event.data.requestedProjectName,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onDone: {
|
||||||
|
target: SystemIOMachineStates.readingFolders,
|
||||||
|
},
|
||||||
|
onError: {
|
||||||
|
target: SystemIOMachineStates.idle,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
[SystemIOMachineStates.renamingProject]: {
|
||||||
|
invoke: {
|
||||||
|
id: SystemIOMachineActors.renameProject,
|
||||||
|
src: SystemIOMachineActors.renameProject,
|
||||||
|
input: ({ context, event }) => {
|
||||||
|
assertEvent(event, SystemIOMachineEvents.renameProject)
|
||||||
|
return {
|
||||||
|
context,
|
||||||
|
requestedProjectName: event.data.requestedProjectName,
|
||||||
|
projectName: event.data.projectName
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onDone: {
|
||||||
|
target: SystemIOMachineStates.readingFolders,
|
||||||
|
},
|
||||||
|
onError: {
|
||||||
|
target: SystemIOMachineStates.idle,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -1,4 +1,10 @@
|
|||||||
import { getProjectInfo, mkdirOrNOOP } from '@src/lib/desktop'
|
import {
|
||||||
|
createNewProjectDirectory,
|
||||||
|
getProjectInfo,
|
||||||
|
mkdirOrNOOP,
|
||||||
|
renameProjectDirectory
|
||||||
|
} from '@src/lib/desktop'
|
||||||
|
import { getUniqueProjectName, doesProjectNameNeedInterpolated, getNextProjectIndex, interpolateProjectNameWithIndex } from '@src/lib/desktopFS'
|
||||||
import type { Project } from '@src/lib/project'
|
import type { Project } from '@src/lib/project'
|
||||||
import { systemIOMachine } from '@src/machines/systemIO/systemIOMachine'
|
import { systemIOMachine } from '@src/machines/systemIO/systemIOMachine'
|
||||||
import type { SystemIOContext } from '@src/machines/systemIO/utils'
|
import type { SystemIOContext } from '@src/machines/systemIO/utils'
|
||||||
@ -53,5 +59,46 @@ export const systemIOMachineDesktop = systemIOMachine.provide({
|
|||||||
return projects
|
return projects
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
|
[SystemIOMachineActors.createProject]: fromPromise(
|
||||||
|
async ({
|
||||||
|
input,
|
||||||
|
}: {
|
||||||
|
input: { context: SystemIOContext; requestedProjectName: string }
|
||||||
|
}) => {
|
||||||
|
const folders = input.context.folders
|
||||||
|
const requestedProjectName = input.requestedProjectName
|
||||||
|
const uniqueName = getUniqueProjectName(requestedProjectName, folders)
|
||||||
|
await createNewProjectDirectory(uniqueName)
|
||||||
|
}
|
||||||
|
),
|
||||||
|
[SystemIOMachineActors.renameProject]: fromPromise(
|
||||||
|
async ({
|
||||||
|
input,
|
||||||
|
}: {
|
||||||
|
input: { context: SystemIOContext; requestedProjectName: string, projectName: string }
|
||||||
|
}) => {
|
||||||
|
const folders = input.context.folders
|
||||||
|
const requestedProjectName = input.requestedProjectName
|
||||||
|
const projectName = input.projectName
|
||||||
|
let newProjectName : string = requestedProjectName
|
||||||
|
if (doesProjectNameNeedInterpolated(requestedProjectName)) {
|
||||||
|
const nextIndex = getNextProjectIndex(requestedProjectName, folders)
|
||||||
|
newProjectName = interpolateProjectNameWithIndex(requestedProjectName, nextIndex)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Toast an error if the project name is taken
|
||||||
|
if (folders.find((p) => p.name === name)) {
|
||||||
|
return Promise.reject(
|
||||||
|
new Error(`Project with name "${name}" already exists`)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
await renameProjectDirectory(
|
||||||
|
window.electron.path.join(input.context.projectDirectoryPath, projectName),
|
||||||
|
newProjectName
|
||||||
|
)
|
||||||
|
// DONE
|
||||||
|
}
|
||||||
|
),
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
@ -3,12 +3,16 @@ import type { Project } from '@src/lib/project'
|
|||||||
export enum SystemIOMachineActors {
|
export enum SystemIOMachineActors {
|
||||||
readFoldersFromProjectDirectory = 'read folders from project directory',
|
readFoldersFromProjectDirectory = 'read folders from project directory',
|
||||||
setProjectDirectoryPath = 'set project directory path',
|
setProjectDirectoryPath = 'set project directory path',
|
||||||
|
createProject = 'create project',
|
||||||
|
renameProject = 'rename project'
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum SystemIOMachineStates {
|
export enum SystemIOMachineStates {
|
||||||
idle = 'idle',
|
idle = 'idle',
|
||||||
readingFolders = 'readingFolders',
|
readingFolders = 'readingFolders',
|
||||||
settingProjectDirectoryPath = 'settingProjectDirectoryPath',
|
settingProjectDirectoryPath = 'settingProjectDirectoryPath',
|
||||||
|
creatingProject = 'creatingProject',
|
||||||
|
renamingProject = 'renamingProject'
|
||||||
}
|
}
|
||||||
|
|
||||||
const donePrefix = 'xstate.done.actor.'
|
const donePrefix = 'xstate.done.actor.'
|
||||||
@ -19,7 +23,9 @@ export enum SystemIOMachineEvents {
|
|||||||
'read folders from project directory',
|
'read folders from project directory',
|
||||||
setProjectDirectoryPath = 'set project directory path',
|
setProjectDirectoryPath = 'set project directory path',
|
||||||
navigateToProject = 'navigate to project',
|
navigateToProject = 'navigate to project',
|
||||||
navigateToFile = 'navigate to file'
|
navigateToFile = 'navigate to file',
|
||||||
|
createProject = 'create project',
|
||||||
|
renameProject = 'rename project'
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum SystemIOMachineActions {
|
export enum SystemIOMachineActions {
|
||||||
@ -43,5 +49,5 @@ export type SystemIOContext = {
|
|||||||
// this is required to prevent chokidar from spamming invalid events during initialization.
|
// this is required to prevent chokidar from spamming invalid events during initialization.
|
||||||
hasListedProjects: boolean
|
hasListedProjects: boolean
|
||||||
requestedProjectName: { name: string }
|
requestedProjectName: { name: string }
|
||||||
requestedFileName: {project: string, file: string}
|
requestedFileName: { project: string; file: string }
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user