Fix: web app theme intialization (#14761)
parent
64e122c5f6
commit
bb4e7da720
@ -1,47 +0,0 @@
|
|||||||
'use client'
|
|
||||||
import { useCallback, useEffect, useState } from 'react'
|
|
||||||
import { createContext, useContextSelector } from 'use-context-selector'
|
|
||||||
import type { FC, ReactNode } from 'react'
|
|
||||||
import { Theme } from '@/types/app'
|
|
||||||
|
|
||||||
export type SharePageContextValue = {
|
|
||||||
theme: Theme
|
|
||||||
setTheme: (theme: Theme) => void
|
|
||||||
}
|
|
||||||
|
|
||||||
const SharePageContext = createContext<SharePageContextValue>({
|
|
||||||
theme: Theme.light,
|
|
||||||
setTheme: () => { },
|
|
||||||
})
|
|
||||||
|
|
||||||
export function useSelector<T>(selector: (value: SharePageContextValue) => T): T {
|
|
||||||
return useContextSelector(SharePageContext, selector)
|
|
||||||
}
|
|
||||||
|
|
||||||
export type SharePageContextProviderProps = {
|
|
||||||
children: ReactNode
|
|
||||||
}
|
|
||||||
|
|
||||||
export const SharePageContextProvider: FC<SharePageContextProviderProps> = ({ children }) => {
|
|
||||||
const [theme, setTheme] = useState<Theme>(Theme.light)
|
|
||||||
const handleSetTheme = useCallback((theme: Theme) => {
|
|
||||||
setTheme(theme)
|
|
||||||
globalThis.document.documentElement.setAttribute('data-theme', theme)
|
|
||||||
}, [])
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
globalThis.document.documentElement.setAttribute('data-theme', theme)
|
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
||||||
}, [])
|
|
||||||
|
|
||||||
return (
|
|
||||||
<SharePageContext.Provider value={{
|
|
||||||
theme,
|
|
||||||
setTheme: handleSetTheme,
|
|
||||||
}}>
|
|
||||||
{children}
|
|
||||||
</SharePageContext.Provider>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
export default SharePageContextProvider
|
|
||||||
Loading…
Reference in New Issue