From 922a9eaaf7785d9eaf579764bbffec1c26220fc5 Mon Sep 17 00:00:00 2001 From: Gao Sun Date: Fri, 12 Apr 2024 18:38:19 +0800 Subject: [PATCH] refactor(console): use route objects --- .../src/containers/ConsoleContent/index.tsx | 239 +------------- .../src/hooks/use-console-routes/index.tsx | 292 ++++++++++++++++++ 2 files changed, 296 insertions(+), 235 deletions(-) create mode 100644 packages/console/src/hooks/use-console-routes/index.tsx diff --git a/packages/console/src/containers/ConsoleContent/index.tsx b/packages/console/src/containers/ConsoleContent/index.tsx index d53c8403278..47bf53847df 100644 --- a/packages/console/src/containers/ConsoleContent/index.tsx +++ b/packages/console/src/containers/ConsoleContent/index.tsx @@ -1,73 +1,7 @@ -import { useContext } from 'react'; -import { Navigate, Route, Routes, useOutletContext } from 'react-router-dom'; +import { useOutletContext } from 'react-router-dom'; -import { - ApplicationDetailsTabs, - ConnectorsTabs, - EnterpriseSsoDetailsTabs, - OrganizationTemplateTabs, - RoleDetailsTabs, - TenantSettingsTabs, - UserDetailsTabs, - WebhookDetailsTabs, -} from '@/consts'; -import { isCloud, isDevFeaturesEnabled } from '@/consts/env'; -import { TenantsContext } from '@/contexts/TenantsProvider'; import OverlayScrollbar from '@/ds-components/OverlayScrollbar'; -import useCurrentTenantScopes from '@/hooks/use-current-tenant-scopes'; -import ApiResourceDetails from '@/pages/ApiResourceDetails'; -import ApiResources from '@/pages/ApiResources'; -import ApplicationDetails from '@/pages/ApplicationDetails'; -import Applications from '@/pages/Applications'; -import AuditLogDetails from '@/pages/AuditLogDetails'; -import AuditLogs from '@/pages/AuditLogs'; -import ConnectorDetails from '@/pages/ConnectorDetails'; -import Connectors from '@/pages/Connectors'; -import CustomizeJwt from '@/pages/CustomizeJwt'; -import CustomizeJwtDetails from '@/pages/CustomizeJwtDetails'; -import Dashboard from '@/pages/Dashboard'; -import EnterpriseSsoConnectors from '@/pages/EnterpriseSso'; -import EnterpriseSsoConnectorDetails from '@/pages/EnterpriseSsoDetails'; -import GetStarted from '@/pages/GetStarted'; -import Mfa from '@/pages/Mfa'; -import NotFound from '@/pages/NotFound'; -import OrganizationDetails from '@/pages/OrganizationDetails'; -import OrganizationRoleDetails from '@/pages/OrganizationRoleDetails'; -import OrganizationTemplate from '@/pages/OrganizationTemplate'; -import OrganizationPermissions from '@/pages/OrganizationTemplate/OrganizationPermissions'; -import OrganizationRoles from '@/pages/OrganizationTemplate/OrganizationRoles'; -import Organizations from '@/pages/Organizations'; -import OrganizationGuide from '@/pages/Organizations/Guide'; -import Profile from '@/pages/Profile'; -import ChangePasswordModal from '@/pages/Profile/containers/ChangePasswordModal'; -import LinkEmailModal from '@/pages/Profile/containers/LinkEmailModal'; -import VerificationCodeModal from '@/pages/Profile/containers/VerificationCodeModal'; -import VerifyPasswordModal from '@/pages/Profile/containers/VerifyPasswordModal'; -import RoleDetails from '@/pages/RoleDetails'; -import RoleApplications from '@/pages/RoleDetails/RoleApplications'; -import RolePermissions from '@/pages/RoleDetails/RolePermissions'; -import RoleSettings from '@/pages/RoleDetails/RoleSettings'; -import RoleUsers from '@/pages/RoleDetails/RoleUsers'; -import Roles from '@/pages/Roles'; -import SignInExperience from '@/pages/SignInExperience'; -import { SignInExperienceTab } from '@/pages/SignInExperience/types'; -import SigningKeys from '@/pages/SigningKeys'; -import TenantSettings from '@/pages/TenantSettings'; -import BillingHistory from '@/pages/TenantSettings/BillingHistory'; -import Subscription from '@/pages/TenantSettings/Subscription'; -import TenantBasicSettings from '@/pages/TenantSettings/TenantBasicSettings'; -import TenantDomainSettings from '@/pages/TenantSettings/TenantDomainSettings'; -import TenantMembers from '@/pages/TenantSettings/TenantMembers'; -import UserDetails from '@/pages/UserDetails'; -import UserLogs from '@/pages/UserDetails/UserLogs'; -import UserOrganizations from '@/pages/UserDetails/UserOrganizations'; -import UserRoles from '@/pages/UserDetails/UserRoles'; -import UserSettings from '@/pages/UserDetails/UserSettings'; -import Users from '@/pages/Users'; -import WebhookDetails from '@/pages/WebhookDetails'; -import WebhookLogs from '@/pages/WebhookDetails/WebhookLogs'; -import WebhookSettings from '@/pages/WebhookDetails/WebhookSettings'; -import Webhooks from '@/pages/Webhooks'; +import { useConsoleRoutes } from '@/hooks/use-console-routes'; import type { AppContentOutletContext } from '../AppContent/types'; @@ -76,179 +10,14 @@ import * as styles from './index.module.scss'; function ConsoleContent() { const { scrollableContent } = useOutletContext(); - const { isDevTenant } = useContext(TenantsContext); - const { canManageTenant } = useCurrentTenantScopes(); + const routes = useConsoleRoutes(); return (
- - } /> - } /> - } /> - - } /> - } - /> - } /> - } /> - - } /> - } /> - - } - /> - - - } /> - } /> - } /> - } /> - - - } /> - } /> - - } /> - - } /> - } /> - } /> - } /> - } /> - - - } /> - } /> - - } - /> - } /> - - - - } /> - } /> - }> - } /> - } /> - } /> - - } - /> - - - } /> - } /> - }> - } /> - } /> - } /> - } /> - } /> - - } - /> - - - } /> - } /> - - - } /> - } /> - }> - } /> - } /> - } /> - } /> - } /> - - - {isDevFeaturesEnabled && ( - <> - }> - } - /> - } - /> - } - /> - - } - /> - - )} - - } /> - } /> - {!isDevFeaturesEnabled && ( - } /> - )} - } /> - - {!isDevFeaturesEnabled && ( - } /> - )} - - } /> - } /> - } /> - } /> - } /> - - } /> - {isCloud && ( - }> - - } - /> - } /> - } /> - } /> - {!isDevTenant && canManageTenant && ( - <> - } /> - } /> - - )} - - )} - {isCloud && isDevFeaturesEnabled && ( - - } /> - } /> - - )} - + {routes}
diff --git a/packages/console/src/hooks/use-console-routes/index.tsx b/packages/console/src/hooks/use-console-routes/index.tsx new file mode 100644 index 00000000000..3acac0eabfe --- /dev/null +++ b/packages/console/src/hooks/use-console-routes/index.tsx @@ -0,0 +1,292 @@ +import { condArray } from '@silverhand/essentials'; +import { useContext, useMemo } from 'react'; +import { Navigate, type RouteObject, useRoutes } from 'react-router-dom'; + +import { + ApplicationDetailsTabs, + ConnectorsTabs, + EnterpriseSsoDetailsTabs, + OrganizationTemplateTabs, + RoleDetailsTabs, + TenantSettingsTabs, + UserDetailsTabs, + WebhookDetailsTabs, +} from '@/consts'; +import { isCloud, isDevFeaturesEnabled } from '@/consts/env'; +import { TenantsContext } from '@/contexts/TenantsProvider'; +import useCurrentTenantScopes from '@/hooks/use-current-tenant-scopes'; +import ApiResourceDetails from '@/pages/ApiResourceDetails'; +import ApiResources from '@/pages/ApiResources'; +import ApplicationDetails from '@/pages/ApplicationDetails'; +import Applications from '@/pages/Applications'; +import AuditLogDetails from '@/pages/AuditLogDetails'; +import AuditLogs from '@/pages/AuditLogs'; +import ConnectorDetails from '@/pages/ConnectorDetails'; +import Connectors from '@/pages/Connectors'; +import CustomizeJwt from '@/pages/CustomizeJwt'; +import CustomizeJwtDetails from '@/pages/CustomizeJwtDetails'; +import Dashboard from '@/pages/Dashboard'; +import EnterpriseSsoConnectors from '@/pages/EnterpriseSso'; +import EnterpriseSsoConnectorDetails from '@/pages/EnterpriseSsoDetails'; +import GetStarted from '@/pages/GetStarted'; +import Mfa from '@/pages/Mfa'; +import NotFound from '@/pages/NotFound'; +import OrganizationDetails from '@/pages/OrganizationDetails'; +import OrganizationRoleDetails from '@/pages/OrganizationRoleDetails'; +import OrganizationTemplate from '@/pages/OrganizationTemplate'; +import OrganizationPermissions from '@/pages/OrganizationTemplate/OrganizationPermissions'; +import OrganizationRoles from '@/pages/OrganizationTemplate/OrganizationRoles'; +import Organizations from '@/pages/Organizations'; +import OrganizationGuide from '@/pages/Organizations/Guide'; +import Profile from '@/pages/Profile'; +import ChangePasswordModal from '@/pages/Profile/containers/ChangePasswordModal'; +import LinkEmailModal from '@/pages/Profile/containers/LinkEmailModal'; +import VerificationCodeModal from '@/pages/Profile/containers/VerificationCodeModal'; +import VerifyPasswordModal from '@/pages/Profile/containers/VerifyPasswordModal'; +import RoleDetails from '@/pages/RoleDetails'; +import RoleApplications from '@/pages/RoleDetails/RoleApplications'; +import RolePermissions from '@/pages/RoleDetails/RolePermissions'; +import RoleSettings from '@/pages/RoleDetails/RoleSettings'; +import RoleUsers from '@/pages/RoleDetails/RoleUsers'; +import Roles from '@/pages/Roles'; +import SignInExperience from '@/pages/SignInExperience'; +import { SignInExperienceTab } from '@/pages/SignInExperience/types'; +import SigningKeys from '@/pages/SigningKeys'; +import TenantSettings from '@/pages/TenantSettings'; +import BillingHistory from '@/pages/TenantSettings/BillingHistory'; +import Subscription from '@/pages/TenantSettings/Subscription'; +import TenantBasicSettings from '@/pages/TenantSettings/TenantBasicSettings'; +import TenantDomainSettings from '@/pages/TenantSettings/TenantDomainSettings'; +import TenantMembers from '@/pages/TenantSettings/TenantMembers'; +import UserDetails from '@/pages/UserDetails'; +import UserLogs from '@/pages/UserDetails/UserLogs'; +import UserOrganizations from '@/pages/UserDetails/UserOrganizations'; +import UserRoles from '@/pages/UserDetails/UserRoles'; +import UserSettings from '@/pages/UserDetails/UserSettings'; +import Users from '@/pages/Users'; +import WebhookDetails from '@/pages/WebhookDetails'; +import WebhookLogs from '@/pages/WebhookDetails/WebhookLogs'; +import WebhookSettings from '@/pages/WebhookDetails/WebhookSettings'; +import Webhooks from '@/pages/Webhooks'; + +export const useConsoleRoutes = () => { + const { isDevTenant } = useContext(TenantsContext); + const { canManageTenant } = useCurrentTenantScopes(); + + const routeObjects: RouteObject[] = useMemo( + () => + condArray( + { path: '*', element: }, + { path: 'get-started', element: }, + { path: 'dashboard', element: }, + { + path: 'applications', + children: [ + { index: true, element: }, + { + path: 'third-party-applications', + element: , + }, + { path: 'create', element: }, + { path: ':id/guide/:guideId', element: }, + { + path: ':id', + children: [ + { index: true, element: }, + { path: ':tab', element: }, + ], + }, + { path: `:appId/${ApplicationDetailsTabs.Logs}/:logId`, element: }, + ], + }, + { + path: 'api-resources', + children: [ + { index: true, element: }, + { path: 'create', element: }, + { path: ':id/guide/:guideId', element: }, + { path: ':id/*', element: }, + ], + }, + { + path: 'sign-in-experience', + children: [ + { index: true, element: }, + { path: ':tab', element: }, + ], + }, + { path: 'mfa', element: }, + { + path: 'connectors', + children: [ + { index: true, element: }, + { path: ':tab', element: }, + { path: ':tab/create/:createType', element: }, + { path: ':tab/guide/:factoryId', element: }, + { path: ':tab/:connectorId', element: }, + ], + }, + { + path: 'enterprise-sso', + children: [ + { index: true, element: }, + { path: 'create', element: }, + { + path: ':ssoConnectorId', + children: [ + { + index: true, + element: , + }, + { path: ':tab', element: }, + ], + }, + ], + }, + { + path: 'webhooks', + children: [ + { index: true, element: }, + { path: 'create', element: }, + { + path: ':id', + element: , + children: [ + { index: true, element: }, + { path: WebhookDetailsTabs.Settings, element: }, + { path: WebhookDetailsTabs.RecentRequests, element: }, + ], + }, + { + path: `:hookId/${WebhookDetailsTabs.RecentRequests}/:logId`, + element: , + }, + ], + }, + { + path: 'users', + children: [ + { index: true, element: }, + { path: 'create', element: }, + { + path: ':id', + element: , + children: [ + { index: true, element: }, + { path: UserDetailsTabs.Settings, element: }, + { path: UserDetailsTabs.Roles, element: }, + { path: UserDetailsTabs.Logs, element: }, + { path: UserDetailsTabs.Organizations, element: }, + ], + }, + { path: `:userId/${UserDetailsTabs.Logs}/:logId`, element: }, + ], + }, + { + path: 'audit-logs', + children: [ + { index: true, element: }, + { path: ':logId', element: }, + ], + }, + { + path: 'roles', + children: [ + { index: true, element: }, + { path: 'create', element: }, + { + path: ':id', + element: , + children: [ + { index: true, element: }, + { path: RoleDetailsTabs.Settings, element: }, + { path: RoleDetailsTabs.Permissions, element: }, + { path: RoleDetailsTabs.Users, element: }, + { path: RoleDetailsTabs.M2mApps, element: }, + ], + }, + ], + }, + isDevFeaturesEnabled && [ + { + path: 'organization-template', + element: , + children: [ + { + index: true, + element: , + }, + { path: OrganizationTemplateTabs.OrganizationRoles, element: }, + { + path: OrganizationTemplateTabs.OrganizationPermissions, + element: , + }, + ], + }, + { + path: `organization-template/${OrganizationTemplateTabs.OrganizationRoles}/:id/*`, + element: , + }, + ], + { + path: 'organizations', + children: condArray( + { index: true, element: }, + { path: 'create', element: }, + !isDevFeaturesEnabled && { + path: 'template', + element: , + }, + { path: ':id/*', element: } + ), + }, + !isDevFeaturesEnabled && { path: 'organization-guide/*', element: }, + { + path: 'profile', + children: [ + { index: true, element: }, + { path: 'verify-password', element: }, + { path: 'change-password', element: }, + { path: 'link-email', element: }, + { path: 'verification-code', element: }, + ], + }, + { path: 'signing-keys', element: }, + isCloud && { + path: 'tenant-settings', + element: , + children: condArray( + { + index: true, + element: ( + + ), + }, + { path: TenantSettingsTabs.Settings, element: }, + { path: `${TenantSettingsTabs.Members}/*`, element: }, + { path: TenantSettingsTabs.Domains, element: }, + !isDevTenant && + canManageTenant && [ + { path: TenantSettingsTabs.Subscription, element: }, + { path: TenantSettingsTabs.BillingHistory, element: }, + ] + ), + }, + isCloud && + isDevFeaturesEnabled && { + path: 'customize-jwt', + children: [ + { index: true, element: }, + { path: ':tokenType/:action', element: }, + ], + } + ), + [canManageTenant, isDevTenant] + ); + const routes = useRoutes(routeObjects); + + return routes; +};