11/**
22 * Analytics Composable
3- *
4- * Provides data fetching for analytics dashboard pages.
53 */
6-
74import { ref } from '@stacksjs/stx'
85
96const baseUrl = import . meta. env . VITE_API_URL || 'http://localhost:3008'
107
118export interface AnalyticsOverview {
12- totalVisitors : string
13- totalPageViews : string
14- avgSessionDuration : string
9+ realtime : number
10+ people : number
11+ views : number
12+ avgTimeOnSite : string
1513 bounceRate : string
16- trends : {
17- visitors : number
18- pageViews : number
19- sessionDuration : number
20- bounceRate : number
21- }
14+ eventCompletions : number
2215}
2316
2417export interface TrafficDataPoint {
@@ -27,84 +20,78 @@ export interface TrafficDataPoint {
2720 pageViews : number
2821}
2922
30- const defaultOverview : AnalyticsOverview = {
31- totalVisitors : '0' ,
32- totalPageViews : '0' ,
33- avgSessionDuration : '0s' ,
34- bounceRate : '0%' ,
35- trends : {
36- visitors : 0 ,
37- pageViews : 0 ,
38- sessionDuration : 0 ,
39- bounceRate : 0 ,
40- } ,
23+ export interface PageData {
24+ path : string
25+ entries : number
26+ visitors : number
27+ views : number
28+ percentage : number
29+ }
30+
31+ export interface ReferrerData {
32+ name : string
33+ visitors : number
34+ views : number
35+ percentage : number
36+ }
37+
38+ export interface DeviceData {
39+ name : string
40+ visitors : number
41+ percentage : number
42+ }
43+
44+ export interface BrowserData {
45+ name : string
46+ visitors : number
47+ percentage : number
48+ }
49+
50+ export interface CountryData {
51+ name : string
52+ visitors : number
53+ percentage : number
54+ flag : string
4155}
4256
4357export function useAnalytics ( ) {
44- const overview = ref < AnalyticsOverview > ( defaultOverview )
58+ const overview = ref < AnalyticsOverview > ( { realtime : 0 , people : 0 , views : 0 , avgTimeOnSite : '0s' , bounceRate : '0%' , eventCompletions : 0 } )
4559 const trafficData = ref < TrafficDataPoint [ ] > ( [ ] )
60+ const pagesData = ref < PageData [ ] > ( [ ] )
61+ const referrersData = ref < ReferrerData [ ] > ( [ ] )
62+ const devicesData = ref < DeviceData [ ] > ( [ ] )
63+ const browsersData = ref < BrowserData [ ] > ( [ ] )
64+ const countriesData = ref < CountryData [ ] > ( [ ] )
4665 const isLoading = ref ( false )
4766 const error = ref < string | null > ( null )
4867
49- async function fetchOverview ( dateRange = '7d' ) {
50- try {
51- const response = await fetch ( `${ baseUrl } /analytics/overview?range=${ dateRange } ` , {
52- headers : { 'Accept' : 'application/json' } ,
53- } )
54-
55- if ( response . ok ) {
56- const data = await response . json ( )
57- overview . value = data . overview || defaultOverview
58- }
59- }
60- catch ( e ) {
61- console . error ( 'Failed to fetch analytics overview:' , e )
62- throw e
63- }
64- }
65-
66- async function fetchTraffic ( dateRange = '7d' ) {
68+ async function fetchAll ( dateRange = '7d' ) {
69+ isLoading . value = true
70+ error . value = null
6771 try {
68- const response = await fetch ( `${ baseUrl } /analytics/traffic ?range=${ dateRange } ` , {
72+ const response = await fetch ( `${ baseUrl } /analytics/web ?range=${ dateRange } ` , {
6973 headers : { 'Accept' : 'application/json' } ,
7074 } )
71-
7275 if ( response . ok ) {
7376 const data = await response . json ( )
77+ overview . value = data . overview || overview . value
7478 trafficData . value = data . traffic || [ ]
79+ pagesData . value = data . pages || [ ]
80+ referrersData . value = data . referrers || [ ]
81+ devicesData . value = data . devices || [ ]
82+ browsersData . value = data . browsers || [ ]
83+ countriesData . value = data . countries || [ ]
7584 }
76- }
77- catch ( e ) {
78- console . error ( 'Failed to fetch traffic data:' , e )
79- throw e
80- }
81- }
82-
83- async function fetchAll ( dateRange = '7d' ) {
84- isLoading . value = true
85- error . value = null
86-
87- try {
88- await Promise . all ( [
89- fetchOverview ( dateRange ) ,
90- fetchTraffic ( dateRange ) ,
91- ] )
92- }
93- catch ( e ) {
85+ } catch ( e ) {
9486 error . value = 'Failed to load analytics data.'
95- }
96- finally {
87+ console . error ( 'Failed to fetch analytics:' , e )
88+ } finally {
9789 isLoading . value = false
9890 }
9991 }
10092
10193 return {
102- overview,
103- trafficData,
104- isLoading,
105- error,
106- fetchOverview,
107- fetchTraffic,
108- fetchAll,
94+ overview, trafficData, pagesData, referrersData, devicesData, browsersData, countriesData,
95+ isLoading, error, fetchAll,
10996 }
11097}
0 commit comments