forked from Cylo-Traders/Agrocylo-PIP
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathuseCampaignAnalytics.ts
More file actions
71 lines (63 loc) · 2.07 KB
/
Copy pathuseCampaignAnalytics.ts
File metadata and controls
71 lines (63 loc) · 2.07 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
import { useEffect, useState } from 'react';
import { loadRecentEscrowEvents } from '../lib/soroban/events';
import {
computeAnalyticsMetrics,
type AnalyticsMetrics,
} from '../lib/analytics/metrics';
const RPC_URL = import.meta.env.VITE_SOROBAN_RPC_URL || undefined;
const CONTRACT_ID =
import.meta.env.VITE_PRODUCTION_ESCROW_CONTRACT_ID || undefined;
const DEFAULT_LOOKBACK_LEDGERS = 120_000;
const LOOKBACK_LEDGERS = (() => {
const parsed = Number(import.meta.env.VITE_SOROBAN_EVENTS_LOOKBACK_LEDGERS);
return Number.isFinite(parsed) && parsed > 0
? parsed
: DEFAULT_LOOKBACK_LEDGERS;
})();
export type AnalyticsState =
| { status: 'not-configured' }
| { status: 'loading' }
| { status: 'error'; message: string }
| { status: 'ready'; metrics: AnalyticsMetrics };
/**
* Loads ProductionEscrowContract events directly from Soroban RPC and derives
* chart-ready analytics metrics client-side. Requires VITE_SOROBAN_RPC_URL and
* VITE_PRODUCTION_ESCROW_CONTRACT_ID to be configured (see client/.env.example);
* without them this resolves to `not-configured` rather than failing.
*/
export function useCampaignAnalytics(): AnalyticsState {
const [state, setState] = useState<AnalyticsState>(
RPC_URL && CONTRACT_ID
? { status: 'loading' }
: { status: 'not-configured' },
);
useEffect(() => {
if (!RPC_URL || !CONTRACT_ID) return;
let cancelled = false;
async function load() {
try {
const events = await loadRecentEscrowEvents({
rpcUrl: RPC_URL!,
contractId: CONTRACT_ID!,
lookbackLedgers: LOOKBACK_LEDGERS,
});
if (cancelled) return;
setState({ status: 'ready', metrics: computeAnalyticsMetrics(events) });
} catch (error) {
if (cancelled) return;
setState({
status: 'error',
message:
error instanceof Error
? error.message
: 'Failed to load analytics data from Soroban RPC.',
});
}
}
void load();
return () => {
cancelled = true;
};
}, []);
return state;
}