Skip to content

Commit bee8557

Browse files
committed
feat(webapp): admins always get the theme switcher
The team can dogfood the new themes on production before the hasThemeSwitcher flag flips for everyone.
1 parent 8e6a56e commit bee8557

2 files changed

Lines changed: 13 additions & 9 deletions

File tree

apps/webapp/app/root.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,11 @@ export const loader = async ({ request }: LoaderFunctionArgs) => {
8080

8181
const user = await getUser(request);
8282
// Theme switching is feature-flagged; while off, everyone stays on the
83-
// classic theme even if a preference was saved earlier. Cached: the root
84-
// loader runs on every document request and client navigation.
83+
// classic theme even if a preference was saved earlier. Admins always get
84+
// the switcher so the team can dogfood before the flag flips. Cached: the
85+
// root loader runs on every document request and client navigation.
8586
const showThemeSwitcher = user
86-
? await cachedFlag({ key: "hasThemeSwitcher", defaultValue: false })
87+
? user.admin || (await cachedFlag({ key: "hasThemeSwitcher", defaultValue: false }))
8788
: false;
8889
// Logged-out pages (login, invites) always render the branded Classic look.
8990
const themePreference: ThemePreference = showThemeSwitcher

apps/webapp/app/routes/account._index/route.tsx

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,9 @@ function createSchema(
121121
}
122122

123123
export async function loader({ request }: LoaderFunctionArgs) {
124-
await requireUserId(request);
125-
const showThemeSwitcher = await flag({ key: "hasThemeSwitcher", defaultValue: false });
124+
const user = await requireUser(request);
125+
const showThemeSwitcher =
126+
user.admin || (await flag({ key: "hasThemeSwitcher", defaultValue: false }));
126127
return json({ showThemeSwitcher });
127128
}
128129

@@ -132,22 +133,24 @@ export const action: ActionFunction = async ({ request }) => {
132133
const formData = await request.formData();
133134

134135
if (formData.get("action") === "update-theme") {
135-
const showThemeSwitcher = await flag({ key: "hasThemeSwitcher", defaultValue: false });
136+
const user = await requireUser(request);
137+
const showThemeSwitcher =
138+
user.admin || (await flag({ key: "hasThemeSwitcher", defaultValue: false }));
136139
if (!showThemeSwitcher) {
137140
return json({ error: "Not available" }, { status: 404 });
138141
}
139-
const user = await requireUser(request);
140142
const theme = normalizeThemePreference(formData.get("theme"));
141143
await updateThemePreference({ user, theme });
142144
return json({ success: true });
143145
}
144146

145147
if (formData.get("action") === "update-contrast") {
146-
const showThemeSwitcher = await flag({ key: "hasThemeSwitcher", defaultValue: false });
148+
const user = await requireUser(request);
149+
const showThemeSwitcher =
150+
user.admin || (await flag({ key: "hasThemeSwitcher", defaultValue: false }));
147151
if (!showThemeSwitcher) {
148152
return json({ error: "Not available" }, { status: 404 });
149153
}
150-
const user = await requireUser(request);
151154
const contrast = normalizeThemeContrast(formData.get("contrast"));
152155
await updateContrastPreference({ user, contrast });
153156
return json({ success: true });

0 commit comments

Comments
 (0)