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,
|
useProjectDirectoryPath,
|
||||||
useRequestedFileName,
|
useRequestedFileName,
|
||||||
useRequestedProjectName,
|
useRequestedProjectName,
|
||||||
useState as useSystemIOState,
|
|
||||||
} from '@src/machines/systemIO/hooks'
|
} from '@src/machines/systemIO/hooks'
|
||||||
import { SystemIOMachineEvents } from '@src/machines/systemIO/utils'
|
import { SystemIOMachineEvents } from '@src/machines/systemIO/utils'
|
||||||
import { useEffect } from 'react'
|
import { useEffect } from 'react'
|
||||||
@ -16,7 +15,6 @@ export function SystemIOMachineLogicListener() {
|
|||||||
const projectDirectoryPath = useProjectDirectoryPath()
|
const projectDirectoryPath = useProjectDirectoryPath()
|
||||||
const navigate = useNavigate()
|
const navigate = useNavigate()
|
||||||
const settings = useSettings()
|
const settings = useSettings()
|
||||||
const state = useSystemIOState()
|
|
||||||
|
|
||||||
// Handle global project name navigation
|
// Handle global project name navigation
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
@ -9,3 +9,8 @@ export const useProjectDirectoryPath = () =>
|
|||||||
export const useFolders = () =>
|
export const useFolders = () =>
|
||||||
useSelector(systemIOActor, (state) => state.context.folders)
|
useSelector(systemIOActor, (state) => state.context.folders)
|
||||||
export const useState = () => useSelector(systemIOActor, (state) => state)
|
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
|
type: SystemIOMachineEvents.done_readFoldersFromProjectDirectory
|
||||||
output: Project[]
|
output: Project[]
|
||||||
}
|
}
|
||||||
|
| {
|
||||||
|
type: SystemIOMachineEvents.done_checkReadWrite
|
||||||
|
output: { value: boolean; error: unknown }
|
||||||
|
}
|
||||||
| {
|
| {
|
||||||
type: SystemIOMachineEvents.setProjectDirectoryPath
|
type: SystemIOMachineEvents.setProjectDirectoryPath
|
||||||
data: { requestedProjectDirectoryPath: string }
|
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: {
|
actors: {
|
||||||
[SystemIOMachineActors.readFoldersFromProjectDirectory]: fromPromise(
|
[SystemIOMachineActors.readFoldersFromProjectDirectory]: fromPromise(
|
||||||
@ -169,6 +179,16 @@ export const systemIOMachine = setup({
|
|||||||
}
|
}
|
||||||
}) => {}
|
}) => {}
|
||||||
),
|
),
|
||||||
|
[SystemIOMachineActors.checkReadWrite]: fromPromise(
|
||||||
|
async ({
|
||||||
|
input: { context, requestedProjectDirectoryPath },
|
||||||
|
}: {
|
||||||
|
input: {
|
||||||
|
context: SystemIOContext
|
||||||
|
requestedProjectDirectoryPath: string
|
||||||
|
}
|
||||||
|
}) => {}
|
||||||
|
),
|
||||||
},
|
},
|
||||||
}).createMachine({
|
}).createMachine({
|
||||||
initial: SystemIOMachineStates.idle,
|
initial: SystemIOMachineStates.idle,
|
||||||
@ -185,6 +205,7 @@ export const systemIOMachine = setup({
|
|||||||
project: NO_PROJECT_DIRECTORY,
|
project: NO_PROJECT_DIRECTORY,
|
||||||
file: NO_PROJECT_DIRECTORY,
|
file: NO_PROJECT_DIRECTORY,
|
||||||
},
|
},
|
||||||
|
canReadWriteProjectDirectory: { value: true, error: undefined },
|
||||||
}),
|
}),
|
||||||
states: {
|
states: {
|
||||||
[SystemIOMachineStates.idle]: {
|
[SystemIOMachineStates.idle]: {
|
||||||
@ -194,7 +215,7 @@ export const systemIOMachine = setup({
|
|||||||
target: SystemIOMachineStates.readingFolders,
|
target: SystemIOMachineStates.readingFolders,
|
||||||
},
|
},
|
||||||
[SystemIOMachineEvents.setProjectDirectoryPath]: {
|
[SystemIOMachineEvents.setProjectDirectoryPath]: {
|
||||||
target: SystemIOMachineStates.readingFolders,
|
target: SystemIOMachineStates.checkingReadWrite,
|
||||||
actions: [SystemIOMachineActions.setProjectDirectoryPath],
|
actions: [SystemIOMachineActions.setProjectDirectoryPath],
|
||||||
},
|
},
|
||||||
[SystemIOMachineEvents.navigateToProject]: {
|
[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',
|
renameProject = 'rename project',
|
||||||
deleteProject = 'delete project',
|
deleteProject = 'delete project',
|
||||||
createKCLFile = 'create kcl file',
|
createKCLFile = 'create kcl file',
|
||||||
|
checkReadWrite = 'check read write',
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum SystemIOMachineStates {
|
export enum SystemIOMachineStates {
|
||||||
@ -17,6 +18,7 @@ export enum SystemIOMachineStates {
|
|||||||
renamingProject = 'renamingProject',
|
renamingProject = 'renamingProject',
|
||||||
deletingProject = 'deletingProject',
|
deletingProject = 'deletingProject',
|
||||||
creatingKCLFile = 'creatingKCLFile',
|
creatingKCLFile = 'creatingKCLFile',
|
||||||
|
checkingReadWrite = 'checkingReadWrite',
|
||||||
}
|
}
|
||||||
|
|
||||||
const donePrefix = 'xstate.done.actor.'
|
const donePrefix = 'xstate.done.actor.'
|
||||||
@ -33,6 +35,7 @@ export enum SystemIOMachineEvents {
|
|||||||
deleteProject = 'delete project',
|
deleteProject = 'delete project',
|
||||||
createKCLFile = 'create kcl file',
|
createKCLFile = 'create kcl file',
|
||||||
setDefaultProjectFolderName = 'set default project folder name',
|
setDefaultProjectFolderName = 'set default project folder name',
|
||||||
|
done_checkReadWrite = donePrefix + 'check read write',
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum SystemIOMachineActions {
|
export enum SystemIOMachineActions {
|
||||||
@ -43,6 +46,7 @@ export enum SystemIOMachineActions {
|
|||||||
setDefaultProjectFolderName = 'set default project folder name',
|
setDefaultProjectFolderName = 'set default project folder name',
|
||||||
toastSuccess = 'toastSuccess',
|
toastSuccess = 'toastSuccess',
|
||||||
toastError = 'toastError',
|
toastError = 'toastError',
|
||||||
|
setReadWriteProjectDirectory = 'set read write project directory',
|
||||||
}
|
}
|
||||||
|
|
||||||
export const NO_PROJECT_DIRECTORY = ''
|
export const NO_PROJECT_DIRECTORY = ''
|
||||||
@ -60,4 +64,5 @@ export type SystemIOContext = {
|
|||||||
hasListedProjects: boolean
|
hasListedProjects: boolean
|
||||||
requestedProjectName: { name: string }
|
requestedProjectName: { name: string }
|
||||||
requestedFileName: { project: string; file: string }
|
requestedFileName: { project: string; file: string }
|
||||||
|
canReadWriteProjectDirectory: { value: boolean; error: unknown }
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import type { FormEvent } from 'react'
|
import type { FormEvent } from 'react'
|
||||||
import { useEffect, useRef, useState } from 'react'
|
import { useEffect, useRef } from 'react'
|
||||||
import { toast } from 'react-hot-toast'
|
import { toast } from 'react-hot-toast'
|
||||||
import { useHotkeys } from 'react-hotkeys-hook'
|
import { useHotkeys } from 'react-hotkeys-hook'
|
||||||
import { Link, useNavigate, useSearchParams } from 'react-router-dom'
|
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 { authActor, systemIOActor, useSettings } from '@src/machines/appMachine'
|
||||||
import { commandBarActor } from '@src/machines/commandBarMachine'
|
import { commandBarActor } from '@src/machines/commandBarMachine'
|
||||||
import {
|
import {
|
||||||
|
useCanReadWriteProjectDirectory,
|
||||||
useFolders,
|
useFolders,
|
||||||
useState as useSystemIOState,
|
useState as useSystemIOState,
|
||||||
} from '@src/machines/systemIO/hooks'
|
} 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.
|
// as defined in Router.tsx, so we can use the desktop APIs and types.
|
||||||
const Home = () => {
|
const Home = () => {
|
||||||
const state = useSystemIOState()
|
const state = useSystemIOState()
|
||||||
const [readWriteProjectDir, setReadWriteProjectDir] = useState<{
|
const readWriteProjectDir = useCanReadWriteProjectDirectory()
|
||||||
value: boolean
|
|
||||||
error: unknown
|
|
||||||
}>({
|
|
||||||
value: true,
|
|
||||||
error: undefined,
|
|
||||||
})
|
|
||||||
|
|
||||||
// Only create the native file menus on desktop
|
// Only create the native file menus on desktop
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
Reference in New Issue
Block a user