diff options
Diffstat (limited to 'apps/web/src/hooks/use-editor.ts')
| -rw-r--r-- | apps/web/src/hooks/use-editor.ts | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/apps/web/src/hooks/use-editor.ts b/apps/web/src/hooks/use-editor.ts new file mode 100644 index 00000000..ff3e2db1 --- /dev/null +++ b/apps/web/src/hooks/use-editor.ts @@ -0,0 +1,39 @@ +import { useCallback, useMemo, useRef, useSyncExternalStore } from "react"; +import { EditorCore } from "@/core"; + +export function useEditor(): EditorCore { + const editor = useMemo(() => EditorCore.getInstance(), []); + const versionRef = useRef(0); + + const subscribe = useCallback( + (onStoreChange: () => void) => { + const handleStoreChange = () => { + versionRef.current += 1; + onStoreChange(); + }; + + const unsubscribers = [ + editor.playback.subscribe(handleStoreChange), + editor.timeline.subscribe(handleStoreChange), + editor.scenes.subscribe(handleStoreChange), + editor.project.subscribe(handleStoreChange), + editor.media.subscribe(handleStoreChange), + editor.renderer.subscribe(handleStoreChange), + editor.selection.subscribe(handleStoreChange), + ]; + + return () => { + for (const unsubscribe of unsubscribers) { + unsubscribe(); + } + }; + }, + [editor], + ); + + const getSnapshot = useCallback(() => versionRef.current, []); + + useSyncExternalStore(subscribe, getSnapshot, getSnapshot); + + return editor; +} |
