From 9895daa980cec3ab05fa4e0f002f530421271182 Mon Sep 17 00:00:00 2001 From: Wes Weitzel Date: Wed, 20 Dec 2023 22:09:40 -0800 Subject: [PATCH] Code cleanup --- src/components/ThemeSelect.tsx | 1 + src/hooks/useTheme.tsx | 10 +++++----- src/lib/theme.ts | 15 +++++++++++++++ src/lib/utils.ts | 14 -------------- src/pages/Settings.tsx | 1 + src/types.d.ts | 2 -- 6 files changed, 22 insertions(+), 21 deletions(-) create mode 100644 src/lib/theme.ts diff --git a/src/components/ThemeSelect.tsx b/src/components/ThemeSelect.tsx index 08f4e53..30641ea 100644 --- a/src/components/ThemeSelect.tsx +++ b/src/components/ThemeSelect.tsx @@ -1,3 +1,4 @@ +import {Theme} from '../lib/theme'; import Select from './Select'; interface ThemeSelectProps { diff --git a/src/hooks/useTheme.tsx b/src/hooks/useTheme.tsx index 2bce35c..94a0b32 100644 --- a/src/hooks/useTheme.tsx +++ b/src/hooks/useTheme.tsx @@ -1,5 +1,5 @@ import {createContext, useContext, useState} from 'react'; -import {getPreferredTheme, setDocumentTheme} from '../lib/utils'; +import {getPreferredTheme, setDocumentTheme, Theme} from '../lib/theme'; interface ThemeContext { theme: Theme; @@ -10,7 +10,7 @@ const currentTheme = getPreferredTheme(); const ThemeContext = createContext({theme: currentTheme, setTheme: () => null}); -export const ThemeProvider = ({children}: {children: React.ReactNode}) => { +export function ThemeProvider({children}: {children: React.ReactNode}) { const [theme, setTheme] = useState(currentTheme); function setGlobalTheme(theme: Theme) { @@ -23,8 +23,8 @@ export const ThemeProvider = ({children}: {children: React.ReactNode}) => { {children} ); -}; +} -export const useTheme = () => { +export function useTheme() { return useContext(ThemeContext); -}; +} diff --git a/src/lib/theme.ts b/src/lib/theme.ts new file mode 100644 index 0000000..b3e047b --- /dev/null +++ b/src/lib/theme.ts @@ -0,0 +1,15 @@ +export type Theme = 'dark' | 'light'; + +export function getPreferredTheme(): Theme { + let storedTheme = localStorage.getItem('top90-theme'); + if (storedTheme) { + return storedTheme as Theme; + } + + return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; +} + +export function setDocumentTheme(theme: Theme) { + localStorage.setItem('top90-theme', theme); + document.documentElement.setAttribute('data-bs-theme', theme); +} diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 46ba95e..0134577 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -1,17 +1,3 @@ -export function getPreferredTheme(): Theme { - let storedTheme = localStorage.getItem('top90-theme'); - if (storedTheme) { - return storedTheme as Theme; - } - - return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; -} - -export function setDocumentTheme(theme: Theme) { - localStorage.setItem('top90-theme', theme); - document.documentElement.setAttribute('data-bs-theme', theme); -} - export function cloudfrontEnabled() { return import.meta.env.VITE_TOP90_CLOUDFRONT_ENABLED !== 'false'; } diff --git a/src/pages/Settings.tsx b/src/pages/Settings.tsx index fdd9446..d02eb4e 100644 --- a/src/pages/Settings.tsx +++ b/src/pages/Settings.tsx @@ -1,5 +1,6 @@ import ThemeSelect from '../components/ThemeSelect'; import {useTheme} from '../hooks/useTheme'; +import {Theme} from '../lib/theme'; function Settings() { const {theme, setTheme} = useTheme(); diff --git a/src/types.d.ts b/src/types.d.ts index a022b26..e2937d4 100644 --- a/src/types.d.ts +++ b/src/types.d.ts @@ -1,3 +1 @@ declare module '*.png'; - -type Theme = 'dark' | 'light';