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
77 lines (70 loc) · 1.99 KB
/
Copy pathuseAnalytics.ts
File metadata and controls
77 lines (70 loc) · 1.99 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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import { useState, useEffect, useCallback } from "react";
import type { AnalyticsData, DateRange } from "../types/analytics";
import {
fetchSpendingTrends,
fetchCategoryBreakdown,
fetchTopPartners,
fetchDebtBalances,
fetchHeatmapData,
fetchTimeDistribution,
} from "../utils/analytics-api";
interface UseAnalyticsReturn {
data: AnalyticsData | 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(): UseAnalyticsReturn {
const [dateRange, setDateRange] = useState<DateRange>(defaultDateRange);
const [data, setData] = useState<AnalyticsData | null>(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState<string | null>(null);
const loadData = useCallback(async () => {
setLoading(true);
setError(null);
try {
const [
spendingTrends,
categoryBreakdown,
topPartners,
debtBalances,
heatmapData,
timeDistribution,
] = await Promise.all([
fetchSpendingTrends(dateRange),
fetchCategoryBreakdown(dateRange),
fetchTopPartners(dateRange),
fetchDebtBalances(),
fetchHeatmapData(dateRange),
fetchTimeDistribution(dateRange),
]);
setData({
spendingTrends,
categoryBreakdown,
topPartners,
debtBalances,
heatmapData,
timeDistribution,
});
} catch (err) {
setError(err instanceof Error ? err.message : "Failed to load analytics");
} finally {
setLoading(false);
}
}, [dateRange]);
useEffect(() => {
loadData();
}, [loadData]);
return { data, loading, error, dateRange, setDateRange, refetch: loadData };
}