feat: add segments prop to DataTableProvider (#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>
This commit is contained in:
devin-ai-integration[bot]andeunjae@cal.com authored and GitHub committed 2025-05-20 22:30:32 +02:00
1 parent d0e17e8611
commit 6258ca14d0
3 files changed
+21 -8

No files matched your search

@@ -74,6 +74,7 @@ interface DataTableProviderProps {
children: React.ReactNode;
ctaContainerClassName?: string;
defaultPageSize?: number;
segments?: FilterSegmentOutput[];
}
export function DataTableProvider({
@@ -82,6 +83,7 @@ export function DataTableProvider({
useSegments = useSegmentsNoop,
defaultPageSize = DEFAULT_PAGE_SIZE,
ctaContainerClassName = CTA_CONTAINER_CLASS_NAME,
segments: providedSegments,
}: DataTableProviderProps) {
const filterToOpen = useRef<string | undefined>(undefined);
const [activeFilters, setActiveFilters] = useQueryState("activeFilters", activeFiltersParser);
@@ -182,6 +184,7 @@ export function DataTableProvider({
setPageSize,
setPageIndex,
setSearchTerm,
segments: providedSegments,
}
);
@@ -26,15 +26,24 @@ export const useSegments: UseSegments = ({
setPageSize,
setPageIndex,
setSearchTerm,
segments: providedSegments,
}) => {
const { data: rawSegments, isFetching: isFetchingSegments } = trpc.viewer.filterSegments.list.useQuery({
tableIdentifier,
});
const { data: rawSegments, isFetching: isFetchingSegments } = trpc.viewer.filterSegments.list.useQuery(
{
tableIdentifier,
},
{
enabled: !providedSegments, // Only fetch if segments are not provided
}
);
// Recalculate date ranges based on the current timestamp
const segments = useMemo(() => {
if (!rawSegments) return [];
return rawSegments.map((segment) => ({
const segmentsSource = providedSegments || rawSegments;
if (!segmentsSource) return [];
return segmentsSource.map((segment) => ({
...segment,
activeFilters: segment.activeFilters.map((filter) => {
if (isDateRangeFilterValue(filter.v)) {
@@ -46,7 +55,7 @@ export const useSegments: UseSegments = ({
return filter;
}),
}));
}, [rawSegments]);
}, [rawSegments, providedSegments]);
const selectedSegment = useMemo(
() => segments?.find((segment) => segment.id === segmentId),
+3 -2
View File
@@ -270,7 +270,7 @@ export const ZSegmentStorage = z.record(
export type UseSegments = (props: UseSegmentsProps) => UseSegmentsReturn;
type UseSegmentsProps = {
export type UseSegmentsProps = {
tableIdentifier: string;
activeFilters: ActiveFilters;
sorting: SortingState;
@@ -288,9 +288,10 @@ type UseSegmentsProps = {
setPageSize: (pageSize: number) => void;
setPageIndex: (pageIndex: number) => void;
setSearchTerm: (searchTerm: string | null) => void;
segments?: FilterSegmentOutput[];
};
type UseSegmentsReturn = {
export type UseSegmentsReturn = {
segments: FilterSegmentOutput[];
selectedSegment: FilterSegmentOutput | undefined;
canSaveSegment: boolean;