diff --git a/src/lib/desktop.ts b/src/lib/desktop.ts index 2befc6c72..796e75f73 100644 --- a/src/lib/desktop.ts +++ b/src/lib/desktop.ts @@ -100,7 +100,8 @@ export async function mkdirOrNOOP(directoryPath: string): Promise { export async function createNewProjectDirectory( projectName: string, initialCode?: string, - configuration?: DeepPartial | Error + configuration?: DeepPartial | Error, + initialFileName?: string ): Promise { if (!configuration) { configuration = await readAppSettingsFile() @@ -126,7 +127,8 @@ export async function createNewProjectDirectory( } } - const projectFile = window.electron.path.join(projectDir, PROJECT_ENTRYPOINT) + const kclFileName = initialFileName || PROJECT_ENTRYPOINT + const projectFile = window.electron.path.join(projectDir, kclFileName) // When initialCode is present, we're loading existing code. If it's not // present, we're creating a new project, and we want to incorporate the // user's settings. diff --git a/src/machines/systemIO/systemIOMachine.ts b/src/machines/systemIO/systemIOMachine.ts index b7582a849..7435f604e 100644 --- a/src/machines/systemIO/systemIOMachine.ts +++ b/src/machines/systemIO/systemIOMachine.ts @@ -50,6 +50,14 @@ export const systemIOMachine = setup({ | { type: SystemIOMachineEvents.deleteProject data: { requestedProjectName: string } + } + | { + type: SystemIOMachineEvents.createKCLFile + data: { + requestedProjectName: string + requestedFileName: string + requestedCode: string + } }, }, actions: { @@ -116,6 +124,18 @@ export const systemIOMachine = setup({ } }) => {} ), + [SystemIOMachineActors.createKCLFile]: fromPromise( + async ({ + input, + }: { + input: { + context: SystemIOContext + requestedProjectName: string + requestedFileName: string + requestedCode: string + } + }) => {} + ), }, }).createMachine({ initial: SystemIOMachineStates.idle, @@ -158,6 +178,9 @@ export const systemIOMachine = setup({ [SystemIOMachineEvents.deleteProject]: { target: SystemIOMachineStates.deletingProject, }, + [SystemIOMachineEvents.createKCLFile]: { + target: SystemIOMachineStates.creatingKCLFile, + }, }, }, [SystemIOMachineStates.readingFolders]: { @@ -234,6 +257,27 @@ export const systemIOMachine = setup({ }, }, }, + [SystemIOMachineStates.creatingKCLFile]: { + invoke: { + id: SystemIOMachineActors.createKCLFile, + src: SystemIOMachineActors.createKCLFile, + input: ({ context, event }) => { + assertEvent(event, SystemIOMachineEvents.createKCLFile) + return { + context, + requestedProjectName: event.data.requestedProjectName, + requestedFileName: event.data.requestedFileName, + requestedCode: event.data.requestedCode, + } + }, + onDone: { + target: SystemIOMachineStates.idle, + }, + onError: { + target: SystemIOMachineStates.idle, + }, + }, + }, }, }) diff --git a/src/machines/systemIO/systemIOMachineDesktop.ts b/src/machines/systemIO/systemIOMachineDesktop.ts index a13631cc4..1f23b4fea 100644 --- a/src/machines/systemIO/systemIOMachineDesktop.ts +++ b/src/machines/systemIO/systemIOMachineDesktop.ts @@ -2,10 +2,12 @@ import { createNewProjectDirectory, getProjectInfo, mkdirOrNOOP, + readAppSettingsFile, renameProjectDirectory, } from '@src/lib/desktop' import { doesProjectNameNeedInterpolated, + getNextFileName, getNextProjectIndex, getUniqueProjectName, interpolateProjectNameWithIndex, @@ -132,5 +134,52 @@ export const systemIOMachineDesktop = systemIOMachine.provide({ ) } ), + [SystemIOMachineActors.createKCLFile]: fromPromise( + async ({ + input, + }: { + input: { + context: SystemIOContext + requestedProjectName: string + requestedFileName: string + requestedCode: string + } + }) => { + const requestedProjectName = input.requestedProjectName + const requestedFileName = input.requestedFileName + const requestedCode = input.requestedCode + const folders = input.context.folders + + let newProjectName = requestedProjectName + + const needsInterpolated = + doesProjectNameNeedInterpolated(newProjectName) + if (needsInterpolated) { + const nextIndex = getNextProjectIndex(newProjectName, folders) + newProjectName = interpolateProjectNameWithIndex( + newProjectName, + nextIndex + ) + } + + const baseDir = window.electron.join( + input.context.projectDirectoryPath, + newProjectName + ) + const { name: newFileName } = getNextFileName({ + entryName: requestedFileName, + baseDir, + }) + const configuration = await readAppSettingsFile() + + // Create the project around the file if newProject + await createNewProjectDirectory( + newProjectName, + requestedCode, + configuration, + newFileName + ) + } + ), }, }) diff --git a/src/machines/systemIO/utils.ts b/src/machines/systemIO/utils.ts index 56c609eef..23d394217 100644 --- a/src/machines/systemIO/utils.ts +++ b/src/machines/systemIO/utils.ts @@ -6,6 +6,7 @@ export enum SystemIOMachineActors { createProject = 'create project', renameProject = 'rename project', deleteProject = 'delete project', + createKCLFile = 'create kcl file', } export enum SystemIOMachineStates { @@ -15,6 +16,7 @@ export enum SystemIOMachineStates { creatingProject = 'creatingProject', renamingProject = 'renamingProject', deletingProject = 'deletingProject', + creatingKCLFile = 'creatingKCLFile', } const donePrefix = 'xstate.done.actor.' @@ -29,6 +31,7 @@ export enum SystemIOMachineEvents { createProject = 'create project', renameProject = 'rename project', deleteProject = 'delete project', + createKCLFile = 'create kcl file', } export enum SystemIOMachineActions {