diff --git a/src/app/(main)/websites/[websiteId]/WebsiteChartList.tsx b/src/app/(main)/websites/[websiteId]/WebsiteChartList.tsx index b27f9870d..e1a1ed81d 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteChartList.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteChartList.tsx @@ -1,12 +1,13 @@ -import { Button, Text, Icon, Icons } from 'react-basics'; -import { useMemo } from 'react'; -import { firstBy } from 'thenby'; -import Link from 'next/link'; -import WebsiteChart from './WebsiteChart'; +import { useLocale, useMessages, useTeamUrl } from '@/components/hooks'; import useDashboard from '@/store/dashboard'; +import Link from 'next/link'; +import { useMemo } from 'react'; +import { Button, Icon, Icons, Text } from 'react-basics'; +import { firstBy } from 'thenby'; +import WebsiteChart from './WebsiteChart'; import WebsiteHeader from './WebsiteHeader'; +import { WebsiteMetrics } from './WebsiteMetrics'; import { WebsiteMetricsBar } from './WebsiteMetricsBar'; -import { useMessages, useLocale, useTeamUrl } from '@/components/hooks'; export default function WebsiteChartList({ websites, @@ -46,7 +47,9 @@ export default function WebsiteChartList({ - + + + {showCharts && } ) : null; diff --git a/src/app/(main)/websites/[websiteId]/WebsiteDetailsPage.tsx b/src/app/(main)/websites/[websiteId]/WebsiteDetailsPage.tsx index 460792efc..d3dc3209f 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteDetailsPage.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteDetailsPage.tsx @@ -1,13 +1,14 @@ 'use client'; -import { usePathname } from 'next/navigation'; -import FilterTags from '@/components/metrics/FilterTags'; import { useNavigation } from '@/components/hooks'; +import FilterTags from '@/components/metrics/FilterTags'; +import { FILTER_COLUMNS } from '@/lib/constants'; +import { usePathname } from 'next/navigation'; import WebsiteChart from './WebsiteChart'; import WebsiteExpandedView from './WebsiteExpandedView'; import WebsiteHeader from './WebsiteHeader'; +import { WebsiteMetrics } from './WebsiteMetrics'; import WebsiteMetricsBar from './WebsiteMetricsBar'; import WebsiteTableView from './WebsiteTableView'; -import { FILTER_COLUMNS } from '@/lib/constants'; export default function WebsiteDetailsPage({ websiteId }: { websiteId: string }) { const pathname = usePathname(); @@ -27,7 +28,9 @@ export default function WebsiteDetailsPage({ websiteId }: { websiteId: string }) <> - + + + {!view && } {view && } diff --git a/src/app/(main)/websites/[websiteId]/WebsiteMetricsBar.module.css b/src/app/(main)/websites/[websiteId]/WebsiteMetrics.module.css similarity index 100% rename from src/app/(main)/websites/[websiteId]/WebsiteMetricsBar.module.css rename to src/app/(main)/websites/[websiteId]/WebsiteMetrics.module.css diff --git a/src/app/(main)/websites/[websiteId]/WebsiteMetrics.tsx b/src/app/(main)/websites/[websiteId]/WebsiteMetrics.tsx new file mode 100644 index 000000000..a45b7623a --- /dev/null +++ b/src/app/(main)/websites/[websiteId]/WebsiteMetrics.tsx @@ -0,0 +1,65 @@ +import { useMessages, useSticky } from '@/components/hooks'; +import WebsiteDateFilter from '@/components/input/WebsiteDateFilter'; +import useStore, { setWebsiteDateCompare } from '@/store/websites'; +import classNames from 'classnames'; +import { ReactNode } from 'react'; +import { Dropdown, Item } from 'react-basics'; +import WebsiteFilterButton from './WebsiteFilterButton'; +import styles from './WebsiteMetrics.module.css'; + +export function WebsiteMetrics({ + websiteId, + sticky, + compareMode = false, + showFilter = false, + children, +}: { + websiteId: string; + sticky?: boolean; + showChange?: boolean; + compareMode?: boolean; + showFilter?: boolean; + children?: ReactNode; +}) { + const { formatMessage, labels } = useMessages(); + const { ref, isSticky } = useSticky({ enabled: sticky }); + const dateCompare = useStore(state => state[websiteId]?.dateCompare); + + const items = [ + { label: formatMessage(labels.previousPeriod), value: 'prev' }, + { label: formatMessage(labels.previousYear), value: 'yoy' }, + ]; + + return ( +
+
{children}
+
+ {showFilter && } + + {compareMode && ( +
+ VS + items.find(i => i.value === value)?.label} + alignment="end" + onChange={(value: any) => setWebsiteDateCompare(websiteId, value)} + > + {items.map(({ label, value }) => ( + {label} + ))} + +
+ )} +
+
+ ); +} diff --git a/src/app/(main)/websites/[websiteId]/WebsiteMetricsBar.tsx b/src/app/(main)/websites/[websiteId]/WebsiteMetricsBar.tsx index f206d3c9e..70ada7600 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteMetricsBar.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteMetricsBar.tsx @@ -1,21 +1,14 @@ -import { Dropdown, Item } from 'react-basics'; -import classNames from 'classnames'; -import { useDateRange, useMessages, useSticky } from '@/components/hooks'; -import WebsiteDateFilter from '@/components/input/WebsiteDateFilter'; +import { useDateRange, useMessages } from '@/components/hooks'; +import useWebsiteStats from '@/components/hooks/queries/useWebsiteStats'; import MetricCard from '@/components/metrics/MetricCard'; import MetricsBar from '@/components/metrics/MetricsBar'; -import { formatShortTime, formatLongNumber } from '@/lib/format'; -import useWebsiteStats from '@/components/hooks/queries/useWebsiteStats'; -import useStore, { setWebsiteDateCompare } from '@/store/websites'; -import WebsiteFilterButton from './WebsiteFilterButton'; -import styles from './WebsiteMetricsBar.module.css'; +import { formatLongNumber, formatShortTime } from '@/lib/format'; +import useStore from '@/store/websites'; export function WebsiteMetricsBar({ websiteId, - sticky, showChange = false, compareMode = false, - showFilter = false, }: { websiteId: string; sticky?: boolean; @@ -26,7 +19,6 @@ export function WebsiteMetricsBar({ const { dateRange } = useDateRange(websiteId); const { formatMessage, labels } = useMessages(); const dateCompare = useStore(state => state[websiteId]?.dateCompare); - const { ref, isSticky } = useSticky({ enabled: sticky }); const { data, isLoading, isFetched, error } = useWebsiteStats( websiteId, compareMode && dateCompare, @@ -76,60 +68,24 @@ export function WebsiteMetricsBar({ ] : []; - const items = [ - { label: formatMessage(labels.previousPeriod), value: 'prev' }, - { label: formatMessage(labels.previousYear), value: 'yoy' }, - ]; - return ( -
+ {metrics.map(({ label, value, prev, change, formatValue, reverseColors }) => { + return ( + + ); })} - > -
- - {metrics.map(({ label, value, prev, change, formatValue, reverseColors }) => { - return ( - - ); - })} - -
-
- {showFilter && } - - {compareMode && ( -
- VS - items.find(i => i.value === value)?.label} - alignment="end" - onChange={(value: any) => setWebsiteDateCompare(websiteId, value)} - > - {items.map(({ label, value }) => ( - {label} - ))} - -
- )} -
-
+ ); } diff --git a/src/app/(main)/websites/[websiteId]/compare/WebsiteComparePage.tsx b/src/app/(main)/websites/[websiteId]/compare/WebsiteComparePage.tsx index 10a2eed15..fd04ad968 100644 --- a/src/app/(main)/websites/[websiteId]/compare/WebsiteComparePage.tsx +++ b/src/app/(main)/websites/[websiteId]/compare/WebsiteComparePage.tsx @@ -1,10 +1,11 @@ 'use client'; -import WebsiteHeader from '../WebsiteHeader'; -import WebsiteMetricsBar from '../WebsiteMetricsBar'; -import FilterTags from '@/components/metrics/FilterTags'; import { useNavigation } from '@/components/hooks'; +import FilterTags from '@/components/metrics/FilterTags'; import { FILTER_COLUMNS } from '@/lib/constants'; import WebsiteChart from '../WebsiteChart'; +import WebsiteHeader from '../WebsiteHeader'; +import { WebsiteMetrics } from '../WebsiteMetrics'; +import WebsiteMetricsBar from '../WebsiteMetricsBar'; import WebsiteCompareTables from './WebsiteCompareTables'; export function WebsiteComparePage({ websiteId }) { @@ -21,7 +22,9 @@ export function WebsiteComparePage({ websiteId }) { <> - + + + diff --git a/src/app/(main)/websites/[websiteId]/events/EventsMetricsBar.tsx b/src/app/(main)/websites/[websiteId]/events/EventsMetricsBar.tsx index e90a7790a..0a532f6e8 100644 --- a/src/app/(main)/websites/[websiteId]/events/EventsMetricsBar.tsx +++ b/src/app/(main)/websites/[websiteId]/events/EventsMetricsBar.tsx @@ -1,41 +1,36 @@ import { useMessages } from '@/components/hooks'; import useWebsiteSessionStats from '@/components/hooks/queries/useWebsiteSessionStats'; -import WebsiteDateFilter from '@/components/input/WebsiteDateFilter'; import MetricCard from '@/components/metrics/MetricCard'; import MetricsBar from '@/components/metrics/MetricsBar'; import { formatLongNumber } from '@/lib/format'; -import { Flexbox } from 'react-basics'; export function EventsMetricsBar({ websiteId }: { websiteId: string }) { const { formatMessage, labels } = useMessages(); const { data, isLoading, isFetched, error } = useWebsiteSessionStats(websiteId); return ( - - - - - - - - - + + + + + + ); } diff --git a/src/app/(main)/websites/[websiteId]/events/EventsPage.tsx b/src/app/(main)/websites/[websiteId]/events/EventsPage.tsx index cf4c19ef4..4ac4ad0b3 100644 --- a/src/app/(main)/websites/[websiteId]/events/EventsPage.tsx +++ b/src/app/(main)/websites/[websiteId]/events/EventsPage.tsx @@ -1,14 +1,15 @@ 'use client'; +import { useMessages } from '@/components/hooks'; +import { GridRow } from '@/components/layout/Grid'; +import EventsChart from '@/components/metrics/EventsChart'; +import MetricsTable from '@/components/metrics/MetricsTable'; +import { useState } from 'react'; +import { Item, Tabs } from 'react-basics'; import WebsiteHeader from '../WebsiteHeader'; +import { WebsiteMetrics } from '../WebsiteMetrics'; +import EventProperties from './EventProperties'; import EventsDataTable from './EventsDataTable'; import EventsMetricsBar from './EventsMetricsBar'; -import EventsChart from '@/components/metrics/EventsChart'; -import { GridRow } from '@/components/layout/Grid'; -import MetricsTable from '@/components/metrics/MetricsTable'; -import { useMessages } from '@/components/hooks'; -import { Item, Tabs } from 'react-basics'; -import { useState } from 'react'; -import EventProperties from './EventProperties'; export default function EventsPage({ websiteId }) { const [tab, setTab] = useState('activity'); @@ -17,7 +18,9 @@ export default function EventsPage({ websiteId }) { return ( <> - + + + - - - - - - - - + + + + + + ); } diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionsPage.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionsPage.tsx index 2ee044db6..b73b46e44 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/SessionsPage.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/SessionsPage.tsx @@ -1,13 +1,14 @@ 'use client'; +import { useMessages } from '@/components/hooks'; +import { GridRow } from '@/components/layout/Grid'; +import WorldMap from '@/components/metrics/WorldMap'; +import { useState } from 'react'; +import { Item, Tabs } from 'react-basics'; import WebsiteHeader from '../WebsiteHeader'; +import { WebsiteMetrics } from '../WebsiteMetrics'; +import SessionProperties from './SessionProperties'; import SessionsDataTable from './SessionsDataTable'; import SessionsMetricsBar from './SessionsMetricsBar'; -import SessionProperties from './SessionProperties'; -import WorldMap from '@/components/metrics/WorldMap'; -import { GridRow } from '@/components/layout/Grid'; -import { Item, Tabs } from 'react-basics'; -import { useState } from 'react'; -import { useMessages } from '@/components/hooks'; import SessionsWeekly from './SessionsWeekly'; export function SessionsPage({ websiteId }) { @@ -17,7 +18,9 @@ export function SessionsPage({ websiteId }) { return ( <> - + + +