From f54e0be91bd11c0d997f4e798d4bd186680c5fbd Mon Sep 17 00:00:00 2001 From: mulan xia Date: Wed, 31 Jan 2024 15:49:48 -0500 Subject: [PATCH] clean up, add into cmd+k --- .ladle/components.tsx | 14 +++++- public/System.png | Bin 29436 -> 0 bytes src/hooks/useAppThemeAndColorMode.tsx | 7 ++- src/lib/tradingView/utils.ts | 2 +- src/state/configs.ts | 10 ++-- src/state/configsSelectors.ts | 7 +-- src/views/dialogs/DisplaySettingsDialog.tsx | 6 +-- src/views/menus/useGlobalCommands.tsx | 53 +++++++++++++++----- 8 files changed, 71 insertions(+), 28 deletions(-) delete mode 100644 public/System.png diff --git a/.ladle/components.tsx b/.ladle/components.tsx index d87bd5a..0ed9130 100644 --- a/.ladle/components.tsx +++ b/.ladle/components.tsx @@ -11,7 +11,13 @@ import { SelectMenu, SelectItem } from '@/components/SelectMenu'; import { AppThemeAndColorModeProvider } from '@/hooks/useAppThemeAndColorMode'; -import { AppTheme, AppColorMode, setAppTheme, setAppColorMode } from '@/state/configs'; +import { + AppTheme, + AppThemeSystemSetting, + AppColorMode, + setAppThemeSetting, + setAppColorMode, +} from '@/state/configs'; import { setLocaleLoaded } from '@/state/localization'; import '@/index.css'; @@ -22,7 +28,7 @@ export const StoryWrapper: React.FC<{ children: React.ReactNode }> = ({ children const [colorMode, setColorMode] = useState(AppColorMode.GreenUp); useEffect(() => { - store.dispatch(setAppTheme(theme)); + store.dispatch(setAppThemeSetting(theme)); store.dispatch(setAppColorMode(colorMode)); }, [theme, colorMode]); @@ -40,6 +46,10 @@ export const StoryWrapper: React.FC<{ children: React.ReactNode }> = ({ children value: AppTheme.Classic, label: 'Default theme', }, + { + value: AppThemeSystemSetting.System, + label: 'System theme', + }, { value: AppTheme.Dark, label: 'Dark theme', diff --git a/public/System.png b/public/System.png deleted file mode 100644 index 24a68dab9e9a5f646267abf5c8746f4d6a47957d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29436 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%0D~alRe$Sf8E}nS~nX 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 T?SJed00000NkvXXu0mjfmnnyr diff --git a/src/hooks/useAppThemeAndColorMode.tsx b/src/hooks/useAppThemeAndColorMode.tsx index 1cbc3de..a6b450f 100644 --- a/src/hooks/useAppThemeAndColorMode.tsx +++ b/src/hooks/useAppThemeAndColorMode.tsx @@ -2,7 +2,12 @@ import { useEffect, useState } from 'react'; import { useSelector } from 'react-redux'; import { ThemeProvider } from 'styled-components'; -import { AppTheme, AppThemeSetting, AppColorMode, AppThemeSystemSetting } from '@/state/configs'; +import type { + AppTheme, + AppThemeSetting, + AppColorMode, + AppThemeSystemSetting, +} from '@/state/configs'; import { getAppThemeSetting, getAppColorMode } from '@/state/configsSelectors'; import { Themes } from '@/styles/themes'; diff --git a/src/lib/tradingView/utils.ts b/src/lib/tradingView/utils.ts index 27c26b6..471a468 100644 --- a/src/lib/tradingView/utils.ts +++ b/src/lib/tradingView/utils.ts @@ -1,6 +1,6 @@ import { Candle, TradingViewBar, TradingViewSymbol } from '@/constants/candles'; -import { AppTheme, AppColorMode } from '@/state/configs'; +import type { AppTheme, AppColorMode } from '@/state/configs'; import { Themes } from '@/styles/themes'; diff --git a/src/state/configs.ts b/src/state/configs.ts index 7e14b16..d4e7977 100644 --- a/src/state/configs.ts +++ b/src/state/configs.ts @@ -24,7 +24,7 @@ export enum AppColorMode { } export interface ConfigsState { - appTheme: AppThemeSetting; + appThemeSetting: AppThemeSetting; appColorMode: AppColorMode; feeTiers?: kollections.List; feeDiscounts?: FeeDiscount[]; @@ -33,7 +33,7 @@ export interface ConfigsState { } const initialState: ConfigsState = { - appTheme: getLocalStorage({ + appThemeSetting: getLocalStorage({ key: LocalStorageKey.SelectedTheme, defaultValue: AppTheme.Classic, }), @@ -54,9 +54,9 @@ export const configsSlice = createSlice({ name: 'Inputs', initialState, reducers: { - setAppTheme: (state: ConfigsState, { payload }: PayloadAction) => { + setAppThemeSetting: (state: ConfigsState, { payload }: PayloadAction) => { setLocalStorage({ key: LocalStorageKey.SelectedTheme, value: payload }); - state.appTheme = payload; + state.appThemeSetting = payload; }, setAppColorMode: (state: ConfigsState, { payload }: PayloadAction) => { setLocalStorage({ key: LocalStorageKey.SelectedColorMode, value: payload }); @@ -73,5 +73,5 @@ export const configsSlice = createSlice({ }, }); -export const { setAppTheme, setAppColorMode, setConfigs, markLaunchIncentivesSeen } = +export const { setAppThemeSetting, setAppColorMode, setConfigs, markLaunchIncentivesSeen } = configsSlice.actions; diff --git a/src/state/configsSelectors.ts b/src/state/configsSelectors.ts index 706c088..25cc4d1 100644 --- a/src/state/configsSelectors.ts +++ b/src/state/configsSelectors.ts @@ -1,16 +1,17 @@ import type { RootState } from './_store'; import { AppTheme, AppThemeSystemSetting, AppThemeSetting } from './configs'; -export const getAppThemeSetting = (state: RootState): AppThemeSetting => state.configs.appTheme; +export const getAppThemeSetting = (state: RootState): AppThemeSetting => + state.configs.appThemeSetting; export const getAppTheme = (state: RootState): AppTheme => { - switch (state.configs.appTheme) { + switch (state.configs.appThemeSetting) { case AppThemeSystemSetting.System: return globalThis.matchMedia('(prefers-color-scheme: dark)').matches ? AppTheme.Dark : AppTheme.Light; default: - return state.configs.appTheme; + return state.configs.appThemeSetting; } }; diff --git a/src/views/dialogs/DisplaySettingsDialog.tsx b/src/views/dialogs/DisplaySettingsDialog.tsx index ceccc7b..72f0157 100644 --- a/src/views/dialogs/DisplaySettingsDialog.tsx +++ b/src/views/dialogs/DisplaySettingsDialog.tsx @@ -9,10 +9,10 @@ import { AppTheme, AppThemeSystemSetting, AppColorMode, - setAppTheme, + setAppThemeSetting, setAppColorMode, } from '@/state/configs'; -import { getAppTheme, getAppThemeSetting, getAppColorMode } from '@/state/configsSelectors'; +import { getAppThemeSetting, getAppColorMode } from '@/state/configsSelectors'; import { layoutMixins } from '@/styles/layoutMixins'; import { Themes } from '@/styles/themes'; @@ -81,7 +81,7 @@ export const DisplaySettingsDialog = ({ setIsOpen }: ElementProps) => { backgroundcolor={backgroundColor} gridcolor={gridColor} onClick={() => { - dispatch(setAppTheme(themeSetting)); + dispatch(setAppThemeSetting(themeSetting)); }} > diff --git a/src/views/menus/useGlobalCommands.tsx b/src/views/menus/useGlobalCommands.tsx index 017df38..504c052 100644 --- a/src/views/menus/useGlobalCommands.tsx +++ b/src/views/menus/useGlobalCommands.tsx @@ -6,19 +6,19 @@ import { TradeLayouts } from '@/constants/layout'; import { AssetIcon } from '@/components/AssetIcon'; -import { AppTheme, setAppTheme } from '@/state/configs'; +import { + AppTheme, + AppThemeSystemSetting, + AppColorMode, + setAppThemeSetting, + setAppColorMode, +} from '@/state/configs'; import { setSelectedTradeLayout } from '@/state/layout'; import { getAssets } from '@/state/assetsSelectors'; import { getPerpetualMarkets } from '@/state/perpetualsSelectors'; import { Asset, PerpetualMarket } from '@/constants/abacus'; -enum ThemeItems { - SetClassicTheme = 'SetDefaultTheme', - SetLightTheme = 'SetLightTheme', - SetDarkTheme = 'SetDarkTheme', -} - enum LayoutItems { setDefaultLayout = 'SetDefaultLayout', setReverseLayout = 'SetReverseLayout', @@ -53,24 +53,51 @@ export const useGlobalCommands = (): MenuConfig => { groupLabel: 'Themes', items: [ { - value: ThemeItems.SetClassicTheme, + value: AppTheme.Classic, label: 'Set Classic Theme', onSelect: () => { - dispatch(setAppTheme(AppTheme.Classic)); + dispatch(setAppThemeSetting(AppTheme.Classic)); }, }, { - value: ThemeItems.SetLightTheme, + value: AppThemeSystemSetting.System, + label: 'Set System Theme', + onSelect: () => { + dispatch(setAppThemeSetting(AppThemeSystemSetting.System)); + }, + }, + { + value: AppTheme.Light, label: 'Set Light Theme', onSelect: () => { - dispatch(setAppTheme(AppTheme.Light)); + dispatch(setAppThemeSetting(AppTheme.Light)); }, }, { - value: ThemeItems.SetDarkTheme, + value: AppTheme.Dark, label: 'Set Dark Theme', onSelect: () => { - dispatch(setAppTheme(AppTheme.Dark)); + dispatch(setAppThemeSetting(AppTheme.Dark)); + }, + }, + ], + }, + { + group: 'colorPreferences', + groupLabel: 'Color Preferences', + items: [ + { + value: AppColorMode.GreenUp, + label: 'Set Green is Up', + onSelect: () => { + dispatch(setAppColorMode(AppColorMode.GreenUp)); + }, + }, + { + value: AppColorMode.RedUp, + label: 'Set Red is Up', + onSelect: () => { + dispatch(setAppColorMode(AppColorMode.RedUp)); }, }, ],