From 050e72bc8af91208553e07c0e4071f6a5b898776 Mon Sep 17 00:00:00 2001 From: John O'Keefe Date: Sun, 6 Sep 2026 10:28:30 -0400 Subject: [PATCH 1/8] chore(deps): upgrade to React 19, Chakra UI v3, router v7 and modern tooling - React 18 -> 19 (react, react-dom, @types), react-router 6 -> 7, vite 5 -> 8, typescript 5.5 -> 5.9 with Bundler module resolution, esModuleInterop and @/* path alias - Chakra 2.8 -> 3.37 (+cli), chakra-react-select 4.9 -> 6.1, next-themes for color mode; drop @chakra-ui/icons, chakra-ui-contextmenu, framer-motion and react-device-detect - axios, jodit-react, hookform, toast, testing-library, node types bumped alongside; bun.lockb regenerated - web-vitals 4 -> 6: ReportHandler/getCLS/getFID removed, migrate to MetricType with onCLS/onINP/onFCP/onLCP/onTTFB --- bun.lockb | Bin 252628 -> 199292 bytes package.json | 66 +++++++++++++++++++---------------------- src/reportWebVitals.ts | 16 +++++----- tsconfig.json | 11 ++++--- 4 files changed, 46 insertions(+), 47 deletions(-) diff --git a/bun.lockb b/bun.lockb index e61532233b4feaec3f0e2d0913ac4977f674bfce..6c5f890a511d6b93ac84bc8058f9f45f26a29121 100755 GIT binary patch literal 199292 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 literal 252628 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 diff --git a/package.json b/package.json index b225db5..9b01bf8 100644 --- a/package.json +++ b/package.json @@ -3,31 +3,27 @@ "version": "0.1.0", "private": true, "dependencies": { - "@chakra-ui/icons": "^2.1.1", - "@chakra-ui/react": "^2.8.2", - "@emotion/react": "^11.13.3", - "@emotion/styled": "^11.13.0", - "@hookstate/core": "^4.0.1", + "@chakra-ui/react": "^3.37.0", + "@emotion/react": "^11.14.0", + "@hookstate/core": "^4.0.2", "@hookstate/localstored": "^4.0.2", - "axios": "1.7.5", + "axios": "^1.20.0", "bson-objectid": "^2.0.4", - "chakra-react-select": "^4.9.1", - "chakra-ui-contextmenu": "^1.0.5", - "framer-motion": "^11.3.30", - "interweave": "^13.1.0", - "jodit-react": "^4.1.2", - "js-base64": "^3.7.7", - "react": "^18.3.1", - "react-device-detect": "^2.2.3", - "react-dom": "^18.3.1", - "react-hook-form": "^7.53.0", - "react-icons": "^5.3.0", + "chakra-react-select": "^6.1.3", + "interweave": "^13.1.1", + "jodit-react": "^5.5.3", + "js-base64": "^3.9.3", + "next-themes": "^0.4.6", + "react": "^19.2.8", + "react-dom": "^19.2.8", + "react-hook-form": "^7.87.0", + "react-icons": "^5.7.0", "react-rating": "^2.0.5", "react-responsive-carousel": "^3.2.23", - "react-router-dom": "^6.26.1", - "react-select": "^5.8.0", - "react-toastify": "^10.0.5", - "web-vitals": "^4.2.3" + "react-router-dom": "^7.18.3", + "react-select": "^5.10.2", + "react-toastify": "^11.1.0", + "web-vitals": "^6.2.1" }, "scripts": { "start": "bunx --bun vite", @@ -42,8 +38,8 @@ ] }, "resolutions": { - "@types/react": "18.2.21", - "@types/react-dom": "18.2.7" + "@types/react": "19.2.18", + "@types/react-dom": "19.2.7" }, "browserslist": { "production": [ @@ -58,18 +54,18 @@ ] }, "devDependencies": { - "@chakra-ui/cli": "^2.4.1", - "@hookstate/devtools": "^4.0.1", - "@testing-library/jest-dom": "^6.5.0", - "@testing-library/react": "^16.0.0", - "@testing-library/user-event": "^14.5.2", - "@types/jest": "^29.5.12", - "@types/node": "^22.5.1", - "@types/react": "^18.2.21", - "@types/react-dom": "^18.2.7", + "@chakra-ui/cli": "^3.37.0", + "@hookstate/devtools": "^4.0.3", + "@testing-library/jest-dom": "^7.0.1", + "@testing-library/react": "^16.3.3", + "@testing-library/user-event": "^14.6.7", + "@types/jest": "^30.0.0", + "@types/node": "^26.4.1", + "@types/react": "^19.2.18", + "@types/react-dom": "^19.2.7", "@types/react-table": "^7.7.20", - "@vitejs/plugin-react": "^4.3.1", - "typescript": "^5.5.4", - "vite": "^5.4.2" + "@vitejs/plugin-react": "^6.1.1", + "typescript": "^5.9.3", + "vite": "^8.2.2" } } diff --git a/src/reportWebVitals.ts b/src/reportWebVitals.ts index 49a2a16..636b328 100644 --- a/src/reportWebVitals.ts +++ b/src/reportWebVitals.ts @@ -1,13 +1,13 @@ -import { ReportHandler } from 'web-vitals'; +import type { MetricType } from 'web-vitals'; -const reportWebVitals = (onPerfEntry?: ReportHandler) => { +const reportWebVitals = (onPerfEntry?: (metric: MetricType) => void) => { if (onPerfEntry && onPerfEntry instanceof Function) { - import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { - getCLS(onPerfEntry); - getFID(onPerfEntry); - getFCP(onPerfEntry); - getLCP(onPerfEntry); - getTTFB(onPerfEntry); + import('web-vitals').then(({ onCLS, onINP, onFCP, onLCP, onTTFB }) => { + onCLS(onPerfEntry); + onINP(onPerfEntry); + onFCP(onPerfEntry); + onLCP(onPerfEntry); + onTTFB(onPerfEntry); }); } }; diff --git a/tsconfig.json b/tsconfig.json index 605dbbd..650e160 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,17 +5,20 @@ "types": ["vite/client"], "allowJs": false, "skipLibCheck": true, - "esModuleInterop": false, + "esModuleInterop": true, "allowSyntheticDefaultImports": true, "strict": true, "forceConsistentCasingInFileNames": true, "noFallthroughCasesInSwitch": true, - "module": "esnext", - "moduleResolution": "node", + "module": "ESNext", + "moduleResolution": "Bundler", "resolveJsonModule": true, "isolatedModules": true, "noEmit": true, - "jsx": "react-jsx" + "jsx": "react-jsx", + "paths": { + "@/*": ["./src/*"] + } }, "include": [ "src" From 4574dfb8f1a92e10338c79c659df49518ca8a84e Mon Sep 17 00:00:00 2001 From: John O'Keefe Date: Sun, 6 Sep 2026 10:29:04 -0400 Subject: [PATCH 2/8] feat(theme): migrate to Chakra v3 system with v2 look restoration - Replace extendTheme/ColorModeScript with createSystem Provider + Toaster shims (components/ui, provider, color-mode) and next-themes; index.tsx renders Provider, App reads useColorMode from the shim and clears both chakra and legacy theme storage keys on preference change - theme.tsx restores the v2 identity on v3 primitives: v2 gray/blue/ green/red scales, v2 solid/contrast fills, v2 text-per-size for button/input/native-select/tag, v2 input heights, v2 heading scale (xl->4xl etc), v2 switch track/thumb, brighter link underlines (currentColor/60), +1px tag top padding, 17px body base font - Default new-user theme light -> dark to match the established dark UI - App.test rewritten around Provider + MemoryRouter + Home (old CRA 'learn react' assertion no longer applies) --- src/App.test.tsx | 18 +- src/App.tsx | 7 +- src/components/ui/alert.tsx | 29 +++ src/components/ui/avatar.tsx | 34 +++ src/components/ui/checkbox.tsx | 25 +++ src/components/ui/close-button.tsx | 17 ++ src/components/ui/color-mode.tsx | 108 +++++++++ src/components/ui/dialog.tsx | 62 ++++++ src/components/ui/drawer.tsx | 61 ++++++ src/components/ui/field.tsx | 33 +++ src/components/ui/menu.tsx | 112 ++++++++++ src/components/ui/number-input.tsx | 28 +++ src/components/ui/provider.tsx | 16 ++ src/components/ui/switch.tsx | 39 ++++ src/components/ui/tag.tsx | 42 ++++ src/components/ui/toaster.tsx | 43 ++++ src/components/ui/tooltip.tsx | 46 ++++ src/index.tsx | 12 +- src/stateManagement/userState.ts | 2 +- src/styles/theme.tsx | 339 ++++++++++++++++++++++++++++- 20 files changed, 1047 insertions(+), 26 deletions(-) create mode 100644 src/components/ui/alert.tsx create mode 100644 src/components/ui/avatar.tsx create mode 100644 src/components/ui/checkbox.tsx create mode 100644 src/components/ui/close-button.tsx create mode 100644 src/components/ui/color-mode.tsx create mode 100644 src/components/ui/dialog.tsx create mode 100644 src/components/ui/drawer.tsx create mode 100644 src/components/ui/field.tsx create mode 100644 src/components/ui/menu.tsx create mode 100644 src/components/ui/number-input.tsx create mode 100644 src/components/ui/provider.tsx create mode 100644 src/components/ui/switch.tsx create mode 100644 src/components/ui/tag.tsx create mode 100644 src/components/ui/toaster.tsx create mode 100644 src/components/ui/tooltip.tsx diff --git a/src/App.test.tsx b/src/App.test.tsx index 2a68616..c05057a 100644 --- a/src/App.test.tsx +++ b/src/App.test.tsx @@ -1,9 +1,17 @@ import React from 'react'; import { render, screen } from '@testing-library/react'; -import App from './App'; +import { MemoryRouter } from 'react-router-dom'; +import { Provider } from './components/ui/provider'; +import Home from './components/Home'; -test('renders learn react link', () => { - render(); - const linkElement = screen.getByText(/learn react/i); - expect(linkElement).toBeInTheDocument(); +test('renders welcome message', () => { + render( + + + + + + ); + const heading = screen.getByText(/Welcome to your Games Database/i); + expect(heading).toBeInTheDocument(); }); diff --git a/src/App.tsx b/src/App.tsx index 45e72cb..d93755b 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -23,7 +23,8 @@ import ForgotPassword from './components/authComponents/ForgotPassword' import ResetPassword from './components/authComponents/ResetPassword' import UserProfile from './components/userComponents/UserProfile' import EditUser from './components/userComponents/EditUser' -import {Box, useColorMode} from "@chakra-ui/react"; +import {Box} from "@chakra-ui/react"; +import {useColorMode} from "./components/ui/color-mode"; import globalRouter from "./api/globalRouter"; function App() { @@ -44,8 +45,10 @@ function App() { if (!appLoad) useEffect(() => { - if(loadedPreferences.get().theme !== colorMode) { + const preferredTheme = loadedPreferences.get().theme + if(preferredTheme && preferredTheme !== colorMode) { localStorage.removeItem('chakra-ui-color-mode') + localStorage.removeItem('theme') toggleColorMode() } }, [loadedPreferences.get().theme]); diff --git a/src/components/ui/alert.tsx b/src/components/ui/alert.tsx new file mode 100644 index 0000000..0afc8ef --- /dev/null +++ b/src/components/ui/alert.tsx @@ -0,0 +1,29 @@ +import { Alert as ChakraAlert } from "@chakra-ui/react" +import * as React from "react" + +export interface AlertProps extends Omit { + startElement?: React.ReactNode + endElement?: React.ReactNode + title?: React.ReactNode + icon?: React.ReactElement +} + +export const Alert = React.forwardRef( + function Alert(props, ref) { + const { title, children, icon, startElement, endElement, ...rest } = props + return ( + + {startElement || {icon}} + {children ? ( + + {title} + {children} + + ) : ( + {title} + )} + {endElement} + + ) + }, +) diff --git a/src/components/ui/avatar.tsx b/src/components/ui/avatar.tsx new file mode 100644 index 0000000..0f1d3a3 --- /dev/null +++ b/src/components/ui/avatar.tsx @@ -0,0 +1,34 @@ +import { + Avatar as ChakraAvatar, + AvatarGroup as ChakraAvatarGroup, +} from "@chakra-ui/react" +import * as React from "react" + +type ImageProps = React.ImgHTMLAttributes + +export interface AvatarProps extends ChakraAvatar.RootProps { + name?: string + src?: string + srcSet?: string + loading?: ImageProps["loading"] + icon?: React.ReactElement + fallback?: React.ReactNode +} + +export const Avatar = React.forwardRef( + function Avatar(props, ref) { + const { name, src, srcSet, loading, icon, fallback, children, ...rest } = + props + return ( + + + {icon || fallback} + + + {children} + + ) + }, +) + +export const AvatarGroup = ChakraAvatarGroup diff --git a/src/components/ui/checkbox.tsx b/src/components/ui/checkbox.tsx new file mode 100644 index 0000000..246e2f0 --- /dev/null +++ b/src/components/ui/checkbox.tsx @@ -0,0 +1,25 @@ +import { Checkbox as ChakraCheckbox } from "@chakra-ui/react" +import * as React from "react" + +export interface CheckboxProps extends ChakraCheckbox.RootProps { + icon?: React.ReactNode + inputProps?: React.InputHTMLAttributes + rootRef?: React.RefObject +} + +export const Checkbox = React.forwardRef( + function Checkbox(props, ref) { + const { icon, children, inputProps, rootRef, ...rest } = props + return ( + + + + {icon || } + + {children != null && ( + {children} + )} + + ) + }, +) diff --git a/src/components/ui/close-button.tsx b/src/components/ui/close-button.tsx new file mode 100644 index 0000000..94af488 --- /dev/null +++ b/src/components/ui/close-button.tsx @@ -0,0 +1,17 @@ +import type { ButtonProps } from "@chakra-ui/react" +import { IconButton as ChakraIconButton } from "@chakra-ui/react" +import * as React from "react" +import { LuX } from "react-icons/lu" + +export type CloseButtonProps = ButtonProps + +export const CloseButton = React.forwardRef< + HTMLButtonElement, + CloseButtonProps +>(function CloseButton(props, ref) { + return ( + + {props.children ?? } + + ) +}) diff --git a/src/components/ui/color-mode.tsx b/src/components/ui/color-mode.tsx new file mode 100644 index 0000000..3ad064a --- /dev/null +++ b/src/components/ui/color-mode.tsx @@ -0,0 +1,108 @@ +"use client" + +import type { IconButtonProps, SpanProps } from "@chakra-ui/react" +import { ClientOnly, IconButton, Skeleton, Span } from "@chakra-ui/react" +import { ThemeProvider, useTheme } from "next-themes" +import type { ThemeProviderProps } from "next-themes" +import * as React from "react" +import { LuMoon, LuSun } from "react-icons/lu" + +export interface ColorModeProviderProps extends ThemeProviderProps {} + +export function ColorModeProvider(props: ColorModeProviderProps) { + return ( + + ) +} + +export type ColorMode = "light" | "dark" + +export interface UseColorModeReturn { + colorMode: ColorMode + setColorMode: (colorMode: ColorMode) => void + toggleColorMode: () => void +} + +export function useColorMode(): UseColorModeReturn { + const { resolvedTheme, setTheme, forcedTheme } = useTheme() + const colorMode = forcedTheme || resolvedTheme + const toggleColorMode = () => { + setTheme(resolvedTheme === "dark" ? "light" : "dark") + } + return { + colorMode: colorMode as ColorMode, + setColorMode: setTheme, + toggleColorMode, + } +} + +export function useColorModeValue(light: T, dark: T) { + const { colorMode } = useColorMode() + return colorMode === "dark" ? dark : light +} + +export function ColorModeIcon() { + const { colorMode } = useColorMode() + return colorMode === "dark" ? : +} + +interface ColorModeButtonProps extends Omit {} + +export const ColorModeButton = React.forwardRef< + HTMLButtonElement, + ColorModeButtonProps +>(function ColorModeButton(props, ref) { + const { toggleColorMode } = useColorMode() + return ( + }> + + + + + ) +}) + +export const LightMode = React.forwardRef( + function LightMode(props, ref) { + return ( + + ) + }, +) + +export const DarkMode = React.forwardRef( + function DarkMode(props, ref) { + return ( + + ) + }, +) diff --git a/src/components/ui/dialog.tsx b/src/components/ui/dialog.tsx new file mode 100644 index 0000000..44ff61a --- /dev/null +++ b/src/components/ui/dialog.tsx @@ -0,0 +1,62 @@ +import { Dialog as ChakraDialog, Portal } from "@chakra-ui/react" +import { CloseButton } from "./close-button" +import * as React from "react" + +interface DialogContentProps extends ChakraDialog.ContentProps { + portalled?: boolean + portalRef?: React.RefObject + backdrop?: boolean +} + +export const DialogContent = React.forwardRef< + HTMLDivElement, + DialogContentProps +>(function DialogContent(props, ref) { + const { + children, + portalled = true, + portalRef, + backdrop = true, + ...rest + } = props + + return ( + + {backdrop && } + + + {children} + + + + ) +}) + +export const DialogCloseTrigger = React.forwardRef< + HTMLButtonElement, + ChakraDialog.CloseTriggerProps +>(function DialogCloseTrigger(props, ref) { + return ( + + + {props.children} + + + ) +}) + +export const DialogRoot = ChakraDialog.Root +export const DialogFooter = ChakraDialog.Footer +export const DialogHeader = ChakraDialog.Header +export const DialogBody = ChakraDialog.Body +export const DialogBackdrop = ChakraDialog.Backdrop +export const DialogTitle = ChakraDialog.Title +export const DialogDescription = ChakraDialog.Description +export const DialogTrigger = ChakraDialog.Trigger +export const DialogActionTrigger = ChakraDialog.ActionTrigger diff --git a/src/components/ui/drawer.tsx b/src/components/ui/drawer.tsx new file mode 100644 index 0000000..4b189b5 --- /dev/null +++ b/src/components/ui/drawer.tsx @@ -0,0 +1,61 @@ +import { Drawer as ChakraDrawer, Portal } from "@chakra-ui/react" +import { CloseButton } from "./close-button" +import * as React from "react" + +interface DrawerContentProps extends ChakraDrawer.ContentProps { + portalled?: boolean + portalRef?: React.RefObject + offset?: ChakraDrawer.ContentProps["padding"] + backdrop?: boolean +} + +export const DrawerContent = React.forwardRef< + HTMLDivElement, + DrawerContentProps +>(function DrawerContent(props, ref) { + const { + children, + portalled = true, + portalRef, + offset, + backdrop = true, + ...rest + } = props + return ( + + {backdrop && } + + + {children} + + + + ) +}) + +export const DrawerCloseTrigger = React.forwardRef< + HTMLButtonElement, + ChakraDrawer.CloseTriggerProps +>(function DrawerCloseTrigger(props, ref) { + return ( + + + + ) +}) + +export const DrawerTrigger = ChakraDrawer.Trigger +export const DrawerRoot = ChakraDrawer.Root +export const DrawerFooter = ChakraDrawer.Footer +export const DrawerHeader = ChakraDrawer.Header +export const DrawerBody = ChakraDrawer.Body +export const DrawerBackdrop = ChakraDrawer.Backdrop +export const DrawerDescription = ChakraDrawer.Description +export const DrawerTitle = ChakraDrawer.Title +export const DrawerActionTrigger = ChakraDrawer.ActionTrigger diff --git a/src/components/ui/field.tsx b/src/components/ui/field.tsx new file mode 100644 index 0000000..4866269 --- /dev/null +++ b/src/components/ui/field.tsx @@ -0,0 +1,33 @@ +import { Field as ChakraField } from "@chakra-ui/react" +import * as React from "react" + +export interface FieldProps extends Omit { + label?: React.ReactNode + helperText?: React.ReactNode + errorText?: React.ReactNode + optionalText?: React.ReactNode +} + +export const Field = React.forwardRef( + function Field(props, ref) { + const { label, children, helperText, errorText, optionalText, ...rest } = + props + return ( + + {label && ( + + {label} + + + )} + {children} + {helperText && ( + {helperText} + )} + {errorText && ( + {errorText} + )} + + ) + }, +) diff --git a/src/components/ui/menu.tsx b/src/components/ui/menu.tsx new file mode 100644 index 0000000..79ceb07 --- /dev/null +++ b/src/components/ui/menu.tsx @@ -0,0 +1,112 @@ +"use client" + +import { AbsoluteCenter, Menu as ChakraMenu, Portal } from "@chakra-ui/react" +import * as React from "react" +import { LuCheck, LuChevronRight } from "react-icons/lu" + +interface MenuContentProps extends ChakraMenu.ContentProps { + portalled?: boolean + portalRef?: React.RefObject +} + +export const MenuContent = React.forwardRef( + function MenuContent(props, ref) { + const { portalled = true, portalRef, ...rest } = props + return ( + + + + + + ) + }, +) + +export const MenuArrow = React.forwardRef< + HTMLDivElement, + ChakraMenu.ArrowProps +>(function MenuArrow(props, ref) { + return ( + + + + ) +}) + +export const MenuCheckboxItem = React.forwardRef< + HTMLDivElement, + ChakraMenu.CheckboxItemProps +>(function MenuCheckboxItem(props, ref) { + return ( + + + + + + + {props.children} + + ) +}) + +export const MenuRadioItem = React.forwardRef< + HTMLDivElement, + ChakraMenu.RadioItemProps +>(function MenuRadioItem(props, ref) { + const { children, ...rest } = props + return ( + + + + + + + {children} + + ) +}) + +export const MenuItemGroup = React.forwardRef< + HTMLDivElement, + ChakraMenu.ItemGroupProps +>(function MenuItemGroup(props, ref) { + const { title, children, ...rest } = props + return ( + + {title && ( + + {title} + + )} + {children} + + ) +}) + +export interface MenuTriggerItemProps extends ChakraMenu.ItemProps { + startIcon?: React.ReactNode +} + +export const MenuTriggerItem = React.forwardRef< + HTMLDivElement, + MenuTriggerItemProps +>(function MenuTriggerItem(props, ref) { + const { startIcon, children, ...rest } = props + return ( + + {startIcon} + {children} + + + ) +}) + +export const MenuRadioItemGroup = ChakraMenu.RadioItemGroup +export const MenuContextTrigger = ChakraMenu.ContextTrigger +export const MenuRoot = ChakraMenu.Root +export const MenuSeparator = ChakraMenu.Separator + +export const MenuItem = ChakraMenu.Item +export const MenuItemText = ChakraMenu.ItemText +export const MenuItemCommand = ChakraMenu.ItemCommand +export const MenuTrigger = ChakraMenu.Trigger diff --git a/src/components/ui/number-input.tsx b/src/components/ui/number-input.tsx new file mode 100644 index 0000000..0948535 --- /dev/null +++ b/src/components/ui/number-input.tsx @@ -0,0 +1,28 @@ +import { NumberInput as ChakraNumberInput } from "@chakra-ui/react" +import * as React from "react" + +export interface NumberInputProps extends ChakraNumberInput.RootProps {} + +export const NumberInputRoot = React.forwardRef< + HTMLDivElement, + NumberInputProps +>(function NumberInput(props, ref) { + const { children, ...rest } = props + return ( + + {children} + + + + + + ) +}) + +export const NumberInputField = ChakraNumberInput.Input +export const NumberInputScrubber = ChakraNumberInput.Scrubber +export const NumberInputLabel = ChakraNumberInput.Label diff --git a/src/components/ui/provider.tsx b/src/components/ui/provider.tsx new file mode 100644 index 0000000..ec44b3f --- /dev/null +++ b/src/components/ui/provider.tsx @@ -0,0 +1,16 @@ +"use client" + +import { ChakraProvider } from "@chakra-ui/react" +import { + ColorModeProvider, + type ColorModeProviderProps, +} from "./color-mode" +import system from "../../styles/theme" + +export function Provider(props: ColorModeProviderProps) { + return ( + + + + ) +} diff --git a/src/components/ui/switch.tsx b/src/components/ui/switch.tsx new file mode 100644 index 0000000..e3690c0 --- /dev/null +++ b/src/components/ui/switch.tsx @@ -0,0 +1,39 @@ +import { Switch as ChakraSwitch } from "@chakra-ui/react" +import * as React from "react" + +export interface SwitchProps extends ChakraSwitch.RootProps { + inputProps?: React.InputHTMLAttributes + rootRef?: React.RefObject + trackLabel?: { on: React.ReactNode; off: React.ReactNode } + thumbLabel?: { on: React.ReactNode; off: React.ReactNode } +} + +export const Switch = React.forwardRef( + function Switch(props, ref) { + const { inputProps, children, rootRef, trackLabel, thumbLabel, ...rest } = + props + + return ( + + + + + {thumbLabel && ( + + {thumbLabel?.on} + + )} + + {trackLabel && ( + + {trackLabel.on} + + )} + + {children != null && ( + {children} + )} + + ) + }, +) diff --git a/src/components/ui/tag.tsx b/src/components/ui/tag.tsx new file mode 100644 index 0000000..df02291 --- /dev/null +++ b/src/components/ui/tag.tsx @@ -0,0 +1,42 @@ +import { Tag as ChakraTag } from "@chakra-ui/react" +import * as React from "react" + +export interface TagProps extends ChakraTag.RootProps { + startElement?: React.ReactNode + endElement?: React.ReactNode + onClose?: VoidFunction + closable?: boolean +} + +export const Tag = React.forwardRef( + function Tag(props, ref) { + const { + startElement, + endElement, + onClose, + closable = !!onClose, + children, + size, + ...rest + } = props + // v2 tag text per size (v3 renders one step smaller) + const labelTextStyle = size === 'lg' ? 'md' : size === 'sm' ? 'xs' : 'sm' + + return ( + + {startElement && ( + {startElement} + )} + {children} + {endElement && ( + {endElement} + )} + {closable && ( + + + + )} + + ) + }, +) diff --git a/src/components/ui/toaster.tsx b/src/components/ui/toaster.tsx new file mode 100644 index 0000000..5d70a35 --- /dev/null +++ b/src/components/ui/toaster.tsx @@ -0,0 +1,43 @@ +"use client" + +import { + Toaster as ChakraToaster, + Portal, + Spinner, + Stack, + Toast, + createToaster, +} from "@chakra-ui/react" + +export const toaster = createToaster({ + placement: "bottom-end", + pauseOnPageIdle: true, +}) + +export const Toaster = () => { + return ( + + + {(toast) => ( + + {toast.type === "loading" ? ( + + ) : ( + + )} + + {toast.title && {toast.title}} + {toast.description && ( + {toast.description} + )} + + {toast.action && ( + {toast.action.label} + )} + {toast.closable && } + + )} + + + ) +} diff --git a/src/components/ui/tooltip.tsx b/src/components/ui/tooltip.tsx new file mode 100644 index 0000000..0129778 --- /dev/null +++ b/src/components/ui/tooltip.tsx @@ -0,0 +1,46 @@ +import { Tooltip as ChakraTooltip, Portal } from "@chakra-ui/react" +import * as React from "react" + +export interface TooltipProps extends ChakraTooltip.RootProps { + showArrow?: boolean + portalled?: boolean + portalRef?: React.RefObject + content: React.ReactNode + contentProps?: ChakraTooltip.ContentProps + disabled?: boolean +} + +export const Tooltip = React.forwardRef( + function Tooltip(props, ref) { + const { + showArrow, + children, + disabled, + portalled = true, + content, + contentProps, + portalRef, + ...rest + } = props + + if (disabled) return children + + return ( + + {children} + + + + {showArrow && ( + + + + )} + {content} + + + + + ) + }, +) diff --git a/src/index.tsx b/src/index.tsx index 7062cd0..2dae8ab 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -3,14 +3,14 @@ import React from "react"; import {createRoot} from "react-dom/client"; import App from "./App"; import reportWebVitals from "./reportWebVitals"; -import "react-toastify/dist/ReactToastify.min.css"; +import "react-toastify/dist/ReactToastify.css"; import "./styles/typography.css"; import "./styles/videoBackground.css"; import "./styles/overrides.css"; import "react-responsive-carousel/lib/styles/carousel.min.css"; import {createBrowserRouter, RouterProvider} from "react-router-dom"; -import {ChakraProvider, ColorModeScript} from "@chakra-ui/react"; -import theme from "./styles/theme"; +import {Provider} from "./components/ui/provider"; +import {Toaster} from "./components/ui/toaster"; import NotFound from "./errors/NotFound"; const container = document.getElementById("root"); @@ -26,10 +26,10 @@ const router = createBrowserRouter([ root.render( - - + - + + ); diff --git a/src/stateManagement/userState.ts b/src/stateManagement/userState.ts index fadc9ba..df6a0be 100644 --- a/src/stateManagement/userState.ts +++ b/src/stateManagement/userState.ts @@ -74,7 +74,7 @@ export const getUser = async (token: string) => { if(userPreferencesExist === -1) { userPreferences.merge([{ id: user.data._id, - theme: 'light', + theme: 'dark', stickyNav: true, }]) } diff --git a/src/styles/theme.tsx b/src/styles/theme.tsx index 0ea0604..784f77f 100644 --- a/src/styles/theme.tsx +++ b/src/styles/theme.tsx @@ -1,18 +1,333 @@ -import { extendTheme, Theme } from '@chakra-ui/react' -import { mode } from '@chakra-ui/theme-tools' -import {loadedPreferences} from "../stateManagement/userState"; +import { + createSystem, + defaultConfig, + defineConfig, + defineRecipe, + defineSlotRecipe, +} from '@chakra-ui/react' +import { + buttonRecipe, + headingRecipe, + inputRecipe, + linkRecipe, + nativeSelectSlotRecipe, + numberInputSlotRecipe, + switchSlotRecipe, + tagSlotRecipe, +} from '@chakra-ui/react/theme' +// Chakra v2 color scales (blue-tinted). Chakra v3 replaced these with neutral +// scales and a near-black page background, which changed the app's whole look. +// Restoring the v2 scales keeps every component on the old colorscheme. +const v2Colors = { + gray: { + 50: '#F7FAFC', + 100: '#EDF2F7', + 200: '#E2E8F0', + 300: '#CBD5E0', + 400: '#A0AEC0', + 500: '#718096', + 600: '#4A5568', + 700: '#2D3748', + 800: '#1A202C', + 900: '#171923', + }, + blue: { + 50: '#EBF8FF', + 100: '#BEE3F8', + 200: '#90CDF4', + 300: '#63B3ED', + 400: '#4299E1', + 500: '#3182CE', + 600: '#2B6CB0', + 700: '#2C5282', + 800: '#2A4365', + 900: '#1A365D', + }, + green: { + 50: '#F0FFF4', + 100: '#C6F6D5', + 200: '#9AE6B4', + 300: '#68D391', + 400: '#48BB78', + 500: '#38A169', + 600: '#2F855A', + 700: '#276749', + 800: '#22543D', + 900: '#1C4532', + }, + red: { + 50: '#FFF5F5', + 100: '#FED7D7', + 200: '#FEB2B2', + 300: '#FC8181', + 400: '#F56565', + 500: '#E53E3E', + 600: '#C53030', + 700: '#9B2C2C', + 800: '#742A2A', + 900: '#63171B', + }, +} as const +const toTokens = (scale: Record) => + Object.fromEntries(Object.entries(scale).map(([shade, hex]) => [shade, { value: hex }])) -export default extendTheme({ - initialColorMode: loadedPreferences.theme, - useSystemColorMode: false, - styles: { - global: (props: Theme) => ({ - body: { - bg: mode('gray.200', 'gray.800')(props), +// Chakra v2 solid fills were bright in dark mode (200-shade bg + dark text), +// while v3 solid fills stay dark with white text. Restore the v2 behavior so +// buttons/tags read the same as before. This also fixes Switch/Checkbox +// checked fills, which consume the same tokens. +const v2Solid = (palette: 'gray' | 'blue' | 'green' | 'red') => { + if (palette === 'gray') { + return { + solid: { value: { _light: '{colors.gray.100}', _dark: '{colors.whiteAlpha.200}' } }, + contrast: { value: { _light: '{colors.gray.800}', _dark: 'white' } }, + } + } + return { + solid: { value: { _light: `{colors.${palette}.500}`, _dark: `{colors.${palette}.200}` } }, + contrast: { value: { _light: 'white', _dark: '{colors.gray.800}' } }, + } +} + +// Chakra v3 shrunk component text a step (e.g. md buttons/inputs render sm +// text). v2 used same-name text per size — restore that. +// NOTE: recipe bases are spread as `any` — retyping Chakra's inferred +// variant unions through defineRecipe's generics is not worth it here; +// the objects below are complete recipes by construction (spread of the +// original + targeted size overrides). +const baseButton: any = buttonRecipe +const baseHeading: any = headingRecipe +const baseInput: any = inputRecipe +const baseNumberInput: any = numberInputSlotRecipe +const baseNativeSelect: any = nativeSelectSlotRecipe +const baseSwitch: any = switchSlotRecipe +const baseTag: any = tagSlotRecipe +const baseLink: any = linkRecipe + +// v3 link underlines render at 20% opacity (currentColor/20) — too dim +// against dark surfaces. Brighten universally. +const v2LinkRecipe = defineRecipe({ + ...baseLink, + variants: { + ...baseLink.variants, + variant: { + ...baseLink.variants?.variant, + underline: { + ...baseLink.variants?.variant?.underline, + textDecorationColor: 'currentColor/60', }, - }) + plain: { + ...baseLink.variants?.variant?.plain, + _hover: { + ...baseLink.variants?.variant?.plain?._hover, + textDecorationColor: 'currentColor/60', + }, + }, + }, }, }) - \ No newline at end of file + +// v2 tag text per size (v3 renders one step smaller) +const v2TagRecipe = defineSlotRecipe({ + ...baseTag, + base: { + ...baseTag.base, + root: { ...baseTag.base?.root, pt: '1px' }, + }, + variants: { + ...baseTag.variants, + size: { + ...baseTag.variants?.size, + md: { + ...baseTag.variants?.size?.md, + label: { ...baseTag.variants?.size?.md?.label, textStyle: 'sm' }, + }, + lg: { + ...baseTag.variants?.size?.lg, + label: { ...baseTag.variants?.size?.lg?.label, textStyle: 'md' }, + }, + }, + }, +}) + +const v2ButtonRecipe = defineRecipe({ + ...baseButton, + base: { + ...baseButton.base, + fontWeight: 'semibold', + }, + variants: { + ...baseButton.variants, + size: { + ...baseButton.variants?.size, + sm: { ...baseButton.variants?.size?.sm, textStyle: 'sm', h: '8', minW: '8' }, + md: { ...baseButton.variants?.size?.md, textStyle: 'md' }, + lg: { ...baseButton.variants?.size?.lg, textStyle: 'lg', h: '12', minW: '12' }, + }, + }, +}) + +const v2InputRecipe = defineRecipe({ + ...baseInput, + variants: { + ...baseInput.variants, + size: { + ...baseInput.variants?.size, + sm: { ...baseInput.variants?.size?.sm, textStyle: 'sm', '--input-height': 'sizes.8' }, + md: { ...baseInput.variants?.size?.md, textStyle: 'md' }, + lg: { ...baseInput.variants?.size?.lg, textStyle: 'lg', '--input-height': 'sizes.12' }, + }, + }, +}) + +// v2 headings were a full step larger than v3 same-name sizes +// (v2 xl = 3xl/4xl ≈ 30/36px, v3 xl = 20px). Restore v2 mapping universally +// so page titles match the old screenshots. +const v2HeadingRecipe = defineRecipe({ + ...baseHeading, + variants: { + ...baseHeading.variants, + size: { + ...baseHeading.variants?.size, + xs: { textStyle: 'sm' }, + sm: { textStyle: 'md' }, + md: { textStyle: 'xl' }, + lg: { textStyle: '3xl' }, + xl: { textStyle: '4xl' }, + '2xl': { textStyle: '5xl' }, + '3xl': { textStyle: '6xl' }, + '4xl': { textStyle: '7xl' }, + }, + }, +}) + +const v2NumberInputRecipe = defineSlotRecipe({ + ...baseNumberInput, + variants: { + ...baseNumberInput.variants, + size: { + ...baseNumberInput.variants?.size, + xs: { + ...baseNumberInput.variants?.size?.xs, + input: { ...v2InputRecipe.variants?.size?.xs }, + }, + sm: { + ...baseNumberInput.variants?.size?.sm, + input: { ...v2InputRecipe.variants?.size?.sm }, + }, + md: { + ...baseNumberInput.variants?.size?.md, + input: { ...v2InputRecipe.variants?.size?.md }, + }, + lg: { + ...baseNumberInput.variants?.size?.lg, + input: { ...v2InputRecipe.variants?.size?.lg }, + }, + }, + }, +}) + +const v2NativeSelectRecipe = defineSlotRecipe({ + ...baseNativeSelect, + variants: { + ...baseNativeSelect.variants, + size: { + ...baseNativeSelect.variants?.size, + md: { + ...baseNativeSelect.variants?.size?.md, + field: { ...baseNativeSelect.variants?.size?.md?.field, textStyle: 'md' }, + }, + lg: { + ...baseNativeSelect.variants?.size?.lg, + field: { ...baseNativeSelect.variants?.size?.lg?.field, textStyle: 'lg' }, + }, + }, + }, +}) + +// v2 Switch: unchecked track lighter grey (gray.300 / whiteAlpha.400), +// checked track blue (500 / 200), thumb white always. v3 uses a near-black +// unchecked track in dark mode and a dark thumb when checked. +const v2SwitchRecipe = defineSlotRecipe({ + ...baseSwitch, + variants: { + ...baseSwitch.variants, + variant: { + ...baseSwitch.variants?.variant, + solid: { + ...baseSwitch.variants?.variant?.solid, + control: { + ...baseSwitch.variants?.variant?.solid?.control, + bg: { base: 'gray.300', _dark: 'whiteAlpha.400' }, + }, + thumb: { + ...baseSwitch.variants?.variant?.solid?.thumb, + bg: 'white', + _checked: { + ...baseSwitch.variants?.variant?.solid?.thumb?._checked, + bg: 'white', + }, + }, + }, + }, + }, +}) + +const config = defineConfig({ + theme: { + recipes: { + button: v2ButtonRecipe, + heading: v2HeadingRecipe, + input: v2InputRecipe, + link: v2LinkRecipe, + }, + slotRecipes: { + numberInput: v2NumberInputRecipe, + nativeSelect: v2NativeSelectRecipe, + switch: v2SwitchRecipe, + tag: v2TagRecipe, + }, + tokens: { + colors: { + gray: { + ...toTokens(v2Colors.gray), + // v3 surfaces that default to near-black (menu/dropdown/modal + // panels) used v2's gray.700 in dark mode. + 950: { value: '#2D3748' }, + }, + blue: toTokens(v2Colors.blue), + green: toTokens(v2Colors.green), + red: toTokens(v2Colors.red), + }, + }, + semanticTokens: { + colors: { + gray: v2Solid('gray'), + blue: v2Solid('blue'), + green: v2Solid('green'), + red: v2Solid('red'), + }, + }, + }, + globalCss: { + // NOTE: top margins of page content collapse past `body`, so the strip + // above the content is painted with `html`'s background. It must match + // the body or the page gets a mismatched band. + // Explicit `.dark` class selectors are used because Chakra v3's `_dark` + // condition only matches *descendants* of `.dark`, never `html.dark` + // itself. + 'html:not(.dark)': { + bg: 'gray.200', + }, + 'html.dark': { + bg: 'gray.800', + }, + body: { + bg: { base: 'gray.200', _dark: 'gray.800' }, + fontSize: '1.0625rem', + }, + }, +}) + +export default createSystem(defaultConfig, config) From 7bdf42ac077e01ac9c3d03fb5da0606d840a6a1e Mon Sep 17 00:00:00 2001 From: John O'Keefe Date: Sun, 6 Sep 2026 10:29:41 -0400 Subject: [PATCH 3/8] refactor(forms): port game form to Chakra v3 with v4-style selects - New FixedSelect wrapper over chakra-react-select v6 restoring the v4 look everywhere: single gray.500 control border, flush addon chevron zone with rounded inner corners, hidden indicator separator, v4 option padding/type scale, gray subtle pills, brighter unselected hover - GameForm: FormControl/InputGroup -> Field/Flex, Button colorScheme/isLoading -> colorPalette/loading, Stack spacing -> gap, Container container.md -> 768px, Steam Scrape row rebuilt as nowrap Flex, select wrappers de-bordered (control owns the border) - formFields: Field/Checkbox/Switch shims in, required asterisk dropped to match legacy labels, Select/Creatable wrappers de-bordered, TS-typed select callbacks --- src/components/FixedSelect.tsx | 140 ++++++++++++++++++ src/components/GameForm.tsx | 88 ++++++----- src/components/formFields/CheckboxInput.tsx | 12 +- .../formFields/CreatableSelectInput.tsx | 18 +-- src/components/formFields/SelectInput.tsx | 18 +-- .../formFields/SingleFieldInput.tsx | 14 +- .../formFields/SingleFieldNumericInput.tsx | 66 ++++++--- .../SystemRequirementsTextareaInput.tsx | 11 +- src/components/formFields/TextareaInput.tsx | 11 +- 9 files changed, 269 insertions(+), 109 deletions(-) create mode 100644 src/components/FixedSelect.tsx diff --git a/src/components/FixedSelect.tsx b/src/components/FixedSelect.tsx new file mode 100644 index 0000000..317e893 --- /dev/null +++ b/src/components/FixedSelect.tsx @@ -0,0 +1,140 @@ +import React from 'react' +import { Select as V6Select, CreatableSelect as V6Creatable } from 'chakra-react-select' +import { useColorModeValue } from './ui/color-mode' + +// Shared styling that restores how these selects looked with Chakra v2 / +// chakra-react-select v4 (verified against the v4.9.1 source + old screenshots): +// +// - v4's control border resolved to the outer wrapper's gray.500 edge via +// `borderColor: inherit` (outer Box sets gray.500). v6 paints its own light +// edge (gray.100 in dark mode) on top, producing a double white+gray border. +// Fix universally: single gray.500 border on the control itself, transparent +// bg so wrapper bg shows through, no shadow, no padding so the chevron zone +// sits flush (v4 had padding:0 + overflow:hidden). +// - v4's chevron sat on a grey input-addon zone (gray.100 / whiteAlpha.300), +// flush right with rounded right corners matching the control. +// - v4's indicator separator was a subtle Divider, effectively invisible in +// the old screenshots; v6 hides it by default, so keep it hidden instead of +// rendering a prominent white line. +// - v4 multi-value pills defaulted to gray subtle tags (dark gray pill in dark +// mode), not bright blue. Defaults restored here; ActiveFilters tags pass +// blue explicitly and are unaffected. +function V6IndicatorSeparator() { + return null +} + +function useSharedChakraStyles(extra: any) { + const zoneBg = useColorModeValue('gray.100', 'whiteAlpha.300') + const pillBg = useColorModeValue('gray.100', 'whiteAlpha.300') + const pillColor = useColorModeValue('gray.800', 'gray.100') + const optionHoverBg = useColorModeValue('gray.200', 'whiteAlpha.300') + return { + control: (provided: any) => ({ + ...provided, + borderColor: 'gray.500', + borderWidth: '1px', + borderStyle: 'solid', + background: 'transparent', + boxShadow: 'none', + padding: 0, + overflow: 'hidden', + }), + valueContainer: (provided: any, state: any) => ({ + ...provided, + paddingTop: '2px', + paddingBottom: '2px', + paddingLeft: state?.selectProps?.size === 'sm' ? '12px' : '16px', + paddingRight: '8px', + }), + indicatorsContainer: (provided: any) => ({ + ...provided, + padding: 0, + margin: 0, + }), + dropdownIndicator: (provided: any) => ({ + ...provided, + background: zoneBg, + alignSelf: 'stretch', + height: '100%', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + margin: 0, + paddingLeft: '8px', + paddingRight: '8px', + borderWidth: 0, + borderRadius: 0, + borderTopRightRadius: 'md', + borderBottomRightRadius: 'md', + }), + option: (provided: any, state: any) => { + const size = state?.selectProps?.size === 'sm' ? 'sm' : state?.selectProps?.size === 'lg' ? 'lg' : 'md' + const v4 = { + sm: { fontSize: '14px', paddingLeft: '12.8px', paddingRight: '12.8px', paddingTop: '4.8px', paddingBottom: '4.8px' }, + md: { fontSize: '16px', paddingLeft: '12.8px', paddingRight: '12.8px', paddingTop: '6.4px', paddingBottom: '6.4px' }, + lg: { fontSize: '18px', paddingLeft: '16px', paddingRight: '16px', paddingTop: '8px', paddingBottom: '8px' }, + }[size] + return { + ...provided, + fontSize: v4.fontSize, + paddingLeft: v4.paddingLeft, + paddingRight: v4.paddingRight, + paddingTop: v4.paddingTop, + paddingBottom: v4.paddingBottom, + // v3 hover uses bg.emphasized/60 — near-invisible on dark surfaces. + // Brighten unselected hover in both modes; keep selected blue. + _highlighted: state?.isSelected + ? provided._highlighted + : { bg: optionHoverBg }, + } + }, + multiValue: (provided: any) => ({ + ...provided, + background: pillBg, + color: pillColor, + borderRadius: 'md', + margin: '2px', + }), + multiValueLabel: (provided: any) => ({ + ...provided, + color: pillColor, + }), + multiValueRemove: (provided: any) => ({ + ...provided, + color: pillColor, + }), + ...extra, + } +} + +function mergeComponents(extra: any) { + return { IndicatorSeparator: V6IndicatorSeparator, ...extra } +} + +export function Select(props: any) { + const { chakraStyles, components, tagColorPalette = 'gray', tagVariant = 'subtle', ...rest } = props + const mergedStyles = useSharedChakraStyles(chakraStyles) + return ( + + ) +} + +export function CreatableSelect(props: any) { + const { chakraStyles, components, tagColorPalette = 'gray', tagVariant = 'subtle', ...rest } = props + const mergedStyles = useSharedChakraStyles(chakraStyles) + return ( + + ) +} diff --git a/src/components/GameForm.tsx b/src/components/GameForm.tsx index 7acf969..f0562ee 100644 --- a/src/components/GameForm.tsx +++ b/src/components/GameForm.tsx @@ -21,17 +21,16 @@ import { Box, Button, Container, - FormControl, - FormLabel, + Flex, Heading, - InputGroup, Spacer, Stack, - Switch, Text, - useColorModeValue, } from '@chakra-ui/react' -import {CreatableSelect,} from 'chakra-react-select' +import {Field} from './ui/field' +import {Switch} from './ui/switch' +import {useColorModeValue} from './ui/color-mode' +import {CreatableSelect} from './FixedSelect' import {adminMode} from '../stateManagement/userState' import {encode} from 'js-base64' import SingleFieldInput from './formFields/SingleFieldInput' @@ -314,63 +313,64 @@ const GameForm = () => { return ( <> - + {id ? Editing {game.title} : Add a Game to the Database}

- + - + {!id || admin ? ( + + ) : ''} {!id && ( - - Steam Scrape + + Steam Scrape { + colorPalette="blue" + checked={game.scrape} + onCheckedChange={() => { handleToggle('scrape') }} name="scrape" id="scrape" /> - + )} - + {(gameId === '' && !game.scrape) || (gameId.length >= 1 && admin) ? ( ) : ''} <> - - Series + + rounded="md" + w="full"> { + onChange={(values: any) => { if (values === null) values = {value: '', label: ''} if (values) { handleInputChange('series', values.value) @@ -380,20 +380,18 @@ const GameForm = () => { value={{value: game.series, label: game.series}} /> - + {(gameId === '' && !game.scrape) || (gameId.length >= 1 && admin) ? ( <> - - Screenshots + + rounded="md" + w="full"> { value={screenshots[0]?.value === '' ? [] : screenshots} /> - + ) : ''} {(gameId === '' && !game.scrape) || (gameId.length >= 1) ? @@ -453,14 +451,14 @@ const GameForm = () => { {(gameId === '' && !game.scrape) || (gameId.length >= 1 && admin) ? ( - Operating Systems + Operating Systems - + { {(gameId === '' && !game.scrape) || (gameId.length >= 1 && admin) ? ( <> - System Requirements + System Requirements - Windows + Windows { bg={bg} handleSystemRequirements={handleSystemRequirements} rows={3}/> - Mac OSX + Mac OSX { field={game.systemRequirements.mac.recommended} bg={bg} handleSystemRequirements={handleSystemRequirements} rows={3}/> - Linux + Linux { ) : ''} - + - - - + + + ) -} \ No newline at end of file +} diff --git a/src/components/SearchModal.tsx b/src/components/SearchModal.tsx index c124d13..4d9eb11 100644 --- a/src/components/SearchModal.tsx +++ b/src/components/SearchModal.tsx @@ -1,8 +1,6 @@ import React from 'react' -import { - Modal, ModalBody, ModalCloseButton, ModalContent, - ModalHeader, -} from '@chakra-ui/react' +import { Dialog } from '@chakra-ui/react' +import {DialogBody, DialogCloseTrigger, DialogContent, DialogHeader, DialogRoot} from './ui/dialog' import { useHookstate } from '@hookstate/core' import { openAndCloseSearchDialogue } from '../stateManagement/loadingState' import Search from './Search' @@ -16,14 +14,14 @@ export default function SearchModal() { } return ( - - - Search - handleClose()}/> - + { if (!e.open) handleClose() }}> + + Search + handleClose()}/> + - - - + + + ) } diff --git a/src/components/dashboardComponents/DashboardLoadingModal.tsx b/src/components/dashboardComponents/DashboardLoadingModal.tsx index e8e35a3..9f774c4 100644 --- a/src/components/dashboardComponents/DashboardLoadingModal.tsx +++ b/src/components/dashboardComponents/DashboardLoadingModal.tsx @@ -1,5 +1,5 @@ import React from 'react' -import { Center, CircularProgress } from '@chakra-ui/react' +import { Center, ProgressCircle } from '@chakra-ui/react' export default function DashboardLoadingModal() { @@ -9,7 +9,12 @@ export default function DashboardLoadingModal() { w="100%" mt={'1rem'} > - + + + + + + ) diff --git a/src/components/helperComponents/ResetFilterButton.tsx b/src/components/helperComponents/ResetFilterButton.tsx index f1bcd2c..7fd1151 100644 --- a/src/components/helperComponents/ResetFilterButton.tsx +++ b/src/components/helperComponents/ResetFilterButton.tsx @@ -9,12 +9,12 @@ import { ratingState, steamRatingState } from "../../stateManagement/ratingState interface Props { text?: string - size?: string - variant?: string - colorScheme?: string + size?: "2xs" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl" + variant?: "solid" | "subtle" | "surface" | "outline" | "ghost" | "plain" + colorPalette?: string } -const ResetFilterButton = ({ text = "Reset Search and Filters", size = 'md', variant = 'solid', colorScheme = 'gray' }: Props) => { +const ResetFilterButton = ({ text = "Reset Search and Filters", size = 'md', variant = 'solid', colorPalette = 'gray' }: Props) => { const gameState = useHookstate(gameDashboardState) const games = gameState.get() const admin = useHookstate(adminMode).get() @@ -58,7 +58,7 @@ const ResetFilterButton = ({ text = "Reset Search and Filters", size = 'md', var } return ( - ) diff --git a/src/components/helperComponents/SteamAndDeckLogo.tsx b/src/components/helperComponents/SteamAndDeckLogo.tsx index 602216d..7dc11ad 100644 --- a/src/components/helperComponents/SteamAndDeckLogo.tsx +++ b/src/components/helperComponents/SteamAndDeckLogo.tsx @@ -9,17 +9,19 @@ const SteamAndDeckLogo = (props: ISteamAndDeckLogo) => { return (
+ SteamAndDeckLogo { +
); From 0919295843b4aa0c4d2522dde9fdcbec93a44beb Mon Sep 17 00:00:00 2001 From: John O'Keefe Date: Sun, 6 Sep 2026 10:30:39 -0400 Subject: [PATCH 5/8] refactor(details): migrate game details, thumbnails and menus to v3 - GameDetails/context menus: chakra context-menu dep replaced with MenuRoot shims, hover lift kept, FixedSelect play-status control, Link/Text/Separator prop renames - Features/Summary/SystemRequirements: Jodit + modal flows moved onto Dialog shims, v3 Button/Tag/Link tokens, carousel slide kept as-is - Preserves legacy dark card/menu surfaces via gray.950 -> v2 gray.700 mapping in the theme --- src/components/GameDetails.tsx | 39 ++--- .../dashboardComponents/GameThumbnail.tsx | 27 ++-- .../GameThumbnailContextMenu.tsx | 49 +++--- .../GameThumbnailSlide.tsx | 20 ++- src/components/detailsComponents/Features.tsx | 152 +++++------------- .../detailsComponents/GamePlayStatus.tsx | 9 +- .../detailsComponents/GameRating.tsx | 3 +- src/components/detailsComponents/Summary.tsx | 6 +- .../detailsComponents/SummaryModal.tsx | 24 +-- .../SystemRequirementsMenu.tsx | 92 +++++------ .../SystemRequirementsModal.tsx | 24 +-- 11 files changed, 195 insertions(+), 250 deletions(-) diff --git a/src/components/GameDetails.tsx b/src/components/GameDetails.tsx index 8d1f37b..a4bc5ac 100644 --- a/src/components/GameDetails.tsx +++ b/src/components/GameDetails.tsx @@ -1,6 +1,6 @@ import React, { useEffect } from 'react' import agent from '../api/agent' -import { useParams } from 'react-router' +import { useParams } from 'react-router-dom' import { Box, Button, @@ -12,10 +12,9 @@ import { Spacer, Stack, Text, - useColorModeValue, - useDisclosure, - useMediaQuery, } from '@chakra-ui/react' +import {useColorModeValue} from './ui/color-mode' +import {useDisclosure, useMediaQuery} from '@chakra-ui/react' import ImageSlider from './detailsComponents/ImageSlider' import Summary from './detailsComponents/Summary' import Features from './detailsComponents/Features' @@ -26,7 +25,7 @@ import { loadingState } from '../stateManagement/loadingState' import { ImmutableObject, useHookstate } from '@hookstate/core' import LoadingModal from './LoadingModal' import SteamAndDeckLogo from './helperComponents/SteamAndDeckLogo' -import { ExternalLinkIcon } from '@chakra-ui/icons' +import { LuExternalLink } from 'react-icons/lu' import { Data } from '../models/game' import SummaryModal from './detailsComponents/SummaryModal' import SystemRequirementsModal from './detailsComponents/SystemRequirementsModal' @@ -38,14 +37,14 @@ const GameDetails = () => { const loaded = loadedState.get() const { id } = useParams<{ id: string }>() const bg = useColorModeValue('white', 'gray.700') - const { isOpen: isSummaryOpen, onOpen: onSummaryOpen, onClose: onSummaryClose } = useDisclosure() - const { isOpen: isSystemOpen, onOpen: onSystemOpen, onClose: onSystemClose } = useDisclosure() - const [isSmallerThan768] = useMediaQuery('(max-width: 768px)') + const { open: isSummaryOpen, onOpen: onSummaryOpen, onClose: onSummaryClose } = useDisclosure() + const { open: isSystemOpen, onOpen: onSystemOpen, onClose: onSystemClose } = useDisclosure() + const [isSmallerThan768] = useMediaQuery(['(max-width: 768px)']) useEffect(() => { const getGame = async () => { loadedState.set(false) - return await agent.Games.details(id) + return await agent.Games.details(id!) } getGame().then((result) => { gameState.set(result) @@ -69,7 +68,7 @@ const GameDetails = () => { : ''} - + { {game.title} - {game.accessedBy[0].store.includes('Steam') && game.steamId.length > 0 && ( - )} - @@ -122,7 +123,7 @@ const GameDetails = () => { {isSmallerThan768 ? - @@ -138,7 +139,7 @@ const GameDetails = () => { {isSmallerThan768 ? - diff --git a/src/components/dashboardComponents/GameThumbnail.tsx b/src/components/dashboardComponents/GameThumbnail.tsx index 58fc6bd..26a9994 100644 --- a/src/components/dashboardComponents/GameThumbnail.tsx +++ b/src/components/dashboardComponents/GameThumbnail.tsx @@ -1,7 +1,7 @@ import React from 'react' import { Link } from 'react-router-dom' import { Data } from '../../models/game' -import { Link as ChakraLink, Flex, Heading, Image, LinkBox, LinkOverlay, Spacer, Text } from '@chakra-ui/react' +import { Link as ChakraLink, Flex, Heading, Image, Spacer, Text, Box } from '@chakra-ui/react' import GameRating from "../detailsComponents/GameRating"; import SteamAndDeckLogo from "../helperComponents/SteamAndDeckLogo"; @@ -16,20 +16,21 @@ export default function GameThumbnail({ onToggle, game, playState }: Props) { const gameLink = game.accessedBy[0].store.includes('Steam') && game.steamId.length > 0 ? game.steamId : game._id return ( <> - - + {game.title} - - - {game.steamId !== '' ? `${game.steamId}: ${game.title}` : `${game.title}`} - - Play Status: {playState} - + + {game.steamId !== '' ? `${game.steamId}: ${game.title}` : `${game.title}`} + + Play Status: {playState} + + diff --git a/src/components/dashboardComponents/GameThumbnailContextMenu.tsx b/src/components/dashboardComponents/GameThumbnailContextMenu.tsx index 97c5701..618e060 100644 --- a/src/components/dashboardComponents/GameThumbnailContextMenu.tsx +++ b/src/components/dashboardComponents/GameThumbnailContextMenu.tsx @@ -1,9 +1,8 @@ import React, { useState } from 'react'; import { Data } from "../../models/game"; -import { ContextMenu } from 'chakra-ui-contextmenu'; -import { MenuItem, MenuList } from '@chakra-ui/menu'; +import { Menu, Portal } from '@chakra-ui/react'; import GameThumbnail from "./GameThumbnail"; -import { Box, MenuGroup, useDisclosure } from "@chakra-ui/react"; +import { Box, useDisclosure } from "@chakra-ui/react"; import GameThumbnailSlide from "./GameThumbnailSlide"; import { playStatusValues } from "../../componentUtils/SelectValues"; import agent from "../../api/agent"; @@ -14,7 +13,7 @@ interface Props { } const GameThumbnailContextMenu = ({ game }: Props) => { - const { isOpen, onToggle } = useDisclosure() + const { open: isOpen, onToggle } = useDisclosure() const [playState, setPlayState] = useState(game.accessedBy[0].playStatus) const gameLink = game.steamId.length > 1 ? game.steamId : game._id @@ -34,20 +33,10 @@ const GameThumbnailContextMenu = ({ game }: Props) => { let mql = window.matchMedia('(max-width: 768px)'); return ( - key={game._id} renderMenu={() => ( - - Open in New Tab - - {playStatusValues.map(value => rightClick(value.label, value.value)} - >{value.label})} - - - )}> - {ref => <> + + { > - {(!mql.matches) && } - - } - + + + + + + Open in New Tab + + + Change PlayStatus + {playStatusValues.map((value, idx) => ( + rightClick(value.label, value.value)} + >{value.label} + ))} + + + + + {(!mql.matches) && } + ); }; diff --git a/src/components/dashboardComponents/GameThumbnailSlide.tsx b/src/components/dashboardComponents/GameThumbnailSlide.tsx index f3160ba..1c97387 100644 --- a/src/components/dashboardComponents/GameThumbnailSlide.tsx +++ b/src/components/dashboardComponents/GameThumbnailSlide.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import {Box, Container, Heading, HStack, Slide} from "@chakra-ui/react"; +import {Box, Container, Heading, HStack, Presence} from "@chakra-ui/react"; import {Data} from "../../models/game"; import ImageSlider from "../detailsComponents/ImageSlider"; @@ -10,17 +10,25 @@ interface Props { const GameThumbnailSlide = ({isOpen, game}: Props) => { return ( - + - - + + {game.title} @@ -29,7 +37,7 @@ const GameThumbnailSlide = ({isOpen, game}: Props) => { - + ); }; diff --git a/src/components/detailsComponents/Features.tsx b/src/components/detailsComponents/Features.tsx index 04d218a..33a4c82 100644 --- a/src/components/detailsComponents/Features.tsx +++ b/src/components/detailsComponents/Features.tsx @@ -1,5 +1,5 @@ import React, { useState as reactUseState } from 'react' -import { Badge, Box, Divider, Flex, Heading, Link, Text } from '@chakra-ui/react' +import { Badge, Box, Separator, Flex, Heading, Link, Text } from '@chakra-ui/react' import { Data } from '../../models/game' import { gameDashboardState } from '../../stateManagement/gameState' import { ImmutableObject, useHookstate } from '@hookstate/core' @@ -36,48 +36,40 @@ export default function Features({ game }: Props) { return history('/games') } + const badge = (label: string) => ( + + + + {label} + + + + ) + return ( Features and Information - - - - Rating: - - - + {badge('Rating:')} - + {game.accessedBy[0].store.includes('Steam') && game.steamId.length > 0 && (<> - - - - Steam ID: - - - + {badge('Steam ID:')} {game.steamId} - + )} {game.series.length > 1 && (<> - - - - Series: - - - + {badge('Series:')} { gamesState.filters.series.set(game.series) @@ -85,16 +77,10 @@ export default function Features({ game }: Props) { }} pt="1">{game.series} - + )} - - - - Play Status: - - - + {badge('Play Status:')} {editMode ? @@ -120,15 +106,9 @@ export default function Features({ game }: Props) { - + - - - - Genre: - - - + {badge('Genre:')} {game.genre.map((genre, index) => [ index > 0 && ", ", @@ -141,15 +121,9 @@ export default function Features({ game }: Props) { ])} - + - - - - Operating Systems: - - - + {badge('Operating Systems:')} {Object.keys(game.os).filter(os => { @@ -175,15 +149,9 @@ export default function Features({ game }: Props) { - + - - - - Store: - - - + {badge('Store:')} {game.accessedBy[0].store.map((store, index) => [ index > 0 && ", ", @@ -196,15 +164,9 @@ export default function Features({ game }: Props) { ])} - + - - - - Developer: - - - + {badge('Developer:')} {game.developer.map((developer, index) => [ index > 0 && ", ", @@ -217,15 +179,9 @@ export default function Features({ game }: Props) { ])} - + - - - - Publisher: - - - + {badge('Publisher:')} {game.publisher.map((publisher, index) => [ index > 0 && ", ", @@ -238,15 +194,9 @@ export default function Features({ game }: Props) { ])} - + - - - - Controller Support: - - - + {badge('Controller Support:')} { gamesState.filters.controller.set(game.controller) @@ -254,28 +204,16 @@ export default function Features({ game }: Props) { }} pt="1">{game.controller} - + - - - - Release Date: - - - + {badge('Release Date:')} {game.releaseDate} - + - - - - Soundtrack: - - - + {badge('Soundtrack:')} { gamesState.filters.soundtrack.set(game.accessedBy[0].soundtrack) @@ -283,15 +221,9 @@ export default function Features({ game }: Props) { }} pt="1">{game.accessedBy[0].soundtrack} - + - - - - Does it work with Intel?: - - - + {badge('Does it work with Intel?:')} { gamesState.filters.intel.set(game.intel) @@ -299,15 +231,9 @@ export default function Features({ game }: Props) { }} pt="1">{game.intel} - + - - - - Does it work with WINE?: - - - + {badge('Does it work with WINE?:')} { gamesState.filters.wine.set(game.wine) @@ -315,7 +241,7 @@ export default function Features({ game }: Props) { }} pt="1">{game.wine} - + ) } diff --git a/src/components/detailsComponents/GamePlayStatus.tsx b/src/components/detailsComponents/GamePlayStatus.tsx index 5b51395..6eabd95 100644 --- a/src/components/detailsComponents/GamePlayStatus.tsx +++ b/src/components/detailsComponents/GamePlayStatus.tsx @@ -2,11 +2,12 @@ import React from 'react'; import { Data } from '../../models/game' import agent from "../../api/agent"; import {playStatusValues} from "../../componentUtils/SelectValues"; -import {Select} from "chakra-react-select"; +import {Select} from "../FixedSelect"; +import {ImmutableObject} from "@hookstate/core"; interface Props { - game: Data + game: Data | ImmutableObject playState: string setPlayState: any } @@ -33,14 +34,14 @@ const GamePlayStatus = ({game, playState, setPlayState}: Props) => { value: playState, label: playState, }} - onChange={(e) => { + onChange={(e: any) => { if(e === null) return handleClick(e.value, e.label) }} size={'sm'} options={playStatusValues} chakraStyles={{ - container: (provided) => ({ + container: (provided: any) => ({ ...provided, width: "150px" }) diff --git a/src/components/detailsComponents/GameRating.tsx b/src/components/detailsComponents/GameRating.tsx index 6b94010..ad959a6 100644 --- a/src/components/detailsComponents/GameRating.tsx +++ b/src/components/detailsComponents/GameRating.tsx @@ -5,10 +5,11 @@ import agent from "../../api/agent"; import {Flex, Link} from "@chakra-ui/react"; import {IoGameController, IoGameControllerOutline} from "react-icons/io5"; import {BiReset} from "react-icons/bi"; +import {ImmutableObject} from "@hookstate/core"; interface Props { - game: Data + game: Data | ImmutableObject size: string } diff --git a/src/components/detailsComponents/Summary.tsx b/src/components/detailsComponents/Summary.tsx index 420c529..985d2be 100644 --- a/src/components/detailsComponents/Summary.tsx +++ b/src/components/detailsComponents/Summary.tsx @@ -1,7 +1,7 @@ import React from 'react' import { Data } from '../../models/game' import { Interweave } from 'interweave' -import { Divider, Box, Heading } from '@chakra-ui/react' +import { Separator, Box, Heading } from '@chakra-ui/react' import { ImmutableObject } from '@hookstate/core' interface Props { @@ -15,7 +15,7 @@ export default function Summary({ game }: Props) { {reviews.length >= 1 && ( <> Reviews - + )} = 1 ? '10' : ''} as="h1">About This Game - + { return ( - - - - - + { if (!e.open) onClose() }}> + + + - - - - - - + + + ) } diff --git a/src/components/detailsComponents/SystemRequirementsMenu.tsx b/src/components/detailsComponents/SystemRequirementsMenu.tsx index e750089..d05f30a 100644 --- a/src/components/detailsComponents/SystemRequirementsMenu.tsx +++ b/src/components/detailsComponents/SystemRequirementsMenu.tsx @@ -1,5 +1,5 @@ import React from 'react' -import { TabList, Tab, TabPanel, TabPanels, Tabs, Heading, Box } from '@chakra-ui/react' +import { Tabs, Heading, Box } from '@chakra-ui/react' import { Data } from '../../models/game' import { Interweave } from 'interweave' import { ImmutableObject } from '@hookstate/core' @@ -20,51 +20,51 @@ export default function SystemRequirements({ game }: Props) { return ( System Requirements - - - Windows - Mac - Linux - - - - - - Minimum - Recommended - - - {} - {} - - - - - - - Minimum - Recommended - - - {} - {} - - - - - - - Minimum - Recommended - - - {} - {} - - - - - + + + Windows + Mac + Linux + + + + + + Minimum + Recommended + + + {} + {} + + + + + + + Minimum + Recommended + + + {} + {} + + + + + + + Minimum + Recommended + + + {} + {} + + + + + ) } diff --git a/src/components/detailsComponents/SystemRequirementsModal.tsx b/src/components/detailsComponents/SystemRequirementsModal.tsx index 38de6f5..45944fd 100644 --- a/src/components/detailsComponents/SystemRequirementsModal.tsx +++ b/src/components/detailsComponents/SystemRequirementsModal.tsx @@ -1,5 +1,6 @@ import React from 'react' -import { Button, Modal, ModalBody, ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalOverlay } from '@chakra-ui/react' +import { Button } from '@chakra-ui/react' +import {DialogBody, DialogCloseTrigger, DialogContent, DialogFooter, DialogRoot} from '../ui/dialog' import { ImmutableObject } from '@hookstate/core' import { Data } from '../../models/game' import SystemRequirements from './SystemRequirementsMenu' @@ -14,20 +15,19 @@ interface Props { const SummaryModal = ({ isOpen, onClose, game }: Props) => { return ( - - - - - + { if (!e.open) onClose() }}> + + + - - - - - - + + + ) } From 54debe4b0ae2f4aabc71d747257d33f8065cee23 Mon Sep 17 00:00:00 2001 From: John O'Keefe Date: Sun, 6 Sep 2026 10:31:23 -0400 Subject: [PATCH 6/8] refactor(auth): migrate login, account, user and error screens to v3 - Login/forgot/reset, create/edit user, profile: Field/Dialog/Toaster shims, colorPalette/button renames, typed hookstate handlers - DeleteDialogue, NotFound, SomethingWentWrong: dialog + centered layout on v3 tokens with legacy copy intact --- src/components/DeleteDialogue.tsx | 59 ++++++-------- src/components/authComponents/AdminMode.tsx | 7 +- .../authComponents/ForgotPassword.tsx | 30 +++---- src/components/authComponents/LoginForm.tsx | 37 ++++----- .../authComponents/ResetPassword.tsx | 55 ++++++------- src/components/userComponents/CreateUser.tsx | 81 ++++++++----------- src/components/userComponents/EditUser.tsx | 77 ++++++++---------- src/components/userComponents/UserProfile.tsx | 62 +++++++------- src/errors/NotFound.tsx | 4 +- src/errors/SomethingWentWrong.tsx | 4 +- 10 files changed, 180 insertions(+), 236 deletions(-) diff --git a/src/components/DeleteDialogue.tsx b/src/components/DeleteDialogue.tsx index 1cafb17..712e002 100644 --- a/src/components/DeleteDialogue.tsx +++ b/src/components/DeleteDialogue.tsx @@ -3,13 +3,9 @@ import agent from '../api/agent' import { useNavigate } from 'react-router-dom' import { Data } from '../models/game' import { - AlertDialog, - AlertDialogBody, - AlertDialogContent, AlertDialogFooter, - AlertDialogHeader, - AlertDialogOverlay, - Button, Icon, Text + Button, Text } from '@chakra-ui/react' +import {DialogBody, DialogContent, DialogFooter, DialogHeader, DialogRoot} from './ui/dialog' type Props = { id: string @@ -44,34 +40,31 @@ export default function DeleteDialogue({ } } - const cancelRef = useRef(null) + const cancelRef = useRef(null) return ( - - - - - Delete? - - Are you sure you would like to delete {game.title}? - - - - - - - - + { if (!e.open) handleClose() }} role="alertdialog" initialFocusEl={() => cancelRef.current}> + + Delete? + + Are you sure you would like to delete {game.title}? + + + + + + + ) } diff --git a/src/components/authComponents/AdminMode.tsx b/src/components/authComponents/AdminMode.tsx index 51122a2..26bc7dc 100644 --- a/src/components/authComponents/AdminMode.tsx +++ b/src/components/authComponents/AdminMode.tsx @@ -1,5 +1,6 @@ import React from 'react' -import { Checkbox, Text } from '@chakra-ui/react' +import { Text } from '@chakra-ui/react' +import {Checkbox} from '../ui/checkbox' import { adminModeToggle, loggedInUser, adminMode } from '../../stateManagement/userState' import { useHookstate } from '@hookstate/core' @@ -8,8 +9,8 @@ export default function AdminMode() { const admin = useHookstate(adminMode).get() return ( - adminModeToggle()} isChecked={admin} isDisabled={!(user.role === 'admin')}> + adminModeToggle()} checked={admin} disabled={!(user.role === 'admin')}> Administrator Mode ) -} \ No newline at end of file +} diff --git a/src/components/authComponents/ForgotPassword.tsx b/src/components/authComponents/ForgotPassword.tsx index 4348f7f..adb9ad6 100644 --- a/src/components/authComponents/ForgotPassword.tsx +++ b/src/components/authComponents/ForgotPassword.tsx @@ -3,11 +3,11 @@ import { useForm } from 'react-hook-form' import { Container, Button, - FormControl, - FormLabel, Input, - useColorModeValue, FormErrorMessage, useToast, } from '@chakra-ui/react' +import {Field} from '../ui/field' +import {useColorModeValue} from '../ui/color-mode' +import {toaster} from '../ui/toaster' import agent from '../../api/agent' import { IForgotPassword } from '../../models/user' @@ -18,7 +18,6 @@ export default function ForgotPassword() { handleSubmit, formState: { errors, isSubmitting, isDirty }, } = useForm() - const toast = useToast() interface Message { success: boolean @@ -27,27 +26,25 @@ export default function ForgotPassword() { const onSubmit = handleSubmit(async (values) => { const message = await agent.Account.forgot(values as IForgotPassword) as Message - toast({ + toaster.create({ title: 'Email Sent', - status: 'success', + type: 'success', description: message.data, - isClosable: true, + closable: true, duration: 10000, - position: 'top' }) }) return (
- - Email + - - {errors.email?.type === 'required' && errors.email.message?.toString()} - {errors.email?.type === 'pattern' && 'Invalid Email Address'} - - +
diff --git a/src/components/authComponents/LoginForm.tsx b/src/components/authComponents/LoginForm.tsx index 5e5ba8f..47ab793 100644 --- a/src/components/authComponents/LoginForm.tsx +++ b/src/components/authComponents/LoginForm.tsx @@ -5,11 +5,10 @@ import { login } from '../../stateManagement/userState' import { Container, Button, - FormControl, - FormLabel, - Input, - useColorModeValue, HStack, Center, FormErrorMessage, + Input, HStack, Center, } from '@chakra-ui/react' +import {Field} from '../ui/field' +import {useColorModeValue} from '../ui/color-mode' import { Link } from 'react-router-dom' export default function LoginForm() { @@ -38,14 +37,13 @@ export default function LoginForm() { return ( - - Email + - - {errors.email?.type === 'required' && errors.email.message?.toString()} - {errors.email?.type === 'pattern' && 'Invalid Email Address'} - - - - Password + + - - {errors.password && errors.password.message?.toString()} - - +
- +
diff --git a/src/components/authComponents/ResetPassword.tsx b/src/components/authComponents/ResetPassword.tsx index aec3cc9..3cdc3d3 100644 --- a/src/components/authComponents/ResetPassword.tsx +++ b/src/components/authComponents/ResetPassword.tsx @@ -4,10 +4,11 @@ import { IResetPassword } from '../../models/user' import { Button, Container, - FormControl, - FormLabel, - Input, useToast, useColorModeValue, FormErrorMessage, + Input, } from '@chakra-ui/react' +import {Field} from '../ui/field' +import {useColorModeValue} from '../ui/color-mode' +import {toaster} from '../ui/toaster' import agent from '../../api/agent' import { useNavigate, useParams } from 'react-router-dom' @@ -17,7 +18,7 @@ interface Message { } interface URL { - token: string + token?: string } export default function ResetPassword() { @@ -27,32 +28,29 @@ export default function ResetPassword() { watch, formState: { errors, isSubmitting, isDirty }, } = useForm() - const { token } = useParams() + const { token } = useParams() const history = useNavigate() - const toast = useToast() const password = useRef({}) password.current = watch('password', '') const onSubmit = handleSubmit(async (data) => { - const message = await agent.Account.reset(token, data as IResetPassword) as Message + const message = await agent.Account.reset(token!, data as IResetPassword) as Message if (message.success) { setTimeout(() => history('/login'), 3000) - toast({ + toaster.create({ title: 'Password Reset', - status: 'success', + type: 'success', description: 'Your password has been reset. You will be redirected to login automatically', - isClosable: true, + closable: true, duration: 5000, - position: 'top', }) } else { - toast({ + toaster.create({ title: 'Password Not Reset', - status: 'error', + type: 'error', description: 'Something went wrong, please contact the website administrator', - isClosable: true, + closable: true, duration: 10000, - position: 'top', }) } }) @@ -62,15 +60,14 @@ export default function ResetPassword() { return (
- - Password + - - {errors.password && errors.password.message?.toString()} - - - - Repeat Password + + - - {errors.repeat_password && errors.repeat_password.message?.toString()} - - +
diff --git a/src/components/userComponents/CreateUser.tsx b/src/components/userComponents/CreateUser.tsx index 8e3cc58..88ea2fe 100644 --- a/src/components/userComponents/CreateUser.tsx +++ b/src/components/userComponents/CreateUser.tsx @@ -3,15 +3,13 @@ import { useForm } from 'react-hook-form' import { UserFormValues } from '../../models/user' import { createUser } from '../../stateManagement/userState' import { - Alert, - AlertDescription, - AlertIcon, Button, Container, - FormControl, FormErrorMessage, - FormLabel, - Input, useColorModeValue, + Input, } from '@chakra-ui/react' +import {Field} from '../ui/field' +import {Alert} from '../ui/alert' +import {useColorModeValue} from '../ui/color-mode' export default function CreateUser() { const { @@ -44,59 +42,52 @@ export default function CreateUser() { return ( - - Full Name + - {errors.name && { errors.name.message?.toString()}} - - - Display Name + + - {errors.displayName && { errors.displayName.message?.toString()}} - - - Email + + - {errors.email && { errors.email.message?.toString()}} - - - Password + + - {errors.password && { errors.password.message?.toString()}} - + {errors.password && ( <> - - - {errors.password.message?.toString()} - {/**/} + + {errors.password.message?.toString()}
)} - - Repeat Password + - {errors.repeat_password && { errors.repeat_password.message?.toString()}} - + {errors.repeat_password && ( <> - - - {errors.repeat_password.message?.toString()} - {/**/} + + {errors.repeat_password.message?.toString()} )}
diff --git a/src/components/userComponents/EditUser.tsx b/src/components/userComponents/EditUser.tsx index fec1405..5acfecb 100644 --- a/src/components/userComponents/EditUser.tsx +++ b/src/components/userComponents/EditUser.tsx @@ -5,14 +5,14 @@ import { loadedPreferences, loggedInUser, updateUserPreferences } from '../../st import { Button, Container, Flex, - FormControl, - FormLabel, Heading, Input, - Stack, Switch, - useColorModeValue, - useToast, + Stack, } from '@chakra-ui/react' +import {Field} from '../ui/field' +import {Switch} from '../ui/switch' +import {useColorModeValue} from '../ui/color-mode' +import {toaster} from '../ui/toaster' import { useHookstate } from '@hookstate/core' import agent from '../../api/agent' import { useNavigate } from 'react-router-dom' @@ -43,12 +43,10 @@ export default function EditUser() { const history = useNavigate() useEffect(() => { - reset(user) + reset(user as any) return }, [user.name !== '']) - const toast = useToast() - interface Message { success: boolean data: string @@ -66,13 +64,12 @@ export default function EditUser() { const engageChangePassword = async (values: IForgotPassword) => { const message = await agent.Account.forgot(values as IForgotPassword) as Message - toast({ + toaster.create({ title: 'Email Sent', - status: 'success', + type: 'success', description: message.data, - isClosable: true, + closable: true, duration: 10000, - position: 'top' }) } @@ -90,78 +87,70 @@ export default function EditUser() { Edit {user.displayName} - - Full Name + - - - Display Name + + - - - Email + + - - - - Dark Mode: + + ( - + onChange(checked)} ref={ref} /> )} /> - - - - - Sticky Navbar: + + ( - + onChange(checked)} ref={ref} /> )} /> - - +
- + @@ -42,28 +40,28 @@ const UserProfile = () => { - - - - - - - - - - - - - - - - - - - - -
Display Name: {user.displayName}
Full Name: {user.name}
Email: {user.email}
Role: {user.role}
-
+ + + + + Display Name: + {user.displayName} + + + Full Name: + {user.name} + + + Email: + {user.email} + + + Role: + {user.role} + + + +
diff --git a/src/errors/NotFound.tsx b/src/errors/NotFound.tsx index eb554c0..704ef71 100644 --- a/src/errors/NotFound.tsx +++ b/src/errors/NotFound.tsx @@ -29,8 +29,8 @@ export default function NotFound() { It looks like you hit a{' '} {DEAD} end! - }>