refactor(routes): move shared pages to global scope
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
import {
|
||||
DEFAULT_CHARACTER,
|
||||
getCharacterBySlug,
|
||||
type CharacterProfile,
|
||||
} from "@/data/constants/character";
|
||||
|
||||
import { getCharacterRoutes, ROUTES } from "./routes";
|
||||
|
||||
export const GLOBAL_RETURN_TO_PARAM = "returnTo";
|
||||
|
||||
export type GlobalPageRoute =
|
||||
| typeof ROUTES.sidebar
|
||||
| typeof ROUTES.feedback
|
||||
| typeof ROUTES.coinsRules;
|
||||
|
||||
export interface GlobalRouteContext {
|
||||
readonly characterSlug: CharacterProfile["slug"];
|
||||
readonly chatUrl: string;
|
||||
readonly splashUrl: string;
|
||||
readonly sidebarUrl: string;
|
||||
readonly feedbackUrl: string;
|
||||
readonly coinsRulesUrl: string;
|
||||
}
|
||||
|
||||
export type GlobalReturnToValue =
|
||||
| string
|
||||
| readonly string[]
|
||||
| null
|
||||
| undefined;
|
||||
|
||||
export function resolveGlobalRouteContext(
|
||||
value?: GlobalReturnToValue,
|
||||
): GlobalRouteContext {
|
||||
const character = resolveReturnCharacter(getFirstValue(value));
|
||||
const characterRoutes = getCharacterRoutes(character.slug);
|
||||
const chatUrl = characterRoutes.chat;
|
||||
|
||||
return Object.freeze({
|
||||
characterSlug: character.slug,
|
||||
chatUrl,
|
||||
splashUrl: characterRoutes.splash,
|
||||
sidebarUrl: buildGlobalPageUrl(ROUTES.sidebar, chatUrl),
|
||||
feedbackUrl: buildGlobalPageUrl(ROUTES.feedback, chatUrl),
|
||||
coinsRulesUrl: buildGlobalPageUrl(ROUTES.coinsRules, chatUrl),
|
||||
});
|
||||
}
|
||||
|
||||
export function buildGlobalPageUrl(
|
||||
route: GlobalPageRoute,
|
||||
returnTo: string,
|
||||
): string {
|
||||
const safeReturnTo = resolveGlobalRouteContextValue(returnTo);
|
||||
const params = new URLSearchParams({
|
||||
[GLOBAL_RETURN_TO_PARAM]: safeReturnTo,
|
||||
});
|
||||
return `${route}?${params.toString()}`;
|
||||
}
|
||||
|
||||
export function resolveGlobalRouteContextValue(
|
||||
value?: GlobalReturnToValue,
|
||||
): string {
|
||||
const character = resolveReturnCharacter(getFirstValue(value));
|
||||
return getCharacterRoutes(character.slug).chat;
|
||||
}
|
||||
|
||||
function resolveReturnCharacter(value: string | null): CharacterProfile {
|
||||
const match = value?.match(/^\/characters\/([^/?#]+)\/chat$/);
|
||||
if (!match?.[1]) return DEFAULT_CHARACTER;
|
||||
return getCharacterBySlug(match[1]) ?? DEFAULT_CHARACTER;
|
||||
}
|
||||
|
||||
function getFirstValue(value: GlobalReturnToValue): string | null {
|
||||
if (typeof value === "string") return value;
|
||||
if (Array.isArray(value)) return value[0] ?? null;
|
||||
return null;
|
||||
}
|
||||
Reference in New Issue
Block a user