From 48a50086d3d645b6655c3169a71d47d96494803a Mon Sep 17 00:00:00 2001 From: Vasilica Olariu Date: Fri, 5 May 2023 11:42:03 +0300 Subject: [PATCH 1/5] TCA-1281 - update routing: support friendlier urls on subdomains --- config/dev.js | 1 + config/prod.js | 1 + src-ts/config/constants.ts | 7 ++ .../environments/environment-config.model.ts | 2 + .../environment.default.config.ts | 1 + .../route-provider/platform-route.model.ts | 1 + .../route-provider/route-functions/index.ts | 1 + .../route-functions/route.functions.ts | 12 +++- src-ts/lib/route-provider/route.provider.tsx | 11 ++- .../getting-started/GettingStartedGuide.tsx | 2 +- .../GetStartedCardsContainer.tsx | 2 +- src-ts/tools/dev-center/dev-center.routes.tsx | 6 +- .../use-gamification-breadcrumb.hook.tsx | 4 +- .../gamification-admin.routes.tsx | 10 +-- .../create-badge-form.config.tsx | 3 +- .../useLearnBreadcrumb.provider.tsx | 2 +- src-ts/tools/learn/learn.routes.tsx | 22 +++--- .../work-intake-form-routes.config.ts | 10 +-- src-ts/tools/work/work.routes.tsx | 13 ++-- src/App.jsx | 5 +- src/IntakeForm.jsx | 10 +-- src/constants/index.js | 71 ++++++++++--------- src/constants/products/DataAdvisory/index.js | 8 +-- .../products/DataExploration/index.js | 8 +-- src/constants/products/FindMeData/index.js | 8 +-- src/constants/products/WebsiteDesign/index.js | 8 +-- .../products/WebsiteDesignLegacy/index.js | 26 +++---- src/routes/BasicInfoLegacy/index.jsx | 5 +- src/routes/BrandingLegacy/index.jsx | 7 +- src/routes/LoginPrompt/index.jsx | 3 +- src/routes/PageDetailsLegacy/index.jsx | 7 +- src/routes/Products/DataAdvisory/index.jsx | 9 +-- src/routes/Products/DataExploration/index.jsx | 9 +-- src/routes/Products/FindMeData/index.jsx | 9 +-- src/routes/Products/WebsiteDesign/index.jsx | 9 +-- .../Products/WebsiteDesignLegacy/index.jsx | 3 +- .../Products/components/BasicInfo/index.jsx | 7 +- .../Review/components/ReviewTable/index.jsx | 3 +- src/routes/Review/index.jsx | 9 +-- src/routes/ReviewLegacy/index.jsx | 9 +-- src/routes/SelectWorkType/index.jsx | 3 +- src/routes/WebsitePurposeLegacy/index.jsx | 7 +- 42 files changed, 204 insertions(+), 150 deletions(-) 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..be217dba6 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 @@ -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: '/' }, { 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..4665e25ac 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 @@ -14,7 +14,7 @@ const GetStartedCardsContainer: FC = () => ( title='Community App' titleClass={styles.communityTitle} description='Learn about Topcoder Community App and run started code.' - button={