aboutsummaryrefslogtreecommitdiff
path: root/src/console/colorscheme
diff options
context:
space:
mode:
authorShin'ya Ueoka <ueokande@i-beam.org>2021-04-05 23:05:23 +0900
committerShin'ya Ueoka <ueokande@i-beam.org>2021-04-06 21:47:04 +0900
commit21f863d76fbb5ed752ad529f8fbe33e75460027e (patch)
tree9e90a22ec44fbbf33c14bddfd6d7ea22e464581b /src/console/colorscheme
parent9041bae89f54efce14239768e642f99d1f0b35d1 (diff)
Replace colorscheme state with React Hooks
Diffstat (limited to 'src/console/colorscheme')
-rw-r--r--src/console/colorscheme/contexts.tsx10
-rw-r--r--src/console/colorscheme/hooks.ts15
-rw-r--r--src/console/colorscheme/providers.tsx31
-rw-r--r--src/console/colorscheme/styled.tsx6
-rw-r--r--src/console/colorscheme/theme.ts47
5 files changed, 109 insertions, 0 deletions
diff --git a/src/console/colorscheme/contexts.tsx b/src/console/colorscheme/contexts.tsx
new file mode 100644
index 0000000..e94454b
--- /dev/null
+++ b/src/console/colorscheme/contexts.tsx
@@ -0,0 +1,10 @@
+import React from "react";
+import ColorScheme from "../../shared/ColorScheme";
+
+export const ColorSchemeContext = React.createContext<ColorScheme>(
+ ColorScheme.System
+);
+
+export const ColorSchemeUpdateContext = React.createContext<
+ (colorscheme: ColorScheme) => void
+>(() => {});
diff --git a/src/console/colorscheme/hooks.ts b/src/console/colorscheme/hooks.ts
new file mode 100644
index 0000000..c9de754
--- /dev/null
+++ b/src/console/colorscheme/hooks.ts
@@ -0,0 +1,15 @@
+import React from "react";
+import { ColorSchemeUpdateContext } from "./contexts";
+import SettingClient from "../clients/SettingClient";
+
+export const useColorSchemeRefresh = () => {
+ const update = React.useContext(ColorSchemeUpdateContext);
+ const settingClient = new SettingClient();
+ const refresh = React.useCallback(() => {
+ settingClient.getColorScheme().then((newScheme) => {
+ update(newScheme);
+ });
+ }, []);
+
+ return refresh;
+};
diff --git a/src/console/colorscheme/providers.tsx b/src/console/colorscheme/providers.tsx
new file mode 100644
index 0000000..810c8e0
--- /dev/null
+++ b/src/console/colorscheme/providers.tsx
@@ -0,0 +1,31 @@
+import React from "react";
+import ColorScheme from "../../shared/ColorScheme";
+import { DarkTheme, LightTheme } from "./theme";
+import { ColorSchemeContext, ColorSchemeUpdateContext } from "./contexts";
+import { ThemeProvider } from "styled-components";
+
+export const ColorSchemeProvider: React.FC = ({ children }) => {
+ const [colorscheme, setColorScheme] = React.useState(ColorScheme.System);
+ const theme = React.useMemo(() => {
+ if (colorscheme === ColorScheme.System) {
+ if (
+ window.matchMedia &&
+ window.matchMedia("(prefers-color-scheme: dark)").matches
+ ) {
+ return DarkTheme;
+ }
+ } else if (colorscheme === ColorScheme.Dark) {
+ return DarkTheme;
+ }
+ return LightTheme;
+ }, [colorscheme]);
+
+ return (
+ <ColorSchemeContext.Provider value={colorscheme}>
+ <ColorSchemeUpdateContext.Provider value={setColorScheme}>
+ <ThemeProvider theme={theme}>{children}</ThemeProvider>
+ </ColorSchemeUpdateContext.Provider>
+ </ColorSchemeContext.Provider>
+ );
+};
+export default ColorSchemeProvider;
diff --git a/src/console/colorscheme/styled.tsx b/src/console/colorscheme/styled.tsx
new file mode 100644
index 0000000..12e10ec
--- /dev/null
+++ b/src/console/colorscheme/styled.tsx
@@ -0,0 +1,6 @@
+import baseStyled, { ThemedStyledInterface } from "styled-components";
+import { ThemeProperties } from "./theme";
+
+const styled = baseStyled as ThemedStyledInterface<ThemeProperties>;
+
+export default styled;
diff --git a/src/console/colorscheme/theme.ts b/src/console/colorscheme/theme.ts
new file mode 100644
index 0000000..5c17190
--- /dev/null
+++ b/src/console/colorscheme/theme.ts
@@ -0,0 +1,47 @@
+export type ThemeProperties = {
+ completionTitleBackground: string;
+ completionTitleForeground: string;
+ completionItemBackground: string;
+ completionItemForeground: string;
+ completionItemDescriptionForeground: string;
+ completionSelectedBackground: string;
+ completionSelectedForeground: string;
+ commandBackground: string;
+ commandForeground: string;
+ consoleErrorBackground: string;
+ consoleErrorForeground: string;
+ consoleInfoBackground: string;
+ consoleInfoForeground: string;
+};
+
+export const LightTheme: ThemeProperties = {
+ completionTitleBackground: "lightgray",
+ completionTitleForeground: "#000000",
+ completionItemBackground: "#ffffff",
+ completionItemForeground: "#000000",
+ completionItemDescriptionForeground: "#008000",
+ completionSelectedBackground: "#ffff00",
+ completionSelectedForeground: "#000000",
+ commandBackground: "#ffffff",
+ commandForeground: "#000000",
+ consoleErrorBackground: "#ff0000",
+ consoleErrorForeground: "#ffffff",
+ consoleInfoBackground: "#ffffff",
+ consoleInfoForeground: "#018786",
+};
+
+export const DarkTheme: ThemeProperties = {
+ completionTitleBackground: "#052027",
+ completionTitleForeground: "white",
+ completionItemBackground: "#2f474f",
+ completionItemForeground: "white",
+ completionItemDescriptionForeground: "#86fab0",
+ completionSelectedBackground: "#eeff41",
+ completionSelectedForeground: "#000000",
+ commandBackground: "#052027",
+ commandForeground: "white",
+ consoleErrorBackground: "red",
+ consoleErrorForeground: "white",
+ consoleInfoBackground: "#052027",
+ consoleInfoForeground: "#ffffff",
+};