Sifa professional network frontend (Next.js, React, TailwindCSS)
sifa.id/
1export interface EventInsightsData {
2 slug: string;
3 generatedAt: string;
4 attendeeCount: number;
5 pdsDistribution: PdsDistributionEntry[];
6 didMethodSplit: DidMethodEntry[];
7 accountAgeDistribution: AccountAgeBucket[];
8 ecosystemRoles: EcosystemRoleEntry[];
9 connectionGraph: ConnectionGraphData;
10 postTimeline: PostTimelineBucket[];
11 clientDiversity: ClientDiversityEntry[];
12 summary: InsightsSummary;
13}
14
15export interface PdsDistributionEntry {
16 host: string;
17 count: number;
18 isSelfHosted: boolean;
19}
20
21export interface DidMethodEntry {
22 method: string;
23 count: number;
24}
25
26export interface AccountAgeBucket {
27 label: string;
28 count: number;
29}
30
31export interface EcosystemRoleEntry {
32 role: string;
33 count: number;
34}
35
36export interface ConnectionGraphData {
37 nodes: ConnectionNode[];
38 edges: ConnectionEdge[];
39}
40
41export interface ConnectionNode {
42 did: string;
43 handle: string;
44 displayName: string;
45 avatar: string | null;
46 degree: number;
47}
48
49export interface ConnectionEdge {
50 source: string;
51 target: string;
52 mutual: boolean;
53}
54
55export interface PostTimelineBucket {
56 timestamp: string;
57 posts: number;
58 replies: number;
59 reposts: number;
60}
61
62export interface ClientDiversityEntry {
63 client: string;
64 count: number;
65}
66
67export interface InsightsSummary {
68 attendeesTracked: number;
69 pdsProviderCount: number;
70 totalPosts: number;
71 connectedPercentage: number;
72}
73
74const API_URL = process.env.NEXT_PUBLIC_API_URL ?? 'https://api.sifa.id';
75
76export async function fetchEventInsights(slug: string): Promise<EventInsightsData | null> {
77 try {
78 const res = await fetch(`${API_URL}/api/events/${slug}/insights`, {
79 next: { revalidate: 3600, tags: [`event-insights-${slug}`] },
80 signal: AbortSignal.timeout(5000),
81 });
82 if (!res.ok) return null;
83 return (await res.json()) as EventInsightsData;
84 } catch {
85 return null;
86 }
87}