From f06038390359f4a49b71514735ec8d8b5627c901 Mon Sep 17 00:00:00 2001
From: MathieuG-P <40181755+Zagrios@users.noreply.github.com>
Date: Thu, 23 Jun 2022 03:45:17 +0200
Subject: [PATCH] add interface to delete steam session, change primary colors,
and switch theme
---
.../setting-color-chooser.component.tsx | 25 +++++++
.../settings/setting-container.component.tsx | 12 +++
.../setting-radio-array.component.tsx | 30 ++++++++
.../pages/settings-page.component.tsx | 74 ++++++++++++++++---
4 files changed, 132 insertions(+), 9 deletions(-)
create mode 100644 src/renderer/components/settings/setting-color-chooser.component.tsx
create mode 100644 src/renderer/components/settings/setting-container.component.tsx
create mode 100644 src/renderer/components/settings/setting-radio-array.component.tsx
diff --git a/src/renderer/components/settings/setting-color-chooser.component.tsx b/src/renderer/components/settings/setting-color-chooser.component.tsx
new file mode 100644
index 00000000..8fa1b710
--- /dev/null
+++ b/src/renderer/components/settings/setting-color-chooser.component.tsx
@@ -0,0 +1,25 @@
+import { useState } from "react";
+import { HexColorPicker } from "react-colorful";
+import { motion, AnimatePresence } from "framer-motion"
+import OutsideClickHandler from "react-outside-click-handler";
+
+export default function SettingColorChooser({color, onChange}: {color?: string, onChange?: (color: string) => void}) {
+
+ const [colorVisible, setColorVisible] = useState(false);
+
+ return (
+ setColorVisible(false)}>
+
+
setColorVisible(!colorVisible)} style={{backgroundColor: color}}/>
+
+ {colorVisible &&
+
+
+
+
+ }
+
+
+
+ )
+}
diff --git a/src/renderer/components/settings/setting-container.component.tsx b/src/renderer/components/settings/setting-container.component.tsx
new file mode 100644
index 00000000..dacf7cf1
--- /dev/null
+++ b/src/renderer/components/settings/setting-container.component.tsx
@@ -0,0 +1,12 @@
+import { ReactNode } from "react";
+
+export function SettingContainer({className, title, minorTitle, description, children}: {className?: string, title?: string, minorTitle?: string, description?: string, children?: ReactNode}) {
+ return (
+
+ { title &&
{title}
}
+ { minorTitle &&
{minorTitle}
}
+ { description &&
{description}
}
+ { children }
+
+ )
+}
diff --git a/src/renderer/components/settings/setting-radio-array.component.tsx b/src/renderer/components/settings/setting-radio-array.component.tsx
new file mode 100644
index 00000000..152411cf
--- /dev/null
+++ b/src/renderer/components/settings/setting-radio-array.component.tsx
@@ -0,0 +1,30 @@
+import { motion } from "framer-motion"
+import { BsmIcon, BsmIconType } from "../svgs/bsm-icon.component"
+
+export function SettingRadioArray({items, selectedItem = items[0].id, onItemSelected}: {items: RadioItem[], selectedItem?: number, onItemSelected?: (id: number) => void}) {
+
+ return (
+
+ { items.map(i => (
+
onItemSelected(i.id)} key={i.id} className={`py-3 my-[6px] w-full flex justify-between items-center rounded-md px-2 transition-colors duration-200 ${i.id === selectedItem ? "bg-main-color-3" : "bg-main-color-1"}`}>
+
+ {i.icon && (
+ <>
+
+ {i.textIcon && {i.textIcon}}
+
+
+ >
+ )}
+
+ )) }
+
+ )
+}
+
+export interface RadioItem { id: number, text: string, icon?: BsmIconType, textIcon?: string }
diff --git a/src/renderer/pages/settings-page.component.tsx b/src/renderer/pages/settings-page.component.tsx
index b8b1d6d6..f1ac8303 100644
--- a/src/renderer/pages/settings-page.component.tsx
+++ b/src/renderer/pages/settings-page.component.tsx
@@ -1,22 +1,78 @@
-import { HexColorPicker } from "react-colorful"
+import { useEffect, useState } from "react";
+import SettingColorChooser from "renderer/components/settings/setting-color-chooser.component";
+import { SettingContainer } from "renderer/components/settings/setting-container.component";
+import { RadioItem, SettingRadioArray } from "renderer/components/settings/setting-radio-array.component";
+import { BsmButton } from "renderer/components/shared/bsm-button.component";
+import { DefaultConfigKey } from "renderer/config/default-configuration.config";
import { ConfigurationService } from "renderer/services/configuration.service"
export function SettingsPage() {
const configService = ConfigurationService.getInstance();
- const setFirstColorSetting = (hex: string) => {
- configService.set("first-color", hex);
+ const [firstColor, setFirstColor] = useState("#fff");
+ const [secondColor, setSecondColor] = useState("#fff");
+
+ const[themeIdSelected, setThemeIdSelected]= useState(0);
+
+ useEffect(() => {
+ const [fColorObs, sColorObs] = [configService.watch("first-color"), configService.watch("second-color")];
+ const fColorSub = fColorObs.subscribe(color => setFirstColor(color));
+ const sColorSub = sColorObs.subscribe(color => setSecondColor(color));
+
+ return () => {
+ configService.stopWatch("first-color" as DefaultConfigKey, fColorObs);
+ configService.stopWatch("second-color" as DefaultConfigKey, sColorObs);
+
+ [fColorSub, sColorSub].forEach(s => s.unsubscribe());
+ }
+ }, []);
+
+ const themeItem: RadioItem[] = [
+ {id: 0, text: "Dark"},
+ {id: 1, text: "Light"},
+ {id: 3, text: "Operating System"}
+ ]
+
+ const resetColors = () => {
+ configService.delete("first-color" as DefaultConfigKey);
+ configService.delete("second-color" as DefaultConfigKey);
}
- const setSecondColorSetting = (hex: string) => {
- configService.set("second-color", hex);
- }
+ const setFirstColorSetting = (hex: string) => configService.set("first-color", hex);
+ const setSecondColorSetting = (hex: string) => configService.set("second-color", hex);
+
+
return (
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+ setThemeIdSelected(id)}/>
+
+
+
+
+
+
+
+
+ {/*
+ */}
)
}