Files
hyperframes/packages/studio/src/contexts/FileManagerContext.tsx
T
Vance Ingalls 89069d24c3 fix(studio): keep preview state synchronized (#3450)
* fix(core): harden audio FX and group identity

* fix(core): address audio group review feedback

* fix(core): align preview transport with grouped audio

* test(core): pin audio group gain ceiling

* fix(core): preserve solo bridge through stack

* fix(engine): harden grouped audio rendering

* docs(engine): explain grouped mix fallback invariant

* test(engine): allow grouped mixes to finish on Windows

* feat(lint): validate audio group membership and timing

* test(lint): pin audio group membership guards

* fix(studio): unify audio IDs and group state

* fix(studio): make audio-group edits transactional

* fix(studio): keep preview state synchronized
2026-08-23 18:10:46 -07:00

144 lines
3.5 KiB
TypeScript

import type { useFileManager } from "../hooks/useFileManager";
import { useContext, useMemo, type ReactNode } from "react";
import { createStableContext } from "../utils/hmrStableContext";
type FileManagerValue = ReturnType<typeof useFileManager>;
const FileManagerContext = createStableContext<FileManagerValue | null>("FileManagerContext", null);
export function useFileManagerContext(): FileManagerValue {
const ctx = useContext(FileManagerContext);
if (!ctx) throw new Error("useFileManagerContext must be used within FileManagerProvider");
return ctx;
}
export function useFileManagerContextOptional(): FileManagerValue | null {
return useContext(FileManagerContext);
}
export function FileManagerProvider({
value: {
// fallow-ignore-next-line code-duplication
editingFile,
setEditingFile,
projectDir,
fileTree,
fileTreeLoaded,
setFileTree,
editingPathRef,
projectIdRef,
saveRafRef,
flushPendingSourceSave,
discardPendingSourceSave,
getPendingSourceCandidate,
importedFontAssetsRef,
readProjectFile,
writeProjectFile,
overwriteExternalConflict,
readOptionalProjectFile,
observeProjectFileVersion,
updateEditingFileContent,
revealSourceOffset,
openSourceForSelection,
handleFileSelect,
handleContentChange,
refreshFileTree,
uploadProjectFiles,
handleCreateFile,
handleCreateFolder,
handleDeleteFile,
handleRenameFile,
handleDuplicateFile,
handleMoveFile,
handleImportFiles,
handleImportFonts,
compositions,
assets,
fontAssets,
},
children,
}: {
value: FileManagerValue;
children: ReactNode;
}) {
const stable = useMemo<FileManagerValue>(
() => ({
editingFile,
setEditingFile,
projectDir,
fileTree,
fileTreeLoaded,
setFileTree,
editingPathRef,
projectIdRef,
saveRafRef,
flushPendingSourceSave,
discardPendingSourceSave,
getPendingSourceCandidate,
importedFontAssetsRef,
readProjectFile,
writeProjectFile,
overwriteExternalConflict,
readOptionalProjectFile,
observeProjectFileVersion,
updateEditingFileContent,
revealSourceOffset,
openSourceForSelection,
handleFileSelect,
handleContentChange,
refreshFileTree,
uploadProjectFiles,
handleCreateFile,
handleCreateFolder,
handleDeleteFile,
handleRenameFile,
handleDuplicateFile,
handleMoveFile,
handleImportFiles,
handleImportFonts,
compositions,
assets,
fontAssets,
}),
[
editingFile,
setEditingFile,
projectDir,
fileTree,
fileTreeLoaded,
setFileTree,
editingPathRef,
projectIdRef,
saveRafRef,
flushPendingSourceSave,
discardPendingSourceSave,
getPendingSourceCandidate,
importedFontAssetsRef,
readProjectFile,
writeProjectFile,
overwriteExternalConflict,
readOptionalProjectFile,
observeProjectFileVersion,
updateEditingFileContent,
revealSourceOffset,
openSourceForSelection,
handleFileSelect,
handleContentChange,
refreshFileTree,
uploadProjectFiles,
handleCreateFile,
handleCreateFolder,
handleDeleteFile,
handleRenameFile,
handleDuplicateFile,
handleMoveFile,
handleImportFiles,
handleImportFonts,
compositions,
assets,
fontAssets,
],
);
return <FileManagerContext value={stable}>{children}</FileManagerContext>;
}