chore: implemented navigating to specfic KCL file

This commit is contained in:
Kevin Nadro
2025-04-14 12:59:20 -06:00
parent ba2570d2cd
commit a3b8b1c859
4 changed files with 56 additions and 16 deletions

View File

@ -6,16 +6,16 @@ import { ProjectsContextProvider } from '@src/components/ProjectsContextProvider
import { SystemIOMachineLogicListener } from '@src/components/Providers/SystemIOProviderDesktop'
import { RouteProvider } from '@src/components/RouteProvider'
import { KclContextProvider } from '@src/lang/KclProvider'
import { useEffect } from 'react'
import { Outlet } from 'react-router-dom'
import {useEffect} from "react"
function RootLayout() {
useEffect(() => {
console.log('MyComponent mounted');
console.log('MyComponent mounted')
return () => {
console.log('MyComponent unmounted');
};
}, []);
console.log('MyComponent unmounted')
}
}, [])
return (
<div>
<OpenInDesktopAppHandler>

View File

@ -5,13 +5,19 @@ import { useEffect } from 'react'
import { useNavigate } from 'react-router-dom'
export const useRequestedProjectName = () =>
useSelector(systemIOActor, (state) => state.context.requestedProjectName)
export const useRequestedFileName = () =>
useSelector(systemIOActor, (state) => state.context.requestedFileName)
export const useProjectDirectoryPath = () =>
useSelector(systemIOActor, (state) => state.context.projectDirectoryPath)
export function SystemIOMachineLogicListener() {
const requestedProjectName = useRequestedProjectName()
const requestedFileName = useRequestedFileName()
console.log(requestedFileName,'okay')
const projectDirectoryPath = useProjectDirectoryPath()
const navigate = useNavigate()
// Handle global project name navigation
useEffect(() => {
if (!requestedProjectName.name) {
return
@ -20,10 +26,29 @@ export function SystemIOMachineLogicListener() {
projectDirectoryPath +
window.electron.path.sep +
requestedProjectName.name
const requestedPath = `${PATHS.FILE}/${encodeURIComponent(
projectPathWithoutSpecificKCLFile
)}`
navigate(requestedPath)
}, [requestedProjectName])
// Handle global file name navigation
useEffect(() => {
if (!requestedFileName.file || !requestedFileName.project) {
return
}
const projectPath = window.electron.join(
projectDirectoryPath,
requestedFileName.project
)
const filePath = window.electron.join(
projectPath,
requestedFileName.file
)
const requestedPath = `${PATHS.FILE}/${encodeURIComponent(filePath)}`
navigate(requestedPath)
}, [requestedFileName])
return null
}

View File

@ -34,9 +34,13 @@ export const systemIOMachine = setup({
data: { requestedProjectDirectoryPath: string }
}
| {
type: SystemIOMachineEvents.openProject
type: SystemIOMachineEvents.navigateToProject
data: { requestedProjectName: string }
},
}
| {
type: SystemIOMachineEvents.navigateToFile
data: { requestedProjectName: string, requestedFileName: string }
}
},
actions: {
[SystemIOMachineActions.setFolders]: assign({
@ -56,10 +60,16 @@ export const systemIOMachine = setup({
}),
[SystemIOMachineActions.setRequestedProjectName]: assign({
requestedProjectName: ({ event }) => {
assertEvent(event, SystemIOMachineEvents.openProject)
assertEvent(event, SystemIOMachineEvents.navigateToProject)
return { name: event.data.requestedProjectName }
},
}),
[SystemIOMachineActions.setRequestedFileName]: assign({
requestedFileName: ({ event }) => {
assertEvent(event, SystemIOMachineEvents.navigateToFile)
return { project: event.data.requestedProjectName, file: event.data.requestedFileName }
},
}),
},
actors: {
[SystemIOMachineActors.readFoldersFromProjectDirectory]: fromPromise(
@ -79,6 +89,7 @@ export const systemIOMachine = setup({
projectDirectoryPath: NO_PROJECT_DIRECTORY,
hasListedProjects: false,
requestedProjectName: { name: NO_PROJECT_DIRECTORY },
requestedFileName: { name: NO_PROJECT_DIRECTORY },
}),
states: {
[SystemIOMachineStates.idle]: {
@ -90,9 +101,12 @@ export const systemIOMachine = setup({
target: SystemIOMachineStates.readingFolders,
actions: [SystemIOMachineActions.setProjectDirectoryPath],
},
[SystemIOMachineEvents.openProject]: {
[SystemIOMachineEvents.navigateToProject]: {
actions: [SystemIOMachineActions.setRequestedProjectName],
},
[SystemIOMachineEvents.navigateToFile]: {
actions: [SystemIOMachineActions.setRequestedFileName],
},
},
},
[SystemIOMachineStates.readingFolders]: {
@ -111,7 +125,6 @@ export const systemIOMachine = setup({
},
},
},
[SystemIOMachineStates.openingProject]: {},
},
})

View File

@ -9,7 +9,6 @@ export enum SystemIOMachineStates {
idle = 'idle',
readingFolders = 'readingFolders',
settingProjectDirectoryPath = 'settingProjectDirectoryPath',
openingProject = 'openingProject',
}
const donePrefix = 'xstate.done.actor.'
@ -19,13 +18,15 @@ export enum SystemIOMachineEvents {
done_readFoldersFromProjectDirectory = donePrefix +
'read folders from project directory',
setProjectDirectoryPath = 'set project directory path',
openProject = 'open project',
navigateToProject = 'navigate to project',
navigateToFile = 'navigate to file'
}
export enum SystemIOMachineActions {
setFolders = 'set folders',
setProjectDirectoryPath = 'set project directory path',
setRequestedProjectName = 'set requested project name',
setRequestedFileName = 'set requested file name',
}
export const NO_PROJECT_DIRECTORY = ''
@ -42,4 +43,5 @@ export type SystemIOContext = {
// this is required to prevent chokidar from spamming invalid events during initialization.
hasListedProjects: boolean
requestedProjectName: { name: string }
requestedFileName: {project: string, file: string}
}