Files
twenty/packages/twenty-front/src/modules/settings/usage/components/SettingsUsageAnalyticsSection.tsx
T
Raphaël Bosi c596a5e342 Rename twenty-ui to twenty-ui-deprecated and twenty-new-ui to twenty-ui to prepare package release (#21315)
## Description

Promotes the next-gen UI library (formerly `twenty-new-ui`) to the name
**`twenty-ui`** (v0.1.0, publishable) and renames the old package to
**`twenty-ui-deprecated`**. Rewrites ~1,730 `twenty-ui` imports →
`twenty-ui-deprecated`, updates all configs/CI/Docker/deps, and migrates
twenty-front's `Toggle` to the new package (first consumer) as a
drop-in.

## Next steps
- Wire the `ui/v*` publish dispatch (`cd-deploy-tag.yaml` +
`.yarnrc.yml`), then tag `ui/v0.1.0` to publish.
- Continue migrating components from `twenty-ui-deprecated` →
`twenty-ui`.
2026-06-08 18:12:28 +02:00

108 lines
3.7 KiB
TypeScript

import { isClickHouseConfiguredState } from '@/client-config/states/isClickHouseConfiguredState';
import { SettingsBillingLabelValueItem } from '@/settings/billing/components/internal/SettingsBillingLabelValueItem';
import { SubscriptionInfoContainer } from '@/settings/billing/components/SubscriptionInfoContainer';
import { UsageBreakdownPieSection } from '@/settings/usage/components/UsageBreakdownPieSection';
import { UsageByUserTableSection } from '@/settings/usage/components/UsageByUserTableSection';
import { UsageDailyChartSection } from '@/settings/usage/components/UsageDailyChartSection';
import { UsageSectionSkeleton } from '@/settings/usage/components/UsageSectionSkeleton';
import { useUsageAnalyticsData } from '@/settings/usage/hooks/useUsageAnalyticsData';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { t } from '@lingui/core/macro';
import { Link } from 'react-router-dom';
import { SettingsPath } from 'twenty-shared/types';
import { getSettingsPath } from 'twenty-shared/utils';
import { H2Title, IconSparkles } from 'twenty-ui-deprecated/display';
import { Button } from 'twenty-ui-deprecated/input';
import { Section } from 'twenty-ui-deprecated/layout';
import { SETTINGS_AI_TABS } from '~/pages/settings/ai/constants/SettingsAiTabs';
export const SettingsUsageAnalyticsSection = () => {
const isClickHouseConfigured = useAtomStateValue(isClickHouseConfiguredState);
const { analytics, isInitialLoading } = useUsageAnalyticsData({
skip: !isClickHouseConfigured,
});
if (!isClickHouseConfigured) {
return (
<Section>
<H2Title
title={t`Usage Analytics`}
description={t`Credit usage breakdown for your workspace.`}
/>
<SubscriptionInfoContainer>
<SettingsBillingLabelValueItem
label={t`ClickHouse Not Configured`}
value={t`Usage analytics requires ClickHouse. Contact your administrator.`}
/>
</SubscriptionInfoContainer>
</Section>
);
}
if (isInitialLoading) {
return <UsageSectionSkeleton />;
}
const hasData =
analytics &&
(analytics.timeSeries.length > 0 ||
analytics.usageByOperationType.length > 0 ||
analytics.usageByUser.length > 0);
if (!hasData) {
return (
<Section>
<H2Title
title={t`Usage Analytics`}
description={t`Credit usage breakdown for your workspace.`}
/>
<SubscriptionInfoContainer>
<SettingsBillingLabelValueItem
label={t`No usage data yet`}
value={t`Usage analytics will appear here once you start using credits.`}
/>
</SubscriptionInfoContainer>
</Section>
);
}
return (
<>
<UsageBreakdownPieSection
title={t`Usage by Type`}
breakdownField="operationType"
sectionId="usage-type"
/>
<UsageDailyChartSection
title={t`Daily Usage`}
description={t`Credit consumption over time.`}
chartId="usage-daily"
chartLabel={t`Credits`}
/>
<UsageByUserTableSection
title={t`Usage by User`}
description={t`Click a user to see their daily breakdown.`}
getDetailPath={(userWorkspaceId) =>
getSettingsPath(SettingsPath.UsageUserDetail, {
userWorkspaceId,
})
}
showAvatar
/>
<Section>
<Link
to={`${getSettingsPath(SettingsPath.AI)}#${SETTINGS_AI_TABS.TABS_IDS.USAGE}`}
style={{ textDecoration: 'none' }}
>
<Button
Icon={IconSparkles}
title={t`View AI usage breakdown`}
variant="secondary"
/>
</Link>
</Section>
</>
);
};