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.text}

+
+ {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)}/> + +
+ +
+ + + + + {/* + */}
) }