New source found from dndbeyond.com
This commit is contained in:
@@ -1,10 +1,7 @@
|
||||
import React from "react";
|
||||
import { matchPath } from "react-router-dom";
|
||||
|
||||
import {
|
||||
FeatureFlagInfoState,
|
||||
rulesEngineSelectors,
|
||||
} from "@dndbeyond/character-rules-engine/es";
|
||||
import { rulesEngineSelectors } from "@dndbeyond/character-rules-engine/es";
|
||||
|
||||
// export interface RouteDefinition {
|
||||
// key: string,
|
||||
@@ -21,10 +18,10 @@ import {
|
||||
SectionKey,
|
||||
} from "~/subApps/builder/constants";
|
||||
import { ClassChoose } from "~/subApps/builder/routes/ClassChoose";
|
||||
import { QuickBuild } from "~/subApps/builder/routes/QuickBuild";
|
||||
import { RandomBuild } from "~/subApps/builder/routes/RandomBuild";
|
||||
import { Home } from "~/subApps/builder/routes/Home";
|
||||
import { SpeciesChoose } from "~/subApps/builder/routes/SpeciesChoose";
|
||||
|
||||
import { WhatsNext } from "../../../../subApps/builder/routes/WhatsNext";
|
||||
import AbilityScoresHelp from "../containers/pages/AbilityScoresHelp";
|
||||
import AbilityScoresManage from "../containers/pages/AbilityScoresManage";
|
||||
import ClassHelp from "../containers/pages/ClassHelp";
|
||||
@@ -33,41 +30,23 @@ import DescriptionHelp from "../containers/pages/DescriptionHelp";
|
||||
import DescriptionManage from "../containers/pages/DescriptionManage";
|
||||
import EquipmentHelp from "../containers/pages/EquipmentHelp";
|
||||
import EquipmentManage from "../containers/pages/EquipmentManage";
|
||||
import HomeBasicInfo from "../containers/pages/HomeBasicInfo";
|
||||
import HomeHelp from "../containers/pages/HomeHelp";
|
||||
import SpeciesHelp from "../containers/pages/SpeciesHelp";
|
||||
import SpeciesManage from "../containers/pages/SpeciesManage";
|
||||
import WhatsNext from "../containers/pages/WhatsNext";
|
||||
import { NavigationUtils } from "../utils";
|
||||
|
||||
// TODO: remove the use of either `Component` or `getComponent` on the ROUTE_DEFINITIONS and we can get rid of the no-dd-sa rule..
|
||||
|
||||
const BASE_PATHNAME = config.basePathname;
|
||||
|
||||
export const ROUTE_DEFINITIONS = {
|
||||
[RouteKey.QUICK_BUILD]: {
|
||||
key: RouteKey.QUICK_BUILD,
|
||||
type: NavigationType.Page,
|
||||
path: `${BASE_PATHNAME}/builder/quick-build`,
|
||||
Component: QuickBuild,
|
||||
getComponent: () => <QuickBuild />,
|
||||
checkCanAccess: (routeDef, state) => {
|
||||
return NavigationUtils.checkStdBuilderPageRequirements(routeDef, state);
|
||||
},
|
||||
},
|
||||
[RouteKey.RANDOMIZE_BUILD]: {
|
||||
key: RouteKey.RANDOMIZE_BUILD,
|
||||
type: NavigationType.Page,
|
||||
path: `${BASE_PATHNAME}/builder/randomize`,
|
||||
Component: RandomBuild,
|
||||
getComponent: () => <RandomBuild />,
|
||||
checkCanAccess: (routeDef, state) =>
|
||||
NavigationUtils.checkStdBuilderPageRequirements(routeDef, state),
|
||||
},
|
||||
[RouteKey.HOME_BASIC_INFO]: {
|
||||
key: RouteKey.HOME_BASIC_INFO,
|
||||
type: NavigationType.Page,
|
||||
path: `${BASE_PATHNAME}/:characterId/builder/home/basic`,
|
||||
Component: HomeBasicInfo,
|
||||
getComponent: () => <HomeBasicInfo />,
|
||||
Component: Home,
|
||||
// no-dd-sa:typescript-best-practices/no-dupe-keys
|
||||
getComponent: () => <Home />,
|
||||
checkCanAccess: (routeDef, state) =>
|
||||
NavigationUtils.checkStdBuilderPageRequirements(routeDef, state),
|
||||
},
|
||||
@@ -77,7 +56,8 @@ export const ROUTE_DEFINITIONS = {
|
||||
path: `${BASE_PATHNAME}/:characterId/builder/species/choose`,
|
||||
Component: SpeciesChoose,
|
||||
getComponent: () => <SpeciesChoose />,
|
||||
checkCanAccess: (routeDef, state, dispatch) => {
|
||||
// no-dd-sa:typescript-best-practices/no-dupe-keys
|
||||
checkCanAccess: (routeDef, state) => {
|
||||
if (!NavigationUtils.checkStdBuilderPageRequirements(routeDef, state)) {
|
||||
return false;
|
||||
}
|
||||
@@ -95,7 +75,12 @@ export const ROUTE_DEFINITIONS = {
|
||||
path: `${BASE_PATHNAME}/:characterId/builder/species/manage`,
|
||||
Component: SpeciesManage,
|
||||
getComponent: () => <SpeciesManage />,
|
||||
checkCanAccess: (routeDef, state, dispatch) => {
|
||||
// no-dd-sa:typescript-best-practices/no-dupe-keys
|
||||
checkCanAccess: (routeDef, state) => {
|
||||
if (!NavigationUtils.checkStdBuilderPageRequirements(routeDef, state)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (rulesEngineSelectors.getRace(state) === null) {
|
||||
return false;
|
||||
}
|
||||
@@ -109,7 +94,8 @@ export const ROUTE_DEFINITIONS = {
|
||||
path: `${BASE_PATHNAME}/:characterId/builder/class/choose`,
|
||||
Component: ClassChoose,
|
||||
getComponent: () => <ClassChoose />,
|
||||
checkCanAccess: (routeDef, state, dispatch) => {
|
||||
// no-dd-sa:typescript-best-practices/no-dupe-keys
|
||||
checkCanAccess: (routeDef, state) => {
|
||||
if (!NavigationUtils.checkStdBuilderPageRequirements(routeDef, state)) {
|
||||
return false;
|
||||
}
|
||||
@@ -127,7 +113,8 @@ export const ROUTE_DEFINITIONS = {
|
||||
path: `${BASE_PATHNAME}/:characterId/builder/class/manage`,
|
||||
Component: ClassesManage,
|
||||
getComponent: () => <ClassesManage />,
|
||||
checkCanAccess: (routeDef, state, dispatch) => {
|
||||
// no-dd-sa:typescript-best-practices/no-dupe-keys
|
||||
checkCanAccess: (routeDef, state) => {
|
||||
if (!NavigationUtils.checkStdBuilderPageRequirements(routeDef, state)) {
|
||||
return false;
|
||||
}
|
||||
@@ -144,6 +131,7 @@ export const ROUTE_DEFINITIONS = {
|
||||
type: NavigationType.Page,
|
||||
path: `${BASE_PATHNAME}/:characterId/builder/ability-scores/manage`,
|
||||
Component: AbilityScoresManage,
|
||||
// no-dd-sa:typescript-best-practices/no-dupe-keys
|
||||
getComponent: () => <AbilityScoresManage />,
|
||||
checkCanAccess: (routeDef, state) =>
|
||||
NavigationUtils.checkStdBuilderPageRequirements(routeDef, state),
|
||||
@@ -153,6 +141,7 @@ export const ROUTE_DEFINITIONS = {
|
||||
type: NavigationType.Page,
|
||||
path: `${BASE_PATHNAME}/:characterId/builder/description/manage`,
|
||||
Component: DescriptionManage,
|
||||
// no-dd-sa:typescript-best-practices/no-dupe-keys
|
||||
getComponent: () => <DescriptionManage />,
|
||||
checkCanAccess: (routeDef, state) =>
|
||||
NavigationUtils.checkStdBuilderPageRequirements(routeDef, state),
|
||||
@@ -162,6 +151,7 @@ export const ROUTE_DEFINITIONS = {
|
||||
type: NavigationType.Page,
|
||||
path: `${BASE_PATHNAME}/:characterId/builder/equipment/manage`,
|
||||
Component: EquipmentManage,
|
||||
// no-dd-sa:typescript-best-practices/no-dupe-keys
|
||||
getComponent: () => <EquipmentManage />,
|
||||
checkCanAccess: (routeDef, state) =>
|
||||
NavigationUtils.checkStdBuilderPageRequirements(routeDef, state),
|
||||
@@ -172,6 +162,7 @@ export const ROUTE_DEFINITIONS = {
|
||||
type: NavigationType.Page,
|
||||
path: `${BASE_PATHNAME}/:characterId/builder/whats-next`,
|
||||
Component: WhatsNext,
|
||||
// no-dd-sa:typescript-best-practices/no-dupe-keys
|
||||
getComponent: () => <WhatsNext />,
|
||||
checkCanAccess: (routeDef, state) =>
|
||||
NavigationUtils.checkStdBuilderPageRequirements(routeDef, state),
|
||||
@@ -182,6 +173,7 @@ export const ROUTE_DEFINITIONS = {
|
||||
type: NavigationType.HelpPage,
|
||||
path: `${BASE_PATHNAME}/:characterId/builder/home/help`,
|
||||
Component: HomeHelp,
|
||||
// no-dd-sa:typescript-best-practices/no-dupe-keys
|
||||
getComponent: () => <HomeHelp />,
|
||||
checkCanAccess: (routeDef, state) =>
|
||||
NavigationUtils.checkStdBuilderPageRequirements(routeDef, state),
|
||||
@@ -191,6 +183,7 @@ export const ROUTE_DEFINITIONS = {
|
||||
type: NavigationType.HelpPage,
|
||||
path: `${BASE_PATHNAME}/:characterId/builder/species/help`,
|
||||
Component: SpeciesHelp,
|
||||
// no-dd-sa:typescript-best-practices/no-dupe-keys
|
||||
getComponent: () => <SpeciesHelp />,
|
||||
checkCanAccess: (routeDef, state) =>
|
||||
NavigationUtils.checkStdBuilderPageRequirements(routeDef, state),
|
||||
@@ -200,6 +193,7 @@ export const ROUTE_DEFINITIONS = {
|
||||
type: NavigationType.HelpPage,
|
||||
path: `${BASE_PATHNAME}/:characterId/builder/class/help`,
|
||||
Component: ClassHelp,
|
||||
// no-dd-sa:typescript-best-practices/no-dupe-keys
|
||||
getComponent: () => <ClassHelp />,
|
||||
checkCanAccess: (routeDef, state) =>
|
||||
NavigationUtils.checkStdBuilderPageRequirements(routeDef, state),
|
||||
@@ -209,6 +203,7 @@ export const ROUTE_DEFINITIONS = {
|
||||
type: NavigationType.HelpPage,
|
||||
path: `${BASE_PATHNAME}/:characterId/builder/ability-scores/help`,
|
||||
Component: AbilityScoresHelp,
|
||||
// no-dd-sa:typescript-best-practices/no-dupe-keys
|
||||
getComponent: () => <AbilityScoresHelp />,
|
||||
checkCanAccess: (routeDef, state) =>
|
||||
NavigationUtils.checkStdBuilderPageRequirements(routeDef, state),
|
||||
@@ -218,6 +213,7 @@ export const ROUTE_DEFINITIONS = {
|
||||
type: NavigationType.HelpPage,
|
||||
path: `${BASE_PATHNAME}/:characterId/builder/description/help`,
|
||||
Component: DescriptionHelp,
|
||||
// no-dd-sa:typescript-best-practices/no-dupe-keys
|
||||
getComponent: () => <DescriptionHelp />,
|
||||
checkCanAccess: (routeDef, state) =>
|
||||
NavigationUtils.checkStdBuilderPageRequirements(routeDef, state),
|
||||
@@ -227,49 +223,51 @@ export const ROUTE_DEFINITIONS = {
|
||||
type: NavigationType.HelpPage,
|
||||
path: `${BASE_PATHNAME}/:characterId/builder/equipment/help`,
|
||||
Component: EquipmentHelp,
|
||||
// no-dd-sa:typescript-best-practices/no-dupe-keys
|
||||
getComponent: () => <EquipmentHelp />,
|
||||
checkCanAccess: (routeDef, state) =>
|
||||
NavigationUtils.checkStdBuilderPageRequirements(routeDef, state),
|
||||
},
|
||||
};
|
||||
|
||||
export interface RouteDef {
|
||||
key: string; // get the thing as an enum
|
||||
type: typeof NavigationType;
|
||||
type: string;
|
||||
path: string;
|
||||
Component: React.ComponentType<any>;
|
||||
getComponent: () => React.ComponentType<any>;
|
||||
// no-dd-sa:typescript-best-practices/no-dupe-keys
|
||||
getComponent: () => React.ReactElement;
|
||||
checkCanAccess?: (routeDef: RouteDef, state: any) => boolean;
|
||||
}
|
||||
|
||||
export const getAllRouterRoutes = () => {
|
||||
return Object.values(ROUTE_DEFINITIONS).map((routeDef: RouteDef) => ({
|
||||
return (Object.values(ROUTE_DEFINITIONS) as RouteDef[]).map((routeDef) => ({
|
||||
element: <routeDef.Component />,
|
||||
path: routeDef.path,
|
||||
routeDef,
|
||||
}));
|
||||
};
|
||||
|
||||
const addSearchParamsToRouteDef = (routeDef: RouteDef): RouteDef => {
|
||||
let params = "";
|
||||
if (typeof window !== "undefined") {
|
||||
// If we ever need to know specific search params, we can use URLSearchParams here instead.
|
||||
params = window.location.search;
|
||||
}
|
||||
return {
|
||||
...routeDef,
|
||||
path: `${routeDef.path}${params}`,
|
||||
};
|
||||
};
|
||||
|
||||
export const getRouteDef = (routeKey) => ROUTE_DEFINITIONS[routeKey];
|
||||
export const getRouteDefPath = (routeKey) => getRouteDef(routeKey).path;
|
||||
export const getRouteDefPath = (routeKey) => {
|
||||
const basePath = getRouteDef(routeKey);
|
||||
return addSearchParamsToRouteDef(basePath).path;
|
||||
};
|
||||
export const getRouteDefType = (routeKey) => getRouteDef(routeKey).type;
|
||||
|
||||
export const NAVIGATION_DEFINITIONS = {
|
||||
[BuilderMethod.QUICK]: [
|
||||
{
|
||||
type: NavigationType.Section,
|
||||
key: SectionKey.QUICK_BUILD,
|
||||
getLabel: () => "Quick Build",
|
||||
routes: [getRouteDef(RouteKey.QUICK_BUILD)],
|
||||
},
|
||||
],
|
||||
[BuilderMethod.RANDOMIZE]: [
|
||||
{
|
||||
type: NavigationType.Section,
|
||||
key: SectionKey.RANDOMIZE,
|
||||
getLabel: () => "Randomize Build",
|
||||
routes: [getRouteDef(RouteKey.RANDOMIZE_BUILD)],
|
||||
},
|
||||
],
|
||||
[BuilderMethod.STEP_BY_STEP]: [
|
||||
{
|
||||
type: NavigationType.Section,
|
||||
@@ -346,12 +344,8 @@ export function checkIsRouteInSection(testRouteDef, sectionRoutes) {
|
||||
return false;
|
||||
}
|
||||
|
||||
export function getNavigationSections(
|
||||
builderMethod,
|
||||
currentRouteDef,
|
||||
featureFlags: FeatureFlagInfoState
|
||||
) {
|
||||
const navConfig = getNavBuilderConfig(builderMethod, featureFlags);
|
||||
export function getNavigationSections(builderMethod, currentRouteDef) {
|
||||
const navConfig = getNavBuilderConfig(builderMethod);
|
||||
|
||||
return navConfig.map((section) => ({
|
||||
...section,
|
||||
@@ -359,12 +353,17 @@ export function getNavigationSections(
|
||||
}));
|
||||
}
|
||||
|
||||
export function getNavBuilderConfig(
|
||||
builderMethod,
|
||||
featureFlags: FeatureFlagInfoState
|
||||
) {
|
||||
export function getNavBuilderConfig(builderMethod) {
|
||||
if (builderMethod) {
|
||||
return NAVIGATION_DEFINITIONS[builderMethod];
|
||||
const config = NAVIGATION_DEFINITIONS[builderMethod];
|
||||
|
||||
// Add search params to all route paths in the config
|
||||
return config.map((section) => ({
|
||||
...section,
|
||||
routes: section.routes.map((routeDef) =>
|
||||
addSearchParamsToRouteDef(routeDef)
|
||||
),
|
||||
}));
|
||||
} else {
|
||||
return [];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user