aboutsummaryrefslogtreecommitdiff
path: root/src/components/hooks/queries
diff options
context:
space:
mode:
authorFuwn <[email protected]>2026-01-24 13:09:50 +0000
committerFuwn <[email protected]>2026-01-24 13:09:50 +0000
commit396acf3bbbe00a192cb0ea0a9ccf91b1d8d2850b (patch)
treeb9df4ca6a70db45cfffbae6fdd7252e20fb8e93c /src/components/hooks/queries
downloadumami-main.tar.xz
umami-main.zip
Initial commitHEADmain
Created from https://vercel.com/new
Diffstat (limited to 'src/components/hooks/queries')
-rw-r--r--src/components/hooks/queries/useActiveUsersQuery.ts12
-rw-r--r--src/components/hooks/queries/useDateRangeQuery.ts23
-rw-r--r--src/components/hooks/queries/useDeleteQuery.ts12
-rw-r--r--src/components/hooks/queries/useEventDataEventsQuery.ts27
-rw-r--r--src/components/hooks/queries/useEventDataPropertiesQuery.ts27
-rw-r--r--src/components/hooks/queries/useEventDataQuery.ts27
-rw-r--r--src/components/hooks/queries/useEventDataValuesQuery.ts34
-rw-r--r--src/components/hooks/queries/useLinkQuery.ts15
-rw-r--r--src/components/hooks/queries/useLinksQuery.ts17
-rw-r--r--src/components/hooks/queries/useLoginQuery.ts23
-rw-r--r--src/components/hooks/queries/usePixelQuery.ts15
-rw-r--r--src/components/hooks/queries/usePixelsQuery.ts17
-rw-r--r--src/components/hooks/queries/useRealtimeQuery.ts17
-rw-r--r--src/components/hooks/queries/useReportQuery.ts15
-rw-r--r--src/components/hooks/queries/useReportsQuery.ts19
-rw-r--r--src/components/hooks/queries/useResultQuery.ts44
-rw-r--r--src/components/hooks/queries/useSessionActivityQuery.ts21
-rw-r--r--src/components/hooks/queries/useSessionDataPropertiesQuery.ts27
-rw-r--r--src/components/hooks/queries/useSessionDataQuery.ts12
-rw-r--r--src/components/hooks/queries/useSessionDataValuesQuery.ts32
-rw-r--r--src/components/hooks/queries/useShareTokenQuery.ts25
-rw-r--r--src/components/hooks/queries/useTeamMembersQuery.ts16
-rw-r--r--src/components/hooks/queries/useTeamQuery.ts17
-rw-r--r--src/components/hooks/queries/useTeamWebsitesQuery.ts15
-rw-r--r--src/components/hooks/queries/useTeamsQuery.ts20
-rw-r--r--src/components/hooks/queries/useUpdateQuery.ts15
-rw-r--r--src/components/hooks/queries/useUserQuery.ts17
-rw-r--r--src/components/hooks/queries/useUserTeamsQuery.ts15
-rw-r--r--src/components/hooks/queries/useUserWebsitesQuery.ts31
-rw-r--r--src/components/hooks/queries/useUsersQuery.ts17
-rw-r--r--src/components/hooks/queries/useWebsiteCohortQuery.ts21
-rw-r--r--src/components/hooks/queries/useWebsiteCohortsQuery.ts25
-rw-r--r--src/components/hooks/queries/useWebsiteEventsQuery.ts39
-rw-r--r--src/components/hooks/queries/useWebsiteEventsSeriesQuery.ts18
-rw-r--r--src/components/hooks/queries/useWebsiteExpandedMetricsQuery.ts51
-rw-r--r--src/components/hooks/queries/useWebsiteMetricsQuery.ts47
-rw-r--r--src/components/hooks/queries/useWebsitePageviewsQuery.ts36
-rw-r--r--src/components/hooks/queries/useWebsiteQuery.ts17
-rw-r--r--src/components/hooks/queries/useWebsiteSegmentQuery.ts21
-rw-r--r--src/components/hooks/queries/useWebsiteSegmentsQuery.ts24
-rw-r--r--src/components/hooks/queries/useWebsiteSessionQuery.ts13
-rw-r--r--src/components/hooks/queries/useWebsiteSessionStatsQuery.ts17
-rw-r--r--src/components/hooks/queries/useWebsiteSessionsQuery.ts34
-rw-r--r--src/components/hooks/queries/useWebsiteStatsQuery.ts36
-rw-r--r--src/components/hooks/queries/useWebsiteValuesQuery.ts62
-rw-r--r--src/components/hooks/queries/useWebsitesQuery.ts20
-rw-r--r--src/components/hooks/queries/useWeeklyTrafficQuery.ts28
47 files changed, 1133 insertions, 0 deletions
diff --git a/src/components/hooks/queries/useActiveUsersQuery.ts b/src/components/hooks/queries/useActiveUsersQuery.ts
new file mode 100644
index 0000000..42867c1
--- /dev/null
+++ b/src/components/hooks/queries/useActiveUsersQuery.ts
@@ -0,0 +1,12 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+
+export function useActyiveUsersQuery(websiteId: string, options?: ReactQueryOptions) {
+ const { get, useQuery } = useApi();
+ return useQuery<any>({
+ queryKey: ['websites:active', websiteId],
+ queryFn: () => get(`/websites/${websiteId}/active`),
+ enabled: !!websiteId,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useDateRangeQuery.ts b/src/components/hooks/queries/useDateRangeQuery.ts
new file mode 100644
index 0000000..84b7eec
--- /dev/null
+++ b/src/components/hooks/queries/useDateRangeQuery.ts
@@ -0,0 +1,23 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+
+type DateRange = {
+ startDate?: string;
+ endDate?: string;
+};
+
+export function useDateRangeQuery(websiteId: string, options?: ReactQueryOptions) {
+ const { get, useQuery } = useApi();
+
+ const { data } = useQuery<DateRange>({
+ queryKey: ['date-range', websiteId],
+ queryFn: () => get(`/websites/${websiteId}/daterange`),
+ enabled: !!websiteId,
+ ...options,
+ });
+
+ return {
+ startDate: data?.startDate ? new Date(data.startDate) : null,
+ endDate: data?.endDate ? new Date(data.endDate) : null,
+ };
+}
diff --git a/src/components/hooks/queries/useDeleteQuery.ts b/src/components/hooks/queries/useDeleteQuery.ts
new file mode 100644
index 0000000..556231a
--- /dev/null
+++ b/src/components/hooks/queries/useDeleteQuery.ts
@@ -0,0 +1,12 @@
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+
+export function useDeleteQuery(path: string, params?: Record<string, any>) {
+ const { del, useMutation } = useApi();
+ const query = useMutation({
+ mutationFn: () => del(path, params),
+ });
+ const { touch } = useModified();
+
+ return { ...query, touch };
+}
diff --git a/src/components/hooks/queries/useEventDataEventsQuery.ts b/src/components/hooks/queries/useEventDataEventsQuery.ts
new file mode 100644
index 0000000..1401989
--- /dev/null
+++ b/src/components/hooks/queries/useEventDataEventsQuery.ts
@@ -0,0 +1,27 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useDateParameters } from '../useDateParameters';
+import { useFilterParameters } from '../useFilterParameters';
+
+export function useEventDataEventsQuery(websiteId: string, options?: ReactQueryOptions) {
+ const { get, useQuery } = useApi();
+ const { startAt, endAt, unit, timezone } = useDateParameters();
+ const filters = useFilterParameters();
+
+ return useQuery({
+ queryKey: [
+ 'websites:event-data:events',
+ { websiteId, startAt, endAt, unit, timezone, ...filters },
+ ],
+ queryFn: () =>
+ get(`/websites/${websiteId}/event-data/events`, {
+ startAt,
+ endAt,
+ unit,
+ timezone,
+ ...filters,
+ }),
+ enabled: !!websiteId,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useEventDataPropertiesQuery.ts b/src/components/hooks/queries/useEventDataPropertiesQuery.ts
new file mode 100644
index 0000000..dfa6e92
--- /dev/null
+++ b/src/components/hooks/queries/useEventDataPropertiesQuery.ts
@@ -0,0 +1,27 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useDateParameters } from '../useDateParameters';
+import { useFilterParameters } from '../useFilterParameters';
+
+export function useEventDataPropertiesQuery(websiteId: string, options?: ReactQueryOptions) {
+ const { get, useQuery } = useApi();
+ const { startAt, endAt, unit, timezone } = useDateParameters();
+ const filters = useFilterParameters();
+
+ return useQuery<any>({
+ queryKey: [
+ 'websites:event-data:properties',
+ { websiteId, startAt, endAt, unit, timezone, ...filters },
+ ],
+ queryFn: () =>
+ get(`/websites/${websiteId}/event-data/properties`, {
+ startAt,
+ endAt,
+ unit,
+ timezone,
+ ...filters,
+ }),
+ enabled: !!websiteId,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useEventDataQuery.ts b/src/components/hooks/queries/useEventDataQuery.ts
new file mode 100644
index 0000000..2ccbd63
--- /dev/null
+++ b/src/components/hooks/queries/useEventDataQuery.ts
@@ -0,0 +1,27 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useDateParameters } from '../useDateParameters';
+import { useFilterParameters } from '../useFilterParameters';
+
+export function useEventDataQuery(websiteId: string, eventId: string, options?: ReactQueryOptions) {
+ const { get, useQuery } = useApi();
+ const { startAt, endAt, unit, timezone } = useDateParameters();
+ const params = useFilterParameters();
+
+ return useQuery({
+ queryKey: [
+ 'websites:event-data',
+ { websiteId, eventId, startAt, endAt, unit, timezone, ...params },
+ ],
+ queryFn: () =>
+ get(`/websites/${websiteId}/event-data/${eventId}`, {
+ startAt,
+ endAt,
+ unit,
+ timezone,
+ ...params,
+ }),
+ enabled: !!(websiteId && eventId),
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useEventDataValuesQuery.ts b/src/components/hooks/queries/useEventDataValuesQuery.ts
new file mode 100644
index 0000000..6529e14
--- /dev/null
+++ b/src/components/hooks/queries/useEventDataValuesQuery.ts
@@ -0,0 +1,34 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useDateParameters } from '../useDateParameters';
+import { useFilterParameters } from '../useFilterParameters';
+
+export function useEventDataValuesQuery(
+ websiteId: string,
+ event: string,
+ propertyName: string,
+ options?: ReactQueryOptions,
+) {
+ const { get, useQuery } = useApi();
+ const { startAt, endAt, unit, timezone } = useDateParameters();
+ const filters = useFilterParameters();
+
+ return useQuery<any>({
+ queryKey: [
+ 'websites:event-data:values',
+ { websiteId, event, propertyName, startAt, endAt, unit, timezone, ...filters },
+ ],
+ queryFn: () =>
+ get(`/websites/${websiteId}/event-data/values`, {
+ startAt,
+ endAt,
+ unit,
+ timezone,
+ ...filters,
+ event,
+ propertyName,
+ }),
+ enabled: !!(websiteId && propertyName),
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useLinkQuery.ts b/src/components/hooks/queries/useLinkQuery.ts
new file mode 100644
index 0000000..2a5d4a9
--- /dev/null
+++ b/src/components/hooks/queries/useLinkQuery.ts
@@ -0,0 +1,15 @@
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+
+export function useLinkQuery(linkId: string) {
+ const { get, useQuery } = useApi();
+ const { modified } = useModified(`link:${linkId}`);
+
+ return useQuery({
+ queryKey: ['link', { linkId, modified }],
+ queryFn: () => {
+ return get(`/links/${linkId}`);
+ },
+ enabled: !!linkId,
+ });
+}
diff --git a/src/components/hooks/queries/useLinksQuery.ts b/src/components/hooks/queries/useLinksQuery.ts
new file mode 100644
index 0000000..ebf945f
--- /dev/null
+++ b/src/components/hooks/queries/useLinksQuery.ts
@@ -0,0 +1,17 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+import { usePagedQuery } from '../usePagedQuery';
+
+export function useLinksQuery({ teamId }: { teamId?: string }, options?: ReactQueryOptions) {
+ const { modified } = useModified('links');
+ const { get } = useApi();
+
+ return usePagedQuery({
+ queryKey: ['links', { teamId, modified }],
+ queryFn: pageParams => {
+ return get(teamId ? `/teams/${teamId}/links` : '/links', pageParams);
+ },
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useLoginQuery.ts b/src/components/hooks/queries/useLoginQuery.ts
new file mode 100644
index 0000000..a64b784
--- /dev/null
+++ b/src/components/hooks/queries/useLoginQuery.ts
@@ -0,0 +1,23 @@
+import { setUser, useApp } from '@/store/app';
+import { useApi } from '../useApi';
+
+const selector = (state: { user: any }) => state.user;
+
+export function useLoginQuery() {
+ const { post, useQuery } = useApi();
+ const user = useApp(selector);
+
+ const query = useQuery({
+ queryKey: ['login'],
+ queryFn: async () => {
+ const data = await post('/auth/verify');
+
+ setUser(data);
+
+ return data;
+ },
+ enabled: !user,
+ });
+
+ return { user, setUser, ...query };
+}
diff --git a/src/components/hooks/queries/usePixelQuery.ts b/src/components/hooks/queries/usePixelQuery.ts
new file mode 100644
index 0000000..7fd83c2
--- /dev/null
+++ b/src/components/hooks/queries/usePixelQuery.ts
@@ -0,0 +1,15 @@
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+
+export function usePixelQuery(pixelId: string) {
+ const { get, useQuery } = useApi();
+ const { modified } = useModified(`pixel:${pixelId}`);
+
+ return useQuery({
+ queryKey: ['pixel', { pixelId, modified }],
+ queryFn: () => {
+ return get(`/pixels/${pixelId}`);
+ },
+ enabled: !!pixelId,
+ });
+}
diff --git a/src/components/hooks/queries/usePixelsQuery.ts b/src/components/hooks/queries/usePixelsQuery.ts
new file mode 100644
index 0000000..c431179
--- /dev/null
+++ b/src/components/hooks/queries/usePixelsQuery.ts
@@ -0,0 +1,17 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+import { usePagedQuery } from '../usePagedQuery';
+
+export function usePixelsQuery({ teamId }: { teamId?: string }, options?: ReactQueryOptions) {
+ const { modified } = useModified('pixels');
+ const { get } = useApi();
+
+ return usePagedQuery({
+ queryKey: ['pixels', { teamId, modified }],
+ queryFn: pageParams => {
+ return get(teamId ? `/teams/${teamId}/pixels` : '/pixels', pageParams);
+ },
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useRealtimeQuery.ts b/src/components/hooks/queries/useRealtimeQuery.ts
new file mode 100644
index 0000000..1a5bd1c
--- /dev/null
+++ b/src/components/hooks/queries/useRealtimeQuery.ts
@@ -0,0 +1,17 @@
+import { REALTIME_INTERVAL } from '@/lib/constants';
+import type { RealtimeData } from '@/lib/types';
+import { useApi } from '../useApi';
+
+export function useRealtimeQuery(websiteId: string) {
+ const { get, useQuery } = useApi();
+ const { data, isLoading, error } = useQuery<RealtimeData>({
+ queryKey: ['realtime', { websiteId }],
+ queryFn: async () => {
+ return get(`/realtime/${websiteId}`);
+ },
+ enabled: !!websiteId,
+ refetchInterval: REALTIME_INTERVAL,
+ });
+
+ return { data, isLoading, error };
+}
diff --git a/src/components/hooks/queries/useReportQuery.ts b/src/components/hooks/queries/useReportQuery.ts
new file mode 100644
index 0000000..6973e2d
--- /dev/null
+++ b/src/components/hooks/queries/useReportQuery.ts
@@ -0,0 +1,15 @@
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+
+export function useReportQuery(reportId: string) {
+ const { get, useQuery } = useApi();
+ const { modified } = useModified(`report:${reportId}`);
+
+ return useQuery({
+ queryKey: ['report', { reportId, modified }],
+ queryFn: () => {
+ return get(`/reports/${reportId}`);
+ },
+ enabled: !!reportId,
+ });
+}
diff --git a/src/components/hooks/queries/useReportsQuery.ts b/src/components/hooks/queries/useReportsQuery.ts
new file mode 100644
index 0000000..ba1bdd4
--- /dev/null
+++ b/src/components/hooks/queries/useReportsQuery.ts
@@ -0,0 +1,19 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+import { usePagedQuery } from '../usePagedQuery';
+
+export function useReportsQuery(
+ { websiteId, type }: { websiteId: string; type?: string },
+ options?: ReactQueryOptions,
+) {
+ const { modified } = useModified(`reports:${type}`);
+ const { get } = useApi();
+
+ return usePagedQuery({
+ queryKey: ['reports', { websiteId, type, modified }],
+ queryFn: async () => get('/reports', { websiteId, type }),
+ enabled: !!websiteId && !!type,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useResultQuery.ts b/src/components/hooks/queries/useResultQuery.ts
new file mode 100644
index 0000000..c6fce12
--- /dev/null
+++ b/src/components/hooks/queries/useResultQuery.ts
@@ -0,0 +1,44 @@
+import { useDateParameters } from '@/components/hooks/useDateParameters';
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useFilterParameters } from '../useFilterParameters';
+
+export function useResultQuery<T = any>(
+ type: string,
+ params?: Record<string, any>,
+ options?: ReactQueryOptions<T>,
+) {
+ const { websiteId, ...parameters } = params;
+ const { post, useQuery } = useApi();
+ const { startDate, endDate, timezone } = useDateParameters();
+ const filters = useFilterParameters();
+
+ return useQuery<T>({
+ queryKey: [
+ 'reports',
+ {
+ type,
+ websiteId,
+ startDate,
+ endDate,
+ timezone,
+ ...params,
+ ...filters,
+ },
+ ],
+ queryFn: () =>
+ post(`/reports/${type}`, {
+ websiteId,
+ type,
+ filters,
+ parameters: {
+ startDate,
+ endDate,
+ timezone,
+ ...parameters,
+ },
+ }),
+ enabled: !!type,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useSessionActivityQuery.ts b/src/components/hooks/queries/useSessionActivityQuery.ts
new file mode 100644
index 0000000..d8d34ac
--- /dev/null
+++ b/src/components/hooks/queries/useSessionActivityQuery.ts
@@ -0,0 +1,21 @@
+import { useApi } from '../useApi';
+
+export function useSessionActivityQuery(
+ websiteId: string,
+ sessionId: string,
+ startDate: Date,
+ endDate: Date,
+) {
+ const { get, useQuery } = useApi();
+
+ return useQuery({
+ queryKey: ['session:activity', { websiteId, sessionId, startDate, endDate }],
+ queryFn: () => {
+ return get(`/websites/${websiteId}/sessions/${sessionId}/activity`, {
+ startAt: +new Date(startDate),
+ endAt: +new Date(endDate),
+ });
+ },
+ enabled: Boolean(websiteId && sessionId && startDate && endDate),
+ });
+}
diff --git a/src/components/hooks/queries/useSessionDataPropertiesQuery.ts b/src/components/hooks/queries/useSessionDataPropertiesQuery.ts
new file mode 100644
index 0000000..ac651bb
--- /dev/null
+++ b/src/components/hooks/queries/useSessionDataPropertiesQuery.ts
@@ -0,0 +1,27 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useDateParameters } from '../useDateParameters';
+import { useFilterParameters } from '../useFilterParameters';
+
+export function useSessionDataPropertiesQuery(websiteId: string, options?: ReactQueryOptions) {
+ const { get, useQuery } = useApi();
+ const { startAt, endAt, unit, timezone } = useDateParameters();
+ const filters = useFilterParameters();
+
+ return useQuery<any>({
+ queryKey: [
+ 'websites:session-data:properties',
+ { websiteId, startAt, endAt, unit, timezone, ...filters },
+ ],
+ queryFn: () =>
+ get(`/websites/${websiteId}/session-data/properties`, {
+ startAt,
+ endAt,
+ unit,
+ timezone,
+ ...filters,
+ }),
+ enabled: !!websiteId,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useSessionDataQuery.ts b/src/components/hooks/queries/useSessionDataQuery.ts
new file mode 100644
index 0000000..62b5398
--- /dev/null
+++ b/src/components/hooks/queries/useSessionDataQuery.ts
@@ -0,0 +1,12 @@
+import { useApi } from '../useApi';
+
+export function useSessionDataQuery(websiteId: string, sessionId: string) {
+ const { get, useQuery } = useApi();
+
+ return useQuery({
+ queryKey: ['session:data', { websiteId, sessionId }],
+ queryFn: () => {
+ return get(`/websites/${websiteId}/sessions/${sessionId}/properties`, { websiteId });
+ },
+ });
+}
diff --git a/src/components/hooks/queries/useSessionDataValuesQuery.ts b/src/components/hooks/queries/useSessionDataValuesQuery.ts
new file mode 100644
index 0000000..d5e180b
--- /dev/null
+++ b/src/components/hooks/queries/useSessionDataValuesQuery.ts
@@ -0,0 +1,32 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useDateParameters } from '../useDateParameters';
+import { useFilterParameters } from '../useFilterParameters';
+
+export function useSessionDataValuesQuery(
+ websiteId: string,
+ propertyName: string,
+ options?: ReactQueryOptions,
+) {
+ const { get, useQuery } = useApi();
+ const { startAt, endAt, unit, timezone } = useDateParameters();
+ const filters = useFilterParameters();
+
+ return useQuery<any>({
+ queryKey: [
+ 'websites:session-data:values',
+ { websiteId, propertyName, startAt, endAt, unit, timezone, ...filters },
+ ],
+ queryFn: () =>
+ get(`/websites/${websiteId}/session-data/values`, {
+ startAt,
+ endAt,
+ unit,
+ timezone,
+ ...filters,
+ propertyName,
+ }),
+ enabled: !!(websiteId && propertyName),
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useShareTokenQuery.ts b/src/components/hooks/queries/useShareTokenQuery.ts
new file mode 100644
index 0000000..dbad3dc
--- /dev/null
+++ b/src/components/hooks/queries/useShareTokenQuery.ts
@@ -0,0 +1,25 @@
+import { setShareToken, useApp } from '@/store/app';
+import { useApi } from '../useApi';
+
+const selector = (state: { shareToken: string }) => state.shareToken;
+
+export function useShareTokenQuery(shareId: string): {
+ shareToken: any;
+ isLoading?: boolean;
+ error?: Error;
+} {
+ const shareToken = useApp(selector);
+ const { get, useQuery } = useApi();
+ const { isLoading, error } = useQuery({
+ queryKey: ['share', shareId],
+ queryFn: async () => {
+ const data = await get(`/share/${shareId}`);
+
+ setShareToken(data);
+
+ return data;
+ },
+ });
+
+ return { shareToken, isLoading, error };
+}
diff --git a/src/components/hooks/queries/useTeamMembersQuery.ts b/src/components/hooks/queries/useTeamMembersQuery.ts
new file mode 100644
index 0000000..6f6f815
--- /dev/null
+++ b/src/components/hooks/queries/useTeamMembersQuery.ts
@@ -0,0 +1,16 @@
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+import { usePagedQuery } from '../usePagedQuery';
+
+export function useTeamMembersQuery(teamId: string) {
+ const { get } = useApi();
+ const { modified } = useModified(`teams:members`);
+
+ return usePagedQuery({
+ queryKey: ['teams:members', { teamId, modified }],
+ queryFn: (params: any) => {
+ return get(`/teams/${teamId}/users`, params);
+ },
+ enabled: !!teamId,
+ });
+}
diff --git a/src/components/hooks/queries/useTeamQuery.ts b/src/components/hooks/queries/useTeamQuery.ts
new file mode 100644
index 0000000..c076a6a
--- /dev/null
+++ b/src/components/hooks/queries/useTeamQuery.ts
@@ -0,0 +1,17 @@
+import { keepPreviousData } from '@tanstack/react-query';
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+
+export function useTeamQuery(teamId: string, options?: ReactQueryOptions) {
+ const { get, useQuery } = useApi();
+ const { modified } = useModified(`teams:${teamId}`);
+
+ return useQuery({
+ queryKey: ['teams', { teamId, modified }],
+ queryFn: () => get(`/teams/${teamId}`),
+ enabled: !!teamId,
+ placeholderData: keepPreviousData,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useTeamWebsitesQuery.ts b/src/components/hooks/queries/useTeamWebsitesQuery.ts
new file mode 100644
index 0000000..ffe601b
--- /dev/null
+++ b/src/components/hooks/queries/useTeamWebsitesQuery.ts
@@ -0,0 +1,15 @@
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+import { usePagedQuery } from '../usePagedQuery';
+
+export function useTeamWebsitesQuery(teamId: string) {
+ const { get } = useApi();
+ const { modified } = useModified(`websites`);
+
+ return usePagedQuery({
+ queryKey: ['teams:websites', { teamId, modified }],
+ queryFn: (params: any) => {
+ return get(`/teams/${teamId}/websites`, params);
+ },
+ });
+}
diff --git a/src/components/hooks/queries/useTeamsQuery.ts b/src/components/hooks/queries/useTeamsQuery.ts
new file mode 100644
index 0000000..f1a09f4
--- /dev/null
+++ b/src/components/hooks/queries/useTeamsQuery.ts
@@ -0,0 +1,20 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+import { usePagedQuery } from '../usePagedQuery';
+
+export function useTeamsQuery(params?: Record<string, any>, options?: ReactQueryOptions) {
+ const { get } = useApi();
+ const { modified } = useModified(`teams`);
+
+ return usePagedQuery({
+ queryKey: ['teams:admin', { modified, ...params }],
+ queryFn: pageParams => {
+ return get(`/admin/teams`, {
+ ...pageParams,
+ ...params,
+ });
+ },
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useUpdateQuery.ts b/src/components/hooks/queries/useUpdateQuery.ts
new file mode 100644
index 0000000..85a9442
--- /dev/null
+++ b/src/components/hooks/queries/useUpdateQuery.ts
@@ -0,0 +1,15 @@
+import { useToast } from '@umami/react-zen';
+import type { ApiError } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+
+export function useUpdateQuery(path: string, params?: Record<string, any>) {
+ const { post, useMutation } = useApi();
+ const query = useMutation<any, ApiError, Record<string, any>>({
+ mutationFn: (data: Record<string, any>) => post(path, { ...data, ...params }),
+ });
+ const { touch } = useModified();
+ const { toast } = useToast();
+
+ return { ...query, touch, toast };
+}
diff --git a/src/components/hooks/queries/useUserQuery.ts b/src/components/hooks/queries/useUserQuery.ts
new file mode 100644
index 0000000..07e23f0
--- /dev/null
+++ b/src/components/hooks/queries/useUserQuery.ts
@@ -0,0 +1,17 @@
+import { keepPreviousData } from '@tanstack/react-query';
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+
+export function useUserQuery(userId: string, options?: ReactQueryOptions) {
+ const { get, useQuery } = useApi();
+ const { modified } = useModified(`user:${userId}`);
+
+ return useQuery({
+ queryKey: ['users', { userId, modified }],
+ queryFn: () => get(`/users/${userId}`),
+ enabled: !!userId,
+ placeholderData: keepPreviousData,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useUserTeamsQuery.ts b/src/components/hooks/queries/useUserTeamsQuery.ts
new file mode 100644
index 0000000..82f6549
--- /dev/null
+++ b/src/components/hooks/queries/useUserTeamsQuery.ts
@@ -0,0 +1,15 @@
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+
+export function useUserTeamsQuery(userId: string) {
+ const { get, useQuery } = useApi();
+ const { modified } = useModified(`teams`);
+
+ return useQuery({
+ queryKey: ['teams', { userId, modified }],
+ queryFn: () => {
+ return get(`/users/${userId}/teams`);
+ },
+ enabled: !!userId,
+ });
+}
diff --git a/src/components/hooks/queries/useUserWebsitesQuery.ts b/src/components/hooks/queries/useUserWebsitesQuery.ts
new file mode 100644
index 0000000..f98eaff
--- /dev/null
+++ b/src/components/hooks/queries/useUserWebsitesQuery.ts
@@ -0,0 +1,31 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+import { usePagedQuery } from '../usePagedQuery';
+
+export function useUserWebsitesQuery(
+ { userId, teamId }: { userId?: string; teamId?: string },
+ params?: Record<string, any>,
+ options?: ReactQueryOptions,
+) {
+ const { get } = useApi();
+ const { modified } = useModified(`websites`);
+
+ return usePagedQuery({
+ queryKey: ['websites', { userId, teamId, modified, ...params }],
+ queryFn: pageParams => {
+ return get(
+ teamId
+ ? `/teams/${teamId}/websites`
+ : userId
+ ? `/users/${userId}/websites`
+ : '/me/websites',
+ {
+ ...pageParams,
+ ...params,
+ },
+ );
+ },
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useUsersQuery.ts b/src/components/hooks/queries/useUsersQuery.ts
new file mode 100644
index 0000000..d87900b
--- /dev/null
+++ b/src/components/hooks/queries/useUsersQuery.ts
@@ -0,0 +1,17 @@
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+import { usePagedQuery } from '../usePagedQuery';
+
+export function useUsersQuery() {
+ const { get } = useApi();
+ const { modified } = useModified(`users`);
+
+ return usePagedQuery({
+ queryKey: ['users:admin', { modified }],
+ queryFn: (pageParams: any) => {
+ return get('/admin/users', {
+ ...pageParams,
+ });
+ },
+ });
+}
diff --git a/src/components/hooks/queries/useWebsiteCohortQuery.ts b/src/components/hooks/queries/useWebsiteCohortQuery.ts
new file mode 100644
index 0000000..975766e
--- /dev/null
+++ b/src/components/hooks/queries/useWebsiteCohortQuery.ts
@@ -0,0 +1,21 @@
+import { keepPreviousData } from '@tanstack/react-query';
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+
+export function useWebsiteCohortQuery(
+ websiteId: string,
+ cohortId: string,
+ options?: ReactQueryOptions,
+) {
+ const { get, useQuery } = useApi();
+ const { modified } = useModified(`cohorts`);
+
+ return useQuery({
+ queryKey: ['website:cohorts', { websiteId, cohortId, modified }],
+ queryFn: () => get(`/websites/${websiteId}/segments/${cohortId}`),
+ enabled: !!(websiteId && cohortId),
+ placeholderData: keepPreviousData,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useWebsiteCohortsQuery.ts b/src/components/hooks/queries/useWebsiteCohortsQuery.ts
new file mode 100644
index 0000000..e0cbf4c
--- /dev/null
+++ b/src/components/hooks/queries/useWebsiteCohortsQuery.ts
@@ -0,0 +1,25 @@
+import { keepPreviousData } from '@tanstack/react-query';
+import { useFilterParameters } from '@/components/hooks/useFilterParameters';
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+
+export function useWebsiteCohortsQuery(
+ websiteId: string,
+ params?: Record<string, string>,
+ options?: ReactQueryOptions,
+) {
+ const { get, useQuery } = useApi();
+ const { modified } = useModified(`cohorts`);
+ const filters = useFilterParameters();
+
+ return useQuery({
+ queryKey: ['website:cohorts', { websiteId, modified, ...filters, ...params }],
+ queryFn: pageParams => {
+ return get(`/websites/${websiteId}/segments`, { ...pageParams, ...filters, ...params });
+ },
+ enabled: !!websiteId,
+ placeholderData: keepPreviousData,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useWebsiteEventsQuery.ts b/src/components/hooks/queries/useWebsiteEventsQuery.ts
new file mode 100644
index 0000000..fc4dad5
--- /dev/null
+++ b/src/components/hooks/queries/useWebsiteEventsQuery.ts
@@ -0,0 +1,39 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useDateParameters } from '../useDateParameters';
+import { useFilterParameters } from '../useFilterParameters';
+import { usePagedQuery } from '../usePagedQuery';
+
+const EVENT_TYPES = {
+ views: 1,
+ events: 2,
+};
+
+export function useWebsiteEventsQuery(
+ websiteId: string,
+ params?: Record<string, any>,
+ options?: ReactQueryOptions,
+) {
+ const { get } = useApi();
+ const { startAt, endAt, unit, timezone } = useDateParameters();
+ const filters = useFilterParameters();
+
+ return usePagedQuery({
+ queryKey: [
+ 'websites:events',
+ { websiteId, startAt, endAt, unit, timezone, ...filters, ...params },
+ ],
+ queryFn: pageParams =>
+ get(`/websites/${websiteId}/events`, {
+ startAt,
+ endAt,
+ unit,
+ timezone,
+ ...filters,
+ ...pageParams,
+ eventType: EVENT_TYPES[params.view],
+ }),
+ enabled: !!websiteId,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useWebsiteEventsSeriesQuery.ts b/src/components/hooks/queries/useWebsiteEventsSeriesQuery.ts
new file mode 100644
index 0000000..6c1d112
--- /dev/null
+++ b/src/components/hooks/queries/useWebsiteEventsSeriesQuery.ts
@@ -0,0 +1,18 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useDateParameters } from '../useDateParameters';
+import { useFilterParameters } from '../useFilterParameters';
+
+export function useWebsiteEventsSeriesQuery(websiteId: string, options?: ReactQueryOptions) {
+ const { get, useQuery } = useApi();
+ const { startAt, endAt, unit, timezone } = useDateParameters();
+ const filters = useFilterParameters();
+
+ return useQuery({
+ queryKey: ['websites:events:series', { websiteId, startAt, endAt, unit, timezone, ...filters }],
+ queryFn: () =>
+ get(`/websites/${websiteId}/events/series`, { startAt, endAt, unit, timezone, ...filters }),
+ enabled: !!websiteId,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useWebsiteExpandedMetricsQuery.ts b/src/components/hooks/queries/useWebsiteExpandedMetricsQuery.ts
new file mode 100644
index 0000000..b2e9019
--- /dev/null
+++ b/src/components/hooks/queries/useWebsiteExpandedMetricsQuery.ts
@@ -0,0 +1,51 @@
+import { keepPreviousData } from '@tanstack/react-query';
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useDateParameters } from '../useDateParameters';
+import { useFilterParameters } from '../useFilterParameters';
+
+export type WebsiteExpandedMetricsData = {
+ name: string;
+ pageviews: number;
+ visitors: number;
+ visits: number;
+ bounces: number;
+ totaltime: number;
+}[];
+
+export function useWebsiteExpandedMetricsQuery(
+ websiteId: string,
+ params: { type: string; limit?: number; search?: string },
+ options?: ReactQueryOptions<WebsiteExpandedMetricsData>,
+) {
+ const { get, useQuery } = useApi();
+ const { startAt, endAt, unit, timezone } = useDateParameters();
+ const filters = useFilterParameters();
+
+ return useQuery<WebsiteExpandedMetricsData>({
+ queryKey: [
+ 'websites:metrics:expanded',
+ {
+ websiteId,
+ startAt,
+ endAt,
+ unit,
+ timezone,
+ ...filters,
+ ...params,
+ },
+ ],
+ queryFn: async () =>
+ get(`/websites/${websiteId}/metrics/expanded`, {
+ startAt,
+ endAt,
+ unit,
+ timezone,
+ ...filters,
+ ...params,
+ }),
+ enabled: !!websiteId,
+ placeholderData: keepPreviousData,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useWebsiteMetricsQuery.ts b/src/components/hooks/queries/useWebsiteMetricsQuery.ts
new file mode 100644
index 0000000..67c5e4d
--- /dev/null
+++ b/src/components/hooks/queries/useWebsiteMetricsQuery.ts
@@ -0,0 +1,47 @@
+import { keepPreviousData } from '@tanstack/react-query';
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useDateParameters } from '../useDateParameters';
+import { useFilterParameters } from '../useFilterParameters';
+
+export type WebsiteMetricsData = {
+ x: string;
+ y: number;
+}[];
+
+export function useWebsiteMetricsQuery(
+ websiteId: string,
+ params: { type: string; limit?: number; search?: string },
+ options?: ReactQueryOptions<WebsiteMetricsData>,
+) {
+ const { get, useQuery } = useApi();
+ const { startAt, endAt, unit, timezone } = useDateParameters();
+ const filters = useFilterParameters();
+
+ return useQuery<WebsiteMetricsData>({
+ queryKey: [
+ 'websites:metrics',
+ {
+ websiteId,
+ startAt,
+ endAt,
+ unit,
+ timezone,
+ ...filters,
+ ...params,
+ },
+ ],
+ queryFn: async () =>
+ get(`/websites/${websiteId}/metrics`, {
+ startAt,
+ endAt,
+ unit,
+ timezone,
+ ...filters,
+ ...params,
+ }),
+ enabled: !!websiteId,
+ placeholderData: keepPreviousData,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useWebsitePageviewsQuery.ts b/src/components/hooks/queries/useWebsitePageviewsQuery.ts
new file mode 100644
index 0000000..b35c820
--- /dev/null
+++ b/src/components/hooks/queries/useWebsitePageviewsQuery.ts
@@ -0,0 +1,36 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useDateParameters } from '../useDateParameters';
+import { useFilterParameters } from '../useFilterParameters';
+
+export interface WebsitePageviewsData {
+ pageviews: { x: string; y: number }[];
+ sessions: { x: string; y: number }[];
+}
+
+export function useWebsitePageviewsQuery(
+ { websiteId, compare }: { websiteId: string; compare?: string },
+ options?: ReactQueryOptions<WebsitePageviewsData>,
+) {
+ const { get, useQuery } = useApi();
+ const { startAt, endAt, unit, timezone } = useDateParameters();
+ const queryParams = useFilterParameters();
+
+ return useQuery<WebsitePageviewsData>({
+ queryKey: [
+ 'websites:pageviews',
+ { websiteId, compare, startAt, endAt, unit, timezone, ...queryParams },
+ ],
+ queryFn: () =>
+ get(`/websites/${websiteId}/pageviews`, {
+ compare,
+ startAt,
+ endAt,
+ unit,
+ timezone,
+ ...queryParams,
+ }),
+ enabled: !!websiteId,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useWebsiteQuery.ts b/src/components/hooks/queries/useWebsiteQuery.ts
new file mode 100644
index 0000000..b9a5533
--- /dev/null
+++ b/src/components/hooks/queries/useWebsiteQuery.ts
@@ -0,0 +1,17 @@
+import { keepPreviousData } from '@tanstack/react-query';
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+
+export function useWebsiteQuery(websiteId: string, options?: ReactQueryOptions) {
+ const { get, useQuery } = useApi();
+ const { modified } = useModified(`website:${websiteId}`);
+
+ return useQuery({
+ queryKey: ['website', { websiteId, modified }],
+ queryFn: () => get(`/websites/${websiteId}`),
+ enabled: !!websiteId,
+ placeholderData: keepPreviousData,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useWebsiteSegmentQuery.ts b/src/components/hooks/queries/useWebsiteSegmentQuery.ts
new file mode 100644
index 0000000..1923fbd
--- /dev/null
+++ b/src/components/hooks/queries/useWebsiteSegmentQuery.ts
@@ -0,0 +1,21 @@
+import { keepPreviousData } from '@tanstack/react-query';
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+
+export function useWebsiteSegmentQuery(
+ websiteId: string,
+ segmentId: string,
+ options?: ReactQueryOptions,
+) {
+ const { get, useQuery } = useApi();
+ const { modified } = useModified(`segments`);
+
+ return useQuery({
+ queryKey: ['website:segments', { websiteId, segmentId, modified }],
+ queryFn: () => get(`/websites/${websiteId}/segments/${segmentId}`),
+ enabled: !!(websiteId && segmentId),
+ placeholderData: keepPreviousData,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useWebsiteSegmentsQuery.ts b/src/components/hooks/queries/useWebsiteSegmentsQuery.ts
new file mode 100644
index 0000000..8d3af96
--- /dev/null
+++ b/src/components/hooks/queries/useWebsiteSegmentsQuery.ts
@@ -0,0 +1,24 @@
+import { keepPreviousData } from '@tanstack/react-query';
+import { useFilterParameters } from '@/components/hooks/useFilterParameters';
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+
+export function useWebsiteSegmentsQuery(
+ websiteId: string,
+ params?: Record<string, string>,
+ options?: ReactQueryOptions,
+) {
+ const { get, useQuery } = useApi();
+ const { modified } = useModified(`segments`);
+ const filters = useFilterParameters();
+
+ return useQuery({
+ queryKey: ['website:segments', { websiteId, modified, ...filters, ...params }],
+ queryFn: pageParams =>
+ get(`/websites/${websiteId}/segments`, { ...pageParams, ...filters, ...params }),
+ enabled: !!websiteId,
+ placeholderData: keepPreviousData,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useWebsiteSessionQuery.ts b/src/components/hooks/queries/useWebsiteSessionQuery.ts
new file mode 100644
index 0000000..21e9491
--- /dev/null
+++ b/src/components/hooks/queries/useWebsiteSessionQuery.ts
@@ -0,0 +1,13 @@
+import { useApi } from '../useApi';
+
+export function useWebsiteSessionQuery(websiteId: string, sessionId: string) {
+ const { get, useQuery } = useApi();
+
+ return useQuery({
+ queryKey: ['session', { websiteId, sessionId }],
+ queryFn: () => {
+ return get(`/websites/${websiteId}/sessions/${sessionId}`);
+ },
+ enabled: Boolean(websiteId && sessionId),
+ });
+}
diff --git a/src/components/hooks/queries/useWebsiteSessionStatsQuery.ts b/src/components/hooks/queries/useWebsiteSessionStatsQuery.ts
new file mode 100644
index 0000000..bac9fc9
--- /dev/null
+++ b/src/components/hooks/queries/useWebsiteSessionStatsQuery.ts
@@ -0,0 +1,17 @@
+import { useApi } from '../useApi';
+import { useDateParameters } from '../useDateParameters';
+import { useFilterParameters } from '../useFilterParameters';
+
+export function useWebsiteSessionStatsQuery(websiteId: string, options?: Record<string, string>) {
+ const { get, useQuery } = useApi();
+ const { startAt, endAt, unit, timezone } = useDateParameters();
+ const filters = useFilterParameters();
+
+ return useQuery({
+ queryKey: ['sessions:stats', { websiteId, startAt, endAt, unit, timezone, ...filters }],
+ queryFn: () =>
+ get(`/websites/${websiteId}/sessions/stats`, { startAt, endAt, unit, timezone, ...filters }),
+ enabled: !!websiteId,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useWebsiteSessionsQuery.ts b/src/components/hooks/queries/useWebsiteSessionsQuery.ts
new file mode 100644
index 0000000..31906be
--- /dev/null
+++ b/src/components/hooks/queries/useWebsiteSessionsQuery.ts
@@ -0,0 +1,34 @@
+import { useApi } from '../useApi';
+import { useDateParameters } from '../useDateParameters';
+import { useFilterParameters } from '../useFilterParameters';
+import { useModified } from '../useModified';
+import { usePagedQuery } from '../usePagedQuery';
+
+export function useWebsiteSessionsQuery(
+ websiteId: string,
+ params?: Record<string, string | number>,
+) {
+ const { get } = useApi();
+ const { modified } = useModified(`sessions`);
+ const { startAt, endAt, unit, timezone } = useDateParameters();
+ const filters = useFilterParameters();
+
+ return usePagedQuery({
+ queryKey: [
+ 'sessions',
+ { websiteId, modified, startAt, endAt, unit, timezone, ...params, ...filters },
+ ],
+ queryFn: pageParams => {
+ return get(`/websites/${websiteId}/sessions`, {
+ startAt,
+ endAt,
+ unit,
+ timezone,
+ ...filters,
+ ...pageParams,
+ ...params,
+ pageSize: 20,
+ });
+ },
+ });
+}
diff --git a/src/components/hooks/queries/useWebsiteStatsQuery.ts b/src/components/hooks/queries/useWebsiteStatsQuery.ts
new file mode 100644
index 0000000..e9a0c48
--- /dev/null
+++ b/src/components/hooks/queries/useWebsiteStatsQuery.ts
@@ -0,0 +1,36 @@
+import type { UseQueryOptions } from '@tanstack/react-query';
+import { useDateParameters } from '@/components/hooks/useDateParameters';
+import { useApi } from '../useApi';
+import { useFilterParameters } from '../useFilterParameters';
+
+export interface WebsiteStatsData {
+ pageviews: number;
+ visitors: number;
+ visits: number;
+ bounces: number;
+ totaltime: number;
+ comparison: {
+ pageviews: number;
+ visitors: number;
+ visits: number;
+ bounces: number;
+ totaltime: number;
+ };
+}
+
+export function useWebsiteStatsQuery(
+ websiteId: string,
+ options?: UseQueryOptions<WebsiteStatsData, Error, WebsiteStatsData>,
+) {
+ const { get, useQuery } = useApi();
+ const { startAt, endAt, unit, timezone } = useDateParameters();
+ const filters = useFilterParameters();
+
+ return useQuery<WebsiteStatsData>({
+ queryKey: ['websites:stats', { websiteId, startAt, endAt, unit, timezone, ...filters }],
+ queryFn: () =>
+ get(`/websites/${websiteId}/stats`, { startAt, endAt, unit, timezone, ...filters }),
+ enabled: !!websiteId,
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useWebsiteValuesQuery.ts b/src/components/hooks/queries/useWebsiteValuesQuery.ts
new file mode 100644
index 0000000..1e09736
--- /dev/null
+++ b/src/components/hooks/queries/useWebsiteValuesQuery.ts
@@ -0,0 +1,62 @@
+import { useCountryNames } from '@/components/hooks/useCountryNames';
+import { useRegionNames } from '@/components/hooks/useRegionNames';
+import { useApi } from '../useApi';
+import { useLocale } from '../useLocale';
+
+export function useWebsiteValuesQuery({
+ websiteId,
+ type,
+ startDate,
+ endDate,
+ search,
+}: {
+ websiteId: string;
+ type: string;
+ startDate: Date;
+ endDate: Date;
+ search?: string;
+}) {
+ const { get, useQuery } = useApi();
+ const { locale } = useLocale();
+ const { countryNames } = useCountryNames(locale);
+ const { regionNames } = useRegionNames(locale);
+
+ const names = {
+ country: countryNames,
+ region: regionNames,
+ };
+
+ const getSearch = (type: string, value: string) => {
+ if (value) {
+ const values = names[type];
+
+ if (values) {
+ return (
+ Object.keys(values)
+ .reduce((arr: string[], key: string) => {
+ if (values[key].toLowerCase().includes(value.toLowerCase())) {
+ return arr.concat(key);
+ }
+ return arr;
+ }, [])
+ .slice(0, 5)
+ .join(',') || value
+ );
+ }
+
+ return value;
+ }
+ };
+
+ return useQuery({
+ queryKey: ['websites:values', { websiteId, type, startDate, endDate, search }],
+ queryFn: () =>
+ get(`/websites/${websiteId}/values`, {
+ type,
+ startAt: +startDate,
+ endAt: +endDate,
+ search: getSearch(type, search),
+ }),
+ enabled: !!(websiteId && type && startDate && endDate),
+ });
+}
diff --git a/src/components/hooks/queries/useWebsitesQuery.ts b/src/components/hooks/queries/useWebsitesQuery.ts
new file mode 100644
index 0000000..a7b6618
--- /dev/null
+++ b/src/components/hooks/queries/useWebsitesQuery.ts
@@ -0,0 +1,20 @@
+import type { ReactQueryOptions } from '@/lib/types';
+import { useApi } from '../useApi';
+import { useModified } from '../useModified';
+import { usePagedQuery } from '../usePagedQuery';
+
+export function useWebsitesQuery(params?: Record<string, any>, options?: ReactQueryOptions) {
+ const { get } = useApi();
+ const { modified } = useModified(`websites`);
+
+ return usePagedQuery({
+ queryKey: ['websites:admin', { modified, ...params }],
+ queryFn: pageParams => {
+ return get(`/admin/websites`, {
+ ...pageParams,
+ ...params,
+ });
+ },
+ ...options,
+ });
+}
diff --git a/src/components/hooks/queries/useWeeklyTrafficQuery.ts b/src/components/hooks/queries/useWeeklyTrafficQuery.ts
new file mode 100644
index 0000000..a76ebb3
--- /dev/null
+++ b/src/components/hooks/queries/useWeeklyTrafficQuery.ts
@@ -0,0 +1,28 @@
+import { useFilterParameters } from '@/components/hooks/useFilterParameters';
+import { useApi } from '../useApi';
+import { useDateParameters } from '../useDateParameters';
+import { useModified } from '../useModified';
+
+export function useWeeklyTrafficQuery(websiteId: string, params?: Record<string, string | number>) {
+ const { get, useQuery } = useApi();
+ const { modified } = useModified(`sessions`);
+ const { startAt, endAt, unit, timezone } = useDateParameters();
+ const filters = useFilterParameters();
+
+ return useQuery({
+ queryKey: [
+ 'sessions',
+ { websiteId, modified, startAt, endAt, unit, timezone, ...params, ...filters },
+ ],
+ queryFn: () => {
+ return get(`/websites/${websiteId}/sessions/weekly`, {
+ startAt,
+ endAt,
+ unit,
+ timezone,
+ ...params,
+ ...filters,
+ });
+ },
+ });
+}