From 658d905fe04bc2971eb7464c9844b73b1a52b5c8 Mon Sep 17 00:00:00 2001 From: Xiao Yijun Date: Thu, 16 Mar 2023 13:34:23 +0800 Subject: [PATCH] refactor(console): refactor theme-related types (#3419) --- .../console/src/components/AppError/index.tsx | 4 +- .../src/components/AppLoading/Offline.tsx | 5 +- .../src/components/AppLoading/index.tsx | 9 +- .../src/components/ApplicationIcon/index.tsx | 9 +- .../src/components/ConnectorLogo/index.tsx | 9 +- .../components/EmptyDataPlaceholder/index.tsx | 9 +- .../ImageWithErrorFallback/index.tsx | 10 +-- .../src/components/RequestDataError/index.tsx | 9 +- .../ToggleUiThemeButton}/index.module.scss | 0 .../components/ToggleUiThemeButton}/index.tsx | 14 ++-- .../SignInExperiencePreview/index.tsx | 7 +- .../src/components/Table/TableError.tsx | 9 +- .../src/components/Table/TablePlaceholder.tsx | 9 +- .../src/components/UserAvatar/index.tsx | 9 +- packages/console/src/consts/index.ts | 2 +- .../AppContent/components/UserInfo/index.tsx | 9 +- .../Sidebar/components/Contact/hook.tsx | 9 +- .../src/contexts/AppThemeProvider/index.tsx | 16 ++-- packages/console/src/hooks/use-theme.ts | 11 +++ .../console/src/hooks/use-user-preferences.ts | 21 ++--- packages/console/src/onboarding/App.tsx | 4 +- .../components/Preview/index.tsx | 4 +- .../src/pages/ApiResourceDetails/index.tsx | 11 ++- .../console/src/pages/ApiResources/index.tsx | 9 +- .../components/SdkSelector/index.tsx | 10 +-- .../components/GetStartedProgress/index.tsx | 10 +-- packages/console/src/pages/GetStarted/hook.ts | 8 +- packages/console/src/pages/NotFound/index.tsx | 9 +- .../components/LinkAccountSection/index.tsx | 10 +-- .../components/Preview/index.tsx | 11 ++- .../components/Welcome/index.tsx | 15 ++-- packages/console/src/pages/Welcome/index.tsx | 6 +- packages/console/src/types/appearance-mode.ts | 10 +++ packages/console/src/types/theme.ts | 4 - packages/console/src/utils/theme.ts | 24 +++--- ...481-remove-deprecated-logto-config-item.ts | 84 +++++++++++++++++++ .../schemas/src/foundations/jsonb-types.ts | 12 --- packages/schemas/src/seeds/logto-config.ts | 3 - packages/schemas/src/types/index.ts | 1 + packages/schemas/src/types/theme.ts | 4 + .../src/components/LogtoSignature/index.tsx | 8 +- .../ui/src/containers/SocialLanding/index.tsx | 3 +- packages/ui/src/hooks/use-color-theme.ts | 3 +- packages/ui/src/hooks/use-page-context.ts | 7 +- packages/ui/src/hooks/use-theme.ts | 6 +- packages/ui/src/pages/ErrorPage/index.tsx | 3 +- packages/ui/src/types/index.ts | 12 +-- packages/ui/src/utils/logo.ts | 5 +- 48 files changed, 270 insertions(+), 206 deletions(-) rename packages/console/src/components/{ToggleThemeButton => SignInExperiencePreview/components/ToggleUiThemeButton}/index.module.scss (100%) rename packages/console/src/components/{ToggleThemeButton => SignInExperiencePreview/components/ToggleUiThemeButton}/index.tsx (68%) create mode 100644 packages/console/src/hooks/use-theme.ts create mode 100644 packages/console/src/types/appearance-mode.ts delete mode 100644 packages/console/src/types/theme.ts create mode 100644 packages/schemas/alterations/next-1678928481-remove-deprecated-logto-config-item.ts create mode 100644 packages/schemas/src/types/theme.ts diff --git a/packages/console/src/components/AppError/index.tsx b/packages/console/src/components/AppError/index.tsx index 60a5ae7ce..1eed1eb3c 100644 --- a/packages/console/src/components/AppError/index.tsx +++ b/packages/console/src/components/AppError/index.tsx @@ -1,3 +1,4 @@ +import { Theme } from '@logto/schemas'; import { useState } from 'react'; import { useTranslation } from 'react-i18next'; @@ -5,7 +6,6 @@ import ErrorDark from '@/assets/images/error-dark.svg'; import Error from '@/assets/images/error.svg'; import KeyboardArrowDown from '@/assets/images/keyboard-arrow-down.svg'; import KeyboardArrowUp from '@/assets/images/keyboard-arrow-up.svg'; -import { Theme } from '@/types/theme'; import { onKeyDownHandler } from '@/utils/a11y'; import { getThemeFromLocalStorage } from '@/utils/theme'; @@ -26,7 +26,7 @@ const AppError = ({ title, errorCode, errorMessage, callStack, children }: Props return (
- {theme === Theme.LightMode ? : } + {theme === Theme.Light ? : }
diff --git a/packages/console/src/components/AppLoading/Offline.tsx b/packages/console/src/components/AppLoading/Offline.tsx index 81efe0418..89c5b5600 100644 --- a/packages/console/src/components/AppLoading/Offline.tsx +++ b/packages/console/src/components/AppLoading/Offline.tsx @@ -1,7 +1,8 @@ +import { Theme } from '@logto/schemas'; + import IllustrationDark from '@/assets/images/loading-illustration-dark.svg'; import Illustration from '@/assets/images/loading-illustration.svg'; import { Daisy as Spinner } from '@/components/Spinner'; -import { Theme } from '@/types/theme'; import { getThemeFromLocalStorage } from '@/utils/theme'; import * as styles from './index.module.scss'; @@ -14,7 +15,7 @@ export const AppLoadingOffline = () => { return (
- {theme === Theme.LightMode ? : } + {theme === Theme.Light ? : }
); diff --git a/packages/console/src/components/AppLoading/index.tsx b/packages/console/src/components/AppLoading/index.tsx index 168650b12..091a833fd 100644 --- a/packages/console/src/components/AppLoading/index.tsx +++ b/packages/console/src/components/AppLoading/index.tsx @@ -1,19 +1,18 @@ -import { useContext } from 'react'; +import { Theme } from '@logto/schemas'; import IllustrationDark from '@/assets/images/loading-illustration-dark.svg'; import Illustration from '@/assets/images/loading-illustration.svg'; import { Daisy as Spinner } from '@/components/Spinner'; -import { AppThemeContext } from '@/contexts/AppThemeProvider'; -import { Theme } from '@/types/theme'; +import useTheme from '@/hooks/use-theme'; import * as styles from './index.module.scss'; const AppLoading = () => { - const { theme } = useContext(AppThemeContext); + const theme = useTheme(); return (
- {theme === Theme.LightMode ? : } + {theme === Theme.Light ? : }
); diff --git a/packages/console/src/components/ApplicationIcon/index.tsx b/packages/console/src/components/ApplicationIcon/index.tsx index b5f857a77..87efdb5b1 100644 --- a/packages/console/src/components/ApplicationIcon/index.tsx +++ b/packages/console/src/components/ApplicationIcon/index.tsx @@ -1,9 +1,8 @@ import type { ApplicationType } from '@logto/schemas'; -import { useContext } from 'react'; +import { Theme } from '@logto/schemas'; import { darkModeApplicationIconMap, lightModeApplicationIconMap } from '@/consts'; -import { AppThemeContext } from '@/contexts/AppThemeProvider'; -import { Theme } from '@/types/theme'; +import useTheme from '@/hooks/use-theme'; type Props = { type: ApplicationType; @@ -11,8 +10,8 @@ type Props = { }; const ApplicationIcon = ({ type, className }: Props) => { - const { theme } = useContext(AppThemeContext); - const isLightMode = theme === Theme.LightMode; + const theme = useTheme(); + const isLightMode = theme === Theme.Light; const Icon = isLightMode ? lightModeApplicationIconMap[type] : darkModeApplicationIconMap[type]; return ; diff --git a/packages/console/src/components/ConnectorLogo/index.tsx b/packages/console/src/components/ConnectorLogo/index.tsx index 3e7d09290..ebb27a457 100644 --- a/packages/console/src/components/ConnectorLogo/index.tsx +++ b/packages/console/src/components/ConnectorLogo/index.tsx @@ -1,9 +1,8 @@ import type { ConnectorResponse } from '@logto/schemas'; +import { Theme } from '@logto/schemas'; import classNames from 'classnames'; -import { useContext } from 'react'; -import { AppThemeContext } from '@/contexts/AppThemeProvider'; -import { Theme } from '@/types/theme'; +import useTheme from '@/hooks/use-theme'; import ImageWithErrorFallback from '../ImageWithErrorFallback'; import * as styles from './index.module.scss'; @@ -15,14 +14,14 @@ type Props = { }; const ConnectorLogo = ({ className, data, size = 'medium' }: Props) => { - const { theme } = useContext(AppThemeContext); + const theme = useTheme(); return ( ); }; diff --git a/packages/console/src/components/EmptyDataPlaceholder/index.tsx b/packages/console/src/components/EmptyDataPlaceholder/index.tsx index 6bdf1ef5d..4b24142d6 100644 --- a/packages/console/src/components/EmptyDataPlaceholder/index.tsx +++ b/packages/console/src/components/EmptyDataPlaceholder/index.tsx @@ -1,11 +1,10 @@ +import { Theme } from '@logto/schemas'; import classNames from 'classnames'; -import { useContext } from 'react'; import { useTranslation } from 'react-i18next'; import EmptyDark from '@/assets/images/table-empty-dark.svg'; import Empty from '@/assets/images/table-empty.svg'; -import { AppThemeContext } from '@/contexts/AppThemeProvider'; -import { Theme } from '@/types/theme'; +import useTheme from '@/hooks/use-theme'; import * as styles from './index.module.scss'; @@ -16,8 +15,8 @@ export type Props = { const EmptyDataPlaceholder = ({ title, size = 'medium' }: Props) => { const { t } = useTranslation(undefined, { keyPrefix: 'admin_console' }); - const { theme } = useContext(AppThemeContext); - const EmptyImage = theme === Theme.LightMode ? Empty : EmptyDark; + const theme = useTheme(); + const EmptyImage = theme === Theme.Light ? Empty : EmptyDark; return (
diff --git a/packages/console/src/components/ImageWithErrorFallback/index.tsx b/packages/console/src/components/ImageWithErrorFallback/index.tsx index d624dc9a2..9d0e963aa 100644 --- a/packages/console/src/components/ImageWithErrorFallback/index.tsx +++ b/packages/console/src/components/ImageWithErrorFallback/index.tsx @@ -1,17 +1,17 @@ +import { Theme } from '@logto/schemas'; import type { ImgHTMLAttributes } from 'react'; -import { useContext, useState } from 'react'; +import { useState } from 'react'; import FallbackImageDark from '@/assets/images/broken-image-dark.svg'; import FallbackImageLight from '@/assets/images/broken-image-light.svg'; -import { AppThemeContext } from '@/contexts/AppThemeProvider'; -import { Theme } from '@/types/theme'; +import useTheme from '@/hooks/use-theme'; type Props = { containerClassName?: string } & ImgHTMLAttributes; const ImageWithErrorFallback = ({ src, alt, className, containerClassName, ...props }: Props) => { const [hasError, setHasError] = useState(false); - const { theme } = useContext(AppThemeContext); - const Fallback = theme === Theme.LightMode ? FallbackImageLight : FallbackImageDark; + const theme = useTheme(); + const Fallback = theme === Theme.Light ? FallbackImageLight : FallbackImageDark; const errorHandler = () => { setHasError(true); diff --git a/packages/console/src/components/RequestDataError/index.tsx b/packages/console/src/components/RequestDataError/index.tsx index d617b0238..d4855160e 100644 --- a/packages/console/src/components/RequestDataError/index.tsx +++ b/packages/console/src/components/RequestDataError/index.tsx @@ -1,12 +1,11 @@ +import { Theme } from '@logto/schemas'; import classNames from 'classnames'; -import { useContext } from 'react'; import { useTranslation } from 'react-i18next'; import RequestErrorDarkImage from '@/assets/images/request-error-dark.svg'; import RequestErrorImage from '@/assets/images/request-error.svg'; -import { AppThemeContext } from '@/contexts/AppThemeProvider'; import type { RequestError } from '@/hooks/use-api'; -import { Theme } from '@/types/theme'; +import useTheme from '@/hooks/use-theme'; import Button from '../Button'; import Card from '../Card'; @@ -20,10 +19,10 @@ type Props = { const RequestDataError = ({ error, onRetry, className }: Props) => { const { t } = useTranslation(undefined, { keyPrefix: 'admin_console' }); - const { theme } = useContext(AppThemeContext); + const theme = useTheme(); const errorMessage = error.body?.message ?? error.message; const isNotFoundError = error.status === 404; - const ErrorImage = theme === Theme.LightMode ? RequestErrorImage : RequestErrorDarkImage; + const ErrorImage = theme === Theme.Light ? RequestErrorImage : RequestErrorDarkImage; return ( diff --git a/packages/console/src/components/ToggleThemeButton/index.module.scss b/packages/console/src/components/SignInExperiencePreview/components/ToggleUiThemeButton/index.module.scss similarity index 100% rename from packages/console/src/components/ToggleThemeButton/index.module.scss rename to packages/console/src/components/SignInExperiencePreview/components/ToggleUiThemeButton/index.module.scss diff --git a/packages/console/src/components/ToggleThemeButton/index.tsx b/packages/console/src/components/SignInExperiencePreview/components/ToggleUiThemeButton/index.tsx similarity index 68% rename from packages/console/src/components/ToggleThemeButton/index.tsx rename to packages/console/src/components/SignInExperiencePreview/components/ToggleUiThemeButton/index.tsx index 117a67a4a..b75034a1a 100644 --- a/packages/console/src/components/ToggleThemeButton/index.tsx +++ b/packages/console/src/components/SignInExperiencePreview/components/ToggleUiThemeButton/index.tsx @@ -1,11 +1,11 @@ +import { Theme } from '@logto/schemas'; import classNames from 'classnames'; import Moon from '@/assets/images/moon.svg'; import Sun from '@/assets/images/sun.svg'; -import { Theme } from '@/types/theme'; -import type { Props as ButtonProps } from '../Button'; -import Button from '../Button'; +import type { Props as ButtonProps } from '../../../Button'; +import Button from '../../../Button'; import * as styles from './index.module.scss'; type Props = { @@ -16,14 +16,14 @@ type Props = { size?: ButtonProps['size']; }; -const ToggleThemeButton = ({ +const ToggleUiThemeButton = ({ value, onToggle, className, iconClassName, size = 'medium', }: Props) => { - const ThemeIcon = value === Theme.LightMode ? Sun : Moon; + const ThemeIcon = value === Theme.Light ? Sun : Moon; return (
@@ -32,11 +32,11 @@ const ToggleThemeButton = ({ className={classNames(styles.button, className)} icon={} onClick={() => { - onToggle(value === Theme.LightMode ? Theme.DarkMode : Theme.LightMode); + onToggle(value === Theme.Light ? Theme.Dark : Theme.Light); }} />
); }; -export default ToggleThemeButton; +export default ToggleUiThemeButton; diff --git a/packages/console/src/components/SignInExperiencePreview/index.tsx b/packages/console/src/components/SignInExperiencePreview/index.tsx index 5b926e0d8..6250481e2 100644 --- a/packages/console/src/components/SignInExperiencePreview/index.tsx +++ b/packages/console/src/components/SignInExperiencePreview/index.tsx @@ -1,6 +1,6 @@ import type { LanguageTag } from '@logto/language-kit'; import type { ConnectorMetadata, ConnectorResponse, SignInExperience } from '@logto/schemas'; -import { ConnectorType } from '@logto/schemas'; +import { Theme, ConnectorType } from '@logto/schemas'; import { conditional } from '@silverhand/essentials'; import classNames from 'classnames'; import { format } from 'date-fns'; @@ -12,11 +12,12 @@ import PhoneInfo from '@/assets/images/phone-info.svg'; import { AppEndpointsContext } from '@/contexts/AppEndpointsProvider'; import type { RequestError } from '@/hooks/use-api'; import useUiLanguages from '@/hooks/use-ui-languages'; -import { Theme } from '@/types/theme'; import * as styles from './index.module.scss'; import { PreviewPlatform } from './types'; +export { default as ToggleUiThemeButton } from './components/ToggleUiThemeButton'; + type Props = { platform: PreviewPlatform; mode: Theme; @@ -114,7 +115,7 @@ const SignInExperiencePreview = ({ platform, mode, language = 'en', signInExperi style={conditional( platform === PreviewPlatform.DesktopWeb && { // Set background color to match iframe's background color on both dark and light mode. - backgroundColor: mode === Theme.DarkMode ? '#000' : '#e5e1ec', + backgroundColor: mode === Theme.Dark ? '#000' : '#e5e1ec', } )} > diff --git a/packages/console/src/components/Table/TableError.tsx b/packages/console/src/components/Table/TableError.tsx index 17e92e13c..070ba1c83 100644 --- a/packages/console/src/components/Table/TableError.tsx +++ b/packages/console/src/components/Table/TableError.tsx @@ -1,10 +1,9 @@ -import { useContext } from 'react'; +import { Theme } from '@logto/schemas'; import { useTranslation } from 'react-i18next'; import RequestErrorDarkImage from '@/assets/images/request-error-dark.svg'; import RequestErrorImage from '@/assets/images/request-error.svg'; -import { AppThemeContext } from '@/contexts/AppThemeProvider'; -import { Theme } from '@/types/theme'; +import useTheme from '@/hooks/use-theme'; import Button from '../Button'; import * as styles from './TableError.module.scss'; @@ -18,13 +17,13 @@ type Props = { const TableError = ({ title, content, onRetry, columns }: Props) => { const { t } = useTranslation(undefined, { keyPrefix: 'admin_console' }); - const { theme } = useContext(AppThemeContext); + const theme = useTheme(); return (
- {theme === Theme.LightMode ? : } + {theme === Theme.Light ? : }
{title ?? t('errors.something_went_wrong')}
{content ?? t('errors.unknown_server_error')}
{onRetry &&