diff --git a/packages/twenty-front/src/modules/settings/admin-panel/components/SettingsAdminTabContent.tsx b/packages/twenty-front/src/modules/settings/admin-panel/components/SettingsAdminTabContent.tsx
index 70853518fd..4f41109ed2 100644
--- a/packages/twenty-front/src/modules/settings/admin-panel/components/SettingsAdminTabContent.tsx
+++ b/packages/twenty-front/src/modules/settings/admin-panel/components/SettingsAdminTabContent.tsx
@@ -3,11 +3,8 @@ import { SettingsAdminApps } from '@/settings/admin-panel/apps/components/Settin
import { SettingsAdminGeneral } from '@/settings/admin-panel/components/SettingsAdminGeneral';
import { SettingsAdminConfigVariables } from '@/settings/admin-panel/config-variables/components/SettingsAdminConfigVariables';
import { SETTINGS_ADMIN_TABS } from '@/settings/admin-panel/constants/SettingsAdminTabs';
-import { SETTINGS_ADMIN_TABS_ID } from '@/settings/admin-panel/constants/SettingsAdminTabsId';
import { SettingsAdminHealthStatus } from '@/settings/admin-panel/health-status/components/SettingsAdminHealthStatus';
import { SettingsSectionSkeletonLoader } from '@/settings/components/SettingsSectionSkeletonLoader';
-import { activeTabIdComponentState } from '@/ui/layout/tab-list/states/activeTabIdComponentState';
-import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateValue';
import { lazy, Suspense } from 'react';
const SettingsEnterprise = lazy(() =>
@@ -15,12 +12,11 @@ const SettingsEnterprise = lazy(() =>
default: module.SettingsEnterprise,
})),
);
-export const SettingsAdminTabContent = () => {
- const activeTabId = useAtomComponentStateValue(
- activeTabIdComponentState,
- SETTINGS_ADMIN_TABS_ID,
- );
-
+export const SettingsAdminTabContent = ({
+ activeTabId,
+}: {
+ activeTabId: string | null;
+}) => {
switch (activeTabId) {
case SETTINGS_ADMIN_TABS.GENERAL:
return ;
diff --git a/packages/twenty-front/src/modules/settings/admin-panel/components/SettingsAdminContent.tsx b/packages/twenty-front/src/modules/settings/admin-panel/hooks/useSettingsAdminTabs.ts
similarity index 77%
rename from packages/twenty-front/src/modules/settings/admin-panel/components/SettingsAdminContent.tsx
rename to packages/twenty-front/src/modules/settings/admin-panel/hooks/useSettingsAdminTabs.ts
index 353351bb63..1c11cbe0c8 100644
--- a/packages/twenty-front/src/modules/settings/admin-panel/components/SettingsAdminContent.tsx
+++ b/packages/twenty-front/src/modules/settings/admin-panel/hooks/useSettingsAdminTabs.ts
@@ -1,9 +1,6 @@
import { currentUserState } from '@/auth/states/currentUserState';
import { billingState } from '@/client-config/states/billingState';
-import { SettingsAdminTabContent } from '@/settings/admin-panel/components/SettingsAdminTabContent';
import { SETTINGS_ADMIN_TABS } from '@/settings/admin-panel/constants/SettingsAdminTabs';
-import { SETTINGS_ADMIN_TABS_ID } from '@/settings/admin-panel/constants/SettingsAdminTabsId';
-import { TabList } from '@/ui/layout/tab-list/components/TabList';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { t } from '@lingui/core/macro';
import {
@@ -15,14 +12,15 @@ import {
IconVariable,
} from 'twenty-ui/icon';
-export const SettingsAdminContent = () => {
+export const useSettingsAdminTabs = () => {
const currentUser = useAtomStateValue(currentUserState);
const billing = useAtomStateValue(billingState);
const canAccessFullAdminPanel = currentUser?.canAccessFullAdminPanel;
const canImpersonate = currentUser?.canImpersonate;
const isBillingEnabled = billing?.isBillingEnabled;
- const tabs = [
+
+ return [
{
id: SETTINGS_ADMIN_TABS.GENERAL,
title: t`General`,
@@ -64,15 +62,4 @@ export const SettingsAdminContent = () => {
]
: []),
];
-
- return (
- <>
-
-
- >
- );
};
diff --git a/packages/twenty-front/src/modules/settings/components/layout/SettingsTabBar.tsx b/packages/twenty-front/src/modules/settings/components/layout/SettingsTabBar.tsx
index 3bb97f1d1c..3e84a3d4b4 100644
--- a/packages/twenty-front/src/modules/settings/components/layout/SettingsTabBar.tsx
+++ b/packages/twenty-front/src/modules/settings/components/layout/SettingsTabBar.tsx
@@ -1,64 +1,16 @@
-import { useSettingsActiveTabId } from '@/settings/components/layout/useSettingsActiveTabId';
-import { TabListFromUrlOptionalEffect } from '@/ui/layout/tab-list/components/TabListFromUrlOptionalEffect';
-import { TAB_LIST_GAP } from '@/ui/layout/tab-list/constants/TabListGap';
-import { TabListComponentInstanceContext } from '@/ui/layout/tab-list/states/contexts/TabListComponentInstanceContext';
+import { TabList } from '@/ui/layout/tab-list/components/TabList';
import { type SingleTabProps } from '@/ui/layout/tab-list/types/SingleTabProps';
-import { styled } from '@linaria/react';
-import { TabButton } from 'twenty-ui/input';
type SettingsTabBarProps = {
tabs: SingleTabProps[];
componentInstanceId: string;
};
-const StyledTabBar = styled.div`
- display: flex;
- flex: 1;
- gap: ${TAB_LIST_GAP}px;
- justify-content: center;
- min-width: 0;
-`;
-
export const SettingsTabBar = ({
tabs,
componentInstanceId,
}: SettingsTabBarProps) => {
- const visibleTabs = tabs.filter((tab) => !tab.hide);
- const visibleTabIds = visibleTabs.map((tab) => tab.id);
-
- const activeTabId = useSettingsActiveTabId(
- componentInstanceId,
- visibleTabIds,
- );
-
- if (visibleTabs.length === 0) {
- return null;
- }
-
return (
-
-
-
- {visibleTabs.map((tab) => (
-
- ))}
-
-
+
);
};
diff --git a/packages/twenty-front/src/modules/ui/layout/tab-list/components/TabList.tsx b/packages/twenty-front/src/modules/ui/layout/tab-list/components/TabList.tsx
index 92ac0bdfff..ebac87c2e1 100644
--- a/packages/twenty-front/src/modules/ui/layout/tab-list/components/TabList.tsx
+++ b/packages/twenty-front/src/modules/ui/layout/tab-list/components/TabList.tsx
@@ -36,9 +36,11 @@ const StyledContainer = styled.div`
}
`;
-const StyledInnerContainer = styled.div`
+const StyledInnerContainer = styled.div<{ $centerTabs: boolean }>`
display: flex;
flex: 1;
+ justify-content: ${({ $centerTabs }) =>
+ $centerTabs ? 'center' : 'flex-start'};
min-width: 0;
`;
@@ -76,6 +78,7 @@ export const TabList = ({
componentInstanceId,
onChangeTab,
rightComponent,
+ centerTabs = false,
}: TabListProps) => {
const visibleTabs = tabs.filter((tab) => !tab.hide);
const navigate = useNavigate();
@@ -160,7 +163,7 @@ export const TabList = ({
-
+
{visibleTabs.slice(0, visibleTabCount).map((tab) => (
void;
rightComponent?: ReactNode;
+ centerTabs?: boolean;
};
diff --git a/packages/twenty-front/src/pages/settings/admin-panel/SettingsAdmin.tsx b/packages/twenty-front/src/pages/settings/admin-panel/SettingsAdmin.tsx
index da303a0a60..5d81f6b5fd 100644
--- a/packages/twenty-front/src/pages/settings/admin-panel/SettingsAdmin.tsx
+++ b/packages/twenty-front/src/pages/settings/admin-panel/SettingsAdmin.tsx
@@ -1,16 +1,31 @@
-import { SettingsAdminContent } from '@/settings/admin-panel/components/SettingsAdminContent';
+import { SettingsAdminTabContent } from '@/settings/admin-panel/components/SettingsAdminTabContent';
+import { SETTINGS_ADMIN_TABS_ID } from '@/settings/admin-panel/constants/SettingsAdminTabsId';
+import { useSettingsAdminTabs } from '@/settings/admin-panel/hooks/useSettingsAdminTabs';
import { SettingsPageContainer } from '@/settings/components/SettingsPageContainer';
import { SettingsPageLayout } from '@/settings/components/layout/SettingsPageLayout';
+import { SettingsTabBar } from '@/settings/components/layout/SettingsTabBar';
+import { useSettingsActiveTabId } from '@/settings/components/layout/useSettingsActiveTabId';
import { useLingui } from '@lingui/react/macro';
import { SettingsPath } from 'twenty-shared/types';
import { getSettingsPath } from 'twenty-shared/utils';
export const SettingsAdmin = () => {
const { t } = useLingui();
+ const tabs = useSettingsAdminTabs();
+ const activeTabId = useSettingsActiveTabId(
+ SETTINGS_ADMIN_TABS_ID,
+ tabs.map((tab) => tab.id),
+ );
return (
+ }
links={[
{
children: t`Other`,
@@ -20,7 +35,7 @@ export const SettingsAdmin = () => {
]}
>
-
+
);
diff --git a/packages/twenty-front/src/pages/settings/communications/SettingsWorkspaceCommunications.tsx b/packages/twenty-front/src/pages/settings/communications/SettingsWorkspaceCommunications.tsx
index 157c97d1e3..3707860932 100644
--- a/packages/twenty-front/src/pages/settings/communications/SettingsWorkspaceCommunications.tsx
+++ b/packages/twenty-front/src/pages/settings/communications/SettingsWorkspaceCommunications.tsx
@@ -5,7 +5,7 @@ import { SettingsPageContainer } from '@/settings/components/SettingsPageContain
import { SettingsDiscoveryHeroCard } from '@/settings/components/SettingsDiscoveryHeroCard';
import { SettingsWorkspaceEmailGroupSection } from '@/settings/workspace/components/SettingsWorkspaceEmailGroupSection';
import { SettingsPageLayout } from '@/settings/components/layout/SettingsPageLayout';
-import { TabList } from '@/ui/layout/tab-list/components/TabList';
+import { SettingsTabBar } from '@/settings/components/layout/SettingsTabBar';
import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled';
import { FeatureFlagKey, SettingsPath } from 'twenty-shared/types';
import { getSettingsPath } from 'twenty-shared/utils';
@@ -43,6 +43,24 @@ export const SettingsWorkspaceCommunications = () => {
FeatureFlagKey.IS_EMAIL_GROUP_ENABLED,
);
+ const tabs = [
+ { id: 'emails', title: t`Emails`, Icon: IconMail },
+ {
+ id: 'whatsapp',
+ title: t`Whatsapp`,
+ Icon: IconBrandWhatsapp,
+ disabled: true,
+ pill: t`Soon`,
+ },
+ {
+ id: 'calls',
+ title: t`Calls`,
+ Icon: IconPhone,
+ disabled: true,
+ pill: t`Soon`,
+ },
+ ];
+
if (!isEmailGroupFeatureEnabled) {
return null;
}
@@ -50,6 +68,12 @@ export const SettingsWorkspaceCommunications = () => {
return (
+ }
links={[
{
children: t`Workspace`,
@@ -59,26 +83,6 @@ export const SettingsWorkspaceCommunications = () => {
]}
>
-