Files
modeling-app/src/useStore.ts

143 lines
3.5 KiB
TypeScript
Raw Normal View History

import create from 'zustand'
2022-11-26 08:34:23 +11:00
import { addLineHighlight, EditorView } from './editor/highlightextension'
2022-11-28 19:43:20 +11:00
import { Program, abstractSyntaxTree } from './lang/abstractSyntaxTree'
2023-01-04 01:28:26 +11:00
import { ProgramMemory } from './lang/executor'
import { recast } from './lang/recast'
2022-11-28 19:43:20 +11:00
import { lexer } from './lang/tokeniser'
2022-12-23 07:37:42 +11:00
import { Quaternion } from 'three'
export type Range = [number, number]
2022-12-06 05:40:05 +11:00
type PathToNode = (string | number)[]
2023-01-04 01:28:26 +11:00
type Position = [number, number, number]
2022-12-06 05:40:05 +11:00
type GuiModes =
| {
mode: 'default'
}
| {
mode: 'sketch'
sketchMode: 'points'
2022-12-23 07:37:42 +11:00
quaternion: Quaternion
2023-01-04 01:28:26 +11:00
position: Position
id?: string
2022-12-06 05:40:05 +11:00
pathToNode: PathToNode
}
2022-12-06 05:40:05 +11:00
| {
mode: 'sketch'
sketchMode: 'sketchEdit'
2022-12-23 07:37:42 +11:00
quaternion: Quaternion
2023-01-04 01:28:26 +11:00
position: Position
2022-12-06 05:40:05 +11:00
pathToNode: PathToNode
2022-12-23 07:37:42 +11:00
}
| {
mode: 'sketch'
sketchMode: 'selectFace'
}
| {
2022-12-06 05:40:05 +11:00
mode: 'canEditSketch'
pathToNode: PathToNode
2022-12-23 07:37:42 +11:00
quaternion: Quaternion
2023-01-04 01:28:26 +11:00
position: Position
2022-12-23 07:37:42 +11:00
}
interface StoreState {
2022-11-26 08:34:23 +11:00
editorView: EditorView | null
setEditorView: (editorView: EditorView) => void
highlightRange: [number, number]
setHighlightRange: (range: Range) => void
2023-01-06 09:07:22 +11:00
setCursor: (cursor: number) => void
2022-11-26 08:34:23 +11:00
selectionRange: [number, number]
setSelectionRange: (range: Range) => void
guiMode: GuiModes
lastGuiMode: GuiModes
setGuiMode: (guiMode: GuiModes) => void
removeError: () => void
logs: string[]
addLog: (log: string) => void
resetLogs: () => void
ast: Program | null
setAst: (ast: Program | null) => void
updateAst: (ast: Program) => void
code: string
setCode: (code: string) => void
2022-11-28 19:43:20 +11:00
formatCode: () => void
2022-12-06 05:40:05 +11:00
errorState: {
isError: boolean
error: string
}
setError: (error?: string) => void
2023-01-04 01:28:26 +11:00
programMemory: ProgramMemory
setProgramMemory: (programMemory: ProgramMemory) => void
}
export const useStore = create<StoreState>()((set, get) => ({
2022-11-26 08:34:23 +11:00
editorView: null,
setEditorView: (editorView) => {
set({ editorView })
},
highlightRange: [0, 0],
setHighlightRange: (highlightRange) => {
set({ highlightRange })
const editorView = get().editorView
if (editorView) {
editorView.dispatch({ effects: addLineHighlight.of(highlightRange) })
}
},
2023-01-06 09:07:22 +11:00
setCursor: (cursor: number) => {
const editorView = get().editorView
if (!editorView) return
editorView.dispatch({
selection: { anchor: cursor, head: cursor },
})
},
2022-11-26 08:34:23 +11:00
selectionRange: [0, 0],
setSelectionRange: (selectionRange) => {
set({ selectionRange })
},
guiMode: { mode: 'default' },
lastGuiMode: { mode: 'default' },
setGuiMode: (guiMode) => {
const lastGuiMode = get().guiMode
set({ guiMode })
},
removeError: () => {
const lastGuiMode = get().lastGuiMode
const currentGuiMode = get().guiMode
},
logs: [],
addLog: (log) => {
set((state) => ({ logs: [...state.logs, log] }))
},
resetLogs: () => {
set({ logs: [] })
},
ast: null,
setAst: (ast) => {
set({ ast })
},
updateAst: (ast) => {
const newCode = recast(ast)
set({ ast, code: newCode })
},
code: '',
setCode: (code) => {
set({ code })
2022-11-28 19:43:20 +11:00
},
formatCode: () => {
const code = get().code
const ast = abstractSyntaxTree(lexer(code))
const newCode = recast(ast)
set({ code: newCode, ast })
},
2022-12-06 05:40:05 +11:00
errorState: {
isError: false,
error: '',
},
setError: (error = '') => {
set({ errorState: { isError: !!error, error } })
2022-12-23 07:37:42 +11:00
},
2023-01-04 01:28:26 +11:00
programMemory: { root: {}, _sketch: [] },
setProgramMemory: (programMemory) => set({ programMemory }),
}))