24 lines
828 B
TypeScript
24 lines
828 B
TypeScript
import { useMemo } from 'react';
|
|||
import type { PenNode } from '@zseven-w/pen-types';
|
|||
import { useDesignEngine } from './use-design-engine.js';
|
|||
import { useSelection } from './use-selection.js';
|
|||
import { useDocument } from './use-document.js';
|
|||
|
|||
/**
|
|||
* Returns the first selected node's full data, or null.
|
|||
* Derived from useSelection + useDocument — re-renders on either change.
|
|||
*
|
|||
* `doc` is included in the deps so the memo recomputes when node properties
|
|||
* change even if the selection array stays the same.
|
|||
*/
|
|||
export function useActiveNode(): PenNode | null {
|
|||
const engine = useDesignEngine();
|
|||
const selection = useSelection();
|
|||
const doc = useDocument();
|
|||
|
|||
return useMemo(() => {
|
|||
if (selection.length === 0) return null;
|
|||
return engine.getNodeById(selection[0]) ?? null;
|
|||
}, [engine, selection, doc]);
|
|||
}
|