Feat: add route-backed settings pages
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
// Path: Frontend/src/components/app-shell/data/workspace-routes.ts
|
||||
|
||||
import type { WorkspaceStaticKind } from "./shell.types";
|
||||
|
||||
export type WorkspaceSurfaceKind = Exclude<WorkspaceStaticKind, "workspace">;
|
||||
export type SettingsSectionKind = "account" | "workspace" | "server" | "theme" | "security" | "members";
|
||||
|
||||
export type WorkspaceBreadcrumbContext = {
|
||||
activeProjectName: string;
|
||||
activeDepartmentName: string;
|
||||
activeTeamName?: string;
|
||||
};
|
||||
|
||||
const workspaceSurfaceRoutes: Record<WorkspaceSurfaceKind, string> = {
|
||||
home: "/workspace/home",
|
||||
settings: "/settings",
|
||||
};
|
||||
|
||||
export const getWorkspaceSurfaceRoute = (surface: WorkspaceSurfaceKind): string => workspaceSurfaceRoutes[surface];
|
||||
|
||||
const settingsSectionRoutes: Record<SettingsSectionKind, string> = {
|
||||
account: "/settings/account",
|
||||
workspace: "/settings/workspace",
|
||||
server: "/settings/server",
|
||||
theme: "/settings/theme",
|
||||
security: "/settings/security",
|
||||
members: "/settings/members",
|
||||
};
|
||||
|
||||
export const getSettingsSectionRoute = (section: SettingsSectionKind): string => settingsSectionRoutes[section];
|
||||
|
||||
export const getWorkspaceSurfaceFromPathname = (pathname: string): WorkspaceSurfaceKind => {
|
||||
if (pathname.startsWith(workspaceSurfaceRoutes.settings) || pathname.startsWith("/workspace/settings")) {
|
||||
return "settings";
|
||||
}
|
||||
|
||||
return "home";
|
||||
};
|
||||
|
||||
export const getWorkspaceSurfaceBreadcrumbLabel = (pathname: string): string => {
|
||||
const surface = getWorkspaceSurfaceFromPathname(pathname);
|
||||
return surface === "settings" ? "Settings" : "Home";
|
||||
};
|
||||
|
||||
const getSettingsSectionFromPathname = (pathname: string): SettingsSectionKind | null => {
|
||||
const matchedEntry = (Object.entries(settingsSectionRoutes) as Array<[SettingsSectionKind, string]>).find(([, route]) => pathname.startsWith(route));
|
||||
|
||||
return matchedEntry?.[0] ?? null;
|
||||
};
|
||||
|
||||
export const getWorkspaceBreadcrumbSegments = (
|
||||
pathname: string,
|
||||
context: WorkspaceBreadcrumbContext,
|
||||
): string[] => {
|
||||
const settingsSection = getSettingsSectionFromPathname(pathname);
|
||||
|
||||
if (pathname === workspaceSurfaceRoutes.settings || pathname === "/workspace/settings") {
|
||||
return ["Settings"];
|
||||
}
|
||||
|
||||
if (settingsSection) {
|
||||
switch (settingsSection) {
|
||||
case "account":
|
||||
return ["Users", "Settings"];
|
||||
case "workspace":
|
||||
return [context.activeProjectName, "Settings"];
|
||||
case "server":
|
||||
return ["Settings"];
|
||||
case "theme":
|
||||
return ["Personal", "Settings"];
|
||||
case "security":
|
||||
return ["Users", "Settings"];
|
||||
case "members":
|
||||
return [context.activeTeamName || context.activeDepartmentName || "Members", "Users"];
|
||||
}
|
||||
}
|
||||
|
||||
return [context.activeProjectName, getWorkspaceSurfaceBreadcrumbLabel(pathname)];
|
||||
};
|
||||
Reference in New Issue
Block a user