Update WebsiteMetricsBar.tsx

This commit is contained in:
Minseo Lee 2024-08-29 15:07:28 +09:00
parent cb0210a72c
commit 4e07e70941

View file

@ -1,14 +1,15 @@
import classNames from 'classnames'; import classNames from 'classnames';
import { useDateRange, useMessages, useSticky } from 'components/hooks'; import { useDateRange, useLocale, useMessages, useSticky } from 'components/hooks';
import WebsiteDateFilter from 'components/input/WebsiteDateFilter'; import WebsiteDateFilter from 'components/input/WebsiteDateFilter';
import MetricCard from 'components/metrics/MetricCard'; import MetricCard from 'components/metrics/MetricCard';
import MetricsBar from 'components/metrics/MetricsBar'; import MetricsBar from 'components/metrics/MetricsBar';
import { formatShortTime, formatLongNumber } from 'lib/format'; import { formatShortTime } from 'lib/format';
import WebsiteFilterButton from './WebsiteFilterButton'; import WebsiteFilterButton from './WebsiteFilterButton';
import useWebsiteStats from 'components/hooks/queries/useWebsiteStats'; import useWebsiteStats from 'components/hooks/queries/useWebsiteStats';
import styles from './WebsiteMetricsBar.module.css'; import styles from './WebsiteMetricsBar.module.css';
import { Dropdown, Item } from 'react-basics'; import { Dropdown, Item } from 'react-basics';
import useStore, { setWebsiteDateCompare } from 'store/websites'; import useStore, { setWebsiteDateCompare } from 'store/websites';
import { type FormatNumberOptions, useIntl } from 'react-intl';
export function WebsiteMetricsBar({ export function WebsiteMetricsBar({
websiteId, websiteId,
@ -32,8 +33,21 @@ export function WebsiteMetricsBar({
compareMode && dateCompare, compareMode && dateCompare,
); );
const isAllTime = dateRange.value === 'all'; const isAllTime = dateRange.value === 'all';
const { locale } = useLocale();
const intl = useIntl();
const { pageviews, visitors, visits, bounces, totaltime } = data || {}; const { pageviews, visitors, visits, bounces, totaltime } = data || {};
const optionsNumber: FormatNumberOptions = { notation: 'compact', maximumFractionDigits: 2 };
const optionsSmallNumber: FormatNumberOptions = { notation: 'compact' };
const optionsPercent: FormatNumberOptions = { style: 'percent' };
const minimum = {
'de-CH': 1000000,
'de-DE': 1000000,
'it-IT': 1000000,
'ja-JP': 10000,
'zh-CN': 10000,
'zh-TW': 10000,
};
const metrics = data const metrics = data
? [ ? [
@ -41,19 +55,31 @@ export function WebsiteMetricsBar({
...pageviews, ...pageviews,
label: formatMessage(labels.views), label: formatMessage(labels.views),
change: pageviews.value - pageviews.prev, change: pageviews.value - pageviews.prev,
formatValue: formatLongNumber, formatValue: (n: number) =>
intl.formatNumber(
+n,
+n < (minimum[locale] || 1000) ? optionsSmallNumber : optionsNumber,
),
}, },
{ {
...visits, ...visits,
label: formatMessage(labels.visits), label: formatMessage(labels.visits),
change: visits.value - visits.prev, change: visits.value - visits.prev,
formatValue: formatLongNumber, formatValue: (n: number) =>
intl.formatNumber(
+n,
+n < (minimum[locale] || 1000) ? optionsSmallNumber : optionsNumber,
),
}, },
{ {
...visitors, ...visitors,
label: formatMessage(labels.visitors), label: formatMessage(labels.visitors),
change: visitors.value - visitors.prev, change: visitors.value - visitors.prev,
formatValue: formatLongNumber, formatValue: (n: number) =>
intl.formatNumber(
+n,
+n < (minimum[locale] || 1000) ? optionsSmallNumber : optionsNumber,
),
}, },
{ {
label: formatMessage(labels.bounceRate), label: formatMessage(labels.bounceRate),
@ -62,7 +88,7 @@ export function WebsiteMetricsBar({
change: change:
(Math.min(visits.value, bounces.value) / visits.value) * 100 - (Math.min(visits.value, bounces.value) / visits.value) * 100 -
(Math.min(visits.prev, bounces.prev) / visits.prev) * 100, (Math.min(visits.prev, bounces.prev) / visits.prev) * 100,
formatValue: n => Math.round(+n) + '%', formatValue: (n: number) => intl.formatNumber(+n / 100, optionsPercent),
reverseColors: true, reverseColors: true,
}, },
{ {
@ -70,7 +96,7 @@ export function WebsiteMetricsBar({
value: totaltime.value / visits.value, value: totaltime.value / visits.value,
prev: totaltime.prev / visits.prev, prev: totaltime.prev / visits.prev,
change: totaltime.value / visits.value - totaltime.prev / visits.prev, change: totaltime.value / visits.value - totaltime.prev / visits.prev,
formatValue: n => formatValue: (n: number) =>
`${+n < 0 ? '-' : ''}${formatShortTime(Math.abs(~~n), ['m', 's'], ' ')}`, `${+n < 0 ? '-' : ''}${formatShortTime(Math.abs(~~n), ['m', 's'], ' ')}`,
}, },
] ]