Skip to content

Commit 757ba00

Browse files
committed
chore: wip
1 parent ab392a9 commit 757ba00

3 files changed

Lines changed: 159 additions & 71 deletions

File tree

Lines changed: 58 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,17 @@
11
/**
22
* Analytics Composable
3-
*
4-
* Provides data fetching for analytics dashboard pages.
53
*/
6-
74
import { ref } from '@stacksjs/stx'
85

96
const baseUrl = import.meta.env.VITE_API_URL || 'http://localhost:3008'
107

118
export 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

2417
export 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

4357
export 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
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/**
2+
* Realtime Composable
3+
*/
4+
import { ref } from '@stacksjs/stx'
5+
6+
const baseUrl = import.meta.env.VITE_API_URL || 'http://localhost:3008'
7+
8+
export interface RealtimeStats {
9+
connectionsTriggered: number
10+
connectionsChange: number
11+
avgLatency: string
12+
latencyChange: number
13+
successRate: string
14+
successChange: number
15+
}
16+
17+
export interface ActiveConnection {
18+
id: string
19+
client: string
20+
status: string
21+
uptime: string
22+
messages: number
23+
}
24+
25+
export function useRealtimeStats() {
26+
const stats = ref<RealtimeStats>({ connectionsTriggered: 0, connectionsChange: 0, avgLatency: '0ms', latencyChange: 0, successRate: '0%', successChange: 0 })
27+
const activeConnections = ref<ActiveConnection[]>([])
28+
const isLoading = ref(false)
29+
const error = ref<string | null>(null)
30+
31+
async function fetchStats() {
32+
isLoading.value = true
33+
error.value = null
34+
try {
35+
const response = await fetch(`${baseUrl}/realtime/stats`, {
36+
headers: { 'Accept': 'application/json' },
37+
})
38+
if (response.ok) {
39+
const data = await response.json()
40+
stats.value = data.stats || stats.value
41+
activeConnections.value = data.activeConnections || []
42+
}
43+
} catch (e) {
44+
error.value = 'Failed to load realtime stats.'
45+
console.error('Failed to fetch realtime stats:', e)
46+
} finally {
47+
isLoading.value = false
48+
}
49+
}
50+
51+
return { stats, activeConnections, isLoading, error, fetchStats }
52+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/**
2+
* Releases Composable
3+
*/
4+
import { ref } from '@stacksjs/stx'
5+
6+
const baseUrl = import.meta.env.VITE_API_URL || 'http://localhost:3008'
7+
8+
export interface Release {
9+
version: string
10+
codename: string
11+
size: string
12+
path: string
13+
createdAt: string
14+
}
15+
16+
export interface ReleaseStats {
17+
labels: string[]
18+
downloads: number[]
19+
releaseTimes: number[]
20+
}
21+
22+
export function useReleases() {
23+
const releases = ref<Release[]>([])
24+
const stats = ref<ReleaseStats>({ labels: [], downloads: [], releaseTimes: [] })
25+
const isLoading = ref(false)
26+
const error = ref<string | null>(null)
27+
28+
async function fetchAll() {
29+
isLoading.value = true
30+
error.value = null
31+
try {
32+
const response = await fetch(`${baseUrl}/releases`, {
33+
headers: { 'Accept': 'application/json' },
34+
})
35+
if (response.ok) {
36+
const data = await response.json()
37+
releases.value = data.data || []
38+
stats.value = data.stats || stats.value
39+
}
40+
} catch (e) {
41+
error.value = 'Failed to load releases.'
42+
console.error('Failed to fetch releases:', e)
43+
} finally {
44+
isLoading.value = false
45+
}
46+
}
47+
48+
return { releases, stats, isLoading, error, fetchAll }
49+
}

0 commit comments

Comments
 (0)