This commit is contained in:
Evan Boehs 2025-04-20 20:33:40 +02:00 committed by GitHub
commit 56d868612a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 20 additions and 3 deletions
frontend/src
components/application-loader
initializers
loading-screen
hooks/dark-mode

View file

@ -27,7 +27,7 @@ export const loadDarkMode = (): Promise<void> => {
* @return {@link true} if the local storage has saved that the user prefers dark mode. * @return {@link true} if the local storage has saved that the user prefers dark mode.
* {@link false} if the user doesn't prefer dark mode or if the value couldn't be read from local storage. * {@link false} if the user doesn't prefer dark mode or if the value couldn't be read from local storage.
*/ */
const fetchDarkModeFromLocalStorage = (): DarkModePreference => { export const fetchDarkModeFromLocalStorage = (): DarkModePreference => {
try { try {
const colorScheme = window.localStorage.getItem(DARK_MODE_LOCAL_STORAGE_KEY) const colorScheme = window.localStorage.getItem(DARK_MODE_LOCAL_STORAGE_KEY)
if (colorScheme === 'dark') { if (colorScheme === 'dark') {

View file

@ -8,6 +8,7 @@ import { LoadingAnimation } from './loading-animation'
import type { ReactElement } from 'react' import type { ReactElement } from 'react'
import React from 'react' import React from 'react'
import { Alert } from 'react-bootstrap' import { Alert } from 'react-bootstrap'
import { darkModeStateSync } from '../../../hooks/dark-mode/use-dark-mode-state'
export interface LoadingScreenProps { export interface LoadingScreenProps {
errorMessage?: string | ReactElement | null errorMessage?: string | ReactElement | null
@ -19,9 +20,12 @@ export interface LoadingScreenProps {
* @param failedTaskName Should be set if a task failed to load. The name will be shown on screen. * @param failedTaskName Should be set if a task failed to load. The name will be shown on screen.
*/ */
export const LoadingScreen: React.FC<LoadingScreenProps> = ({ errorMessage }) => { export const LoadingScreen: React.FC<LoadingScreenProps> = ({ errorMessage }) => {
let darkMode = darkModeStateSync()
console.log(darkMode)
return ( return (
<div className={`${styles.loader} text-light bg-dark`}> <div className={`${styles.loader} ${darkMode ? 'text-light' : 'text-dark'} ${darkMode ? 'bg-dark' : 'bg-light'}`}>
<div className='mb-3 text-light'> <div className='mb-3'>
<span className={`d-block`}> <span className={`d-block`}>
<LoadingAnimation error={!!errorMessage} /> <LoadingAnimation error={!!errorMessage} />
</span> </span>

View file

@ -3,6 +3,7 @@
* *
* SPDX-License-Identifier: AGPL-3.0-only * SPDX-License-Identifier: AGPL-3.0-only
*/ */
import { fetchDarkModeFromLocalStorage } from '../../components/application-loader/initializers/load-dark-mode'
import { DarkModePreference } from '../../redux/dark-mode/types' import { DarkModePreference } from '../../redux/dark-mode/types'
import { useApplicationState } from '../common/use-application-state' import { useApplicationState } from '../common/use-application-state'
import useMediaQuery from '@restart/hooks/useMediaQuery' import useMediaQuery from '@restart/hooks/useMediaQuery'
@ -26,3 +27,15 @@ export const useDarkModeState = (): boolean => {
return preference === DarkModePreference.DARK || (preference === DarkModePreference.AUTO && isBrowserPreferringDark) return preference === DarkModePreference.DARK || (preference === DarkModePreference.AUTO && isBrowserPreferringDark)
}, [preference, printModeEnabled, isBrowserPreferringDark]) }, [preference, printModeEnabled, isBrowserPreferringDark])
} }
/**
* Uses the user settings and the browser preference to determine if dark mode should be used. Value does not change
*
* @return The state of the dark mode at time of call.
*/
export const darkModeStateSync = (): boolean => {
const preference = fetchDarkModeFromLocalStorage()
const isBrowserPreferringDark = matchMedia('(prefers-color-scheme: dark)').matches
return preference === DarkModePreference.DARK || (preference === DarkModePreference.AUTO && isBrowserPreferringDark)
}