Merge remote-tracking branch 'origin/dev' into dev
Some checks are pending
Create docker images / Build, push, and deploy (push) Waiting to run
Node.js CI / build (postgresql, 18.18, 10) (push) Waiting to run

This commit is contained in:
Mike Cao 2025-09-30 16:18:48 -07:00
commit 581ddc0233
7 changed files with 45 additions and 103 deletions

View file

@ -1,35 +1,33 @@
import { useState } from 'react';
import { Grid, Row, Text } from '@umami/react-zen';
import classNames from 'classnames';
import { colord } from 'colord';
import { BarChart } from '@/components/charts/BarChart';
import { LoadingPanel } from '@/components/common/LoadingPanel';
import { Panel } from '@/components/common/Panel';
import { TypeIcon } from '@/components/common/TypeIcon';
import { useCountryNames, useLocale, useMessages, useResultQuery } from '@/components/hooks';
import { CurrencySelect } from '@/components/input/CurrencySelect';
import { ListTable } from '@/components/metrics/ListTable';
import { MetricCard } from '@/components/metrics/MetricCard';
import { MetricsBar } from '@/components/metrics/MetricsBar';
import { renderDateLabels } from '@/lib/charts';
import { CHART_COLORS } from '@/lib/constants';
import { generateTimeSeries } from '@/lib/date';
import { formatLongCurrency, formatLongNumber } from '@/lib/format';
import { useCallback, useMemo } from 'react';
import { Panel } from '@/components/common/Panel';
import { Column } from '@umami/react-zen';
import { LoadingPanel } from '@/components/common/LoadingPanel';
import { getMinimumUnit } from '@/lib/date';
import { CurrencySelect } from '@/components/input/CurrencySelect';
import { Column, Grid, Row, Text } from '@umami/react-zen';
import classNames from 'classnames';
import { colord } from 'colord';
import { useCallback, useMemo, useState } from 'react';
export interface RevenueProps {
websiteId: string;
startDate: Date;
endDate: Date;
unit: string;
}
export function Revenue({ websiteId, startDate, endDate }: RevenueProps) {
export function Revenue({ websiteId, startDate, endDate, unit }: RevenueProps) {
const [currency, setCurrency] = useState('USD');
const { formatMessage, labels } = useMessages();
const { locale } = useLocale();
const { locale, dateLocale } = useLocale();
const { countryNames } = useCountryNames(locale);
const unit = getMinimumUnit(startDate, endDate);
const { data, error, isLoading } = useResultQuery<any>('revenue', {
websiteId,
startDate,
@ -65,7 +63,7 @@ export function Revenue({ websiteId, startDate, endDate }: RevenueProps) {
const color = colord(CHART_COLORS[index % CHART_COLORS.length]);
return {
label: key,
data: map[key],
data: generateTimeSeries(map[key], startDate, endDate, unit, dateLocale),
lineTension: 0,
backgroundColor: color.alpha(0.6).toRgbString(),
borderColor: color.alpha(0.7).toRgbString(),
@ -104,6 +102,8 @@ export function Revenue({ websiteId, startDate, endDate }: RevenueProps) {
] as any;
}, [data, locale]);
const renderXLabel = useCallback(renderDateLabels(unit, locale), [unit, locale]);
return (
<Column gap>
<Grid columns="280px" gap>
@ -127,7 +127,7 @@ export function Revenue({ websiteId, startDate, endDate }: RevenueProps) {
unit={unit}
stacked={true}
currency={currency}
renderXLabel={renderDateLabels(unit, locale)}
renderXLabel={renderXLabel}
height="400px"
/>
</Panel>

View file

@ -6,13 +6,13 @@ import { useDateRange } from '@/components/hooks';
export function RevenuePage({ websiteId }: { websiteId: string }) {
const {
dateRange: { startDate, endDate },
dateRange: { startDate, endDate, unit },
} = useDateRange(websiteId);
return (
<Column gap>
<WebsiteControls websiteId={websiteId} />
<Revenue websiteId={websiteId} startDate={startDate} endDate={endDate} />
<Revenue websiteId={websiteId} startDate={startDate} endDate={endDate} unit={unit} />
</Column>
);
}

View file

@ -37,8 +37,8 @@ export function WebsiteTransferForm({
const isTeamWebsite = !!website?.teamId;
const items =
teams?.data?.filter(({ teamUser }) =>
teamUser.find(
teams?.data?.filter(({ members }) =>
members.some(
({ role, userId }) =>
[ROLES.teamOwner, ROLES.teamManager].includes(role) && userId === user.id,
),
@ -79,7 +79,7 @@ export function WebsiteTransferForm({
<Select onSelectionChange={handleChange} selectedKey={teamId}>
{items.map(({ id, name }) => {
return (
<ListItem key={`${id}!!!!`} id={`${id}????`}>
<ListItem key={`${id}`} id={`${id}`}>
{name}
</ListItem>
);