Login:Src: change useTheme and ThemeProvider

This commit is contained in:
Darya Umrikhina 2024-08-12 10:51:41 +04:00
parent 5c653cdd08
commit 2e6a7a25fd
3 changed files with 38 additions and 28 deletions

View File

@ -34,7 +34,12 @@ import { LANGUAGE, SYSTEM_THEME_KEY } from "@docspace/shared/constants";
import StyledComponentsRegistry from "@/utils/registry";
import { Providers } from "@/providers";
import { getColorTheme, getConfig, getSettings } from "@/utils/actions";
import {
getColorTheme,
getConfig,
getSettings,
getUser,
} from "@/utils/actions";
import "../styles/globals.scss";
@ -57,9 +62,10 @@ export default async function RootLayout({
let redirectUrl = "";
const [settings, colorTheme] = await Promise.all([
const [settings, colorTheme, user] = await Promise.all([
getSettings(),
getColorTheme(),
getUser(),
]);
if (settings === "access-restricted") redirectUrl = `/${settings}`;
@ -123,6 +129,7 @@ export default async function RootLayout({
systemTheme: systemTheme?.value as ThemeKeys,
}}
redirectURL={redirectUrl}
user={user}
>
<Toast isSSR />
{children}

View File

@ -26,6 +26,7 @@ import { i18n } from "i18next";
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
import React from "react";
import { match, P } from "ts-pattern";
import { Base, Dark, TColorScheme, TTheme } from "@docspace/shared/themes";
import { getEditorTheme, getSystemTheme } from "@docspace/shared/utils";
@ -34,14 +35,18 @@ import { getAppearanceTheme } from "@docspace/shared/api/settings";
import { TGetColorTheme } from "@docspace/shared/api/settings/types";
import { setCookie } from "@docspace/shared/utils/cookie";
import { SYSTEM_THEME_KEY } from "@docspace/shared/constants";
import { TUser } from "@docspace/shared/api/people/types";
type MatchType = [ThemeKeys | undefined, ThemeKeys | undefined];
export interface UseThemeProps {
user?: TUser;
colorTheme?: TGetColorTheme;
systemTheme?: ThemeKeys;
i18n: i18n;
}
const useTheme = ({ colorTheme, systemTheme, i18n }: UseThemeProps) => {
const useTheme = ({ user, colorTheme, systemTheme, i18n }: UseThemeProps) => {
const [currentColorTheme, setCurrentColorTheme] =
React.useState<TColorScheme>(() => {
if (!colorTheme) return {} as TColorScheme;
@ -58,11 +63,18 @@ const useTheme = ({ colorTheme, systemTheme, i18n }: UseThemeProps) => {
({} as TColorScheme)
: ({} as TColorScheme);
if (systemTheme === ThemeKeys.DarkStr) {
return { ...Dark, currentColorScheme: currColorTheme };
}
const newTheme = match<MatchType>([user?.theme, systemTheme])
.returnType<TTheme>()
.with([ThemeKeys.DarkStr, P._], () => Dark)
.with([ThemeKeys.BaseStr, P._], () => Base)
.with([ThemeKeys.SystemStr, ThemeKeys.BaseStr], () => Base)
.with([ThemeKeys.SystemStr, ThemeKeys.DarkStr], () => Dark)
.with([undefined, ThemeKeys.DarkStr], () => Dark)
.with([undefined, ThemeKeys.BaseStr], () => Base)
.otherwise(() => Base);
return {
...Base,
...newTheme,
currentColorScheme: currColorTheme,
};
});
@ -85,40 +97,28 @@ const useTheme = ({ colorTheme, systemTheme, i18n }: UseThemeProps) => {
const getUserTheme = React.useCallback(() => {
const SYSTEM_THEME = getSystemTheme();
let theme = user?.theme ?? SYSTEM_THEME;
const interfaceDirection = i18n?.dir ? i18n.dir() : "ltr";
if (SYSTEM_THEME === ThemeKeys.BaseStr) {
setTheme({
...Base,
currentColorScheme: currentColorTheme,
interfaceDirection,
});
if (user?.theme === ThemeKeys.SystemStr) theme = SYSTEM_THEME;
if (window?.AscDesktopEditor !== undefined) {
const editorTheme = getEditorTheme(ThemeKeys.Base);
window.AscDesktopEditor.execCommand("portal:uitheme", editorTheme);
}
setCookie(SYSTEM_THEME_KEY, ThemeKeys.BaseStr);
return;
}
const isBaseTheme = theme === ThemeKeys.BaseStr;
setTheme({
...Dark,
...(isBaseTheme ? Base : Dark),
currentColorScheme: currentColorTheme,
interfaceDirection,
});
setCookie(SYSTEM_THEME_KEY, ThemeKeys.DarkStr);
setCookie(SYSTEM_THEME_KEY, SYSTEM_THEME);
if (window?.AscDesktopEditor !== undefined) {
const editorTheme = getEditorTheme(ThemeKeys.Dark);
const editorTheme = getEditorTheme(
isBaseTheme ? ThemeKeys.Base : ThemeKeys.Dark,
);
window.AscDesktopEditor.execCommand("portal:uitheme", editorTheme);
}
}, [currentColorTheme, i18n]);
}, [user?.theme, currentColorTheme, i18n]);
React.useEffect(() => {
getCurrentColorTheme();

View File

@ -47,10 +47,12 @@ export const Providers = ({
children,
value,
redirectURL,
user,
}: {
children: React.ReactNode;
value: TDataContext;
redirectURL: string;
user?: TUser;
}) => {
const firebaseHelper = new FirebaseHelper(
value.settings?.firebase ?? ({} as TFirebaseSettings),
@ -75,6 +77,7 @@ export const Providers = ({
});
const { theme, currentColorTheme } = useTheme({
user,
colorTheme: value.colorTheme,
systemTheme: value.systemTheme,
i18n,