From c1a4f04d37a9976e97d2c7bfdeb353244dd91f45 Mon Sep 17 00:00:00 2001 From: Carlos Valente Date: Fri, 20 Jun 2025 20:38:25 +0200 Subject: [PATCH] refactor: prevent stale data in collapsed groups --- apps/client/src/features/rundown/Rundown.tsx | 62 ++++++++++---------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/apps/client/src/features/rundown/Rundown.tsx b/apps/client/src/features/rundown/Rundown.tsx index d21747cec..e1f090247 100644 --- a/apps/client/src/features/rundown/Rundown.tsx +++ b/apps/client/src/features/rundown/Rundown.tsx @@ -187,6 +187,36 @@ export default function Rundown({ data }: RundownProps) { [order, entries, setSelectedEvents], ); + /** + * Checks whether a block is collapsed + */ + const getIsCollapsed = useCallback( + (blockId: EntryId): boolean => { + return Boolean(collapsedGroups.find((id) => id === blockId)); + }, + [collapsedGroups], + ); + + /** + * Handles logic for collapsing groups + */ + const handleCollapseGroup = useCallback( + (collapsed: boolean, groupId: EntryId) => { + setCollapsedGroups((prev) => { + const isCollapsed = getIsCollapsed(groupId); + if (collapsed && !isCollapsed) { + const newSet = new Set(prev).add(groupId); + return [...newSet]; + } + if (!collapsed && isCollapsed) { + return [...prev].filter((id) => id !== groupId); + } + return prev; + }); + }, + [getIsCollapsed, setCollapsedGroups], + ); + const moveEntry = useCallback( (cursor: EntryId | null, direction: 'up' | 'down') => { if (sortableData.length < 2 || cursor == null) { @@ -207,7 +237,7 @@ export default function Rundown({ data }: RundownProps) { reorderEntry(cursor, destinationId, order as 'before' | 'after' | 'insert'); }, - [sortableData, reorderEntry], + [sortableData, entries, reorderEntry, handleCollapseGroup], ); // shortcuts @@ -256,36 +286,6 @@ export default function Rundown({ data }: RundownProps) { setSelectedEvents({ id: featureData.selectedEventId, selectMode: 'click', index }); }, [appMode, featureData.selectedEventId, order, setSelectedEvents]); - /** - * Checks whether a block is collapsed - */ - const getIsCollapsed = useCallback( - (blockId: EntryId): boolean => { - return Boolean(collapsedGroups.find((id) => id === blockId)); - }, - [collapsedGroups], - ); - - /** - * Handles logic for collapsing groups - */ - const handleCollapseGroup = useCallback( - (collapsed: boolean, groupId: EntryId) => { - setCollapsedGroups((prev) => { - const isCollapsed = getIsCollapsed(groupId); - if (collapsed && !isCollapsed) { - const newSet = new Set(prev).add(groupId); - return [...newSet]; - } - if (!collapsed && isCollapsed) { - return [...prev].filter((id) => id !== groupId); - } - return prev; - }); - }, - [getIsCollapsed, setCollapsedGroups], - ); - /** * On drag end, we reorder the events */