Skip to content

Commit 6258ca1

Browse files
feat: add segments prop to DataTableProvider (calcom#21409)
* feat: add segments prop to DataTableProvider Co-Authored-By: eunjae@cal.com <hey@eunjae.dev> * refactor: modify useSegments hook instead of creating a new one Co-Authored-By: eunjae@cal.com <hey@eunjae.dev> * fix: implement PR feedback and fix failing test Co-Authored-By: eunjae@cal.com <hey@eunjae.dev> * clean up --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: eunjae@cal.com <hey@eunjae.dev>
1 parent d0e17e8 commit 6258ca1

3 files changed

Lines changed: 21 additions & 8 deletions

File tree

packages/features/data-table/DataTableProvider.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ interface DataTableProviderProps {
7474
children: React.ReactNode;
7575
ctaContainerClassName?: string;
7676
defaultPageSize?: number;
77+
segments?: FilterSegmentOutput[];
7778
}
7879

7980
export function DataTableProvider({
@@ -82,6 +83,7 @@ export function DataTableProvider({
8283
useSegments = useSegmentsNoop,
8384
defaultPageSize = DEFAULT_PAGE_SIZE,
8485
ctaContainerClassName = CTA_CONTAINER_CLASS_NAME,
86+
segments: providedSegments,
8587
}: DataTableProviderProps) {
8688
const filterToOpen = useRef<string | undefined>(undefined);
8789
const [activeFilters, setActiveFilters] = useQueryState("activeFilters", activeFiltersParser);
@@ -182,6 +184,7 @@ export function DataTableProvider({
182184
setPageSize,
183185
setPageIndex,
184186
setSearchTerm,
187+
segments: providedSegments,
185188
}
186189
);
187190

packages/features/data-table/hooks/useSegments.ts

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,24 @@ export const useSegments: UseSegments = ({
2626
setPageSize,
2727
setPageIndex,
2828
setSearchTerm,
29+
segments: providedSegments,
2930
}) => {
30-
const { data: rawSegments, isFetching: isFetchingSegments } = trpc.viewer.filterSegments.list.useQuery({
31-
tableIdentifier,
32-
});
31+
const { data: rawSegments, isFetching: isFetchingSegments } = trpc.viewer.filterSegments.list.useQuery(
32+
{
33+
tableIdentifier,
34+
},
35+
{
36+
enabled: !providedSegments, // Only fetch if segments are not provided
37+
}
38+
);
3339

3440
// Recalculate date ranges based on the current timestamp
3541
const segments = useMemo(() => {
36-
if (!rawSegments) return [];
37-
return rawSegments.map((segment) => ({
42+
const segmentsSource = providedSegments || rawSegments;
43+
44+
if (!segmentsSource) return [];
45+
46+
return segmentsSource.map((segment) => ({
3847
...segment,
3948
activeFilters: segment.activeFilters.map((filter) => {
4049
if (isDateRangeFilterValue(filter.v)) {
@@ -46,7 +55,7 @@ export const useSegments: UseSegments = ({
4655
return filter;
4756
}),
4857
}));
49-
}, [rawSegments]);
58+
}, [rawSegments, providedSegments]);
5059

5160
const selectedSegment = useMemo(
5261
() => segments?.find((segment) => segment.id === segmentId),

packages/features/data-table/lib/types.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ export const ZSegmentStorage = z.record(
270270

271271
export type UseSegments = (props: UseSegmentsProps) => UseSegmentsReturn;
272272

273-
type UseSegmentsProps = {
273+
export type UseSegmentsProps = {
274274
tableIdentifier: string;
275275
activeFilters: ActiveFilters;
276276
sorting: SortingState;
@@ -288,9 +288,10 @@ type UseSegmentsProps = {
288288
setPageSize: (pageSize: number) => void;
289289
setPageIndex: (pageIndex: number) => void;
290290
setSearchTerm: (searchTerm: string | null) => void;
291+
segments?: FilterSegmentOutput[];
291292
};
292293

293-
type UseSegmentsReturn = {
294+
export type UseSegmentsReturn = {
294295
segments: FilterSegmentOutput[];
295296
selectedSegment: FilterSegmentOutput | undefined;
296297
canSaveSegment: boolean;

0 commit comments

Comments
 (0)