From 00a11d05e0bcc3819abac1ed483466d25fcdcb45 Mon Sep 17 00:00:00 2001 From: Fedor Katurov Date: Wed, 26 Apr 2023 17:47:11 +0600 Subject: [PATCH] made simple settings page --- .../GridLayout/utils/createDefaultLayout.ts | 2 +- .../modal/components/ModalPage/index.tsx | 12 ++++ .../components/ModalPage/styles.module.scss | 5 ++ src/modules/modal/containers/Modal/index.tsx | 4 +- .../modal/containers/Modal/styles.module.scss | 8 ++- .../containers/SettingsContainer/index.tsx | 68 ++++++++++++++++--- .../settings/context/SettingsContext.ts | 12 +++- .../providers/SettingsProvider/index.tsx | 12 +++- .../theme/containers/ThemeProvider/index.tsx | 12 ++++ 9 files changed, 116 insertions(+), 19 deletions(-) create mode 100644 src/modules/modal/components/ModalPage/index.tsx create mode 100644 src/modules/modal/components/ModalPage/styles.module.scss diff --git a/src/modules/layout/components/GridLayout/utils/createDefaultLayout.ts b/src/modules/layout/components/GridLayout/utils/createDefaultLayout.ts index 6c391bd..f836400 100644 --- a/src/modules/layout/components/GridLayout/utils/createDefaultLayout.ts +++ b/src/modules/layout/components/GridLayout/utils/createDefaultLayout.ts @@ -13,5 +13,5 @@ export const createDefaultLayout = (api: DockviewApi) => { }); // panel.group.locked = true; - panel.group.header.hidden = true; + panel.group.header.hidden = false; }; diff --git a/src/modules/modal/components/ModalPage/index.tsx b/src/modules/modal/components/ModalPage/index.tsx new file mode 100644 index 0000000..e5b7f8d --- /dev/null +++ b/src/modules/modal/components/ModalPage/index.tsx @@ -0,0 +1,12 @@ +import { FC, PropsWithChildren } from "react"; +import styles from "./styles.module.scss"; + +interface ModalPageProps extends PropsWithChildren { + onClose: () => void; +} + +const ModalPage: FC = ({ children }) => ( +
{children}
+); + +export { ModalPage }; diff --git a/src/modules/modal/components/ModalPage/styles.module.scss b/src/modules/modal/components/ModalPage/styles.module.scss new file mode 100644 index 0000000..29fcf86 --- /dev/null +++ b/src/modules/modal/components/ModalPage/styles.module.scss @@ -0,0 +1,5 @@ +.page { + background: var(--color-background); + padding: 16px; + border-radius: 10px; +} diff --git a/src/modules/modal/containers/Modal/index.tsx b/src/modules/modal/containers/Modal/index.tsx index c4aa8a0..684a6e7 100644 --- a/src/modules/modal/containers/Modal/index.tsx +++ b/src/modules/modal/containers/Modal/index.tsx @@ -5,9 +5,9 @@ type ModalProps = PropsWithChildren & { onClose: () => void; }; -const Modal: FC = ({ children }) => ( +const Modal: FC = ({ children, onClose }) => (
-
+
{children}
diff --git a/src/modules/modal/containers/Modal/styles.module.scss b/src/modules/modal/containers/Modal/styles.module.scss index a217fc4..783075d 100644 --- a/src/modules/modal/containers/Modal/styles.module.scss +++ b/src/modules/modal/containers/Modal/styles.module.scss @@ -14,13 +14,14 @@ justify-content: center; padding: 16px; box-sizing: border-box; + pointer-events: none; + touch-action: none; } .page { - background: var(--color-background); - padding: 16px; - border-radius: 10px; margin: auto; + pointer-events: all; + touch-action: all; } .overlay { @@ -28,4 +29,5 @@ inset: 0; z-index: 1; background: rgba(0, 0, 0, 0.1); + backdrop-filter: blur(5px); } diff --git a/src/modules/settings/containers/SettingsContainer/index.tsx b/src/modules/settings/containers/SettingsContainer/index.tsx index a50ac9f..0ea13c5 100644 --- a/src/modules/settings/containers/SettingsContainer/index.tsx +++ b/src/modules/settings/containers/SettingsContainer/index.tsx @@ -1,12 +1,62 @@ -import { FC } from "react"; +import { ChangeEvent, FC, useCallback } from "react"; +import { useSettings } from "../../context/SettingsContext"; -const SettingsContainer: FC = () => ( -
- -
-); +const SettingsContainer: FC = () => { + const { update, settings } = useSettings(); + + const updateBackgroundColor = useCallback( + (event: ChangeEvent) => { + update({ backgroundColor: event.target.value }); + }, + [update] + ); + const updateTextColor = useCallback( + (event: ChangeEvent) => { + update({ textColor: event.target.value }); + }, + [update] + ); + + const updateLinkColor = useCallback( + (event: ChangeEvent) => { + update({ linkColor: event.target.value }); + }, + [update] + ); + + return ( +
+ + + + + +
+ ); +}; export { SettingsContainer }; diff --git a/src/modules/settings/context/SettingsContext.ts b/src/modules/settings/context/SettingsContext.ts index 4b21d1a..0470825 100644 --- a/src/modules/settings/context/SettingsContext.ts +++ b/src/modules/settings/context/SettingsContext.ts @@ -2,14 +2,22 @@ import { createContext, useContext } from "react"; export type SettingsValue = { richEditorEnabled: boolean; + backgroundColor: string; + textColor: string; + linkColor: string; }; -export const defaultSettings: SettingsValue = { richEditorEnabled: false }; +export const defaultSettings: SettingsValue = { + richEditorEnabled: false, + backgroundColor: "", + textColor: "", + linkColor: "", +}; export const SettingsContext = createContext({ settings: defaultSettings, // eslint-disable-next-line @typescript-eslint/no-unused-vars - setSettings: (_: SettingsValue) => {}, + update: (_: Partial) => {}, show: () => {}, hide: () => {}, }); diff --git a/src/modules/settings/providers/SettingsProvider/index.tsx b/src/modules/settings/providers/SettingsProvider/index.tsx index d7d3232..db4a560 100644 --- a/src/modules/settings/providers/SettingsProvider/index.tsx +++ b/src/modules/settings/providers/SettingsProvider/index.tsx @@ -3,8 +3,10 @@ import { Modal } from "~/modules/modal/containers/Modal"; import { SettingsContainer } from "../../containers/SettingsContainer"; import { SettingsContext, + SettingsValue, defaultSettings, } from "../../context/SettingsContext"; +import { ModalPage } from "~/modules/modal/components/ModalPage"; const SettingsProvider: FC = ({ children }) => { const [settings, setSettings] = useState(defaultSettings); @@ -12,12 +14,18 @@ const SettingsProvider: FC = ({ children }) => { const show = useCallback(() => setSettingsModalVisible(true), []); const hide = useCallback(() => setSettingsModalVisible(false), []); + const update = useCallback( + (val: Partial) => setSettings((v) => ({ ...v, ...val })), + [] + ); return ( - + {settingsModalVisible && ( - + + + )} diff --git a/src/modules/theme/containers/ThemeProvider/index.tsx b/src/modules/theme/containers/ThemeProvider/index.tsx index 895337b..0184bd0 100644 --- a/src/modules/theme/containers/ThemeProvider/index.tsx +++ b/src/modules/theme/containers/ThemeProvider/index.tsx @@ -1,9 +1,11 @@ import { FC, PropsWithChildren, useEffect, useState } from "react"; import { ThemeContext, defaultTheme } from "../../context/ThemeContext"; +import { useSettings } from "~/modules/settings/context/SettingsContext"; type ThemeProviderProps = PropsWithChildren; const ThemeProvider: FC = ({ children }) => { + const { settings } = useSettings(); const [theme] = useState(defaultTheme); useEffect(() => { @@ -16,6 +18,16 @@ const ThemeProvider: FC = ({ children }) => { return () => document.body.classList.remove(`theme-${theme.theme}`); }, [theme.theme]); + useEffect(() => { + document.body.style.setProperty( + "--color-background", + settings.backgroundColor + ); + + document.body.style.setProperty("--color-text", settings.textColor); + document.body.style.setProperty("--color-link", settings.linkColor); + }, [settings]); + return ( {children} );