From 23e7564475a2a315996c6a74c53a27140ccf4305 Mon Sep 17 00:00:00 2001
From: simeng-li <simeng@silverhand.io>
Date: Tue, 5 Mar 2024 14:39:37 +0800
Subject: [PATCH] feat(console,phrases): add new jwt claims page (#5448)

* feat(console,phrases): add new jwt claims page

add new jwt claims page

* feat(console, phrases): add token tabs nav

add token tabs nav

* fix(console): remove lint comments

remove lint comments
---
 packages/console/src/App.tsx                  |  2 +-
 packages/console/src/consts/env.ts            |  2 +-
 .../src/containers/ConsoleContent/index.tsx   | 16 ++++++-
 .../ConsoleRoutes/index.tsx                   |  5 +-
 .../src/pages/JwtClaims/index.module.scss     | 12 +++++
 .../console/src/pages/JwtClaims/index.tsx     | 46 +++++++++++++++++++
 packages/console/src/pages/JwtClaims/type.ts  |  4 ++
 .../de/translation/admin-console/index.ts     |  2 +
 .../translation/admin-console/jwt-claims.ts   | 13 ++++++
 .../en/translation/admin-console/index.ts     |  2 +
 .../translation/admin-console/jwt-claims.ts   |  9 ++++
 .../es/translation/admin-console/index.ts     |  2 +
 .../translation/admin-console/jwt-claims.ts   | 13 ++++++
 .../fr/translation/admin-console/index.ts     |  2 +
 .../translation/admin-console/jwt-claims.ts   | 13 ++++++
 .../it/translation/admin-console/index.ts     |  2 +
 .../translation/admin-console/jwt-claims.ts   | 13 ++++++
 .../ja/translation/admin-console/index.ts     |  2 +
 .../translation/admin-console/jwt-claims.ts   | 13 ++++++
 .../ko/translation/admin-console/index.ts     |  2 +
 .../translation/admin-console/jwt-claims.ts   | 13 ++++++
 .../pl-pl/translation/admin-console/index.ts  |  2 +
 .../translation/admin-console/jwt-claims.ts   | 13 ++++++
 .../pt-br/translation/admin-console/index.ts  |  2 +
 .../translation/admin-console/jwt-claims.ts   | 13 ++++++
 .../pt-pt/translation/admin-console/index.ts  |  2 +
 .../translation/admin-console/jwt-claims.ts   | 13 ++++++
 .../ru/translation/admin-console/index.ts     |  2 +
 .../translation/admin-console/jwt-claims.ts   | 13 ++++++
 .../tr-tr/translation/admin-console/index.ts  |  2 +
 .../translation/admin-console/jwt-claims.ts   | 13 ++++++
 .../zh-cn/translation/admin-console/index.ts  |  2 +
 .../translation/admin-console/jwt-claims.ts   | 13 ++++++
 .../zh-hk/translation/admin-console/index.ts  |  2 +
 .../translation/admin-console/jwt-claims.ts   | 13 ++++++
 .../zh-tw/translation/admin-console/index.ts  |  2 +
 .../translation/admin-console/jwt-claims.ts   | 13 ++++++
 37 files changed, 302 insertions(+), 6 deletions(-)
 rename packages/console/src/{pages => containers}/ConsoleRoutes/index.tsx (93%)
 create mode 100644 packages/console/src/pages/JwtClaims/index.module.scss
 create mode 100644 packages/console/src/pages/JwtClaims/index.tsx
 create mode 100644 packages/console/src/pages/JwtClaims/type.ts
 create mode 100644 packages/phrases/src/locales/de/translation/admin-console/jwt-claims.ts
 create mode 100644 packages/phrases/src/locales/en/translation/admin-console/jwt-claims.ts
 create mode 100644 packages/phrases/src/locales/es/translation/admin-console/jwt-claims.ts
 create mode 100644 packages/phrases/src/locales/fr/translation/admin-console/jwt-claims.ts
 create mode 100644 packages/phrases/src/locales/it/translation/admin-console/jwt-claims.ts
 create mode 100644 packages/phrases/src/locales/ja/translation/admin-console/jwt-claims.ts
 create mode 100644 packages/phrases/src/locales/ko/translation/admin-console/jwt-claims.ts
 create mode 100644 packages/phrases/src/locales/pl-pl/translation/admin-console/jwt-claims.ts
 create mode 100644 packages/phrases/src/locales/pt-br/translation/admin-console/jwt-claims.ts
 create mode 100644 packages/phrases/src/locales/pt-pt/translation/admin-console/jwt-claims.ts
 create mode 100644 packages/phrases/src/locales/ru/translation/admin-console/jwt-claims.ts
 create mode 100644 packages/phrases/src/locales/tr-tr/translation/admin-console/jwt-claims.ts
 create mode 100644 packages/phrases/src/locales/zh-cn/translation/admin-console/jwt-claims.ts
 create mode 100644 packages/phrases/src/locales/zh-hk/translation/admin-console/jwt-claims.ts
 create mode 100644 packages/phrases/src/locales/zh-tw/translation/admin-console/jwt-claims.ts

diff --git a/packages/console/src/App.tsx b/packages/console/src/App.tsx
index 3f2ab4b69..9db1a229c 100644
--- a/packages/console/src/App.tsx
+++ b/packages/console/src/App.tsx
@@ -22,10 +22,10 @@ import CloudAppRoutes from '@/cloud/AppRoutes';
 import AppLoading from '@/components/AppLoading';
 import { isCloud } from '@/consts/env';
 import { cloudApi, getManagementApi, meApi } from '@/consts/resources';
+import { ConsoleRoutes } from '@/containers/ConsoleRoutes';
 import useTrackUserId from '@/hooks/use-track-user-id';
 import { OnboardingRoutes } from '@/onboarding';
 import useUserOnboardingData from '@/onboarding/hooks/use-user-onboarding-data';
-import { ConsoleRoutes } from '@/pages/ConsoleRoutes';
 
 import { GlobalScripts } from './components/Conversion';
 import { adminTenantEndpoint, mainTitle } from './consts';
diff --git a/packages/console/src/consts/env.ts b/packages/console/src/consts/env.ts
index 1b1c95c51..fcdd528d1 100644
--- a/packages/console/src/consts/env.ts
+++ b/packages/console/src/consts/env.ts
@@ -3,6 +3,6 @@ import { yes } from '@silverhand/essentials';
 export const isProduction = process.env.NODE_ENV === 'production';
 export const isCloud = yes(process.env.IS_CLOUD);
 export const adminEndpoint = process.env.ADMIN_ENDPOINT;
-// eslint-disable-next-line import/no-unused-modules
+
 export const isDevFeaturesEnabled =
   !isProduction || yes(process.env.DEV_FEATURES_ENABLED) || yes(process.env.INTEGRATION_TEST);
diff --git a/packages/console/src/containers/ConsoleContent/index.tsx b/packages/console/src/containers/ConsoleContent/index.tsx
index a1e63ad5c..0f0e59207 100644
--- a/packages/console/src/containers/ConsoleContent/index.tsx
+++ b/packages/console/src/containers/ConsoleContent/index.tsx
@@ -11,7 +11,7 @@ import {
   ApplicationDetailsTabs,
   EnterpriseSsoDetailsTabs,
 } from '@/consts';
-import { isCloud } from '@/consts/env';
+import { isCloud, isDevFeaturesEnabled } from '@/consts/env';
 import { TenantsContext } from '@/contexts/TenantsProvider';
 import OverlayScrollbar from '@/ds-components/OverlayScrollbar';
 import ApiResourceDetails from '@/pages/ApiResourceDetails';
@@ -28,6 +28,7 @@ import Dashboard from '@/pages/Dashboard';
 import EnterpriseSsoConnectors from '@/pages/EnterpriseSso';
 import EnterpriseSsoConnectorDetails from '@/pages/EnterpriseSsoDetails';
 import GetStarted from '@/pages/GetStarted';
+import JwtClaims, { JwtTokenType } from '@/pages/JwtClaims';
 import Mfa from '@/pages/Mfa';
 import NotFound from '@/pages/NotFound';
 import OrganizationDetails from '@/pages/OrganizationDetails';
@@ -203,6 +204,19 @@ function ConsoleContent() {
                 )}
               </Route>
             )}
+            {isDevFeaturesEnabled && (
+              <Route path="jwt-claims">
+                <Route index element={<Navigate replace to={JwtTokenType.UserAccessToken} />} />
+                <Route
+                  path={JwtTokenType.UserAccessToken}
+                  element={<JwtClaims tab={JwtTokenType.UserAccessToken} />}
+                />
+                <Route
+                  path={JwtTokenType.MachineToMachineAccessToken}
+                  element={<JwtClaims tab={JwtTokenType.MachineToMachineAccessToken} />}
+                />
+              </Route>
+            )}
           </Routes>
         </div>
       </OverlayScrollbar>
diff --git a/packages/console/src/pages/ConsoleRoutes/index.tsx b/packages/console/src/containers/ConsoleRoutes/index.tsx
similarity index 93%
rename from packages/console/src/pages/ConsoleRoutes/index.tsx
rename to packages/console/src/containers/ConsoleRoutes/index.tsx
index 56acf8853..ec49548bc 100644
--- a/packages/console/src/pages/ConsoleRoutes/index.tsx
+++ b/packages/console/src/containers/ConsoleRoutes/index.tsx
@@ -14,12 +14,11 @@ import { GlobalRoute } from '@/contexts/TenantsProvider';
 import Toast from '@/ds-components/Toast';
 import useSwrOptions from '@/hooks/use-swr-options';
 import Callback from '@/pages/Callback';
+import CheckoutSuccessCallback from '@/pages/CheckoutSuccessCallback';
+import HandleSocialCallback from '@/pages/Profile/containers/HandleSocialCallback';
 import Welcome from '@/pages/Welcome';
 import { dropLeadingSlash } from '@/utils/url';
 
-import CheckoutSuccessCallback from '../CheckoutSuccessCallback';
-import HandleSocialCallback from '../Profile/containers/HandleSocialCallback';
-
 function Layout() {
   const swrOptions = useSwrOptions();
 
diff --git a/packages/console/src/pages/JwtClaims/index.module.scss b/packages/console/src/pages/JwtClaims/index.module.scss
new file mode 100644
index 000000000..2b553139a
--- /dev/null
+++ b/packages/console/src/pages/JwtClaims/index.module.scss
@@ -0,0 +1,12 @@
+@use '@/scss/underscore' as _;
+
+.container {
+  display: flex;
+  flex-direction: column;
+  height: 100%;
+
+  .cardTitle {
+    flex-shrink: 0;
+    margin-bottom: _.unit(4);
+  }
+}
diff --git a/packages/console/src/pages/JwtClaims/index.tsx b/packages/console/src/pages/JwtClaims/index.tsx
new file mode 100644
index 000000000..460090874
--- /dev/null
+++ b/packages/console/src/pages/JwtClaims/index.tsx
@@ -0,0 +1,46 @@
+import { withAppInsights } from '@logto/app-insights/react/AppInsightsReact';
+import { useTranslation } from 'react-i18next';
+
+import CardTitle from '@/ds-components/CardTitle';
+import TabNav, { TabNavItem } from '@/ds-components/TabNav';
+
+import * as styles from './index.module.scss';
+import { JwtTokenType } from './type';
+
+export * from './type';
+
+type Props = {
+  tab: JwtTokenType;
+};
+
+const getPath = (tab: JwtTokenType) => `/jwt-claims/${tab}`;
+
+function JwtClaims({ tab }: Props) {
+  const { t } = useTranslation(undefined, { keyPrefix: 'admin_console' });
+
+  return (
+    <div className={styles.container}>
+      <CardTitle
+        title="jwt_claims.title"
+        subtitle="jwt_claims.description"
+        className={styles.cardTitle}
+      />
+      <TabNav>
+        <TabNavItem
+          href={getPath(JwtTokenType.UserAccessToken)}
+          isActive={tab === JwtTokenType.UserAccessToken}
+        >
+          {t('jwt_claims.user_jwt_tab')}
+        </TabNavItem>
+        <TabNavItem
+          href={getPath(JwtTokenType.MachineToMachineAccessToken)}
+          isActive={tab === JwtTokenType.MachineToMachineAccessToken}
+        >
+          {t('jwt_claims.machine_to_machine_jwt_tab')}
+        </TabNavItem>
+      </TabNav>
+    </div>
+  );
+}
+
+export default withAppInsights(JwtClaims);
diff --git a/packages/console/src/pages/JwtClaims/type.ts b/packages/console/src/pages/JwtClaims/type.ts
new file mode 100644
index 000000000..a0370d5d1
--- /dev/null
+++ b/packages/console/src/pages/JwtClaims/type.ts
@@ -0,0 +1,4 @@
+export enum JwtTokenType {
+  UserAccessToken = 'user-access-token',
+  MachineToMachineAccessToken = 'm2m-access-token',
+}
diff --git a/packages/phrases/src/locales/de/translation/admin-console/index.ts b/packages/phrases/src/locales/de/translation/admin-console/index.ts
index 7966b16f4..1e202610c 100644
--- a/packages/phrases/src/locales/de/translation/admin-console/index.ts
+++ b/packages/phrases/src/locales/de/translation/admin-console/index.ts
@@ -15,6 +15,7 @@ import errors from './errors.js';
 import general from './general.js';
 import get_started from './get-started.js';
 import guide from './guide.js';
+import jwt_claims from './jwt-claims.js';
 import log_details from './log-details.js';
 import logs from './logs.js';
 import menu from './menu.js';
@@ -85,6 +86,7 @@ const admin_console = {
   organizations,
   organization_details,
   protected_app,
+  jwt_claims,
 };
 
 export default Object.freeze(admin_console);
diff --git a/packages/phrases/src/locales/de/translation/admin-console/jwt-claims.ts b/packages/phrases/src/locales/de/translation/admin-console/jwt-claims.ts
new file mode 100644
index 000000000..f61d836e2
--- /dev/null
+++ b/packages/phrases/src/locales/de/translation/admin-console/jwt-claims.ts
@@ -0,0 +1,13 @@
+const jwt_claims = {
+  /** UNTRANSLATED */
+  title: 'JWT claims',
+  /** UNTRANSLATED */
+  description:
+    'Set up custom JWT claims to include in the access token. These claims can be used to pass additional information to your application.',
+  /** UNTRANSLATED */
+  user_jwt_tab: 'User JWT',
+  /** UNTRANSLATED */
+  machine_to_machine_jwt_tab: 'Machine-to-Machine JWT',
+};
+
+export default Object.freeze(jwt_claims);
diff --git a/packages/phrases/src/locales/en/translation/admin-console/index.ts b/packages/phrases/src/locales/en/translation/admin-console/index.ts
index f2b18bef7..1989c8ce7 100644
--- a/packages/phrases/src/locales/en/translation/admin-console/index.ts
+++ b/packages/phrases/src/locales/en/translation/admin-console/index.ts
@@ -15,6 +15,7 @@ import errors from './errors.js';
 import general from './general.js';
 import get_started from './get-started.js';
 import guide from './guide.js';
+import jwt_claims from './jwt-claims.js';
 import log_details from './log-details.js';
 import logs from './logs.js';
 import menu from './menu.js';
@@ -85,6 +86,7 @@ const admin_console = {
   organizations,
   organization_details,
   protected_app,
+  jwt_claims,
 };
 
 export default Object.freeze(admin_console);
diff --git a/packages/phrases/src/locales/en/translation/admin-console/jwt-claims.ts b/packages/phrases/src/locales/en/translation/admin-console/jwt-claims.ts
new file mode 100644
index 000000000..bd25282b4
--- /dev/null
+++ b/packages/phrases/src/locales/en/translation/admin-console/jwt-claims.ts
@@ -0,0 +1,9 @@
+const jwt_claims = {
+  title: 'JWT claims',
+  description:
+    'Set up custom JWT claims to include in the access token. These claims can be used to pass additional information to your application.',
+  user_jwt_tab: 'User JWT',
+  machine_to_machine_jwt_tab: 'Machine-to-Machine JWT',
+};
+
+export default Object.freeze(jwt_claims);
diff --git a/packages/phrases/src/locales/es/translation/admin-console/index.ts b/packages/phrases/src/locales/es/translation/admin-console/index.ts
index ad0720c38..0ee21b9f3 100644
--- a/packages/phrases/src/locales/es/translation/admin-console/index.ts
+++ b/packages/phrases/src/locales/es/translation/admin-console/index.ts
@@ -15,6 +15,7 @@ import errors from './errors.js';
 import general from './general.js';
 import get_started from './get-started.js';
 import guide from './guide.js';
+import jwt_claims from './jwt-claims.js';
 import log_details from './log-details.js';
 import logs from './logs.js';
 import menu from './menu.js';
@@ -85,6 +86,7 @@ const admin_console = {
   organizations,
   organization_details,
   protected_app,
+  jwt_claims,
 };
 
 export default Object.freeze(admin_console);
diff --git a/packages/phrases/src/locales/es/translation/admin-console/jwt-claims.ts b/packages/phrases/src/locales/es/translation/admin-console/jwt-claims.ts
new file mode 100644
index 000000000..f61d836e2
--- /dev/null
+++ b/packages/phrases/src/locales/es/translation/admin-console/jwt-claims.ts
@@ -0,0 +1,13 @@
+const jwt_claims = {
+  /** UNTRANSLATED */
+  title: 'JWT claims',
+  /** UNTRANSLATED */
+  description:
+    'Set up custom JWT claims to include in the access token. These claims can be used to pass additional information to your application.',
+  /** UNTRANSLATED */
+  user_jwt_tab: 'User JWT',
+  /** UNTRANSLATED */
+  machine_to_machine_jwt_tab: 'Machine-to-Machine JWT',
+};
+
+export default Object.freeze(jwt_claims);
diff --git a/packages/phrases/src/locales/fr/translation/admin-console/index.ts b/packages/phrases/src/locales/fr/translation/admin-console/index.ts
index f2b18bef7..1989c8ce7 100644
--- a/packages/phrases/src/locales/fr/translation/admin-console/index.ts
+++ b/packages/phrases/src/locales/fr/translation/admin-console/index.ts
@@ -15,6 +15,7 @@ import errors from './errors.js';
 import general from './general.js';
 import get_started from './get-started.js';
 import guide from './guide.js';
+import jwt_claims from './jwt-claims.js';
 import log_details from './log-details.js';
 import logs from './logs.js';
 import menu from './menu.js';
@@ -85,6 +86,7 @@ const admin_console = {
   organizations,
   organization_details,
   protected_app,
+  jwt_claims,
 };
 
 export default Object.freeze(admin_console);
diff --git a/packages/phrases/src/locales/fr/translation/admin-console/jwt-claims.ts b/packages/phrases/src/locales/fr/translation/admin-console/jwt-claims.ts
new file mode 100644
index 000000000..f61d836e2
--- /dev/null
+++ b/packages/phrases/src/locales/fr/translation/admin-console/jwt-claims.ts
@@ -0,0 +1,13 @@
+const jwt_claims = {
+  /** UNTRANSLATED */
+  title: 'JWT claims',
+  /** UNTRANSLATED */
+  description:
+    'Set up custom JWT claims to include in the access token. These claims can be used to pass additional information to your application.',
+  /** UNTRANSLATED */
+  user_jwt_tab: 'User JWT',
+  /** UNTRANSLATED */
+  machine_to_machine_jwt_tab: 'Machine-to-Machine JWT',
+};
+
+export default Object.freeze(jwt_claims);
diff --git a/packages/phrases/src/locales/it/translation/admin-console/index.ts b/packages/phrases/src/locales/it/translation/admin-console/index.ts
index f2b18bef7..1989c8ce7 100644
--- a/packages/phrases/src/locales/it/translation/admin-console/index.ts
+++ b/packages/phrases/src/locales/it/translation/admin-console/index.ts
@@ -15,6 +15,7 @@ import errors from './errors.js';
 import general from './general.js';
 import get_started from './get-started.js';
 import guide from './guide.js';
+import jwt_claims from './jwt-claims.js';
 import log_details from './log-details.js';
 import logs from './logs.js';
 import menu from './menu.js';
@@ -85,6 +86,7 @@ const admin_console = {
   organizations,
   organization_details,
   protected_app,
+  jwt_claims,
 };
 
 export default Object.freeze(admin_console);
diff --git a/packages/phrases/src/locales/it/translation/admin-console/jwt-claims.ts b/packages/phrases/src/locales/it/translation/admin-console/jwt-claims.ts
new file mode 100644
index 000000000..f61d836e2
--- /dev/null
+++ b/packages/phrases/src/locales/it/translation/admin-console/jwt-claims.ts
@@ -0,0 +1,13 @@
+const jwt_claims = {
+  /** UNTRANSLATED */
+  title: 'JWT claims',
+  /** UNTRANSLATED */
+  description:
+    'Set up custom JWT claims to include in the access token. These claims can be used to pass additional information to your application.',
+  /** UNTRANSLATED */
+  user_jwt_tab: 'User JWT',
+  /** UNTRANSLATED */
+  machine_to_machine_jwt_tab: 'Machine-to-Machine JWT',
+};
+
+export default Object.freeze(jwt_claims);
diff --git a/packages/phrases/src/locales/ja/translation/admin-console/index.ts b/packages/phrases/src/locales/ja/translation/admin-console/index.ts
index f2b18bef7..1989c8ce7 100644
--- a/packages/phrases/src/locales/ja/translation/admin-console/index.ts
+++ b/packages/phrases/src/locales/ja/translation/admin-console/index.ts
@@ -15,6 +15,7 @@ import errors from './errors.js';
 import general from './general.js';
 import get_started from './get-started.js';
 import guide from './guide.js';
+import jwt_claims from './jwt-claims.js';
 import log_details from './log-details.js';
 import logs from './logs.js';
 import menu from './menu.js';
@@ -85,6 +86,7 @@ const admin_console = {
   organizations,
   organization_details,
   protected_app,
+  jwt_claims,
 };
 
 export default Object.freeze(admin_console);
diff --git a/packages/phrases/src/locales/ja/translation/admin-console/jwt-claims.ts b/packages/phrases/src/locales/ja/translation/admin-console/jwt-claims.ts
new file mode 100644
index 000000000..f61d836e2
--- /dev/null
+++ b/packages/phrases/src/locales/ja/translation/admin-console/jwt-claims.ts
@@ -0,0 +1,13 @@
+const jwt_claims = {
+  /** UNTRANSLATED */
+  title: 'JWT claims',
+  /** UNTRANSLATED */
+  description:
+    'Set up custom JWT claims to include in the access token. These claims can be used to pass additional information to your application.',
+  /** UNTRANSLATED */
+  user_jwt_tab: 'User JWT',
+  /** UNTRANSLATED */
+  machine_to_machine_jwt_tab: 'Machine-to-Machine JWT',
+};
+
+export default Object.freeze(jwt_claims);
diff --git a/packages/phrases/src/locales/ko/translation/admin-console/index.ts b/packages/phrases/src/locales/ko/translation/admin-console/index.ts
index 775b3e311..0b428e456 100644
--- a/packages/phrases/src/locales/ko/translation/admin-console/index.ts
+++ b/packages/phrases/src/locales/ko/translation/admin-console/index.ts
@@ -15,6 +15,7 @@ import errors from './errors.js';
 import general from './general.js';
 import get_started from './get-started.js';
 import guide from './guide.js';
+import jwt_claims from './jwt-claims.js';
 import log_details from './log-details.js';
 import logs from './logs.js';
 import menu from './menu.js';
@@ -85,6 +86,7 @@ const admin_console = {
   organizations,
   organization_details,
   protected_app,
+  jwt_claims,
 };
 
 export default Object.freeze(admin_console);
diff --git a/packages/phrases/src/locales/ko/translation/admin-console/jwt-claims.ts b/packages/phrases/src/locales/ko/translation/admin-console/jwt-claims.ts
new file mode 100644
index 000000000..f61d836e2
--- /dev/null
+++ b/packages/phrases/src/locales/ko/translation/admin-console/jwt-claims.ts
@@ -0,0 +1,13 @@
+const jwt_claims = {
+  /** UNTRANSLATED */
+  title: 'JWT claims',
+  /** UNTRANSLATED */
+  description:
+    'Set up custom JWT claims to include in the access token. These claims can be used to pass additional information to your application.',
+  /** UNTRANSLATED */
+  user_jwt_tab: 'User JWT',
+  /** UNTRANSLATED */
+  machine_to_machine_jwt_tab: 'Machine-to-Machine JWT',
+};
+
+export default Object.freeze(jwt_claims);
diff --git a/packages/phrases/src/locales/pl-pl/translation/admin-console/index.ts b/packages/phrases/src/locales/pl-pl/translation/admin-console/index.ts
index 775b3e311..0b428e456 100644
--- a/packages/phrases/src/locales/pl-pl/translation/admin-console/index.ts
+++ b/packages/phrases/src/locales/pl-pl/translation/admin-console/index.ts
@@ -15,6 +15,7 @@ import errors from './errors.js';
 import general from './general.js';
 import get_started from './get-started.js';
 import guide from './guide.js';
+import jwt_claims from './jwt-claims.js';
 import log_details from './log-details.js';
 import logs from './logs.js';
 import menu from './menu.js';
@@ -85,6 +86,7 @@ const admin_console = {
   organizations,
   organization_details,
   protected_app,
+  jwt_claims,
 };
 
 export default Object.freeze(admin_console);
diff --git a/packages/phrases/src/locales/pl-pl/translation/admin-console/jwt-claims.ts b/packages/phrases/src/locales/pl-pl/translation/admin-console/jwt-claims.ts
new file mode 100644
index 000000000..f61d836e2
--- /dev/null
+++ b/packages/phrases/src/locales/pl-pl/translation/admin-console/jwt-claims.ts
@@ -0,0 +1,13 @@
+const jwt_claims = {
+  /** UNTRANSLATED */
+  title: 'JWT claims',
+  /** UNTRANSLATED */
+  description:
+    'Set up custom JWT claims to include in the access token. These claims can be used to pass additional information to your application.',
+  /** UNTRANSLATED */
+  user_jwt_tab: 'User JWT',
+  /** UNTRANSLATED */
+  machine_to_machine_jwt_tab: 'Machine-to-Machine JWT',
+};
+
+export default Object.freeze(jwt_claims);
diff --git a/packages/phrases/src/locales/pt-br/translation/admin-console/index.ts b/packages/phrases/src/locales/pt-br/translation/admin-console/index.ts
index 095fa2a77..a7a2fe04f 100644
--- a/packages/phrases/src/locales/pt-br/translation/admin-console/index.ts
+++ b/packages/phrases/src/locales/pt-br/translation/admin-console/index.ts
@@ -15,6 +15,7 @@ import errors from './errors.js';
 import general from './general.js';
 import get_started from './get-started.js';
 import guide from './guide.js';
+import jwt_claims from './jwt-claims.js';
 import log_details from './log-details.js';
 import logs from './logs.js';
 import menu from './menu.js';
@@ -85,6 +86,7 @@ const admin_console = {
   organizations,
   organization_details,
   protected_app,
+  jwt_claims,
 };
 
 export default Object.freeze(admin_console);
diff --git a/packages/phrases/src/locales/pt-br/translation/admin-console/jwt-claims.ts b/packages/phrases/src/locales/pt-br/translation/admin-console/jwt-claims.ts
new file mode 100644
index 000000000..f61d836e2
--- /dev/null
+++ b/packages/phrases/src/locales/pt-br/translation/admin-console/jwt-claims.ts
@@ -0,0 +1,13 @@
+const jwt_claims = {
+  /** UNTRANSLATED */
+  title: 'JWT claims',
+  /** UNTRANSLATED */
+  description:
+    'Set up custom JWT claims to include in the access token. These claims can be used to pass additional information to your application.',
+  /** UNTRANSLATED */
+  user_jwt_tab: 'User JWT',
+  /** UNTRANSLATED */
+  machine_to_machine_jwt_tab: 'Machine-to-Machine JWT',
+};
+
+export default Object.freeze(jwt_claims);
diff --git a/packages/phrases/src/locales/pt-pt/translation/admin-console/index.ts b/packages/phrases/src/locales/pt-pt/translation/admin-console/index.ts
index 774ab6c00..fca5ccdd2 100644
--- a/packages/phrases/src/locales/pt-pt/translation/admin-console/index.ts
+++ b/packages/phrases/src/locales/pt-pt/translation/admin-console/index.ts
@@ -15,6 +15,7 @@ import errors from './errors.js';
 import general from './general.js';
 import get_started from './get-started.js';
 import guide from './guide.js';
+import jwt_claims from './jwt-claims.js';
 import log_details from './log-details.js';
 import logs from './logs.js';
 import menu from './menu.js';
@@ -85,6 +86,7 @@ const admin_console = {
   organizations,
   organization_details,
   protected_app,
+  jwt_claims,
 };
 
 export default Object.freeze(admin_console);
diff --git a/packages/phrases/src/locales/pt-pt/translation/admin-console/jwt-claims.ts b/packages/phrases/src/locales/pt-pt/translation/admin-console/jwt-claims.ts
new file mode 100644
index 000000000..f61d836e2
--- /dev/null
+++ b/packages/phrases/src/locales/pt-pt/translation/admin-console/jwt-claims.ts
@@ -0,0 +1,13 @@
+const jwt_claims = {
+  /** UNTRANSLATED */
+  title: 'JWT claims',
+  /** UNTRANSLATED */
+  description:
+    'Set up custom JWT claims to include in the access token. These claims can be used to pass additional information to your application.',
+  /** UNTRANSLATED */
+  user_jwt_tab: 'User JWT',
+  /** UNTRANSLATED */
+  machine_to_machine_jwt_tab: 'Machine-to-Machine JWT',
+};
+
+export default Object.freeze(jwt_claims);
diff --git a/packages/phrases/src/locales/ru/translation/admin-console/index.ts b/packages/phrases/src/locales/ru/translation/admin-console/index.ts
index 2e290287b..8b96baa11 100644
--- a/packages/phrases/src/locales/ru/translation/admin-console/index.ts
+++ b/packages/phrases/src/locales/ru/translation/admin-console/index.ts
@@ -15,6 +15,7 @@ import errors from './errors.js';
 import general from './general.js';
 import get_started from './get-started.js';
 import guide from './guide.js';
+import jwt_claims from './jwt-claims.js';
 import log_details from './log-details.js';
 import logs from './logs.js';
 import menu from './menu.js';
@@ -85,6 +86,7 @@ const admin_console = {
   organizations,
   organization_details,
   protected_app,
+  jwt_claims,
 };
 
 export default Object.freeze(admin_console);
diff --git a/packages/phrases/src/locales/ru/translation/admin-console/jwt-claims.ts b/packages/phrases/src/locales/ru/translation/admin-console/jwt-claims.ts
new file mode 100644
index 000000000..f61d836e2
--- /dev/null
+++ b/packages/phrases/src/locales/ru/translation/admin-console/jwt-claims.ts
@@ -0,0 +1,13 @@
+const jwt_claims = {
+  /** UNTRANSLATED */
+  title: 'JWT claims',
+  /** UNTRANSLATED */
+  description:
+    'Set up custom JWT claims to include in the access token. These claims can be used to pass additional information to your application.',
+  /** UNTRANSLATED */
+  user_jwt_tab: 'User JWT',
+  /** UNTRANSLATED */
+  machine_to_machine_jwt_tab: 'Machine-to-Machine JWT',
+};
+
+export default Object.freeze(jwt_claims);
diff --git a/packages/phrases/src/locales/tr-tr/translation/admin-console/index.ts b/packages/phrases/src/locales/tr-tr/translation/admin-console/index.ts
index b1aabc9eb..f277d4755 100644
--- a/packages/phrases/src/locales/tr-tr/translation/admin-console/index.ts
+++ b/packages/phrases/src/locales/tr-tr/translation/admin-console/index.ts
@@ -15,6 +15,7 @@ import errors from './errors.js';
 import general from './general.js';
 import get_started from './get-started.js';
 import guide from './guide.js';
+import jwt_claims from './jwt-claims.js';
 import log_details from './log-details.js';
 import logs from './logs.js';
 import menu from './menu.js';
@@ -85,6 +86,7 @@ const admin_console = {
   organizations,
   organization_details,
   protected_app,
+  jwt_claims,
 };
 
 export default Object.freeze(admin_console);
diff --git a/packages/phrases/src/locales/tr-tr/translation/admin-console/jwt-claims.ts b/packages/phrases/src/locales/tr-tr/translation/admin-console/jwt-claims.ts
new file mode 100644
index 000000000..f61d836e2
--- /dev/null
+++ b/packages/phrases/src/locales/tr-tr/translation/admin-console/jwt-claims.ts
@@ -0,0 +1,13 @@
+const jwt_claims = {
+  /** UNTRANSLATED */
+  title: 'JWT claims',
+  /** UNTRANSLATED */
+  description:
+    'Set up custom JWT claims to include in the access token. These claims can be used to pass additional information to your application.',
+  /** UNTRANSLATED */
+  user_jwt_tab: 'User JWT',
+  /** UNTRANSLATED */
+  machine_to_machine_jwt_tab: 'Machine-to-Machine JWT',
+};
+
+export default Object.freeze(jwt_claims);
diff --git a/packages/phrases/src/locales/zh-cn/translation/admin-console/index.ts b/packages/phrases/src/locales/zh-cn/translation/admin-console/index.ts
index dad97ee43..dbbb9b238 100644
--- a/packages/phrases/src/locales/zh-cn/translation/admin-console/index.ts
+++ b/packages/phrases/src/locales/zh-cn/translation/admin-console/index.ts
@@ -15,6 +15,7 @@ import errors from './errors.js';
 import general from './general.js';
 import get_started from './get-started.js';
 import guide from './guide.js';
+import jwt_claims from './jwt-claims.js';
 import log_details from './log-details.js';
 import logs from './logs.js';
 import menu from './menu.js';
@@ -85,6 +86,7 @@ const admin_console = {
   organizations,
   organization_details,
   protected_app,
+  jwt_claims,
 };
 
 export default Object.freeze(admin_console);
diff --git a/packages/phrases/src/locales/zh-cn/translation/admin-console/jwt-claims.ts b/packages/phrases/src/locales/zh-cn/translation/admin-console/jwt-claims.ts
new file mode 100644
index 000000000..f61d836e2
--- /dev/null
+++ b/packages/phrases/src/locales/zh-cn/translation/admin-console/jwt-claims.ts
@@ -0,0 +1,13 @@
+const jwt_claims = {
+  /** UNTRANSLATED */
+  title: 'JWT claims',
+  /** UNTRANSLATED */
+  description:
+    'Set up custom JWT claims to include in the access token. These claims can be used to pass additional information to your application.',
+  /** UNTRANSLATED */
+  user_jwt_tab: 'User JWT',
+  /** UNTRANSLATED */
+  machine_to_machine_jwt_tab: 'Machine-to-Machine JWT',
+};
+
+export default Object.freeze(jwt_claims);
diff --git a/packages/phrases/src/locales/zh-hk/translation/admin-console/index.ts b/packages/phrases/src/locales/zh-hk/translation/admin-console/index.ts
index b742a19f9..4ef68123a 100644
--- a/packages/phrases/src/locales/zh-hk/translation/admin-console/index.ts
+++ b/packages/phrases/src/locales/zh-hk/translation/admin-console/index.ts
@@ -15,6 +15,7 @@ import errors from './errors.js';
 import general from './general.js';
 import get_started from './get-started.js';
 import guide from './guide.js';
+import jwt_claims from './jwt-claims.js';
 import log_details from './log-details.js';
 import logs from './logs.js';
 import menu from './menu.js';
@@ -85,6 +86,7 @@ const admin_console = {
   organizations,
   organization_details,
   protected_app,
+  jwt_claims,
 };
 
 export default Object.freeze(admin_console);
diff --git a/packages/phrases/src/locales/zh-hk/translation/admin-console/jwt-claims.ts b/packages/phrases/src/locales/zh-hk/translation/admin-console/jwt-claims.ts
new file mode 100644
index 000000000..f61d836e2
--- /dev/null
+++ b/packages/phrases/src/locales/zh-hk/translation/admin-console/jwt-claims.ts
@@ -0,0 +1,13 @@
+const jwt_claims = {
+  /** UNTRANSLATED */
+  title: 'JWT claims',
+  /** UNTRANSLATED */
+  description:
+    'Set up custom JWT claims to include in the access token. These claims can be used to pass additional information to your application.',
+  /** UNTRANSLATED */
+  user_jwt_tab: 'User JWT',
+  /** UNTRANSLATED */
+  machine_to_machine_jwt_tab: 'Machine-to-Machine JWT',
+};
+
+export default Object.freeze(jwt_claims);
diff --git a/packages/phrases/src/locales/zh-tw/translation/admin-console/index.ts b/packages/phrases/src/locales/zh-tw/translation/admin-console/index.ts
index b742a19f9..4ef68123a 100644
--- a/packages/phrases/src/locales/zh-tw/translation/admin-console/index.ts
+++ b/packages/phrases/src/locales/zh-tw/translation/admin-console/index.ts
@@ -15,6 +15,7 @@ import errors from './errors.js';
 import general from './general.js';
 import get_started from './get-started.js';
 import guide from './guide.js';
+import jwt_claims from './jwt-claims.js';
 import log_details from './log-details.js';
 import logs from './logs.js';
 import menu from './menu.js';
@@ -85,6 +86,7 @@ const admin_console = {
   organizations,
   organization_details,
   protected_app,
+  jwt_claims,
 };
 
 export default Object.freeze(admin_console);
diff --git a/packages/phrases/src/locales/zh-tw/translation/admin-console/jwt-claims.ts b/packages/phrases/src/locales/zh-tw/translation/admin-console/jwt-claims.ts
new file mode 100644
index 000000000..f61d836e2
--- /dev/null
+++ b/packages/phrases/src/locales/zh-tw/translation/admin-console/jwt-claims.ts
@@ -0,0 +1,13 @@
+const jwt_claims = {
+  /** UNTRANSLATED */
+  title: 'JWT claims',
+  /** UNTRANSLATED */
+  description:
+    'Set up custom JWT claims to include in the access token. These claims can be used to pass additional information to your application.',
+  /** UNTRANSLATED */
+  user_jwt_tab: 'User JWT',
+  /** UNTRANSLATED */
+  machine_to_machine_jwt_tab: 'Machine-to-Machine JWT',
+};
+
+export default Object.freeze(jwt_claims);