|
|
@@ -1,19 +1,12 @@
|
|
|
-import { useCallback, useEffect, useState } from 'react'
|
|
|
+import { useCallback, useEffect } from 'react'
|
|
|
import _ from 'lodash'
|
|
|
-import type { OverallThemeMeta } from '../../../../../types/project-settings'
|
|
|
import { saveUserSettings } from '../utils/api'
|
|
|
import { UserSettings } from '../../../../../types/user-settings'
|
|
|
import { useUserSettingsContext } from '@/shared/context/user-settings-context'
|
|
|
import getMeta from '@/utils/meta'
|
|
|
-import { isBootstrap5 } from '@/features/utils/bootstrap-5'
|
|
|
import { isIEEEBranded } from '@/utils/is-ieee-branded'
|
|
|
-import { useLayoutContext } from '@/shared/context/layout-context'
|
|
|
|
|
|
export default function useSetOverallTheme() {
|
|
|
- const [chosenTheme, setChosenTheme] = useState<OverallThemeMeta | null>(null)
|
|
|
-
|
|
|
- const { loadingStyleSheet, setLoadingStyleSheet } = useLayoutContext()
|
|
|
-
|
|
|
const { userSettings, setUserSettings } = useUserSettingsContext()
|
|
|
const { overallTheme } = userSettings
|
|
|
|
|
|
@@ -24,54 +17,13 @@ export default function useSetOverallTheme() {
|
|
|
[setUserSettings]
|
|
|
)
|
|
|
|
|
|
- const skipLoadingStyleSheet = isBootstrap5()
|
|
|
-
|
|
|
useEffect(() => {
|
|
|
- // Sets `data-theme` attribute to the body element, needed for Bootstrap 5 theming
|
|
|
+ // Sets the body's data-theme attribute for theming
|
|
|
const theme =
|
|
|
overallTheme === 'light-' && !isIEEEBranded() ? 'light' : 'default'
|
|
|
document.body.dataset.theme = theme
|
|
|
}, [overallTheme])
|
|
|
|
|
|
- useEffect(() => {
|
|
|
- if (skipLoadingStyleSheet) {
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- const docHeadEl = document.querySelector('head')
|
|
|
- const oldStyleSheetEl = document.getElementById('main-stylesheet')
|
|
|
-
|
|
|
- const newStyleSheetEl = document.createElement('link')
|
|
|
- newStyleSheetEl.setAttribute('rel', 'stylesheet')
|
|
|
- newStyleSheetEl.setAttribute('id', 'main-stylesheet')
|
|
|
- newStyleSheetEl.setAttribute('href', chosenTheme?.path ?? '')
|
|
|
-
|
|
|
- const loadEventCallback = () => {
|
|
|
- setLoadingStyleSheet(false)
|
|
|
-
|
|
|
- if (docHeadEl && oldStyleSheetEl) {
|
|
|
- docHeadEl.removeChild(oldStyleSheetEl)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (loadingStyleSheet) {
|
|
|
- newStyleSheetEl.addEventListener('load', loadEventCallback, {
|
|
|
- once: true,
|
|
|
- })
|
|
|
-
|
|
|
- docHeadEl?.appendChild(newStyleSheetEl)
|
|
|
- }
|
|
|
-
|
|
|
- return () => {
|
|
|
- newStyleSheetEl.removeEventListener('load', loadEventCallback)
|
|
|
- }
|
|
|
- }, [
|
|
|
- loadingStyleSheet,
|
|
|
- setLoadingStyleSheet,
|
|
|
- skipLoadingStyleSheet,
|
|
|
- chosenTheme?.path,
|
|
|
- ])
|
|
|
-
|
|
|
return useCallback(
|
|
|
(newOverallTheme: UserSettings['overallTheme']) => {
|
|
|
if (overallTheme !== newOverallTheme) {
|
|
|
@@ -81,15 +33,11 @@ export default function useSetOverallTheme() {
|
|
|
)
|
|
|
|
|
|
if (chosenTheme) {
|
|
|
- if (!skipLoadingStyleSheet) {
|
|
|
- setLoadingStyleSheet(true)
|
|
|
- }
|
|
|
- setChosenTheme(chosenTheme)
|
|
|
setOverallTheme(newOverallTheme)
|
|
|
saveUserSettings('overallTheme', newOverallTheme)
|
|
|
}
|
|
|
}
|
|
|
},
|
|
|
- [overallTheme, setLoadingStyleSheet, skipLoadingStyleSheet, setOverallTheme]
|
|
|
+ [overallTheme, setOverallTheme]
|
|
|
)
|
|
|
}
|