From bb974bb67ef3037258cf0b5a617778785da545e2 Mon Sep 17 00:00:00 2001 From: Saxon Fletcher Date: Fri, 19 Sep 2025 13:10:20 +1000 Subject: [PATCH] update --- .../interfaces/Auth/Users/UsersBarChart.tsx | 80 +++++++++++++------ 1 file changed, 55 insertions(+), 25 deletions(-) diff --git a/apps/studio/components/interfaces/Auth/Users/UsersBarChart.tsx b/apps/studio/components/interfaces/Auth/Users/UsersBarChart.tsx index e690e624f71..67c9bfd2c70 100644 --- a/apps/studio/components/interfaces/Auth/Users/UsersBarChart.tsx +++ b/apps/studio/components/interfaces/Auth/Users/UsersBarChart.tsx @@ -1,3 +1,4 @@ +import { useQuery } from '@tanstack/react-query' import dayjs from 'dayjs' import { Loader2 } from 'lucide-react' import { useMemo, useState } from 'react' @@ -6,8 +7,9 @@ import type { CategoricalChartState } from 'recharts/types/chart/types' import { MultiAttribute } from 'components/ui/Charts/ComposedChart.utils' import NoDataPlaceholder from 'components/ui/Charts/NoDataPlaceholder' +import { useParams } from 'common' +import { createAuthReportConfig } from 'data/reports/v2/auth.config' import { useFillTimeseriesSorted } from 'hooks/analytics/useFillTimeseriesSorted' -import { useChartData } from 'hooks/useChartData' import { ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent, cn } from 'ui' const CHART_COLORS = { @@ -35,6 +37,7 @@ export const UsersBarChart = ({ className?: string }) => { const [focusDataIndex, setFocusDataIndex] = useState(null) + const { ref: projectRef } = useParams() const startDate = useMemo( () => timestampStart || dayjs().subtract(7, 'day').toISOString(), @@ -55,28 +58,54 @@ export const UsersBarChart = ({ return '1d' }, [startDate, endDate]) - const attributes = useMemo( - () => - [ - { attribute: 'TotalSignUps', provider: 'logs', label: 'Sign Ups', enabled: true }, - ] as MultiAttribute[], - [] + const filters = useMemo(() => ({ status_code: null }), []) + + const signUpsReportConfig = useMemo(() => { + if (!projectRef) return undefined + const reportConfigs = createAuthReportConfig({ + projectRef, + startDate, + endDate, + interval, + filters, + }) + + return reportConfigs.find((config) => config.id === 'signups') + }, [projectRef, startDate, endDate, interval, filters]) + + const canFetch = Boolean(projectRef && signUpsReportConfig) + + const { + data: queryResult, + isLoading, + isFetching, + } = useQuery( + ['projects', projectRef, 'auth-users', 'signups', { startDate, endDate, interval }], + async () => { + if (!signUpsReportConfig || !projectRef) + return { data: [], attributes: [] as MultiAttribute[] } + + return await signUpsReportConfig.dataProvider( + projectRef, + startDate, + endDate, + interval, + filters + ) + }, + { + enabled: canFetch, + refetchOnWindowFocus: false, + } ) - const { data, isLoading } = useChartData({ - attributes: attributes, - startDate, - endDate, - interval, - data: undefined, - enabled: true, - }) - - const chartDataArray = Array.isArray(data) ? data : [] + const chartDataArray = Array.isArray(queryResult?.data) ? queryResult?.data : [] + const dynamicAttributes = (queryResult?.attributes || []) as MultiAttribute[] + const timestampKey = chartDataArray[0]?.hasOwnProperty('timestamp') ? 'timestamp' : 'period_start' const { data: filledData, isError: isFillError } = useFillTimeseriesSorted( chartDataArray, - 'period_start', - attributes.map((attr) => attr.attribute), + timestampKey, + dynamicAttributes.map((attr) => attr.attribute), 0, startDate, endDate, @@ -88,10 +117,10 @@ export const UsersBarChart = ({ const transformedData: UsersBarChartDatum[] = useMemo( () => (finalData || []).map((d: any) => ({ - timestamp: d.period_start, + timestamp: d[timestampKey], count: d.TotalSignUps ?? d.count ?? 0, })), - [finalData] + [finalData, timestampKey] ) const startLabel = useMemo(() => { @@ -103,24 +132,25 @@ export const UsersBarChart = ({ return dayjs(transformedData[transformedData?.length - 1]?.['timestamp']).format(DateTimeFormat) }, [transformedData, DateTimeFormat]) - const noData = chartDataArray.length === 0 + const noData = canFetch && chartDataArray.length === 0 + const showLoader = isLoading || isFetching return (
- {isLoading && ( + {showLoader && (
)} - {noData && !isLoading ? ( + {noData && !showLoader ? ( ) : ( - !isLoading && ( + !showLoader && (