Loading packages/client/src/components/Settings/SettingsSidebar.tsx +10 −2 Original line number Diff line number Diff line import { faGear } from "@fortawesome/free-solid-svg-icons"; import { useAppContext } from "../../contexts/AppContext"; import { SidebarBase } from "../SidebarBase"; import { Button, Divider } from "@nextui-org/react"; import { Button, Divider, Switch } from "@nextui-org/react"; import { TemplateSettings } from "./TemplateSettings"; import { ChatSettings } from "./ChatSettings"; import { OverlaySettings } from "../Overlay/OverlaySettings"; import { useDialog } from "../../contexts/DialogContext"; export const SettingsSidebar = () => { const { settingsSidebar, setSettingsSidebar, setShowKeybinds } = const { settingsSidebar, setSettingsSidebar, setShowKeybinds, settings } = useAppContext(); const { dispatch } = useDialog(); Loading @@ -29,6 +29,14 @@ export const SettingsSidebar = () => { <OverlaySettings /> <Divider /> <section className="flex gap-2 flex-wrap"> <Switch isSelected={settings.get["palette.colors"]} onValueChange={(value) => settings.set({ key: "palette.colors", value }) } > Show palette numbers </Switch> <Button onPress={() => { setShowKeybinds(true); Loading packages/client/src/components/Toolbar/Palette.scss +16 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,22 @@ .pallete-color { margin-left: 10px; position: relative; &.show-number::before { content: attr(data-number); position: absolute; top: 0; left: 0; width: 100%; transform: translateY(-50%); background-color: #000; color: #fff; border-radius: 10px; } } } Loading packages/client/src/components/Toolbar/Palette.tsx +4 −2 Original line number Diff line number Diff line Loading @@ -11,7 +11,7 @@ import useSWR from "swr"; export const Palette = () => { const { dispatch } = useDialog(); const { config, user, cursor, setCursor } = useAppContext<true>(); const { config, user, cursor, setCursor, settings } = useAppContext<true>(); const meta = useSWR<{ login: "INHIBIT" | "NORMAL" | "TRUST" }>("/api/info"); useEffect(() => { Loading Loading @@ -71,13 +71,15 @@ export const Palette = () => { > <FontAwesomeIcon icon={faXmark} /> </button> {config.pallete.colors.map((color) => ( {config.pallete.colors.map((color, i) => ( <button key={color.id} data-number={i + 1} aria-label={color.name} className={[ "pallete-color", color.id === cursor.color && "active", settings.get["palette.colors"] && "show-number", ] .filter((a) => a) .join(" ")} Loading packages/client/src/contexts/AppContext.tsx +38 −0 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ import React, { createContext, useContext, useEffect, useReducer, useState, } from "react"; import { AuthSession, ClientConfig } from "@sc07-canvas/lib/src/net"; Loading @@ -13,12 +14,30 @@ import { RestAPI } from "@sc07-canvas/lib"; type Whoami = RestAPI.components["schemas"]["Whoami"]; interface ISettings { "palette.colors"(val: boolean): boolean; } type SettingsAction<T extends keyof ISettings> = { key: T; value: Parameters<ISettings[T]>[0]; }; type ISettingsValue = { [K in keyof ISettings]: ReturnType<ISettings[K]>; }; interface IAppContext { config?: ClientConfig; user?: AuthSession; whoami?: Whoami; connected: boolean; settings: { get: ISettingsValue; set: React.ActionDispatch<[SettingsAction<keyof ISettings>]>; }; canvasPosition?: ICanvasPosition; setCanvasPosition: (v: ICanvasPosition) => void; cursor: ICursor; Loading Loading @@ -131,6 +150,21 @@ export const AppContext = ({ children }: PropsWithChildren) => { const [profile, setProfile] = useState<string>(); const settings = useReducer< ISettingsValue, [SettingsAction<keyof ISettings>] >( (state, action) => { return { ...state, [action.key]: action.value, }; }, { "palette.colors": false, } ); useEffect(() => { oapi.GET("/whoami").then(({ data }) => { setWhoami(data); Loading Loading @@ -208,6 +242,10 @@ export const AppContext = ({ children }: PropsWithChildren) => { config, user: auth, whoami, settings: { get: settings[0], set: settings[1], }, canvasPosition, setCanvasPosition, cursor, Loading Loading
packages/client/src/components/Settings/SettingsSidebar.tsx +10 −2 Original line number Diff line number Diff line import { faGear } from "@fortawesome/free-solid-svg-icons"; import { useAppContext } from "../../contexts/AppContext"; import { SidebarBase } from "../SidebarBase"; import { Button, Divider } from "@nextui-org/react"; import { Button, Divider, Switch } from "@nextui-org/react"; import { TemplateSettings } from "./TemplateSettings"; import { ChatSettings } from "./ChatSettings"; import { OverlaySettings } from "../Overlay/OverlaySettings"; import { useDialog } from "../../contexts/DialogContext"; export const SettingsSidebar = () => { const { settingsSidebar, setSettingsSidebar, setShowKeybinds } = const { settingsSidebar, setSettingsSidebar, setShowKeybinds, settings } = useAppContext(); const { dispatch } = useDialog(); Loading @@ -29,6 +29,14 @@ export const SettingsSidebar = () => { <OverlaySettings /> <Divider /> <section className="flex gap-2 flex-wrap"> <Switch isSelected={settings.get["palette.colors"]} onValueChange={(value) => settings.set({ key: "palette.colors", value }) } > Show palette numbers </Switch> <Button onPress={() => { setShowKeybinds(true); Loading
packages/client/src/components/Toolbar/Palette.scss +16 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,22 @@ .pallete-color { margin-left: 10px; position: relative; &.show-number::before { content: attr(data-number); position: absolute; top: 0; left: 0; width: 100%; transform: translateY(-50%); background-color: #000; color: #fff; border-radius: 10px; } } } Loading
packages/client/src/components/Toolbar/Palette.tsx +4 −2 Original line number Diff line number Diff line Loading @@ -11,7 +11,7 @@ import useSWR from "swr"; export const Palette = () => { const { dispatch } = useDialog(); const { config, user, cursor, setCursor } = useAppContext<true>(); const { config, user, cursor, setCursor, settings } = useAppContext<true>(); const meta = useSWR<{ login: "INHIBIT" | "NORMAL" | "TRUST" }>("/api/info"); useEffect(() => { Loading Loading @@ -71,13 +71,15 @@ export const Palette = () => { > <FontAwesomeIcon icon={faXmark} /> </button> {config.pallete.colors.map((color) => ( {config.pallete.colors.map((color, i) => ( <button key={color.id} data-number={i + 1} aria-label={color.name} className={[ "pallete-color", color.id === cursor.color && "active", settings.get["palette.colors"] && "show-number", ] .filter((a) => a) .join(" ")} Loading
packages/client/src/contexts/AppContext.tsx +38 −0 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ import React, { createContext, useContext, useEffect, useReducer, useState, } from "react"; import { AuthSession, ClientConfig } from "@sc07-canvas/lib/src/net"; Loading @@ -13,12 +14,30 @@ import { RestAPI } from "@sc07-canvas/lib"; type Whoami = RestAPI.components["schemas"]["Whoami"]; interface ISettings { "palette.colors"(val: boolean): boolean; } type SettingsAction<T extends keyof ISettings> = { key: T; value: Parameters<ISettings[T]>[0]; }; type ISettingsValue = { [K in keyof ISettings]: ReturnType<ISettings[K]>; }; interface IAppContext { config?: ClientConfig; user?: AuthSession; whoami?: Whoami; connected: boolean; settings: { get: ISettingsValue; set: React.ActionDispatch<[SettingsAction<keyof ISettings>]>; }; canvasPosition?: ICanvasPosition; setCanvasPosition: (v: ICanvasPosition) => void; cursor: ICursor; Loading Loading @@ -131,6 +150,21 @@ export const AppContext = ({ children }: PropsWithChildren) => { const [profile, setProfile] = useState<string>(); const settings = useReducer< ISettingsValue, [SettingsAction<keyof ISettings>] >( (state, action) => { return { ...state, [action.key]: action.value, }; }, { "palette.colors": false, } ); useEffect(() => { oapi.GET("/whoami").then(({ data }) => { setWhoami(data); Loading Loading @@ -208,6 +242,10 @@ export const AppContext = ({ children }: PropsWithChildren) => { config, user: auth, whoami, settings: { get: settings[0], set: settings[1], }, canvasPosition, setCanvasPosition, cursor, Loading