diff --git a/config/dev.js b/config/dev.js index 1ef377b48..98d19dce4 100644 --- a/config/dev.js +++ b/config/dev.js @@ -1,4 +1,5 @@ module.exports = { + TC_DOMAIN: 'topcoder-dev.com', /** * URL of Topcoder Community Website */ diff --git a/config/prod.js b/config/prod.js index 94bf5443b..3e81f2045 100644 --- a/config/prod.js +++ b/config/prod.js @@ -1,4 +1,5 @@ module.exports = { + TC_DOMAIN: 'topcoder.com', /** * URL of Topcoder Community Website */ diff --git a/src-ts/config/constants.ts b/src-ts/config/constants.ts index ff7bdc805..9b850fc54 100644 --- a/src-ts/config/constants.ts +++ b/src-ts/config/constants.ts @@ -1,3 +1,10 @@ +export enum AppSubdomain { + dev = 'devcenter', + game = 'gamification-admin', + tca = 'academy', + work = 'work', +} + export enum ToolTitle { dev = 'Dev Center', game = 'Gamification Admin', diff --git a/src-ts/config/environments/environment-config.model.ts b/src-ts/config/environments/environment-config.model.ts index 58628e7de..f3759224d 100644 --- a/src-ts/config/environments/environment-config.model.ts +++ b/src-ts/config/environments/environment-config.model.ts @@ -5,4 +5,6 @@ import { AppHostEnvironmentType } from './app-host-environment.type' export interface EnvironmentConfigModel extends GlobalConfig { // override the ENV var to require that it's defined in the type ENV: AppHostEnvironmentType, + + SUBDOMAIN: string, } diff --git a/src-ts/config/environments/environment.default.config.ts b/src-ts/config/environments/environment.default.config.ts index dc6978dc5..2b2a089c7 100644 --- a/src-ts/config/environments/environment.default.config.ts +++ b/src-ts/config/environments/environment.default.config.ts @@ -40,6 +40,7 @@ export const EnvironmentConfigDefault: EnvironmentConfigModel = { CUSTOMER_TOKEN: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJUb3Bjb2RlciBVc2VyIl0sImlzcyI6Imh0dHBzOi8vYXBpLnRvcGNvZGVyLWRldi5jb20iLCJoYW5kbGUiOiJ0ZXN0MSIsImV4cCI6MjU2MzA3NjY4OSwidXNlcklkIjoiNDAwNTEzMzMiLCJpYXQiOjE0NjMwNzYwODksImVtYWlsIjoidGVzdEB0b3Bjb2Rlci5jb20iLCJqdGkiOiJiMzNiNzdjZC1iNTJlLTQwZmUtODM3ZS1iZWI4ZTBhZTZhNGEifQ.jl6Lp_friVNwEP8nfsfmL-vrQFzOFp2IfM_HC7AwGcg', }, + SUBDOMAIN: window.location.hostname.split('.')[0], TOPCODER_URLS: { ACCOUNT_PROFILE: `${COMMUNITY_WEBSITE}/settings/profile`, ACCOUNT_SETTINGS: `${COMMUNITY_WEBSITE}/settings/account`, diff --git a/src-ts/lib/route-provider/platform-route.model.ts b/src-ts/lib/route-provider/platform-route.model.ts index 3662fa71c..7fc1d2f01 100644 --- a/src-ts/lib/route-provider/platform-route.model.ts +++ b/src-ts/lib/route-provider/platform-route.model.ts @@ -1,4 +1,5 @@ export interface PlatformRoute { + domain?: string alternativePaths?: Array authRequired?: boolean children?: Array diff --git a/src-ts/lib/route-provider/route-functions/index.ts b/src-ts/lib/route-provider/route-functions/index.ts index f341363d0..334056cd2 100644 --- a/src-ts/lib/route-provider/route-functions/index.ts +++ b/src-ts/lib/route-provider/route-functions/index.ts @@ -1,4 +1,5 @@ export { getActive as routeGetActive, getSignupUrl as routeGetSignupUrl, + matchAppRouter as routeMatchAppRouter, } from './route.functions' diff --git a/src-ts/lib/route-provider/route-functions/route.functions.ts b/src-ts/lib/route-provider/route-functions/route.functions.ts index 785d515c4..2eb2121a3 100644 --- a/src-ts/lib/route-provider/route-functions/route.functions.ts +++ b/src-ts/lib/route-provider/route-functions/route.functions.ts @@ -5,7 +5,10 @@ import { } from '../../functions' import { PlatformRoute } from '../platform-route.model' -export function getActive(currentLocation: string, toolRoutes: Array): PlatformRoute | undefined { +export function getActive( + currentLocation: string, + toolRoutes: Array, +): PlatformRoute | undefined { return toolRoutes.find(tool => isActiveTool(currentLocation, tool)) } @@ -33,3 +36,10 @@ function isActiveTool(activePath: string, toolRoute: PlatformRoute): boolean { return !!activePath.startsWith(toolRoute.route) || !!toolRoute.alternativePaths?.some(path => activePath.startsWith(path)) } + +export function matchAppRouter( + activeDomain: string | undefined, + toolsRoutes: Array, +): PlatformRoute | undefined { + return !activeDomain ? undefined : toolsRoutes.find(toolRoutes => activeDomain === toolRoutes.domain) +} diff --git a/src-ts/lib/route-provider/route.provider.tsx b/src-ts/lib/route-provider/route.provider.tsx index cdec5be87..e2e08daf2 100644 --- a/src-ts/lib/route-provider/route.provider.tsx +++ b/src-ts/lib/route-provider/route.provider.tsx @@ -14,11 +14,12 @@ import { Location, Route, useLocation } from 'react-router-dom' import { authUrlLogin } from '../functions' import { LoadingSpinner } from '../loading-spinner' import { profileContext, ProfileContextData } from '../profile-provider' +import { EnvironmentConfig } from '../../config' import { PlatformRoute } from './platform-route.model' import { RequireAuthProvider } from './require-auth-provider' import { RouteContextData } from './route-context-data.model' -import { routeGetActive, routeGetSignupUrl } from './route-functions' +import { routeGetActive, routeGetSignupUrl, routeMatchAppRouter } from './route-functions' import { default as routeContext, defaultRouteContextData } from './route.context' interface RouteProviderProps { @@ -53,7 +54,13 @@ export const RouteProvider: FC = (props: RouteProviderProps) ...utilsRoutes, ] - const activeRoute: PlatformRoute | undefined = routeGetActive(location.pathname, allRoutes) + let activeRoute: PlatformRoute | undefined = routeGetActive(location.pathname, allRoutes) + const matchedAppRouter: PlatformRoute | undefined = routeMatchAppRouter(EnvironmentConfig.SUBDOMAIN, allRoutes) + + if (matchedAppRouter) { + allRoutes = [matchedAppRouter] + activeRoute = matchedAppRouter + } // TODO: support additional roles and landing pages const loggedInRoot: string = !profile diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/getting-started/GettingStartedGuide.tsx b/src-ts/tools/dev-center/dev-center-pages/community-app/getting-started/GettingStartedGuide.tsx index c8333826e..e5e565513 100644 --- a/src-ts/tools/dev-center/dev-center-pages/community-app/getting-started/GettingStartedGuide.tsx +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/getting-started/GettingStartedGuide.tsx @@ -1,7 +1,7 @@ import * as React from 'react' import { Breadcrumb, BreadcrumbItemModel, ContentLayout } from '../../../../../lib' -import { toolTitle } from '../../../dev-center.routes' +import { rootRoute, toolTitle } from '../../../dev-center.routes' import { LayoutDocHeader, MarkdownDoc } from '../../../dev-center-lib/MarkdownDoc' import useMarkdown from '../../../dev-center-lib/hooks/useMarkdown' @@ -11,7 +11,7 @@ import styles from './GettingStartedGuide.module.scss' export const GettingStartedGuide: React.FC = () => { const { doc, toc, title }: ReturnType = useMarkdown({ uri: gettingStartedGuide }) const breadcrumb: Array = React.useMemo(() => [ - { name: toolTitle, url: '/dev-center' }, + { name: toolTitle, url: rootRoute || '/' }, { name: title, url: '#' }, ], [title]) diff --git a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-get-started/GetStartedCardsContainer/GetStartedCardsContainer.tsx b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-get-started/GetStartedCardsContainer/GetStartedCardsContainer.tsx index f464337e6..8bca99394 100644 --- a/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-get-started/GetStartedCardsContainer/GetStartedCardsContainer.tsx +++ b/src-ts/tools/dev-center/dev-center-pages/community-app/landing-page/dev-center-get-started/GetStartedCardsContainer/GetStartedCardsContainer.tsx @@ -3,6 +3,7 @@ import { FC } from 'react' import { Button } from '../../../../../../../lib' import { ApiCornerIcon, ApiIcon, CommunityAppCornerIcon, CommunityAppIcon } from '../../../../../assets/i' import { DevCenterCard } from '../../dev-center-card' +import { rootRoute } from '../../../../../dev-center.routes' import styles from './GetStartedCardsContainer.module.scss' @@ -14,7 +15,7 @@ const GetStartedCardsContainer: FC = () => ( title='Community App' titleClass={styles.communityTitle} description='Learn about Topcoder Community App and run started code.' - button={