c596a5e342
## 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`.
108 lines
3.7 KiB
TypeScript
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>
|
|
</>
|
|
);
|
|
};
|