* Get electron building something at all * Merge Frank test setup work (#3418) * Working window.electron.getPath * Loading project-specific settings in electron tests * Simplify test until we can get snapshots/traces working in electron tests * test tweaks --------- Co-authored-by: Frank Noirot <frank@kittycad.io> * add test #3375 and #3420 * put kcl files together * move files * can sort projects #3362 * File in the file pane should open with a single click #3385 * pressing delete on home screen should do nothing #3387 * add aria labels to icons * Rename and delete projects, also spam arrow keys when renaming #3364 #3365 #3259 * Fix up paths * Update flake.nix to support Electron * Remove a layer of indirection * Work without a web server * Fix settings#projectDir link on home * Fix login (requires new @kittycad/lib WHICH IS NOT INCLUDED HERE) * Lee: Tests are broken because auth skip needs to happen * get setting override envs passed through * tweak eletron CI * yml tweak * fmt * NUKE tauri shit post merge with main * another test auth tweak * Revert "another test auth tweak" This reverts commitb2254b10af
. * try CI again * CI tweaks * SKIP_AUTH true now on playwright * Skipping auth when NODE_ENV=development now * fmt Signed-off-by: Jess Frazelle <github@jessfraz.com> * Use BASE_URL() * fix exists Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix foldername for macos Signed-off-by: Jess Frazelle <github@jessfraz.com> * update for windows Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix version in lower right Signed-off-by: Jess Frazelle <github@jessfraz.com> * cleanup unused imports Signed-off-by: Jess Frazelle <github@jessfraz.com> * progress on is playwright Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix test folders Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix fmt Signed-off-by: Jess Frazelle <github@jessfraz.com> * remove tauri from actions bullshit Signed-off-by: Jess Frazelle <github@jessfraz.com> * remove tauri dir Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixups the coredump async shit Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * node env dev Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix cancellable Signed-off-by: Jess Frazelle <github@jessfraz.com> * cleanup unnessary things Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix Signed-off-by: Jess Frazelle <github@jessfraz.com> * env vars Signed-off-by: Jess Frazelle <github@jessfraz.com> * Bring back fix for NOT using hardcoded main.kcl * env Signed-off-by: Jess Frazelle <github@jessfraz.com> * fmt Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * Revert "updates" This reverts commit da5d9f1043eb94404e8b3f8044088e990e34a4ef. * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * remove tauri clippuy Signed-off-by: Jess Frazelle <github@jessfraz.com> * less retries for now, no debug Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * tsconfig Signed-off-by: Jess Frazelle <github@jessfraz.com> * small tsc fix * update some tsc Signed-off-by: Jess Frazelle <github@jessfraz.com> * tsc env Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix other tsc Signed-off-by: Jess Frazelle <github@jessfraz.com> * small change for routeLoaders * rm old screenshot Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix auth Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix last onew Signed-off-by: Jess Frazelle <github@jessfraz.com> * auth clean up * fix package.json Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix Signed-off-by: Jess Frazelle <github@jessfraz.com> * dissmissed screen on tests * add waits between files being written * put back retried Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix weird programMemory Map issue * put private back * Revert "put private back" This reverts commitd311b978ca
. * Revert "fix weird programMemory Map issue" This reverts commit6c387bdf62
. * remove serde-wasm-bindgen Signed-off-by: Jess Frazelle <github@jessfraz.com> * add env Signed-off-by: Jess Frazelle <github@jessfraz.com> * A snapshot a day keeps the bugs away! 📷🐛 (OS: ubuntu) * A snapshot a day keeps the bugs away! 📷🐛 (OS: ubuntu) * fix tests * more test tweaks * A snapshot a day keeps the bugs away! 📷🐛 (OS: ubuntu) * another tweak * A snapshot a day keeps the bugs away! 📷🐛 (OS: ubuntu) * more test tweaks * more tweaks * increase macos timeout * try fix macos * disable macos playwright tests --------- Signed-off-by: Jess Frazelle <github@jessfraz.com> Co-authored-by: Kurt Hutten <k.hutten@protonmail.ch> Co-authored-by: Frank Noirot <frank@kittycad.io> Co-authored-by: Adam Sunderland <iterion@gmail.com> Co-authored-by: Jess Frazelle <github@jessfraz.com> Co-authored-by: Jess Frazelle <jessfraz@users.noreply.github.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
145 lines
4.0 KiB
TypeScript
145 lines
4.0 KiB
TypeScript
// A little class for updating the code state when we need to and explicitly
|
|
// NOT updating the code state when we don't need to.
|
|
// This prevents re-renders of the codemirror editor, when typing.
|
|
import { bracket } from 'lib/exampleKcl'
|
|
import { isDesktop } from 'lib/isDesktop'
|
|
import toast from 'react-hot-toast'
|
|
import { editorManager } from 'lib/singletons'
|
|
import { Annotation, Transaction } from '@codemirror/state'
|
|
import { KeyBinding } from '@codemirror/view'
|
|
|
|
const PERSIST_CODE_KEY = 'persistCode'
|
|
|
|
const codeManagerUpdateAnnotation = Annotation.define<boolean>()
|
|
export const codeManagerUpdateEvent = codeManagerUpdateAnnotation.of(true)
|
|
|
|
export default class CodeManager {
|
|
private _code: string = bracket
|
|
#updateState: (arg: string) => void = () => {}
|
|
private _currentFilePath: string | null = null
|
|
private _hotkeys: { [key: string]: () => void } = {}
|
|
|
|
constructor() {
|
|
if (isDesktop()) {
|
|
this.code = ''
|
|
return
|
|
}
|
|
|
|
const storedCode = safeLSGetItem(PERSIST_CODE_KEY)
|
|
// TODO #819 remove zustand persistence logic in a few months
|
|
// short term migration, shouldn't make a difference for desktop app users
|
|
// anyway since that's filesystem based.
|
|
const zustandStore = JSON.parse(safeLSGetItem('store') || '{}')
|
|
if (storedCode === null && zustandStore?.state?.code) {
|
|
this.code = zustandStore.state.code
|
|
zustandStore.state.code = ''
|
|
safeLSSetItem('store', JSON.stringify(zustandStore))
|
|
} else if (storedCode === null) {
|
|
this.code = bracket
|
|
} else {
|
|
this.code = storedCode
|
|
}
|
|
}
|
|
|
|
set code(code: string) {
|
|
this._code = code
|
|
}
|
|
|
|
get code(): string {
|
|
return this._code
|
|
}
|
|
|
|
registerCallBacks({ setCode }: { setCode: (arg: string) => void }) {
|
|
this.#updateState = setCode
|
|
}
|
|
|
|
registerHotkey(hotkey: string, callback: () => void) {
|
|
this._hotkeys[hotkey] = callback
|
|
}
|
|
|
|
getCodemirrorHotkeys(): KeyBinding[] {
|
|
return Object.keys(this._hotkeys).map((key) => ({
|
|
key,
|
|
run: () => {
|
|
this._hotkeys[key]()
|
|
return false
|
|
},
|
|
preventDefault: true,
|
|
}))
|
|
}
|
|
|
|
updateCurrentFilePath(path: string) {
|
|
this._currentFilePath = path
|
|
}
|
|
|
|
/**
|
|
* This updates the code state and calls the updateState function.
|
|
*/
|
|
updateCodeState(code: string): void {
|
|
if (this._code !== code) {
|
|
this.code = code
|
|
this.#updateState(code)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Update the code in the editor.
|
|
*/
|
|
updateCodeEditor(code: string): void {
|
|
this.code = code
|
|
if (editorManager.editorView) {
|
|
editorManager.editorView.dispatch({
|
|
changes: {
|
|
from: 0,
|
|
to: editorManager.editorView.state.doc.length,
|
|
insert: code,
|
|
},
|
|
annotations: [
|
|
codeManagerUpdateEvent,
|
|
Transaction.addToHistory.of(true),
|
|
],
|
|
})
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Update the code, state, and the code the code mirror editor sees.
|
|
*/
|
|
updateCodeStateEditor(code: string): void {
|
|
if (this._code !== code) {
|
|
this.code = code
|
|
this.#updateState(code)
|
|
this.updateCodeEditor(code)
|
|
}
|
|
}
|
|
|
|
async writeToFile() {
|
|
if (isDesktop()) {
|
|
setTimeout(() => {
|
|
// Wait one event loop to give a chance for params to be set
|
|
// Save the file to disk
|
|
this._currentFilePath &&
|
|
window.electron
|
|
.writeFile(this._currentFilePath, this.code ?? '')
|
|
.catch((err: Error) => {
|
|
// TODO: add tracing per GH issue #254 (https://github.com/KittyCAD/modeling-app/issues/254)
|
|
console.error('error saving file', err)
|
|
toast.error('Error saving file, please check file permissions')
|
|
})
|
|
})
|
|
} else {
|
|
safeLSSetItem(PERSIST_CODE_KEY, this.code)
|
|
}
|
|
}
|
|
}
|
|
|
|
function safeLSGetItem(key: string) {
|
|
if (typeof window === 'undefined') return null
|
|
return localStorage?.getItem(key)
|
|
}
|
|
|
|
function safeLSSetItem(key: string, value: string) {
|
|
if (typeof window === 'undefined') return
|
|
localStorage?.setItem(key, value)
|
|
}
|