Sifa professional network frontend (Next.js, React, TailwindCSS) sifa.id/
at main 87 lines 1.9 kB view raw
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}