forked from StellarSplit/StellarSplit
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathuseAnalytics.ts
More file actions
41 lines (36 loc) · 1.34 KB
/
Copy pathuseAnalytics.ts
File metadata and controls
41 lines (36 loc) · 1.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import { useState, useCallback } from "react";
import type { AnalyticsData, DateRange } from "../types/analytics";
import { fetchAnalyticsBundle } from "../utils/analytics-api";
import type { AnalyticsMode, AnalyticsSource } from "../services/analyticsDataProvider";
import { useAbortableRequest } from "./useAbortableRequest";
interface UseAnalyticsReturn {
data: AnalyticsData | null;
source: AnalyticsSource | null;
loading: boolean;
error: string | null;
dateRange: DateRange;
setDateRange: (range: DateRange) => void;
refetch: () => void;
}
function defaultDateRange(): DateRange {
const to = new Date();
const from = new Date();
from.setMonth(from.getMonth() - 6);
return {
dateFrom: from.toISOString().slice(0, 10),
dateTo: to.toISOString().slice(0, 10),
};
}
export function useAnalytics(mode: AnalyticsMode = "hybrid"): UseAnalyticsReturn {
const [dateRange, setDateRange] = useState<DateRange>(defaultDateRange);
const [source, setSource] = useState<AnalyticsSource | null>(null);
const { data, loading, error, refetch } = useAbortableRequest(
async (_signal: AbortSignal) => {
const result = await fetchAnalyticsBundle(dateRange, mode);
setSource(result.source);
return result.data;
},
[dateRange, mode],
);
return { data, source, loading, error, dateRange, setDateRange, refetch };
}