chore: writing read write state to the system io based on the project path

This commit is contained in:
Kevin Nadro
2025-04-15 11:23:50 -06:00
parent 657883e09a
commit 8402975e80
6 changed files with 75 additions and 11 deletions

View File

@ -4,7 +4,6 @@ import {
useProjectDirectoryPath,
useRequestedFileName,
useRequestedProjectName,
useState as useSystemIOState,
} from '@src/machines/systemIO/hooks'
import { SystemIOMachineEvents } from '@src/machines/systemIO/utils'
import { useEffect } from 'react'
@ -16,7 +15,6 @@ export function SystemIOMachineLogicListener() {
const projectDirectoryPath = useProjectDirectoryPath()
const navigate = useNavigate()
const settings = useSettings()
const state = useSystemIOState()
// Handle global project name navigation
useEffect(() => {

View File

@ -9,3 +9,8 @@ export const useProjectDirectoryPath = () =>
export const useFolders = () =>
useSelector(systemIOActor, (state) => state.context.folders)
export const useState = () => useSelector(systemIOActor, (state) => state)
export const useCanReadWriteProjectDirectory = () =>
useSelector(
systemIOActor,
(state) => state.context.canReadWriteProjectDirectory
)

View File

@ -28,6 +28,10 @@ export const systemIOMachine = setup({
type: SystemIOMachineEvents.done_readFoldersFromProjectDirectory
output: Project[]
}
| {
type: SystemIOMachineEvents.done_checkReadWrite
output: { value: boolean; error: unknown }
}
| {
type: SystemIOMachineEvents.setProjectDirectoryPath
data: { requestedProjectDirectoryPath: string }
@ -124,6 +128,12 @@ export const systemIOMachine = setup({
''
)
},
[SystemIOMachineActions.setReadWriteProjectDirectory]: assign({
canReadWriteProjectDirectory: ({ event }) => {
assertEvent(event, SystemIOMachineEvents.done_checkReadWrite)
return event.output
},
}),
},
actors: {
[SystemIOMachineActors.readFoldersFromProjectDirectory]: fromPromise(
@ -169,6 +179,16 @@ export const systemIOMachine = setup({
}
}) => {}
),
[SystemIOMachineActors.checkReadWrite]: fromPromise(
async ({
input: { context, requestedProjectDirectoryPath },
}: {
input: {
context: SystemIOContext
requestedProjectDirectoryPath: string
}
}) => {}
),
},
}).createMachine({
initial: SystemIOMachineStates.idle,
@ -185,6 +205,7 @@ export const systemIOMachine = setup({
project: NO_PROJECT_DIRECTORY,
file: NO_PROJECT_DIRECTORY,
},
canReadWriteProjectDirectory: { value: true, error: undefined },
}),
states: {
[SystemIOMachineStates.idle]: {
@ -194,7 +215,7 @@ export const systemIOMachine = setup({
target: SystemIOMachineStates.readingFolders,
},
[SystemIOMachineEvents.setProjectDirectoryPath]: {
target: SystemIOMachineStates.readingFolders,
target: SystemIOMachineStates.checkingReadWrite,
actions: [SystemIOMachineActions.setProjectDirectoryPath],
},
[SystemIOMachineEvents.navigateToProject]: {
@ -322,6 +343,27 @@ export const systemIOMachine = setup({
},
},
},
[SystemIOMachineStates.checkingReadWrite]: {
invoke: {
id: SystemIOMachineActors.checkReadWrite,
src: SystemIOMachineActors.checkReadWrite,
input: ({ context, event }) => {
assertEvent(event, SystemIOMachineEvents.setProjectDirectoryPath)
return {
context,
requestedProjectDirectoryPath:
event.data.requestedProjectDirectoryPath,
}
},
onDone: {
target: SystemIOMachineStates.readingFolders,
},
onError: {
target: SystemIOMachineStates.readingFolders,
actions: [SystemIOMachineActions.toastError],
},
},
},
},
})

View File

@ -195,5 +195,24 @@ export const systemIOMachineDesktop = systemIOMachine.provide({
)
}
),
[SystemIOMachineActors.checkReadWrite]: fromPromise(
async ({
input,
}: {
input: {
context: SystemIOContext
requestedProjectDirectoryPath: string
}
}) => {
const requestProjectDirectoryPath = input.requestedProjectDirectoryPath
if (!requestProjectDirectoryPath) {
return { value: true, error: undefined }
}
const result = await window.electron.canReadWriteDirectory(
requestProjectDirectoryPath
)
return result
}
),
},
})

View File

@ -7,6 +7,7 @@ export enum SystemIOMachineActors {
renameProject = 'rename project',
deleteProject = 'delete project',
createKCLFile = 'create kcl file',
checkReadWrite = 'check read write',
}
export enum SystemIOMachineStates {
@ -17,6 +18,7 @@ export enum SystemIOMachineStates {
renamingProject = 'renamingProject',
deletingProject = 'deletingProject',
creatingKCLFile = 'creatingKCLFile',
checkingReadWrite = 'checkingReadWrite',
}
const donePrefix = 'xstate.done.actor.'
@ -33,6 +35,7 @@ export enum SystemIOMachineEvents {
deleteProject = 'delete project',
createKCLFile = 'create kcl file',
setDefaultProjectFolderName = 'set default project folder name',
done_checkReadWrite = donePrefix + 'check read write',
}
export enum SystemIOMachineActions {
@ -43,6 +46,7 @@ export enum SystemIOMachineActions {
setDefaultProjectFolderName = 'set default project folder name',
toastSuccess = 'toastSuccess',
toastError = 'toastError',
setReadWriteProjectDirectory = 'set read write project directory',
}
export const NO_PROJECT_DIRECTORY = ''
@ -60,4 +64,5 @@ export type SystemIOContext = {
hasListedProjects: boolean
requestedProjectName: { name: string }
requestedFileName: { project: string; file: string }
canReadWriteProjectDirectory: { value: boolean; error: unknown }
}

View File

@ -1,5 +1,5 @@
import type { FormEvent } from 'react'
import { useEffect, useRef, useState } from 'react'
import { useEffect, useRef } from 'react'
import { toast } from 'react-hot-toast'
import { useHotkeys } from 'react-hotkeys-hook'
import { Link, useNavigate, useSearchParams } from 'react-router-dom'
@ -29,6 +29,7 @@ import { reportRejection } from '@src/lib/trap'
import { authActor, systemIOActor, useSettings } from '@src/machines/appMachine'
import { commandBarActor } from '@src/machines/commandBarMachine'
import {
useCanReadWriteProjectDirectory,
useFolders,
useState as useSystemIOState,
} from '@src/machines/systemIO/hooks'
@ -42,13 +43,7 @@ import type { WebContentSendPayload } from '@src/menu/channels'
// as defined in Router.tsx, so we can use the desktop APIs and types.
const Home = () => {
const state = useSystemIOState()
const [readWriteProjectDir, setReadWriteProjectDir] = useState<{
value: boolean
error: unknown
}>({
value: true,
error: undefined,
})
const readWriteProjectDir = useCanReadWriteProjectDirectory()
// Only create the native file menus on desktop
useEffect(() => {