diff --git a/packages/raystack/components/data-table/components/content.tsx b/packages/raystack/components/data-table/components/content.tsx index 4cc3d3e66..c7850639d 100644 --- a/packages/raystack/components/data-table/components/content.tsx +++ b/packages/raystack/components/data-table/components/content.tsx @@ -139,7 +139,7 @@ function Rows({ > {cells.map(cell => { const columnDef = cell.column.columnDef as DataTableColumnDef< - unknown, + TData, unknown >; return ( @@ -184,36 +184,39 @@ export function Content({ const lastRowRef = useRef(null); const observerRef = useRef(null); - const handleObserver = useCallback( - (entries: IntersectionObserverEntry[]) => { - const target = entries[0]; - if (target.isIntersecting && !isLoading) { - loadMoreData(); - } - }, - [loadMoreData, isLoading] - ); + /* Refs keep callback stable so observer is only recreated when mode/rows.length change; */ + const loadMoreDataRef = useRef(loadMoreData); + const isLoadingRef = useRef(isLoading); + loadMoreDataRef.current = loadMoreData; + isLoadingRef.current = isLoading; + + const handleObserver = useCallback((entries: IntersectionObserverEntry[]) => { + const target = entries[0]; + if (!target?.isIntersecting) return; + if (isLoadingRef.current) return; + const loadMore = loadMoreDataRef.current; + if (loadMore) loadMore(); + }, []); useEffect(() => { if (mode !== 'server') return; if (observerRef.current) { observerRef.current.disconnect(); + observerRef.current = null; } + const lastRow = lastRowRef.current; + if (!lastRow) return; + observerRef.current = new IntersectionObserver(handleObserver, { threshold: 0.1 }); - const lastRow = lastRowRef.current; - if (lastRow) { - observerRef.current.observe(lastRow); - } + observerRef.current.observe(lastRow); return () => { - if (observerRef.current && lastRow) { - observerRef.current.unobserve(lastRow); - observerRef.current.disconnect(); - } + observerRef.current?.disconnect(); + observerRef.current = null; }; }, [mode, rows.length, handleObserver]); diff --git a/packages/raystack/components/data-table/components/virtualized-content.tsx b/packages/raystack/components/data-table/components/virtualized-content.tsx index 3eb137eb3..22a9920bb 100644 --- a/packages/raystack/components/data-table/components/virtualized-content.tsx +++ b/packages/raystack/components/data-table/components/virtualized-content.tsx @@ -133,7 +133,7 @@ function VirtualRows({ > {cells.map(cell => { const columnDef = cell.column.columnDef as DataTableColumnDef< - unknown, + TData, unknown >; return ( diff --git a/packages/raystack/components/data-table/data-table.module.css b/packages/raystack/components/data-table/data-table.module.css index 2b722bd67..57c66f97f 100644 --- a/packages/raystack/components/data-table/data-table.module.css +++ b/packages/raystack/components/data-table/data-table.module.css @@ -1,6 +1,5 @@ .toolbar { - padding: var(--rs-space-3) var(--rs-space-7) var(--rs-space-3) - var(--rs-space-5); + padding: var(--rs-space-3) var(--rs-space-7) var(--rs-space-3) var(--rs-space-5); align-self: stretch; border-bottom: 0.5px solid var(--rs-color-border-base-primary); @@ -21,12 +20,13 @@ .display-popover-properties-select { width: var(--select-width); } + .display-popover-properties-select[with-icon-button] { /* Reduce Icon button with "--rs-space-7" and flex gap "--rs-space-2" */ width: calc(var(--select-width) - var(--rs-space-7) - var(--rs-space-2)); } -.display-popover-properties-select > span { +.display-popover-properties-select>span { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; @@ -154,4 +154,4 @@ .loaderRow { position: relative; -} +} \ No newline at end of file