Skip to content

Commit 910576e

Browse files
pigarevaoksclaude
andcommitted
refactor(table): group internal preview context into single object
Replace flat previewRowId, setPreviewRowId, renderPreviewHeader, renderPreviewContent, previewTrigger, previewTooltipText fields in TableContextValue with a single preview object. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 44c4fc5 commit 910576e

File tree

5 files changed

+36
-39
lines changed

5 files changed

+36
-39
lines changed

packages/design-system/src/components/Table/TableContext/TableProvider.tsx

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -333,12 +333,14 @@ export const TableProvider = <T,>(props: TableProviderProps<T>) => {
333333
containerRef,
334334
onEndReached,
335335
onEndReachedThreshold,
336-
previewRowId,
337-
setPreviewRowId,
338-
renderPreviewHeader: renderPreviewHeader as ((row: Row<T>) => ReactNode) | undefined,
339-
renderPreviewContent: renderPreviewContent as ((row: Row<T>) => ReactNode) | undefined,
340-
previewTrigger,
341-
previewTooltipText,
336+
preview: {
337+
rowId: previewRowId,
338+
setRowId: setPreviewRowId,
339+
renderHeader: renderPreviewHeader as ((row: Row<T>) => ReactNode) | undefined,
340+
renderContent: renderPreviewContent as ((row: Row<T>) => ReactNode) | undefined,
341+
trigger: previewTrigger,
342+
tooltipText: previewTooltipText,
343+
},
342344
}),
343345
[
344346
table,
@@ -365,6 +367,7 @@ export const TableProvider = <T,>(props: TableProviderProps<T>) => {
365367
onEndReached,
366368
onEndReachedThreshold,
367369
previewRowId,
370+
setPreviewRowId,
368371
renderPreviewHeader,
369372
renderPreviewContent,
370373
previewTrigger,

packages/design-system/src/components/Table/TableContext/types.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,14 @@ export interface TableContextValue<T> {
5454
onEndReachedThreshold?: number;
5555

5656
// Preview drawer
57-
previewRowId: string | null;
58-
setPreviewRowId: (id: string | null) => void;
59-
renderPreviewHeader?: (row: Row<T>) => ReactNode;
60-
renderPreviewContent?: (row: Row<T>) => ReactNode;
61-
previewTrigger: 'master' | 'button';
62-
previewTooltipText: string;
57+
preview: {
58+
rowId: string | null;
59+
setRowId: (id: string | null) => void;
60+
renderHeader?: (row: Row<T>) => ReactNode;
61+
renderContent?: (row: Row<T>) => ReactNode;
62+
trigger: 'master' | 'button';
63+
tooltipText: string;
64+
};
6365
}
6466

6567
export interface TableProviderProps<T> extends Omit<TableProps<T>, 'children' | 'aria-label'> {

packages/design-system/src/components/Table/TablePreviewDrawer.tsx

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,27 @@ import { Drawer, DrawerBody, DrawerContent, DrawerHeader } from '../Drawer';
44
import { useTableContext } from './TableContext';
55

66
export const TablePreviewDrawer: FC = () => {
7-
const { table, previewRowId, setPreviewRowId, renderPreviewHeader, renderPreviewContent } =
8-
useTableContext();
7+
const { table, preview: previewCtx } = useTableContext();
98

10-
const row = previewRowId ? table.getRowModel().rowsById[previewRowId] : undefined;
11-
const header = row && renderPreviewHeader ? renderPreviewHeader(row) : undefined;
12-
const preview = row && renderPreviewContent ? renderPreviewContent(row) : undefined;
9+
const row = previewCtx.rowId ? table.getRowModel().rowsById[previewCtx.rowId] : undefined;
10+
const header = row && previewCtx.renderHeader ? previewCtx.renderHeader(row) : undefined;
11+
const content = row && previewCtx.renderContent ? previewCtx.renderContent(row) : undefined;
1312

1413
// Keep the last valid preview so drawer content doesn't flash empty during close animation
1514
const lastHeaderRef = useRef<ReactNode>(null);
1615
const lastPreviewRef = useRef<ReactNode>(null);
1716
if (header) lastHeaderRef.current = header;
18-
if (preview) lastPreviewRef.current = preview;
17+
if (content) lastPreviewRef.current = content;
1918
const displayHeader = header ?? lastHeaderRef.current;
20-
const displayPreview = preview ?? lastPreviewRef.current;
19+
const displayContent = content ?? lastPreviewRef.current;
2120

22-
if (!renderPreviewContent) return null;
21+
if (!previewCtx.renderContent) return null;
2322

2423
return (
2524
<Drawer
2625
open={!!row}
2726
onOpenChange={open => {
28-
if (!open) setPreviewRowId(null);
27+
if (!open) previewCtx.setRowId(null);
2928
}}
3029
modal={false}
3130
overlay={false}
@@ -38,7 +37,7 @@ export const TablePreviewDrawer: FC = () => {
3837
<span />
3938
</DrawerHeader>
4039
)}
41-
<DrawerBody>{displayPreview}</DrawerBody>
40+
<DrawerBody>{displayContent}</DrawerBody>
4241
</DrawerContent>
4342
</Drawer>
4443
);

packages/design-system/src/components/Table/TableRow.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@ interface TableRowProps<T> {
1717
}
1818

1919
const TableRowInner = <T,>({ row, ref, 'data-index': dataIndex }: TableRowProps<T>) => {
20-
const { expandingEnabled, previewRowId } = useTableContext<T>();
20+
const { expandingEnabled, preview } = useTableContext<T>();
2121
const testId = useTestId('row');
2222
const isGroupParent = row.subRows.length > 0;
2323
const isSelected = isGroupParent ? row.getIsAllSubRowsSelected() : row.getIsSelected();
24-
const isPreviewActive = previewRowId === row.id;
24+
const isPreviewActive = preview.rowId === row.id;
2525

2626
if (isGroupParent) {
2727
const cells = row.getVisibleCells();

packages/design-system/src/components/Table/hooks/usePreviewCell.ts

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,17 @@ import { useTableContext } from '../TableContext';
66
* Returns flags and a click handler based on `previewTrigger` mode.
77
*/
88
export const usePreviewCell = <T>(columnId: string, rowId: string) => {
9-
const {
10-
masterColumnId,
11-
previewRowId,
12-
setPreviewRowId,
13-
renderPreviewContent,
14-
previewTrigger,
15-
previewTooltipText,
16-
} = useTableContext<T>();
9+
const { masterColumnId, preview } = useTableContext<T>();
1710

1811
const isMasterColumn = columnId === masterColumnId;
19-
const hasPreview = isMasterColumn && !!renderPreviewContent;
20-
const isMasterTrigger = hasPreview && previewTrigger === 'master';
21-
const isButtonTrigger = hasPreview && previewTrigger === 'button';
22-
const isActive = previewRowId === rowId;
12+
const hasPreview = isMasterColumn && !!preview.renderContent;
13+
const isMasterTrigger = hasPreview && preview.trigger === 'master';
14+
const isButtonTrigger = hasPreview && preview.trigger === 'button';
15+
const isActive = preview.rowId === rowId;
2316

2417
const togglePreview = useCallback(() => {
25-
setPreviewRowId(isActive ? null : rowId);
26-
}, [setPreviewRowId, isActive, rowId]);
18+
preview.setRowId(isActive ? null : rowId);
19+
}, [preview.setRowId, isActive, rowId]);
2720

2821
return {
2922
/** Preview opens by clicking the master cell */
@@ -35,6 +28,6 @@ export const usePreviewCell = <T>(columnId: string, rowId: string) => {
3528
/** Toggle preview for this row (open/close) */
3629
togglePreview,
3730
/** Tooltip text for master cell hover */
38-
tooltipText: hasPreview ? previewTooltipText : undefined,
31+
tooltipText: hasPreview ? preview.tooltipText : undefined,
3932
};
4033
};

0 commit comments

Comments
 (0)