refactor(status-page): simplify renderer lookup, extract route prefix, memoize wrapper style

Four small follow-ups from a code review pass:

1. Drop the redundant `?? THEMED_RENDERERS[DEFAULT_STATUS_PAGE_THEME]`
   fallback in Status/index.tsx — the map is now a total Record, so the
   first lookup cannot return undefined.
2. Extract the literal "/status/public" into PUBLIC_STATUS_PAGE_PREFIX in
   Types/StatusPage.ts and reuse from the three runtime call sites
   (Status/index.tsx, HeaderStatusPageControls.tsx, StatusPagesTable.tsx).
   The Routes/index.tsx route definition keeps its string literal — the
   route table is otherwise all literals and the prefix only matters when
   it's interpolated.
3. Delete two narrating comments above the public/admin branches in
   Status/index.tsx — the JSX is self-describing.
4. Move the inline `style` object construction in StatusPageThemeProvider
   into the existing useMemo so the wrapper div receives a stable style
   reference. The previous spread defeated the surrounding memoization on
   every render.
This commit is contained in:
gorkem-bwl committed 2026-04-28 16:52:16 -04:00
1 parent ed3645c3d0
commit bab65770ce
5 files changed
+22 -21

No files matched your search

@@ -8,7 +8,7 @@ import { Settings, ExternalLink } from "lucide-react";
import { useTheme } from "@mui/material";
import { useTranslation } from "react-i18next";
import { useNavigate } from "react-router-dom";
import type { StatusPage } from "@/Types/StatusPage";
import { PUBLIC_STATUS_PAGE_PREFIX, type StatusPage } from "@/Types/StatusPage";
interface HeaderStatusPageControlsProps {
isAdmin: boolean;
@@ -50,7 +50,7 @@ export const HeaderStatusPageControls = ({
<Typography
onClick={() => {
window.open(
`/status/public/${statusPage.url}`,
`${PUBLIC_STATUS_PAGE_PREFIX}/${statusPage.url}`,
"_blank",
"noopener,noreferrer"
);
+4 -7
View File
@@ -11,6 +11,7 @@ import { useGet } from "@/Hooks/UseApi";
import type { Monitor } from "@/Types/Monitor";
import {
DEFAULT_STATUS_PAGE_THEME,
PUBLIC_STATUS_PAGE_PREFIX,
type StatusPage,
type StatusPageResponse,
type StatusPageTheme,
@@ -44,7 +45,7 @@ const StatusPageView = () => {
const { url } = useParams();
const isAdmin = useIsAdmin();
const location = useLocation();
const isPublic = location.pathname.startsWith("/status/public");
const isPublic = location.pathname.startsWith(PUBLIC_STATUS_PAGE_PREFIX);
const apiUrl = url ? `/status-page/${url}?type=uptime&type=infrastructure` : null;
@@ -88,9 +89,7 @@ const StatusPageView = () => {
);
}
const ThemedRenderer =
THEMED_RENDERERS[statusPage.theme ?? DEFAULT_STATUS_PAGE_THEME] ??
THEMED_RENDERERS[DEFAULT_STATUS_PAGE_THEME];
const ThemedRenderer = THEMED_RENDERERS[statusPage.theme ?? DEFAULT_STATUS_PAGE_THEME];
const themedRenderer = (
<ThemedRenderer
statusPage={statusPage}
@@ -98,7 +97,6 @@ const StatusPageView = () => {
/>
);
// Public route: render directly on the viewport, themed background covers everything.
if (isPublic) {
return (
<StatusPageThemeProvider
@@ -111,8 +109,7 @@ const StatusPageView = () => {
);
}
// Admin preview: wrap in a mock browser frame inside the admin shell.
const publicUrl = `${window.location.origin}/status/public/${statusPage.url}`;
const publicUrl = `${window.location.origin}${PUBLIC_STATUS_PAGE_PREFIX}/${statusPage.url}`;
return (
<BasePage
loading={isLoading}
@@ -105,7 +105,17 @@ export const StatusPageThemeProvider = ({
resolvedThemeMode === "auto" ? systemMode : resolvedThemeMode;
const tokens = themeTokens[resolvedTheme][resolvedMode];
const style = useMemo(() => toCssVars(tokens) as React.CSSProperties, [tokens]);
const style = useMemo<React.CSSProperties>(
() =>
transparent
? (toCssVars(tokens) as React.CSSProperties)
: {
...(toCssVars(tokens) as React.CSSProperties),
background: tokens.bg,
minHeight: "100vh",
},
[tokens, transparent]
);
const value = useMemo(
() => ({ theme: resolvedTheme, mode: resolvedMode, tokens }),
@@ -118,15 +128,7 @@ export const StatusPageThemeProvider = ({
data-status-theme={resolvedTheme}
data-status-mode={resolvedMode}
data-status-transparent={transparent ? "" : undefined}
style={
transparent
? (style as React.CSSProperties)
: {
...style,
background: tokens.bg,
minHeight: "100vh",
}
}
style={style}
>
{children}
</div>
@@ -9,7 +9,7 @@ import { useTranslation } from "react-i18next";
import { useTheme } from "@mui/material/styles";
import { useNavigate } from "react-router-dom";
import type { StatusPage } from "@/Types/StatusPage";
import { PUBLIC_STATUS_PAGE_PREFIX, type StatusPage } from "@/Types/StatusPage";
interface StatusPagesTableProps {
data: StatusPage[];
@@ -50,7 +50,7 @@ export const StatusPagesTable = ({
const handleUrlClick = (e: React.MouseEvent, row: StatusPage) => {
if (row.isPublished) {
e.stopPropagation();
const url = `/status/public/${row.url}`;
const url = `${PUBLIC_STATUS_PAGE_PREFIX}/${row.url}`;
window.open(url, "_blank", "noopener,noreferrer");
}
};
+2
View File
@@ -29,6 +29,8 @@ export const STATUS_PAGE_THEME_MODES = ["auto", "light", "dark"] as const;
export type StatusPageThemeMode = (typeof STATUS_PAGE_THEME_MODES)[number];
export const DEFAULT_STATUS_PAGE_THEME_MODE: StatusPageThemeMode = "auto";
export const PUBLIC_STATUS_PAGE_PREFIX = "/status/public";
export interface StatusPage {
id: string;
userId: string;