mirror of
https://github.com/hedgedoc/hedgedoc.git
synced 2024-11-21 17:26:29 -05:00
fix: increase type safety of local storage settings
Signed-off-by: Tilman Vatteroth <git@tilmanvatteroth.de>
This commit is contained in:
parent
c0a65a0e09
commit
5b5dabc84e
4 changed files with 58 additions and 31 deletions
|
@ -9,6 +9,7 @@ import { isDevMode, isTestMode } from '../../../utils/test-modes'
|
||||||
import { fetchAndSetUser } from '../../login-page/auth/utils'
|
import { fetchAndSetUser } from '../../login-page/auth/utils'
|
||||||
import { loadDarkMode } from './load-dark-mode'
|
import { loadDarkMode } from './load-dark-mode'
|
||||||
import { setUpI18n } from './setupI18n'
|
import { setUpI18n } from './setupI18n'
|
||||||
|
import { loadFromLocalStorage } from '../../../redux/editor/methods'
|
||||||
|
|
||||||
const logger = new Logger('Application Loader')
|
const logger = new Logger('Application Loader')
|
||||||
|
|
||||||
|
@ -62,9 +63,18 @@ export const createSetUpTaskList = (): InitTask[] => {
|
||||||
name: 'Load history state',
|
name: 'Load history state',
|
||||||
task: refreshHistoryState
|
task: refreshHistoryState
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: 'Load preferences',
|
||||||
|
task: loadFromLocalStorageAsync
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: 'Add Delay',
|
name: 'Add Delay',
|
||||||
task: customDelay
|
task: customDelay
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const loadFromLocalStorageAsync = (): Promise<void> => {
|
||||||
|
loadFromLocalStorage()
|
||||||
|
return Promise.resolve()
|
||||||
|
}
|
||||||
|
|
|
@ -4,9 +4,8 @@
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
*/
|
*/
|
||||||
import { store } from '..'
|
import { store } from '..'
|
||||||
import { Logger } from '../../utils/logger'
|
|
||||||
import type {
|
import type {
|
||||||
EditorConfig,
|
LoadFromLocalStorageAction,
|
||||||
SetEditorLigaturesAction,
|
SetEditorLigaturesAction,
|
||||||
SetEditorLineWrappingAction,
|
SetEditorLineWrappingAction,
|
||||||
SetEditorSmartPasteAction,
|
SetEditorSmartPasteAction,
|
||||||
|
@ -14,29 +13,6 @@ import type {
|
||||||
} from './types'
|
} from './types'
|
||||||
import { EditorConfigActionType } from './types'
|
import { EditorConfigActionType } from './types'
|
||||||
|
|
||||||
const log = new Logger('Redux > Editor')
|
|
||||||
|
|
||||||
export const loadFromLocalStorage = (): EditorConfig | undefined => {
|
|
||||||
try {
|
|
||||||
const stored = window.localStorage.getItem('editorConfig')
|
|
||||||
if (!stored) {
|
|
||||||
return undefined
|
|
||||||
}
|
|
||||||
return JSON.parse(stored) as EditorConfig
|
|
||||||
} catch (_) {
|
|
||||||
return undefined
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export const saveToLocalStorage = (editorConfig: EditorConfig): void => {
|
|
||||||
try {
|
|
||||||
const json = JSON.stringify(editorConfig)
|
|
||||||
localStorage.setItem('editorConfig', json)
|
|
||||||
} catch (error) {
|
|
||||||
log.error('Error while saving editor config in local storage', error)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export const setEditorSyncScroll = (syncScroll: boolean): void => {
|
export const setEditorSyncScroll = (syncScroll: boolean): void => {
|
||||||
const action: SetEditorSyncScrollAction = {
|
const action: SetEditorSyncScrollAction = {
|
||||||
type: EditorConfigActionType.SET_SYNC_SCROLL,
|
type: EditorConfigActionType.SET_SYNC_SCROLL,
|
||||||
|
@ -68,3 +44,10 @@ export const setEditorSmartPaste = (smartPaste: boolean): void => {
|
||||||
}
|
}
|
||||||
store.dispatch(action)
|
store.dispatch(action)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const loadFromLocalStorage = (): void => {
|
||||||
|
const action: LoadFromLocalStorageAction = {
|
||||||
|
type: EditorConfigActionType.LOAD_FROM_LOCAL_STORAGE
|
||||||
|
}
|
||||||
|
store.dispatch(action)
|
||||||
|
}
|
||||||
|
|
|
@ -3,10 +3,12 @@
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
*/
|
*/
|
||||||
import { loadFromLocalStorage, saveToLocalStorage } from './methods'
|
|
||||||
import type { EditorConfig, EditorConfigActions } from './types'
|
import type { EditorConfig, EditorConfigActions } from './types'
|
||||||
import { EditorConfigActionType } from './types'
|
import { EditorConfigActionType } from './types'
|
||||||
import type { Reducer } from 'redux'
|
import type { Reducer } from 'redux'
|
||||||
|
import { Logger } from '../../utils/logger'
|
||||||
|
|
||||||
|
const logger = new Logger('EditorConfig Local Storage')
|
||||||
|
|
||||||
const initialState: EditorConfig = {
|
const initialState: EditorConfig = {
|
||||||
ligatures: true,
|
ligatures: true,
|
||||||
|
@ -16,16 +18,14 @@ const initialState: EditorConfig = {
|
||||||
lineWrapping: true
|
lineWrapping: true
|
||||||
}
|
}
|
||||||
|
|
||||||
const getInitialState = (): EditorConfig => {
|
|
||||||
return { ...initialState, ...loadFromLocalStorage() }
|
|
||||||
}
|
|
||||||
|
|
||||||
export const EditorConfigReducer: Reducer<EditorConfig, EditorConfigActions> = (
|
export const EditorConfigReducer: Reducer<EditorConfig, EditorConfigActions> = (
|
||||||
state: EditorConfig = getInitialState(),
|
state: EditorConfig = initialState,
|
||||||
action: EditorConfigActions
|
action: EditorConfigActions
|
||||||
) => {
|
) => {
|
||||||
let newState: EditorConfig
|
let newState: EditorConfig
|
||||||
switch (action.type) {
|
switch (action.type) {
|
||||||
|
case EditorConfigActionType.LOAD_FROM_LOCAL_STORAGE:
|
||||||
|
return loadFromLocalStorage() ?? initialState
|
||||||
case EditorConfigActionType.SET_SYNC_SCROLL:
|
case EditorConfigActionType.SET_SYNC_SCROLL:
|
||||||
newState = {
|
newState = {
|
||||||
...state,
|
...state,
|
||||||
|
@ -65,3 +65,31 @@ export const EditorConfigReducer: Reducer<EditorConfig, EditorConfigActions> = (
|
||||||
return state
|
return state
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const loadFromLocalStorage = (): EditorConfig | undefined => {
|
||||||
|
try {
|
||||||
|
const stored = window.localStorage.getItem('editorConfig')
|
||||||
|
if (!stored) {
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
const storedConfiguration = JSON.parse(stored) as Record<string, boolean>
|
||||||
|
return {
|
||||||
|
ligatures: storedConfiguration?.ligatures === true ?? true,
|
||||||
|
syncScroll: storedConfiguration?.syncScroll === true ?? true,
|
||||||
|
smartPaste: storedConfiguration?.smartPaste === true ?? true,
|
||||||
|
spellCheck: storedConfiguration?.spellCheck === true ?? false,
|
||||||
|
lineWrapping: storedConfiguration?.lineWrapping === true ?? true
|
||||||
|
}
|
||||||
|
} catch (_) {
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const saveToLocalStorage = (editorConfig: EditorConfig): void => {
|
||||||
|
try {
|
||||||
|
const json = JSON.stringify(editorConfig)
|
||||||
|
localStorage.setItem('editorConfig', json)
|
||||||
|
} catch (error) {
|
||||||
|
logger.error('Error while saving editor config in local storage', error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@ import type { Action } from 'redux'
|
||||||
export enum EditorConfigActionType {
|
export enum EditorConfigActionType {
|
||||||
SET_EDITOR_VIEW_MODE = 'editor/view-mode/set',
|
SET_EDITOR_VIEW_MODE = 'editor/view-mode/set',
|
||||||
SET_SYNC_SCROLL = 'editor/syncScroll/set',
|
SET_SYNC_SCROLL = 'editor/syncScroll/set',
|
||||||
|
LOAD_FROM_LOCAL_STORAGE = 'editor/preferences/load',
|
||||||
SET_LIGATURES = 'editor/preferences/setLigatures',
|
SET_LIGATURES = 'editor/preferences/setLigatures',
|
||||||
SET_LINE_WRAPPING = 'editor/preferences/setLineWrapping',
|
SET_LINE_WRAPPING = 'editor/preferences/setLineWrapping',
|
||||||
SET_SMART_PASTE = 'editor/preferences/setSmartPaste',
|
SET_SMART_PASTE = 'editor/preferences/setSmartPaste',
|
||||||
|
@ -28,6 +29,11 @@ export type EditorConfigActions =
|
||||||
| SetEditorSmartPasteAction
|
| SetEditorSmartPasteAction
|
||||||
| SetEditorLineWrappingAction
|
| SetEditorLineWrappingAction
|
||||||
| SetSpellCheckAction
|
| SetSpellCheckAction
|
||||||
|
| LoadFromLocalStorageAction
|
||||||
|
|
||||||
|
export interface LoadFromLocalStorageAction extends Action<EditorConfigActionType> {
|
||||||
|
type: EditorConfigActionType.LOAD_FROM_LOCAL_STORAGE
|
||||||
|
}
|
||||||
|
|
||||||
export interface SetEditorLineWrappingAction extends Action<EditorConfigActionType> {
|
export interface SetEditorLineWrappingAction extends Action<EditorConfigActionType> {
|
||||||
type: EditorConfigActionType.SET_LINE_WRAPPING
|
type: EditorConfigActionType.SET_LINE_WRAPPING
|
||||||
|
|
Loading…
Reference in a new issue