openpencil/src/composables/use-node-props.ts
Danila Poyarkov de83a716cd Remove prop drilling from property sections
All sections now get selected node from useNodeProps() composable
instead of receiving it as a prop from PropertiesPanel.
2026-02-28 09:27:03 +03:00

38 lines
1.2 KiB
TypeScript

import { computed } from 'vue'
import { useEditorStore } from '../stores/editor'
import type { SceneNode } from '../engine/scene-graph'
export function useNodeProps() {
const store = useEditorStore()
const node = computed(() => store.selectedNode.value!)
const nodes = computed(() => store.selectedNodes.value)
function updateProp(key: string, value: number | string) {
if (store.selectedNodes.value.length > 1) {
for (const n of store.selectedNodes.value) {
store.updateNode(n.id, { [key]: value })
}
} else {
const node = store.selectedNode.value
if (node) store.updateNode(node.id, { [key]: value })
}
}
function commitProp(key: string, _value: number | string, previous: number | string) {
if (store.selectedNodes.value.length > 1) {
for (const n of store.selectedNodes.value) {
store.commitNodeUpdate(n.id, { [key]: previous } as Partial<SceneNode>, `Change ${key}`)
}
} else {
const node = store.selectedNode.value
if (node) {
store.commitNodeUpdate(node.id, { [key]: previous } as Partial<SceneNode>, `Change ${key}`)
}
}
}
return { store, node, nodes, updateProp, commitProp }
}