diff options
| author | Maze <167211895+mazeincoding@users.noreply.github.com> | 2026-01-31 00:20:04 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-01-31 00:20:04 +0100 |
| commit | 7bf0984698e43b9aa2dd879f65951318ed410390 (patch) | |
| tree | ccf2cd590a47d550152afc07129cb55c71a9ec35 /apps/web/src/hooks/use-editor.ts | |
| parent | 0173db99448d1c4c6415dcf15272e17551b48b04 (diff) | |
| download | opencut-7bf0984698e43b9aa2dd879f65951318ed410390.tar.gz | |
codebase overhaul (#697)
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; +} |
