Merge branch 'dev' into master

This commit is contained in:
Mike Cao 2025-02-18 13:13:47 -08:00 committed by GitHub
commit 910a14296b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
469 changed files with 7142 additions and 7426 deletions

View file

@ -1,9 +1,9 @@
import { useCallback } from 'react';
import ListTable from 'components/metrics/ListTable';
import { useLocale, useCountryNames, useMessages } from 'components/hooks';
import ListTable from '@/components/metrics/ListTable';
import { useLocale, useCountryNames, useMessages } from '@/components/hooks';
import classNames from 'classnames';
import styles from './RealtimeCountries.module.css';
import TypeIcon from 'components/common/TypeIcon';
import TypeIcon from '@/components/common/TypeIcon';
export function RealtimeCountries({ data }) {
const { formatMessage, labels } = useMessages();

View file

@ -1,6 +1,6 @@
import MetricCard from 'components/metrics/MetricCard';
import { useMessages } from 'components/hooks';
import { RealtimeData } from 'lib/types';
import MetricCard from '@/components/metrics/MetricCard';
import { useMessages } from '@/components/hooks';
import { RealtimeData } from '@/lib/types';
import styles from './RealtimeHeader.module.css';
export function RealtimeHeader({ data }: { data: RealtimeData }) {

View file

@ -1,9 +1,9 @@
import { useEffect } from 'react';
import { useRouter } from 'next/navigation';
import Page from 'components/layout/Page';
import PageHeader from 'components/layout/PageHeader';
import { useApi, useMessages } from 'components/hooks';
import EmptyPlaceholder from 'components/common/EmptyPlaceholder';
import Page from '@/components/layout/Page';
import PageHeader from '@/components/layout/PageHeader';
import { useApi, useMessages } from '@/components/hooks';
import EmptyPlaceholder from '@/components/common/EmptyPlaceholder';
export function RealtimeHome() {
const { formatMessage, labels, messages } = useMessages();

View file

@ -1,12 +1,11 @@
import useFormat from 'components//hooks/useFormat';
import Empty from 'components/common/Empty';
import FilterButtons from 'components/common/FilterButtons';
import { useCountryNames, useLocale, useMessages, useTimezone } from 'components/hooks';
import Icons from 'components/icons';
import { BROWSERS, OS_NAMES } from 'lib/constants';
import { stringToColor } from 'lib/format';
import { RealtimeData } from 'lib/types';
import { safeDecodeURI } from 'next-basics';
import useFormat from '@/components//hooks/useFormat';
import Empty from '@/components/common/Empty';
import FilterButtons from '@/components/common/FilterButtons';
import { useCountryNames, useLocale, useMessages, useTimezone } from '@/components/hooks';
import Icons from '@/components/icons';
import { BROWSERS, OS_NAMES } from '@/lib/constants';
import { stringToColor } from '@/lib/format';
import { RealtimeData } from '@/lib/types';
import { useContext, useMemo, useState } from 'react';
import { Icon, SearchField, StatusLight, Text } from 'react-basics';
import { FixedSizeList } from 'react-window';
@ -27,7 +26,7 @@ const icons = {
export function RealtimeLog({ data }: { data: RealtimeData }) {
const website = useContext(WebsiteContext);
const [search, setSearch] = useState('');
const { formatMessage, labels, messages, FormattedMessage } = useMessages();
const { formatMessage, labels, messages } = useMessages();
const { formatValue } = useFormat();
const { locale } = useLocale();
const { formatTimezoneDate } = useTimezone();
@ -71,24 +70,19 @@ export function RealtimeLog({ data }: { data: RealtimeData }) {
const { __type, eventName, urlPath: url, browser, os, country, device } = log;
if (__type === TYPE_EVENT) {
return (
<FormattedMessage
{...messages.eventLog}
values={{
event: <b>{eventName || formatMessage(labels.unknown)}</b>,
url: (
<a
href={`//${website?.domain}${url}`}
className={styles.link}
target="_blank"
rel="noreferrer noopener"
>
{url}
</a>
),
}}
/>
);
return formatMessage(messages.eventLog, {
event: <b>{eventName || formatMessage(labels.unknown)}</b>,
url: (
<a
href={`//${website?.domain}${url}`}
className={styles.link}
target="_blank"
rel="noreferrer noopener"
>
{url}
</a>
),
});
}
if (__type === TYPE_PAGEVIEW) {
@ -99,23 +93,18 @@ export function RealtimeLog({ data }: { data: RealtimeData }) {
target="_blank"
rel="noreferrer noopener"
>
{safeDecodeURI(url)}
{url}
</a>
);
}
if (__type === TYPE_SESSION) {
return (
<FormattedMessage
{...messages.visitorLog}
values={{
country: <b>{countryNames[country] || formatMessage(labels.unknown)}</b>,
browser: <b>{BROWSERS[browser]}</b>,
os: <b>{OS_NAMES[os] || os}</b>,
device: <b>{formatMessage(labels[device] || labels.unknown)}</b>,
}}
/>
);
return formatMessage(messages.visitorLog, {
country: <b>{countryNames[country] || formatMessage(labels.unknown)}</b>,
browser: <b>{BROWSERS[browser]}</b>,
os: <b>{OS_NAMES[os] || os}</b>,
device: <b>{formatMessage(labels[device] || labels.unknown)}</b>,
});
}
};

View file

@ -1,11 +1,11 @@
import { Key, useContext, useState } from 'react';
import { ButtonGroup, Button, Flexbox } from 'react-basics';
import thenby from 'thenby';
import { percentFilter } from 'lib/filters';
import ListTable from 'components/metrics/ListTable';
import { FILTER_PAGES, FILTER_REFERRERS } from 'lib/constants';
import { useMessages } from 'components/hooks';
import { RealtimeData } from 'lib/types';
import { percentFilter } from '@/lib/filters';
import ListTable from '@/components/metrics/ListTable';
import { FILTER_PAGES, FILTER_REFERRERS } from '@/lib/constants';
import { useMessages } from '@/components/hooks';
import { RealtimeData } from '@/lib/types';
import { WebsiteContext } from '../WebsiteProvider';
export function RealtimeUrls({ data }: { data: RealtimeData }) {

View file

@ -1,16 +1,16 @@
'use client';
import { firstBy } from 'thenby';
import { Grid, GridRow } from 'components/layout/Grid';
import Page from 'components/layout/Page';
import RealtimeChart from 'components/metrics/RealtimeChart';
import WorldMap from 'components/metrics/WorldMap';
import { useRealtime } from 'components/hooks';
import { Grid, GridRow } from '@/components/layout/Grid';
import Page from '@/components/layout/Page';
import RealtimeChart from '@/components/metrics/RealtimeChart';
import WorldMap from '@/components/metrics/WorldMap';
import { useRealtime } from '@/components/hooks';
import RealtimeLog from './RealtimeLog';
import RealtimeHeader from './RealtimeHeader';
import RealtimeUrls from './RealtimeUrls';
import RealtimeCountries from './RealtimeCountries';
import WebsiteHeader from '../WebsiteHeader';
import { percentFilter } from 'lib/filters';
import { percentFilter } from '@/lib/filters';
export function WebsiteRealtimePage({ websiteId }) {
const { data, isLoading, error } = useRealtime(websiteId);