2 lines
14 KiB
JavaScript
2 lines
14 KiB
JavaScript
|
|
import{a as l,j as e}from"./vendor-react-YMhRUmcb.js";import{a as y,l as S,m as I,d as E,B as u,C as g}from"./index-D2uzyr9g.js";import{aW as _,al as M,Y as V,D as U,w as $,aC as G,az as z,au as D,m as B,aX as F,aY as Y,r as K}from"./vendor-icons-DINCNwpk.js";import{S as h}from"./StatCard-Xzk79Siz.js";import{S as i}from"./skeleton-BPDNnZ8E.js";import"./vendor-fFnFILYR.js";import"./vendor-router-DX94Iu-2.js";import"./vendor-tanstack-CoFNL2zy.js";import"./vendor-utils-4BWoYre8.js";const k={total_users:12500,total_tracks:3420,total_plays:1205430,total_revenue:14250.5,followers:24500,profile_views:45200,trends:{plays:8.2,revenue:12.5,followers:2.1,views:-2.4},sparklines:{plays:[40,35,50,60,55,70,80,75,90],revenue:[10,12,15,14,18,20,22,25,28],followers:[20,21,21,22,22,23,23,24,24],views:[50,48,45,42,40,43,41,40,38]}},C=[{id:"t1",title:"Neon Nights",plays:15420,change:12,revenue:145.5},{id:"t2",title:"Cyber City",plays:12100,change:-5,revenue:98.2},{id:"t3",title:"System Failure",plays:8500,change:24,revenue:65},{id:"t4",title:"Mainframe",plays:6200,change:8,revenue:42.1}],p={recordEvent:async(s,a)=>{try{await y.post("/analytics/events",{event_name:s,payload:a||{}})}catch{}},getGlobalStats:async(s="30d")=>{try{const a=await y.get("/analytics",{params:{days:s.replace("d","")}});return!a.data||Object.keys(a.data).length===0?k:{...k,...a.data}}catch(a){return S.error("[Analytics] Failed to fetch global stats",{error:a}),k}},getTopTracks:async(s="30d")=>{try{const a=await y.get("/analytics/tracks/top",{params:{days:s.replace("d","")}});return!a.data||a.data.length===0?C:a.data}catch(a){return S.error("[Analytics] Failed to fetch top tracks",{error:a}),C}},getTrafficSources:async()=>[{label:"Direct",val:45,color:"bg-kodo-cyan"},{label:"Social Media",val:30,color:"bg-kodo-magenta"},{label:"Search",val:15,color:"bg-kodo-lime"},{label:"Referral",val:10,color:"bg-kodo-gold"}],getDeviceBreakdown:async()=>({mobile:65,desktop:35})};function H(s="30d"){const{addToast:a}=I(),[t,o]=l.useState(s),[r,n]=l.useState({}),[c,f]=l.useState([]),[b,v]=l.useState([]),[m,j]=l.useState({mobile:0,desktop:0}),[R,T]=l.useState(!0),[L,O]=l.useState(null),A=l.useCallback(async()=>{T(!0);try{const[d,w,N,x]=await Promise.all([p.getGlobalStats(t),p.getTopTracks(t),p.getTrafficSources(),p.getDeviceBreakdown()]);n(d),f(w??[]),v(N??[]),j(x??{mobile:0,desktop:0})}catch(d){S.error("Error loading analytics",{error:d})}finally{T(!1)}},[t]);l.useEffect(()=>{A()},[A]);const P=l.useCallback(d=>{a(`Building ${d.toUpperCase()} archive...`,"info"),setTimeout(()=>{const w=new Blob([JSON.stringify(r,null,2)],{type:"application/json"}),N=URL.createObjectURL(w),x=document.createElement("a");x.href=N,x.download=`veza-analytics-${t}-${new Date().toISOString().split("T")[0]}.${d}`,x.click(),a("Data packet exported successfully","success")},1500)},[r,t,a]);return{dateRange:t,setDateRange:o,stats:r,topTracks:c,trafficSources:b,deviceStats:m,loading:R,hoveredData:L,setHoveredData:O,handleExport:P}}const J=["7d","30d","90d","ytd"];function q({dateRange:s,onDateRangeChange:a,onExportCsv:t,onExportJson:o}){return e.jsxs("div",{className:"flex flex-col lg:flex-row justify-between items-start lg:items-end gap-6 border-b border-white/5 pb-8",children:[e.jsxs("div",{children:[e.jsxs("h1",{className:"text-4xl font-display font-bold text-white mb-2 flex items-center gap-3",children:[e.jsx(_,{className:"text-primary w-8 h-8"})," NEURAL ANALYTICS"]}),e.jsx("p",{className:"text-muted-foreground font-mono text-xs tracking-wide",children:"DEEP PACKET INSPECTION • AUDIENCE METRICS"})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("div",{className:"bg-black/40 p-1 rounded-xl border border-white/10 backdrop-blur-md flex",children:J.map(r=>e.jsx("button",{type:"button",onClick:()=>a(r),className:E("px-4 py-2 rounded-lg text-xs font-bold uppercase tracking-widest transition-all",s===r?"bg-primary text-black shadow-glow-cyan":"text-muted-foreground hover:text-white"),children:r},r))}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(u,{variant:"outline",size:"sm",
|