@ossy/analytics 1.9.7 → 1.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +3 -2
- package/src/Definition.js +1 -7
- package/src/analytics.page.jsx +20 -21
- package/src/en.translations.json +15 -0
- package/src/sv.translations.json +15 -0
- package/src/usePageViewStats.js +10 -20
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ossy/analytics",
|
|
3
3
|
"description": "Analytics module — workspace analytics for website traffic",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.10.1",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./src/index.js",
|
|
7
7
|
"module": "./src/index.js",
|
|
@@ -23,8 +23,9 @@
|
|
|
23
23
|
],
|
|
24
24
|
"peerDependencies": {
|
|
25
25
|
"@ossy/design-system": "*",
|
|
26
|
+
"@ossy/resources": "*",
|
|
26
27
|
"@ossy/sdk-react": "*",
|
|
27
28
|
"react": "*"
|
|
28
29
|
},
|
|
29
|
-
"gitHead": "
|
|
30
|
+
"gitHead": "c0ba5d90749690634e4dc2705178ff8d89dd3070"
|
|
30
31
|
}
|
package/src/Definition.js
CHANGED
|
@@ -2,12 +2,6 @@ export const Definition = {
|
|
|
2
2
|
id: 'analytics',
|
|
3
3
|
title: 'Analytics',
|
|
4
4
|
description: 'Workspace analytics for website traffic and top performing pages.',
|
|
5
|
-
|
|
6
|
-
id: 'analytics',
|
|
7
|
-
enabled: true,
|
|
8
|
-
},
|
|
5
|
+
icon: 'chart',
|
|
9
6
|
statuses: ['beta'],
|
|
10
|
-
actions: ['analytics.read'],
|
|
11
|
-
views: ['home.page'],
|
|
12
|
-
tasks: [],
|
|
13
7
|
}
|
package/src/analytics.page.jsx
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import React, { useMemo } from 'react'
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { Text, Title, View } from '@ossy/design-system'
|
|
2
|
+
import { GetWorkspace } from '@ossy/workspaces'
|
|
3
|
+
import { useSdk } from '@ossy/sdk-react'
|
|
4
|
+
import { Text, Title, View, useLocale } from '@ossy/design-system'
|
|
5
5
|
import { usePageViewStats } from './usePageViewStats.js'
|
|
6
6
|
|
|
7
7
|
export const metadata = {
|
|
8
8
|
id: 'analytics/home',
|
|
9
|
-
title: 'Analytics',
|
|
10
9
|
path: {
|
|
11
10
|
sv: '/analys',
|
|
12
11
|
en: '/analytics',
|
|
@@ -28,12 +27,12 @@ function SummaryCard({ label, value }) {
|
|
|
28
27
|
}
|
|
29
28
|
|
|
30
29
|
export default function AnalyticsPage() {
|
|
31
|
-
const {
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
const { t } = useLocale()
|
|
31
|
+
const sdk = useSdk()
|
|
32
|
+
const { data: workspace } = sdk.read(GetWorkspace)
|
|
34
33
|
const { from, to } = useMemo(() => {
|
|
35
|
-
const
|
|
36
|
-
return { from:
|
|
34
|
+
const now = Date.now()
|
|
35
|
+
return { from: now - 30 * 24 * 60 * 60 * 1000, to: now }
|
|
37
36
|
}, [])
|
|
38
37
|
|
|
39
38
|
const { status, totalViews, dailyViews, topPaths } = usePageViewStats({
|
|
@@ -46,28 +45,28 @@ export default function AnalyticsPage() {
|
|
|
46
45
|
return (
|
|
47
46
|
<View inset="l" gap="l" style={{ width: '100%', boxSizing: 'border-box' }}>
|
|
48
47
|
<View gap="s">
|
|
49
|
-
<Title>{
|
|
50
|
-
<Text>{
|
|
48
|
+
<Title>{t('analytics.home.title')}</Title>
|
|
49
|
+
<Text>{t('analytics.home.description')}</Text>
|
|
51
50
|
</View>
|
|
52
51
|
|
|
53
52
|
{status === 'loading' && (
|
|
54
53
|
<View surface="primary" roundness="m" inset="m">
|
|
55
|
-
<Text>
|
|
54
|
+
<Text>{t('analytics.home.loading')}</Text>
|
|
56
55
|
</View>
|
|
57
56
|
)}
|
|
58
57
|
|
|
59
58
|
{status === 'error' && (
|
|
60
59
|
<View surface="primary" roundness="m" inset="m">
|
|
61
|
-
<Text>
|
|
60
|
+
<Text>{t('analytics.home.error')}</Text>
|
|
62
61
|
</View>
|
|
63
62
|
)}
|
|
64
63
|
|
|
65
64
|
{status === 'success' && (
|
|
66
65
|
<>
|
|
67
66
|
<View layout="row" gap="m">
|
|
68
|
-
<SummaryCard label=
|
|
69
|
-
<SummaryCard label=
|
|
70
|
-
<SummaryCard label=
|
|
67
|
+
<SummaryCard label={t('analytics.home.totalPageViews')} value={`${totalViews}`} />
|
|
68
|
+
<SummaryCard label={t('analytics.home.trackedPages')} value={`${topPaths.length}`} />
|
|
69
|
+
<SummaryCard label={t('analytics.home.daysWithTraffic')} value={`${dailyViews.length}`} />
|
|
71
70
|
</View>
|
|
72
71
|
|
|
73
72
|
<View layout="row" gap="m" style={{ alignItems: 'flex-start' }}>
|
|
@@ -78,11 +77,11 @@ export default function AnalyticsPage() {
|
|
|
78
77
|
gap="s"
|
|
79
78
|
style={{ border: '1px solid var(--separator)', flex: 1 }}
|
|
80
79
|
>
|
|
81
|
-
<Title variant="secondary">
|
|
82
|
-
{topPaths.length === 0 && <Text variant="small">
|
|
80
|
+
<Title variant="secondary">{t('analytics.home.topPaths')}</Title>
|
|
81
|
+
{topPaths.length === 0 && <Text variant="small">{t('analytics.home.noPageViews')}</Text>}
|
|
83
82
|
{topPaths.map((item) => (
|
|
84
83
|
<View key={item.path || 'unknown'} layout="row" justifyContent="space-between">
|
|
85
|
-
<Text variant="small">{item.path || '
|
|
84
|
+
<Text variant="small">{item.path || t('analytics.home.unknownPath')}</Text>
|
|
86
85
|
<Text variant="small">{item.views}</Text>
|
|
87
86
|
</View>
|
|
88
87
|
))}
|
|
@@ -95,8 +94,8 @@ export default function AnalyticsPage() {
|
|
|
95
94
|
gap="s"
|
|
96
95
|
style={{ border: '1px solid var(--separator)', flex: 1 }}
|
|
97
96
|
>
|
|
98
|
-
<Title variant="secondary">
|
|
99
|
-
{dailyViews.length === 0 && <Text variant="small">
|
|
97
|
+
<Title variant="secondary">{t('analytics.home.dailyPageViews')}</Title>
|
|
98
|
+
{dailyViews.length === 0 && <Text variant="small">{t('analytics.home.noDailyData')}</Text>}
|
|
100
99
|
{dailyViews.map((item) => (
|
|
101
100
|
<View key={item.date} layout="row" justifyContent="space-between">
|
|
102
101
|
<Text variant="small">{item.date}</Text>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"analytics/home.documentTitle": "Analytics",
|
|
3
|
+
"analytics.home.title": "Analytics",
|
|
4
|
+
"analytics.home.description": "Workspace analytics for website traffic and top performing pages.",
|
|
5
|
+
"analytics.home.loading": "Loading analytics...",
|
|
6
|
+
"analytics.home.error": "Could not load analytics data.",
|
|
7
|
+
"analytics.home.totalPageViews": "Total page views (30 days)",
|
|
8
|
+
"analytics.home.trackedPages": "Tracked pages (30 days)",
|
|
9
|
+
"analytics.home.daysWithTraffic": "Days with traffic",
|
|
10
|
+
"analytics.home.topPaths": "Top paths",
|
|
11
|
+
"analytics.home.noPageViews": "No page views yet.",
|
|
12
|
+
"analytics.home.unknownPath": "(unknown path)",
|
|
13
|
+
"analytics.home.dailyPageViews": "Daily page views",
|
|
14
|
+
"analytics.home.noDailyData": "No daily data yet."
|
|
15
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"analytics/home.documentTitle": "Analys",
|
|
3
|
+
"analytics.home.title": "Analys",
|
|
4
|
+
"analytics.home.description": "Workspace-analys för webbtrafik och mest besökta sidor.",
|
|
5
|
+
"analytics.home.loading": "Laddar analys...",
|
|
6
|
+
"analytics.home.error": "Kunde inte ladda analysdata.",
|
|
7
|
+
"analytics.home.totalPageViews": "Totala sidvisningar (30 dagar)",
|
|
8
|
+
"analytics.home.trackedPages": "Spårade sidor (30 dagar)",
|
|
9
|
+
"analytics.home.daysWithTraffic": "Dagar med trafik",
|
|
10
|
+
"analytics.home.topPaths": "Topp-sökvägar",
|
|
11
|
+
"analytics.home.noPageViews": "Inga sidvisningar ännu.",
|
|
12
|
+
"analytics.home.unknownPath": "(okänd sökväg)",
|
|
13
|
+
"analytics.home.dailyPageViews": "Dagliga sidvisningar",
|
|
14
|
+
"analytics.home.noDailyData": "Ingen daglig data ännu."
|
|
15
|
+
}
|
package/src/usePageViewStats.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { useEffect, useMemo, useState } from 'react'
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
import { GetPageViewStats } from '@ossy/resources'
|
|
3
|
+
import { useSdk } from '@ossy/sdk-react'
|
|
4
4
|
|
|
5
5
|
export function usePageViewStats({ workspaceId, from, to, limit = 10 }) {
|
|
6
|
+
const sdk = useSdk()
|
|
6
7
|
const [status, setStatus] = useState('loading')
|
|
7
8
|
const [data, setData] = useState({
|
|
8
9
|
totalViews: 0,
|
|
@@ -10,28 +11,17 @@ export function usePageViewStats({ workspaceId, from, to, limit = 10 }) {
|
|
|
10
11
|
topPaths: [],
|
|
11
12
|
})
|
|
12
13
|
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
return sp.toString()
|
|
19
|
-
}, [from, to, limit])
|
|
14
|
+
const payload = useMemo(() => ({
|
|
15
|
+
from,
|
|
16
|
+
to,
|
|
17
|
+
limit,
|
|
18
|
+
}), [from, to, limit])
|
|
20
19
|
|
|
21
20
|
useEffect(() => {
|
|
22
21
|
if (!workspaceId) return
|
|
23
22
|
|
|
24
23
|
setStatus('loading')
|
|
25
|
-
|
|
26
|
-
method: 'GET',
|
|
27
|
-
headers: {
|
|
28
|
-
workspaceId,
|
|
29
|
-
},
|
|
30
|
-
})
|
|
31
|
-
.then(res => {
|
|
32
|
-
if (!res.ok) return Promise.reject(new Error('Failed to fetch stats'))
|
|
33
|
-
return res.json()
|
|
34
|
-
})
|
|
24
|
+
sdk.invoke(GetPageViewStats, payload)
|
|
35
25
|
.then(json => {
|
|
36
26
|
setData({
|
|
37
27
|
totalViews: json?.totalViews || 0,
|
|
@@ -43,7 +33,7 @@ export function usePageViewStats({ workspaceId, from, to, limit = 10 }) {
|
|
|
43
33
|
.catch(() => {
|
|
44
34
|
setStatus('error')
|
|
45
35
|
})
|
|
46
|
-
}, [workspaceId,
|
|
36
|
+
}, [sdk, workspaceId, payload])
|
|
47
37
|
|
|
48
38
|
return {
|
|
49
39
|
status,
|