mirror of
https://github.com/hedgedoc/hedgedoc.git
synced 2025-05-23 03:27:05 -04:00
Add dark mode (#554)
This commit is contained in:
parent
be2428f22c
commit
44637c753e
80 changed files with 2474 additions and 178 deletions
45
src/redux/dark-mode/methods.ts
Normal file
45
src/redux/dark-mode/methods.ts
Normal file
|
@ -0,0 +1,45 @@
|
|||
import { store } from '..'
|
||||
import { DarkModeConfig, DarkModeConfigActionType, SetDarkModeConfigAction } from './types'
|
||||
|
||||
export const setDarkMode = (darkMode: boolean): void => {
|
||||
const action: SetDarkModeConfigAction = {
|
||||
type: DarkModeConfigActionType.SET_DARK_MODE,
|
||||
darkMode: darkMode
|
||||
}
|
||||
store.dispatch(action)
|
||||
}
|
||||
|
||||
export const saveToLocalStorage = (darkModeConfig: DarkModeConfig): void => {
|
||||
try {
|
||||
window.localStorage.setItem('nightMode', String(darkModeConfig.darkMode))
|
||||
} catch (e) {
|
||||
console.error('Saving dark-mode setting to local storage failed: ', e)
|
||||
}
|
||||
}
|
||||
|
||||
export const loadFromLocalStorage = (): DarkModeConfig | undefined => {
|
||||
try {
|
||||
const storedValue = window.localStorage.getItem('nightMode')
|
||||
if (!storedValue) {
|
||||
return undefined
|
||||
}
|
||||
return {
|
||||
darkMode: storedValue === 'true'
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('Loading dark-mode setting from local storage failed: ', e)
|
||||
return undefined
|
||||
}
|
||||
}
|
||||
|
||||
export const determineDarkModeBrowserSetting = (): DarkModeConfig | undefined => {
|
||||
try {
|
||||
const mediaQueryResult = window.matchMedia('(prefers-color-scheme: dark)').matches
|
||||
return {
|
||||
darkMode: mediaQueryResult
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('Can not determine dark-mode setting from browser: ', e)
|
||||
return undefined
|
||||
}
|
||||
}
|
26
src/redux/dark-mode/reducers.ts
Normal file
26
src/redux/dark-mode/reducers.ts
Normal file
|
@ -0,0 +1,26 @@
|
|||
import { Reducer } from 'redux'
|
||||
import { determineDarkModeBrowserSetting, loadFromLocalStorage, saveToLocalStorage } from './methods'
|
||||
import { DarkModeConfig, DarkModeConfigActions, DarkModeConfigActionType, SetDarkModeConfigAction } from './types'
|
||||
|
||||
export const getInitialState = (): DarkModeConfig => {
|
||||
const initialMode = loadFromLocalStorage() ?? determineDarkModeBrowserSetting() ?? {
|
||||
darkMode: false
|
||||
}
|
||||
saveToLocalStorage(initialMode)
|
||||
return initialMode
|
||||
}
|
||||
|
||||
export const DarkModeConfigReducer: Reducer<DarkModeConfig, DarkModeConfigActions> = (state: DarkModeConfig = getInitialState(), action: DarkModeConfigActions) => {
|
||||
let darkModeConfigState: DarkModeConfig
|
||||
switch (action.type) {
|
||||
case DarkModeConfigActionType.SET_DARK_MODE:
|
||||
darkModeConfigState = {
|
||||
...state,
|
||||
darkMode: (action as SetDarkModeConfigAction).darkMode
|
||||
}
|
||||
saveToLocalStorage(darkModeConfigState)
|
||||
return darkModeConfigState
|
||||
default:
|
||||
return state
|
||||
}
|
||||
}
|
17
src/redux/dark-mode/types.ts
Normal file
17
src/redux/dark-mode/types.ts
Normal file
|
@ -0,0 +1,17 @@
|
|||
import { Action } from 'redux'
|
||||
|
||||
export enum DarkModeConfigActionType {
|
||||
SET_DARK_MODE = 'dark-mode/set',
|
||||
}
|
||||
|
||||
export interface DarkModeConfig {
|
||||
darkMode: boolean
|
||||
}
|
||||
|
||||
export interface DarkModeConfigActions extends Action<DarkModeConfigActionType> {
|
||||
type: DarkModeConfigActionType
|
||||
}
|
||||
|
||||
export interface SetDarkModeConfigAction extends DarkModeConfigActions {
|
||||
darkMode: boolean
|
||||
}
|
|
@ -5,6 +5,8 @@ import { ApiUrlObject } from './api-url/types'
|
|||
import { BannerReducer } from './banner/reducers'
|
||||
import { BannerState } from './banner/types'
|
||||
import { ConfigReducer } from './config/reducers'
|
||||
import { DarkModeConfigReducer } from './dark-mode/reducers'
|
||||
import { DarkModeConfig } from './dark-mode/types'
|
||||
import { EditorConfigReducer } from './editor/reducers'
|
||||
import { EditorConfig } from './editor/types'
|
||||
import { UserReducer } from './user/reducers'
|
||||
|
@ -16,6 +18,7 @@ export interface ApplicationState {
|
|||
banner: BannerState;
|
||||
apiUrl: ApiUrlObject;
|
||||
editorConfig: EditorConfig;
|
||||
darkMode: DarkModeConfig;
|
||||
}
|
||||
|
||||
export const allReducers: Reducer<ApplicationState> = combineReducers<ApplicationState>({
|
||||
|
@ -23,7 +26,8 @@ export const allReducers: Reducer<ApplicationState> = combineReducers<Applicatio
|
|||
config: ConfigReducer,
|
||||
banner: BannerReducer,
|
||||
apiUrl: ApiUrlReducer,
|
||||
editorConfig: EditorConfigReducer
|
||||
editorConfig: EditorConfigReducer,
|
||||
darkMode: DarkModeConfigReducer
|
||||
})
|
||||
|
||||
export const store = createStore(allReducers)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue