chore: writing read write state to the system io based on the project path
This commit is contained in:
@ -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(() => {
|
||||
|
@ -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
|
||||
)
|
||||
|
@ -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],
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
),
|
||||
},
|
||||
})
|
||||
|
@ -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 }
|
||||
}
|
||||
|
@ -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(() => {
|
||||
|
Reference in New Issue
Block a user