From c7df1063ac0e3eed1027eb866b4795c09d2ae416 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Tue, 30 Jan 2024 18:25:41 -0800 Subject: [PATCH] Added query hooks for website events and metrics. --- src/components/hooks/index.js | 2 + .../hooks/queries/useWebsiteEvents.ts | 19 ++++++ .../hooks/queries/useWebsiteMetrics.ts | 34 +++++++++++ src/components/metrics/EventsChart.tsx | 37 ++++++------ src/components/metrics/MetricsTable.tsx | 59 +++++++------------ 5 files changed, 94 insertions(+), 57 deletions(-) create mode 100644 src/components/hooks/queries/useWebsiteEvents.ts create mode 100644 src/components/hooks/queries/useWebsiteMetrics.ts diff --git a/src/components/hooks/index.js b/src/components/hooks/index.js index cdb05a6d..9e9993c3 100644 --- a/src/components/hooks/index.js +++ b/src/components/hooks/index.js @@ -11,6 +11,8 @@ export * from './queries/useUser'; export * from './queries/useUsers'; export * from './queries/useWebsite'; export * from './queries/useWebsites'; +export * from './queries/useWebsiteEvents'; +export * from './queries/useWebsiteMetrics'; export * from './useCountryNames'; export * from './useDateRange'; export * from './useDocumentClick'; diff --git a/src/components/hooks/queries/useWebsiteEvents.ts b/src/components/hooks/queries/useWebsiteEvents.ts new file mode 100644 index 00000000..de18a1f9 --- /dev/null +++ b/src/components/hooks/queries/useWebsiteEvents.ts @@ -0,0 +1,19 @@ +import useApi from './useApi'; +import { UseQueryOptions } from '@tanstack/react-query'; + +export function useWebsiteEvents( + websiteId: string, + params?: { [key: string]: any }, + options?: Omit, +) { + const { get, useQuery } = useApi(); + + return useQuery({ + queryKey: ['events', { ...params }], + queryFn: () => get(`/websites/${websiteId}/events`, { ...params }), + enabled: !!websiteId, + ...options, + }); +} + +export default useWebsiteEvents; diff --git a/src/components/hooks/queries/useWebsiteMetrics.ts b/src/components/hooks/queries/useWebsiteMetrics.ts new file mode 100644 index 00000000..c7a719b1 --- /dev/null +++ b/src/components/hooks/queries/useWebsiteMetrics.ts @@ -0,0 +1,34 @@ +import useApi from './useApi'; +import { UseQueryOptions } from '@tanstack/react-query'; + +export function useWebsiteMetrics( + websiteId: string, + params?: { [key: string]: any }, + options?: Omit, +) { + const { get, useQuery } = useApi(); + + return useQuery({ + queryKey: [ + 'websites:metrics', + { + websiteId, + ...params, + }, + ], + queryFn: async () => { + const filters = { ...params }; + + filters[params.type] = undefined; + + const data = await get(`/websites/${websiteId}/metrics`, { + ...filters, + }); + + return data; + }, + ...options, + }); +} + +export default useWebsiteMetrics; diff --git a/src/components/metrics/EventsChart.tsx b/src/components/metrics/EventsChart.tsx index d4f85ed7..b1c581fc 100644 --- a/src/components/metrics/EventsChart.tsx +++ b/src/components/metrics/EventsChart.tsx @@ -3,7 +3,13 @@ import { Loading } from 'react-basics'; import { colord } from 'colord'; import BarChart from './BarChart'; import { getDateArray } from 'lib/date'; -import { useApi, useLocale, useDateRange, useTimezone, useNavigation } from 'components/hooks'; +import { + useLocale, + useDateRange, + useTimezone, + useNavigation, + useWebsiteEvents, +} from 'components/hooks'; import { EVENT_COLORS } from 'lib/constants'; import { renderDateLabels, renderStatusTooltipPopup } from 'lib/charts'; @@ -14,34 +20,29 @@ export interface EventsChartProps { } export function EventsChart({ websiteId, className, token }: EventsChartProps) { - const { get, useQuery } = useApi(); - const [{ startDate, endDate, unit, modified }] = useDateRange(websiteId); + const [{ startDate, endDate, unit, offset }] = useDateRange(websiteId); const { locale } = useLocale(); const [timezone] = useTimezone(); const { query: { url, event }, } = useNavigation(); - const { data, isLoading } = useQuery({ - queryKey: ['events', websiteId, modified, event], - queryFn: () => - get(`/websites/${websiteId}/events`, { - startAt: +startDate, - endAt: +endDate, - unit, - timezone, - url, - event, - token, - }), - enabled: !!websiteId, + const { data, isLoading } = useWebsiteEvents(websiteId, { + startAt: +startDate, + endAt: +endDate, + unit, + timezone, + url, + event, + token, + offset, }); const datasets = useMemo(() => { if (!data) return []; if (isLoading) return data; - const map = data.reduce((obj, { x, t, y }) => { + const map = (data as any[]).reduce((obj, { x, t, y }) => { if (!obj[x]) { obj[x] = []; } @@ -75,7 +76,7 @@ export function EventsChart({ websiteId, className, token }: EventsChartProps) { return ( { - const filters = { url, title, referrer, os, browser, device, country, region, city }; - filters[type] = undefined; - - const data = await get(`/websites/${websiteId}/metrics`, { - type, - startAt: +startDate, - endAt: +endDate, - limit, - ...filters, - }); - - onDataLoad?.(data); - - return data; + const { data, isLoading, isFetched, error } = useWebsiteMetrics( + websiteId, + { + type, + startAt: +startDate, + endAt: +endDate, + url, + referrer, + os, + title, + browser, + device, + country, + region, + city, }, - retryDelay: delay || DEFAULT_ANIMATION_DURATION, - }); + { retryDelay: delay || DEFAULT_ANIMATION_DURATION }, + ); const filteredData = useMemo(() => { if (data) { - let items: any[] = data; + let items = data as any[]; if (dataFilter) { if (Array.isArray(dataFilter)) {