diff --git a/apps/web/modules/settings/my-account/appearance-view.tsx b/apps/web/modules/settings/my-account/appearance-view.tsx index d118129ac7..e07f6ef2cc 100644 --- a/apps/web/modules/settings/my-account/appearance-view.tsx +++ b/apps/web/modules/settings/my-account/appearance-view.tsx @@ -192,15 +192,21 @@ const AppearanceView = ({
{ + handleSubmit={({ appTheme }) => { + if (appTheme === "light" || appTheme === "dark") { + mutation.mutate({ + appTheme, + }); + return; + } mutation.mutate({ - appTheme: values.appTheme === "" ? null : values.appTheme, + appTheme: null, }); }}>
{ + handleSubmit={({ theme }) => { + if (theme === "light" || theme === "dark") { + mutation.mutate({ + theme, + }); + return; + } mutation.mutate({ - // Radio values don't support null as values, therefore we convert an empty string - // back to null here. - theme: values.theme === "" ? null : values.theme, + theme: null, }); }}>
{ - test("change theme to dark", async ({ page, users }) => { +test.describe("Change App Theme Test", () => { + test("change app theme to dark", async ({ page, users }) => { + const pro = await users.create(); + await pro.apiLogin(); + await page.goto("/settings/my-account/appearance"); + await page.click('[data-testid="appTheme-dark"]'); + await page.click('[data-testid="update-app-theme-btn"]'); + + const toast = await page.waitForSelector('[data-testid="toast-success"]'); + expect(toast).toBeTruthy(); + + const darkModeClass = await page.getAttribute("html", "class"); + expect(darkModeClass).toContain("dark"); + + const themeValue = await page.evaluate(() => localStorage.getItem("app-theme")); + expect(themeValue).toBe("dark"); + }); + + test("change app theme to light", async ({ page, users }) => { + const pro = await users.create(); + await pro.apiLogin(); + await page.goto("/settings/my-account/appearance"); + await page.click('[data-testid="appTheme-light"]'); + await page.click('[data-testid="update-app-theme-btn"]'); + + const toast = await page.waitForSelector('[data-testid="toast-success"]'); + expect(toast).toBeTruthy(); + + const darkModeClass = await page.getAttribute("html", "class"); + expect(darkModeClass).toContain("light"); + + const themeValue = await page.evaluate(() => localStorage.getItem("app-theme")); + expect(themeValue).toBe("light"); + }); + + test("change app theme to system", async ({ page, users }) => { + const pro = await users.create(); + await pro.apiLogin(); + + await page.goto("/settings/my-account/appearance"); + await page.click('[data-testid="appTheme-light"]'); + await page.click('[data-testid="update-app-theme-btn"]'); + const toast1 = await page.waitForSelector('[data-testid="toast-success"]'); + expect(toast1).toBeTruthy(); + + await page.click('[data-testid="appTheme-system"]'); + await page.click('[data-testid="update-app-theme-btn"]'); + const toast2 = await page.waitForSelector('[data-testid="toast-success"]'); + expect(toast2).toBeTruthy(); + + await page.waitForTimeout(3000); + const themeValue = await page.evaluate(() => localStorage.getItem("app-theme")); + expect(themeValue).toBe("system"); + + const systemTheme = await page.evaluate(() => { + return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"; + }); + expect(await page.getAttribute("html", "class")).toContain(systemTheme); + }); +}); + +test.describe("Change Booking Page Theme Test", () => { + test("change booking page theme to dark", async ({ page, users }) => { const pro = await users.create(); await pro.apiLogin(); @@ -19,11 +79,11 @@ testBothFutureAndLegacyRoutes.describe("Change Theme Test", () => { expect(toast).toBeTruthy(); //Go to the profile page and check if the theme is dark await page.goto(`/${pro.username}`); - const darkModeClass = await page.getAttribute("html", "class"); - expect(darkModeClass).toContain("dark"); + const htmlClass = await page.getAttribute("html", "class"); + expect(htmlClass).toContain("dark"); }); - test("change theme to light", async ({ page, users }) => { + test("change booking page theme to light", async ({ page, users }) => { const pro = await users.create(); await pro.apiLogin(); @@ -38,7 +98,31 @@ testBothFutureAndLegacyRoutes.describe("Change Theme Test", () => { expect(toast).toBeTruthy(); //Go to the profile page and check if the theme is light await page.goto(`/${pro.username}`); - const darkModeClass = await page.getAttribute("html", "class"); - expect(darkModeClass).toContain("light"); + const htmlClass = await page.getAttribute("html", "class"); + expect(htmlClass).toContain("light"); + }); + + test("change booking page theme to system", async ({ page, users }) => { + const pro = await users.create(); + await pro.apiLogin(); + + await page.goto("/settings/my-account/appearance"); + + await page.click('[data-testid="theme-light"]'); + await page.click('[data-testid="update-theme-btn"]'); + const toast1 = await page.waitForSelector('[data-testid="toast-success"]'); + expect(toast1).toBeTruthy(); + + await page.click('[data-testid="theme-system"]'); + await page.click('[data-testid="update-theme-btn"]'); + const toast2 = await page.waitForSelector('[data-testid="toast-success"]'); + expect(toast2).toBeTruthy(); + await page.goto(`/${pro.username}`); + + const systemTheme = await page.evaluate(() => { + return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"; + }); + + expect(await page.getAttribute("html", "class")).toContain(systemTheme); }); }); diff --git a/packages/features/ee/organizations/pages/settings/appearance.tsx b/packages/features/ee/organizations/pages/settings/appearance.tsx index bad76be5ac..aa81f23b04 100644 --- a/packages/features/ee/organizations/pages/settings/appearance.tsx +++ b/packages/features/ee/organizations/pages/settings/appearance.tsx @@ -78,9 +78,15 @@ const OrgAppearanceView = ({
{ + handleSubmit={({ theme }) => { + if (theme === "light" || theme === "dark") { + mutation.mutate({ + theme, + }); + return; + } mutation.mutate({ - theme: value.theme === "" ? null : value.theme, + theme: null, }); }}>
@@ -92,7 +98,7 @@ const OrgAppearanceView = ({
{ <> { + handleSubmit={({ theme }) => { mutation.mutate({ id: team.id, - theme: values.theme === "" ? null : values.theme, + theme: theme === "light" || theme === "dark" ? theme : null, }); }}>
@@ -105,7 +105,7 @@ const ProfileView = ({ team, isAppDir }: ProfileViewProps) => {
; const useCalcomTheme = (theme: Record) => { useEffect(() => { Object.entries(theme).forEach(([key, value]) => { + if (!value) { + // should not be reached + return; + } if (key === "root") { const root = document.documentElement; Object.entries(value).forEach(([key, value]) => {