Nadro/adhoc/system io machine (#6352)

* chore: saving off skeleton

* fix: saving skeleton

* chore: skeleton for loading projects from project directory path

* chore: cleaning up useless state transition to be an on event direct to action state

* fix: new structure for web vs desktop vs react machine provider code

* chore: saving off skeleton

* fix: skeleton logic for react? going to move it from a string to obj.string

* fix: trying to prevent error element unmount on global react components. This is bricking JS state

* fix: we are so back

* chore: implemented navigating to specfic KCL file

* chore: implementing renaming project

* chore: deleting project

* fix: auto fixes

* fix: old debug/testing file oops

* chore: generic create new file

* chore: skeleton for web create file provide

* chore: basic machine vitest... need to figure out how to get window.electron implemented in vitest?

* chore: save off progress before deleting other project implementation, a few missing features still

* chore: trying a different init skeleton? most likely will migrate

* chore: first attempt of purging projects context provider

* chore: enabling toast for some machine state

* chore: enabling more toast success and error

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

* fix: tsc fixes

* fix: use file system watcher, navigate to project after creation via the requestProjectName

* chore: open project command, hooks vs snapshot context helpers

* chore: implemented open and create project for e2e testing. They are hard coded in poor spot for now.

* fix: codespell fixes

* chore: implementing more project commands

* chore: PR improvements for root.tsx

* chore: leaving comment about new Router.tsx layout

* fix: removing debugging code

* fix: rewriting component for readability

* fix: improving web initialization

* chore: implementing import file from url which is not actually that?

* fix: clearing search params on import file from url

* fix: fixed two e2e tests, forgot needsReview when making new command

* fix: fixing some import from url business logic to pass e2e tests

* chore: script for diffing circular deps +/-

* fix: formatting

* fix: massive fix for circular depsga!

* fix: trying to fix some errors and auto fmt

* fix: updating deps

* fix: removing debugging code

* fix: big clean up

* fix: more deletion

* fix: tsc cleanup

* fix: TSC TSC TSC TSC!

* fix: typo fix

* fix: clear query params on web only, desktop not required

* fix: removing unused code

* fmt

* Bring back `trap` removed in merge

* Use explicit types instead of `any`s on arg configs

* Add project commands directly to command palette

* fix: deleting debugging code, from PR review

* fix: this got added back(?)

* fix: using referred type

* fix: more PR clean up

* fix: big block comment for xstate architecture decision

* fix: more pr comment fixes

* fix: merge conflict just added them back why dude

* fix: more PR comments

* fix: big ciruclar deps fix, commandBarActor in appActor

---------

Co-authored-by: Frank Noirot <frankjohnson1993@gmail.com>
This commit is contained in:
Kevin Nadro
2025-04-24 13:32:49 -05:00
committed by GitHub
parent 95f2caacab
commit 305d613d40
93 changed files with 1704 additions and 1250 deletions

View File

@ -0,0 +1,107 @@
import { useFileSystemWatcher } from '@src/hooks/useFileSystemWatcher'
import { PATHS } from '@src/lib/paths'
import { systemIOActor, useSettings } from '@src/lib/singletons'
import {
useHasListedProjects,
useProjectDirectoryPath,
useRequestedFileName,
useRequestedProjectName,
} from '@src/machines/systemIO/hooks'
import { SystemIOMachineEvents } from '@src/machines/systemIO/utils'
import { useNavigate } from 'react-router-dom'
import { useEffect } from 'react'
export function SystemIOMachineLogicListenerDesktop() {
const requestedProjectName = useRequestedProjectName()
const requestedFileName = useRequestedFileName()
const projectDirectoryPath = useProjectDirectoryPath()
const hasListedProjects = useHasListedProjects()
const navigate = useNavigate()
const settings = useSettings()
const useGlobalProjectNavigation = () => {
useEffect(() => {
if (!requestedProjectName.name) {
return
}
let projectPathWithoutSpecificKCLFile =
projectDirectoryPath +
window.electron.path.sep +
requestedProjectName.name
const requestedPath = `${PATHS.FILE}/${encodeURIComponent(
projectPathWithoutSpecificKCLFile
)}`
navigate(requestedPath)
}, [requestedProjectName])
}
const useGlobalFileNavigation = () => {
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])
}
const useApplicationProjectDirectory = () => {
useEffect(() => {
systemIOActor.send({
type: SystemIOMachineEvents.setProjectDirectoryPath,
data: {
requestedProjectDirectoryPath:
settings.app.projectDirectory.current || '',
},
})
}, [settings.app.projectDirectory.current])
}
const useDefaultProjectName = () => {
useEffect(() => {
systemIOActor.send({
type: SystemIOMachineEvents.setDefaultProjectFolderName,
data: {
requestedDefaultProjectFolderName:
settings.projects.defaultProjectName.current || '',
},
})
}, [settings.projects.defaultProjectName.current])
}
const useWatchingApplicationProjectDirectory = () => {
useFileSystemWatcher(
async () => {
// Gotcha: Chokidar is buggy. It will emit addDir or add on files that did not get created.
// This means while the application initialize and Chokidar initializes you cannot tell if
// a directory or file is actually created or they are buggy signals. This means you must
// ignore all signals during initialization because it is ambiguous. Once those signals settle
// you can actually start listening to real signals.
// If someone creates folders or files during initialization we ignore those events!
if (!hasListedProjects) {
return
}
systemIOActor.send({
type: SystemIOMachineEvents.readFoldersFromProjectDirectory,
})
},
settings.app.projectDirectory.current
? [settings.app.projectDirectory.current]
: []
)
}
useGlobalProjectNavigation()
useGlobalFileNavigation()
useApplicationProjectDirectory()
useDefaultProjectName()
useWatchingApplicationProjectDirectory()
return null
}