From 0e5e59ad793739eb1b1591968bfc245f7f39c461 Mon Sep 17 00:00:00 2001 From: Yash Date: Sun, 7 Dec 2025 17:28:00 +0530 Subject: [PATCH 1/6] Add UniqueSessions component to display unique session count --- .../websites/[websiteId]/WebsiteControls.tsx | 4 ++- src/components/metrics/UniqueSessions.tsx | 30 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 src/components/metrics/UniqueSessions.tsx diff --git a/src/app/(main)/websites/[websiteId]/WebsiteControls.tsx b/src/app/(main)/websites/[websiteId]/WebsiteControls.tsx index 6223dbc0..084ac114 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteControls.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteControls.tsx @@ -4,6 +4,7 @@ import { FilterBar } from '@/components/input/FilterBar'; import { MonthFilter } from '@/components/input/MonthFilter'; import { WebsiteDateFilter } from '@/components/input/WebsiteDateFilter'; import { WebsiteFilterButton } from '@/components/input/WebsiteFilterButton'; +import UniqueSessions from '@/components/metrics/UniqueSessions'; export function WebsiteControls({ websiteId, @@ -23,8 +24,9 @@ export function WebsiteControls({ return ( - + {allowFilter ? :
} + {allowDateFilter && ( diff --git a/src/components/metrics/UniqueSessions.tsx b/src/components/metrics/UniqueSessions.tsx new file mode 100644 index 00000000..536ba5c4 --- /dev/null +++ b/src/components/metrics/UniqueSessions.tsx @@ -0,0 +1,30 @@ +import { Container, Text } from '@umami/react-zen'; +import { useMemo } from 'react'; +import { useWebsiteEventsQuery } from '@/components/hooks'; + +const UniqueSessions = ({ websiteId }) => { + const query = useWebsiteEventsQuery(websiteId, { view: 'all' }); + + const uniqueSessionCount = useMemo(() => { + if (!query?.data?.data) return 0; + + const uniqueSessions = new Set(query.data.data.map((event: any) => event.sessionId)); + + return uniqueSessions.size; + }, [query?.data?.data]); + + return ( + + + {' '} + Unique Sessions:{' '} + + + {' '} + {uniqueSessionCount}{' '} + + + ); +}; + +export default UniqueSessions; From 49c31c1e2c7974a7e9f01e609401d8bbe4edf018 Mon Sep 17 00:00:00 2001 From: Yash Date: Sun, 7 Dec 2025 17:42:53 +0530 Subject: [PATCH 2/6] Refactor UniqueSessions component for improved formatting --- src/components/metrics/UniqueSessions.tsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/components/metrics/UniqueSessions.tsx b/src/components/metrics/UniqueSessions.tsx index 536ba5c4..d39405a6 100644 --- a/src/components/metrics/UniqueSessions.tsx +++ b/src/components/metrics/UniqueSessions.tsx @@ -16,12 +16,11 @@ const UniqueSessions = ({ websiteId }) => { return ( - {' '} - Unique Sessions:{' '} + Unique Sessions: - + {' '} - {uniqueSessionCount}{' '} + {uniqueSessionCount} ); From f7b902cfd9b43e24e52beb864cf58fd4117bd6d8 Mon Sep 17 00:00:00 2001 From: Yash Date: Fri, 23 Jan 2026 23:16:29 +0530 Subject: [PATCH 3/6] fix: unique session count --- src/components/metrics/UniqueSessions.tsx | 40 +++++++++++++++-------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/src/components/metrics/UniqueSessions.tsx b/src/components/metrics/UniqueSessions.tsx index d39405a6..8f0cba3b 100644 --- a/src/components/metrics/UniqueSessions.tsx +++ b/src/components/metrics/UniqueSessions.tsx @@ -1,27 +1,39 @@ -import { Container, Text } from '@umami/react-zen'; -import { useMemo } from 'react'; -import { useWebsiteEventsQuery } from '@/components/hooks'; +import { Container, Loading, Text } from '@umami/react-zen'; +import { useWebsiteStatsQuery } from '@/components/hooks'; -const UniqueSessions = ({ websiteId }) => { - const query = useWebsiteEventsQuery(websiteId, { view: 'all' }); +interface UniqueSessionsProps { + websiteId: string; +} - const uniqueSessionCount = useMemo(() => { - if (!query?.data?.data) return 0; +const UniqueSessions = ({ websiteId }: UniqueSessionsProps) => { + const { data, isLoading, error } = useWebsiteStatsQuery(websiteId); - const uniqueSessions = new Set(query.data.data.map((event: any) => event.sessionId)); + const renderContent = () => { + if (isLoading) { + return ; + } - return uniqueSessions.size; - }, [query?.data?.data]); + if (error) { + return ( + + Error loading data + + ); + } + + return ( + + {data?.visitors ?? 0} + + ); + }; return ( Unique Sessions: - - {' '} - {uniqueSessionCount} - + {renderContent()} ); }; From 7b7c0e1e2cfdefa24447348a4d8dcfc8c6c8825c Mon Sep 17 00:00:00 2001 From: Yash Date: Fri, 23 Jan 2026 23:30:57 +0530 Subject: [PATCH 4/6] replaced Container with the Row --- src/components/metrics/UniqueSessions.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/metrics/UniqueSessions.tsx b/src/components/metrics/UniqueSessions.tsx index 8f0cba3b..77673040 100644 --- a/src/components/metrics/UniqueSessions.tsx +++ b/src/components/metrics/UniqueSessions.tsx @@ -1,4 +1,4 @@ -import { Container, Loading, Text } from '@umami/react-zen'; +import { Loading, Row, Text } from '@umami/react-zen'; import { useWebsiteStatsQuery } from '@/components/hooks'; interface UniqueSessionsProps { @@ -22,19 +22,19 @@ const UniqueSessions = ({ websiteId }: UniqueSessionsProps) => { } return ( - + {data?.visitors ?? 0} ); }; return ( - + Unique Sessions: {renderContent()} - + ); }; From 1a0e20ebb2d66148a43363a27be60641d1568efe Mon Sep 17 00:00:00 2001 From: Yash Date: Fri, 23 Jan 2026 23:36:44 +0530 Subject: [PATCH 5/6] Update src/components/metrics/UniqueSessions.tsx Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --- src/components/metrics/UniqueSessions.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/metrics/UniqueSessions.tsx b/src/components/metrics/UniqueSessions.tsx index 77673040..fb35b30c 100644 --- a/src/components/metrics/UniqueSessions.tsx +++ b/src/components/metrics/UniqueSessions.tsx @@ -31,7 +31,7 @@ const UniqueSessions = ({ websiteId }: UniqueSessionsProps) => { return ( - Unique Sessions: + {formatMessage(labels.visitors)}: {renderContent()} From 2ed8ff3a79cc5cb020653d02887b1f6dc3606834 Mon Sep 17 00:00:00 2001 From: Yash Date: Fri, 23 Jan 2026 23:46:29 +0530 Subject: [PATCH 6/6] renamed the component UniqueSessions to UniqueVisitors --- src/app/(main)/websites/[websiteId]/WebsiteControls.tsx | 4 ++-- .../metrics/{UniqueSessions.tsx => UniqueVisitors.tsx} | 9 +++++---- 2 files changed, 7 insertions(+), 6 deletions(-) rename src/components/metrics/{UniqueSessions.tsx => UniqueVisitors.tsx} (72%) diff --git a/src/app/(main)/websites/[websiteId]/WebsiteControls.tsx b/src/app/(main)/websites/[websiteId]/WebsiteControls.tsx index 084ac114..3d8103a0 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteControls.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteControls.tsx @@ -4,7 +4,7 @@ import { FilterBar } from '@/components/input/FilterBar'; import { MonthFilter } from '@/components/input/MonthFilter'; import { WebsiteDateFilter } from '@/components/input/WebsiteDateFilter'; import { WebsiteFilterButton } from '@/components/input/WebsiteFilterButton'; -import UniqueSessions from '@/components/metrics/UniqueSessions'; +import UniqueVisitors from '@/components/metrics/UniqueVisitors'; export function WebsiteControls({ websiteId, @@ -26,7 +26,7 @@ export function WebsiteControls({ {allowFilter ? :
} - + {allowDateFilter && ( diff --git a/src/components/metrics/UniqueSessions.tsx b/src/components/metrics/UniqueVisitors.tsx similarity index 72% rename from src/components/metrics/UniqueSessions.tsx rename to src/components/metrics/UniqueVisitors.tsx index fb35b30c..91505738 100644 --- a/src/components/metrics/UniqueSessions.tsx +++ b/src/components/metrics/UniqueVisitors.tsx @@ -1,12 +1,13 @@ import { Loading, Row, Text } from '@umami/react-zen'; -import { useWebsiteStatsQuery } from '@/components/hooks'; +import { useMessages, useWebsiteStatsQuery } from '@/components/hooks'; -interface UniqueSessionsProps { +interface UniqueVisitorsProps { websiteId: string; } -const UniqueSessions = ({ websiteId }: UniqueSessionsProps) => { +const UniqueVisitors = ({ websiteId }: UniqueVisitorsProps) => { const { data, isLoading, error } = useWebsiteStatsQuery(websiteId); + const { formatMessage, labels } = useMessages(); const renderContent = () => { if (isLoading) { @@ -38,4 +39,4 @@ const UniqueSessions = ({ websiteId }: UniqueSessionsProps) => { ); }; -export default UniqueSessions; +export default UniqueVisitors;