mirror of
https://github.com/kremalicious/umami.git
synced 2025-02-06 01:15:42 +01:00
update websitesession, add session duration
This commit is contained in:
parent
3646039e54
commit
136dd6794e
@ -1,15 +1,31 @@
|
|||||||
import MetricCard from 'components/metrics/MetricCard';
|
|
||||||
import { useMessages } from 'components/hooks';
|
import { useMessages } from 'components/hooks';
|
||||||
|
import MetricCard from 'components/metrics/MetricCard';
|
||||||
import MetricsBar from 'components/metrics/MetricsBar';
|
import MetricsBar from 'components/metrics/MetricsBar';
|
||||||
|
import { formatShortTime } from 'lib/format';
|
||||||
|
|
||||||
export function SessionStats({ data }) {
|
export function SessionStats({ data }) {
|
||||||
const { formatMessage, labels } = useMessages();
|
const { formatMessage, labels } = useMessages();
|
||||||
|
const duration = (new Date(data?.lastAt).getTime() - new Date(data?.firstAt).getTime()) / 1000;
|
||||||
|
let dateFormat;
|
||||||
|
|
||||||
|
if (duration > 86400) {
|
||||||
|
dateFormat = ['d', 'm'];
|
||||||
|
} else if (duration > 3600) {
|
||||||
|
dateFormat = ['h', 'm'];
|
||||||
|
} else {
|
||||||
|
dateFormat = ['m', 's'];
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<MetricsBar isFetched={true}>
|
<MetricsBar isFetched={true}>
|
||||||
<MetricCard label={formatMessage(labels.visits)} value={data?.visits} />
|
<MetricCard label={formatMessage(labels.visits)} value={data?.visits} />
|
||||||
<MetricCard label={formatMessage(labels.views)} value={data?.views} />
|
<MetricCard label={formatMessage(labels.views)} value={data?.views} />
|
||||||
<MetricCard label={formatMessage(labels.events)} value={data?.events} />
|
<MetricCard label={formatMessage(labels.events)} value={data?.events} />
|
||||||
|
<MetricCard
|
||||||
|
label={formatMessage(labels.sessionDuration)}
|
||||||
|
value={duration}
|
||||||
|
formatValue={n => `${+n < 0 ? '-' : ''}${formatShortTime(Math.abs(~~n), dateFormat, ' ')}`}
|
||||||
|
/>
|
||||||
</MetricsBar>
|
</MetricsBar>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -141,6 +141,7 @@ export const labels = defineMessages({
|
|||||||
bounceRate: { id: 'label.bounce-rate', defaultMessage: 'Bounce rate' },
|
bounceRate: { id: 'label.bounce-rate', defaultMessage: 'Bounce rate' },
|
||||||
viewsPerVisit: { id: 'label.views-per-visit', defaultMessage: 'Views per visit' },
|
viewsPerVisit: { id: 'label.views-per-visit', defaultMessage: 'Views per visit' },
|
||||||
visitDuration: { id: 'label.visit-duration', defaultMessage: 'Visit duration' },
|
visitDuration: { id: 'label.visit-duration', defaultMessage: 'Visit duration' },
|
||||||
|
sessionDuration: { id: 'label.session-duration', defaultMessage: 'Session duration' },
|
||||||
desktop: { id: 'label.desktop', defaultMessage: 'Desktop' },
|
desktop: { id: 'label.desktop', defaultMessage: 'Desktop' },
|
||||||
laptop: { id: 'label.laptop', defaultMessage: 'Laptop' },
|
laptop: { id: 'label.laptop', defaultMessage: 'Laptop' },
|
||||||
tablet: { id: 'label.tablet', defaultMessage: 'Tablet' },
|
tablet: { id: 'label.tablet', defaultMessage: 'Tablet' },
|
||||||
|
@ -18,17 +18,17 @@ export async function fetchWebsite(websiteId: string): Promise<Website> {
|
|||||||
return website;
|
return website;
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function fetchSession(sessionId: string): Promise<Session> {
|
export async function fetchSession(websiteId: string, sessionId: string): Promise<Session> {
|
||||||
let session = null;
|
let session = null;
|
||||||
|
|
||||||
if (redis.enabled) {
|
if (redis.enabled) {
|
||||||
session = await redis.client.fetch(
|
session = await redis.client.fetch(
|
||||||
`session:${sessionId}`,
|
`session:${sessionId}`,
|
||||||
() => getWebsiteSession(sessionId),
|
() => getWebsiteSession(websiteId, sessionId),
|
||||||
86400,
|
86400,
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
session = await getWebsiteSession(sessionId);
|
session = await getWebsiteSession(websiteId, sessionId);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!session) {
|
if (!session) {
|
||||||
|
@ -62,7 +62,7 @@ export async function getSession(req: NextApiRequestCollect): Promise<SessionDat
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Find session
|
// Find session
|
||||||
let session = await fetchSession(sessionId);
|
let session = await fetchSession(websiteId, sessionId);
|
||||||
|
|
||||||
// Create a session if not found
|
// Create a session if not found
|
||||||
if (!session) {
|
if (!session) {
|
||||||
|
@ -40,8 +40,8 @@ export default async (
|
|||||||
const data = await getSessionActivity(
|
const data = await getSessionActivity(
|
||||||
websiteId,
|
websiteId,
|
||||||
sessionId,
|
sessionId,
|
||||||
new Date(startDate),
|
new Date(startDate + 'Z'),
|
||||||
new Date(endDate),
|
new Date(endDate + 'Z'),
|
||||||
);
|
);
|
||||||
|
|
||||||
return ok(res, data);
|
return ok(res, data);
|
||||||
|
@ -47,7 +47,7 @@ async function clickhouseQuery(websiteId: string, filters: QueryFilters, pagePar
|
|||||||
min(created_at) as firstAt,
|
min(created_at) as firstAt,
|
||||||
max(created_at) as lastAt,
|
max(created_at) as lastAt,
|
||||||
uniq(visit_id) as visits,
|
uniq(visit_id) as visits,
|
||||||
count(*) as views
|
sumIf(1, event_type = 1) as views
|
||||||
from website_event
|
from website_event
|
||||||
where website_id = {websiteId:UUID}
|
where website_id = {websiteId:UUID}
|
||||||
${dateQuery}
|
${dateQuery}
|
||||||
|
Loading…
Reference in New Issue
Block a user