Skip to content

Commit 1765fdd

Browse files
committed
refactor(studio): name the timeline editing handler objects before wrapping them
1 parent 592bd09 commit 1765fdd

1 file changed

Lines changed: 77 additions & 85 deletions

File tree

‎packages/studio/src/hooks/useTimelineEditing.ts‎

Lines changed: 77 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -509,100 +509,92 @@ export function useTimelineEditing({
509509
return [...flatMembers, ...domMembers];
510510
};
511511

512-
const stableAudioGroupAttribute = useStableHandlers(
513-
{
514-
...setAudioGroupAttribute,
515-
// Same two-array member lookup syncStoredGroupAttribute mirrors into
516-
// (timelineAudioGroupVolume.ts): a sub-composition's group members have
517-
// no flat twin, only a domClipChildren entry, so both are checked.
518-
setQuiet: track(
519-
guard(audioGroupMembers, setAudioGroupAttribute.setQuiet, (reason, groupId, attr) => {
520-
setAudioGroupAttribute.revertLive(groupId, attr);
512+
const audioGroupAttribute = {
513+
...setAudioGroupAttribute,
514+
// Same two-array member lookup syncStoredGroupAttribute mirrors into
515+
// (timelineAudioGroupVolume.ts): a sub-composition's group members have
516+
// no flat twin, only a domClipChildren entry, so both are checked.
517+
setQuiet: track(
518+
guard(audioGroupMembers, setAudioGroupAttribute.setQuiet, (reason, groupId, attr) => {
519+
setAudioGroupAttribute.revertLive(groupId, attr);
520+
return refused(reason);
521+
}),
522+
),
523+
};
524+
const stableAudioGroupAttribute = useStableHandlers(audioGroupAttribute, projectId);
525+
const elementFxAttribute = {
526+
...setElementFxAttribute,
527+
setMany: track(guard((edits) => edits.map((edit) => edit.element), setElementsAttribute)),
528+
setQuiet: track(
529+
guard(
530+
(element) => [element],
531+
setElementFxAttribute.setQuiet,
532+
(reason, element, attr) => {
533+
setElementFxAttribute.revertLive(element, attr);
521534
return refused(reason);
522-
}),
535+
},
523536
),
524-
},
525-
projectId,
526-
);
527-
const stableElementFxAttribute = useStableHandlers(
528-
{
529-
...setElementFxAttribute,
530-
setMany: track(guard((edits) => edits.map((edit) => edit.element), setElementsAttribute)),
531-
setQuiet: track(
532-
guard(
533-
(element) => [element],
534-
setElementFxAttribute.setQuiet,
535-
(reason, element, attr) => {
536-
setElementFxAttribute.revertLive(element, attr);
537-
return refused(reason);
538-
},
539-
),
540-
),
541-
},
542-
projectId,
543-
);
537+
),
538+
};
539+
const stableElementFxAttribute = useStableHandlers(elementFxAttribute, projectId);
544540
// Every write-handler is tracked here, the one place all hand edits
545541
// converge, so undo never races a write; canEdit gates the same point.
546542
// Coverage boundary: see the PR body, not every kind resolves an element.
547543
const trackedRazorSplit = track(
548544
guard((element) => withLinkPartners([element]), handleRazorSplit),
549545
);
550-
return useStableHandlers(
551-
{
552-
handleTimelineElementMove: track(guard((element) => [element], handleTimelineElementMove)),
553-
handleTimelineElementResize: track(
554-
guard((element) => [element], handleTimelineElementResize),
546+
const editing = {
547+
handleTimelineElementMove: track(guard((element) => [element], handleTimelineElementMove)),
548+
handleTimelineElementResize: track(guard((element) => [element], handleTimelineElementResize)),
549+
handleToggleTrackHidden: track(
550+
guard(
551+
(trackIndex) => timelineElements.filter((el) => el.track === trackIndex),
552+
handleToggleTrackHidden,
555553
),
556-
handleToggleTrackHidden: track(
557-
guard(
558-
(trackIndex) => timelineElements.filter((el) => el.track === trackIndex),
559-
handleToggleTrackHidden,
560-
),
554+
),
555+
handleToggleElementHidden: track(
556+
guard((elementKey) => {
557+
const keys = new Set(Array.isArray(elementKey) ? elementKey : [elementKey]);
558+
return timelineElements.filter((el) => keys.has(el.key ?? el.id));
559+
}, handleToggleElementHidden),
560+
),
561+
handleAutoGroupCarveSources: track(handleAutoGroupCarveSources),
562+
setAudioGroupAttribute: stableAudioGroupAttribute,
563+
setElementFxAttribute: stableElementFxAttribute,
564+
handleTimelineElementDelete: track(
565+
guard((element) => withLinkPartners([element]), linkEditing.handleLinkedElementDelete),
566+
),
567+
handleTimelineElementsDelete: track(
568+
guard(withLinkPartners, linkEditing.handleLinkedElementsDelete),
569+
),
570+
handleTimelineElementDeleteOnly: track(
571+
guard((element) => [element], linkEditing.handleDeleteElementOnly),
572+
),
573+
handleLinkEdit: track(guard(linkEditTargets, linkEditing.handleLinkEdit)),
574+
handleTimelineElementSplit: trackedRazorSplit,
575+
handleRazorSplit: trackedRazorSplit,
576+
handleFreezeFrame: track(guard((element) => [element], handleFreezeFrame)),
577+
// Same selection the handler itself splits (useRazorSplit.ts).
578+
handleRazorSplitAll: track(
579+
guard(
580+
(splitTime) => selectSplittableElements(usePlayerStore.getState().elements, splitTime),
581+
handleRazorSplitAll,
561582
),
562-
handleToggleElementHidden: track(
563-
guard((elementKey) => {
564-
const keys = new Set(Array.isArray(elementKey) ? elementKey : [elementKey]);
565-
return timelineElements.filter((el) => keys.has(el.key ?? el.id));
566-
}, handleToggleElementHidden),
567-
),
568-
handleAutoGroupCarveSources: track(handleAutoGroupCarveSources),
569-
setAudioGroupAttribute: stableAudioGroupAttribute,
570-
setElementFxAttribute: stableElementFxAttribute,
571-
handleTimelineElementDelete: track(
572-
guard((element) => withLinkPartners([element]), linkEditing.handleLinkedElementDelete),
573-
),
574-
handleTimelineElementsDelete: track(
575-
guard(withLinkPartners, linkEditing.handleLinkedElementsDelete),
576-
),
577-
handleTimelineElementDeleteOnly: track(
578-
guard((element) => [element], linkEditing.handleDeleteElementOnly),
579-
),
580-
handleLinkEdit: track(guard(linkEditTargets, linkEditing.handleLinkEdit)),
581-
handleTimelineElementSplit: trackedRazorSplit,
582-
handleRazorSplit: trackedRazorSplit,
583-
handleFreezeFrame: track(guard((element) => [element], handleFreezeFrame)),
584-
// Same selection the handler itself splits (useRazorSplit.ts).
585-
handleRazorSplitAll: track(
586-
guard(
587-
(splitTime) => selectSplittableElements(usePlayerStore.getState().elements, splitTime),
588-
handleRazorSplitAll,
589-
),
590-
),
591-
handleTimelineAssetDrop: track(handleTimelineAssetDrop),
592-
handleTimelineFileDrop: track(handleTimelineFileDrop),
593-
handleTimelineCompositionDrop: track(handleTimelineCompositionDrop),
594-
handleBlockedTimelineEdit,
595-
handleTimelineGroupMove: track(
596-
guard((changes) => changes.map((c) => c.element), groupEditing.handleTimelineGroupMove),
597-
),
598-
handleTimelineGroupResize: track(
599-
guard((changes) => changes.map((c) => c.element), groupEditing.handleTimelineGroupResize),
600-
),
601-
restoreLiveLanes: (restore: Parameters<typeof setElementFxAttribute.restoreLive>[0]) => {
602-
setElementFxAttribute.restoreLive(restore);
603-
setAudioGroupAttribute.restoreLive(restore);
604-
},
583+
),
584+
handleTimelineAssetDrop: track(handleTimelineAssetDrop),
585+
handleTimelineFileDrop: track(handleTimelineFileDrop),
586+
handleTimelineCompositionDrop: track(handleTimelineCompositionDrop),
587+
handleBlockedTimelineEdit,
588+
handleTimelineGroupMove: track(
589+
guard((changes) => changes.map((c) => c.element), groupEditing.handleTimelineGroupMove),
590+
),
591+
handleTimelineGroupResize: track(
592+
guard((changes) => changes.map((c) => c.element), groupEditing.handleTimelineGroupResize),
593+
),
594+
restoreLiveLanes: (restore: Parameters<typeof setElementFxAttribute.restoreLive>[0]) => {
595+
setElementFxAttribute.restoreLive(restore);
596+
setAudioGroupAttribute.restoreLive(restore);
605597
},
606-
projectId,
607-
);
598+
};
599+
return useStableHandlers(editing, projectId);
608600
}

0 commit comments

Comments
 (0)