Merge pull request #181 from Wzixiao/auto-mobile-layout

Modify logic for preferences
This commit is contained in:
Jon Eugster
2024-01-26 12:06:29 +01:00
committed by GitHub
14 changed files with 171 additions and 110 deletions
+41
View File
@@ -0,0 +1,41 @@
import React, { useState } from "react";
import { useAppDispatch, useAppSelector } from "../../hooks";
import {
PreferencesState,
setLayout as setPreferencesLayout,
setIsSavePreferences as setPreferencesIsSavePreferences,
getWindowDimensions,
AUTO_SWITCH_THRESHOLD
} from "../preferences";
const UsePreferences = () => {
const dispatch = useAppDispatch()
const [mobile, setMobile] = React.useState<boolean>()
const layout = useAppSelector((state) => state.preferences.layout);
const setLayout = (layout: PreferencesState["layout"]) => dispatch(setPreferencesLayout(layout))
const isSavePreferences = useAppSelector((state) => state.preferences.isSavePreferences);
const setIsSavePreferences = (isSave: boolean) => dispatch(setPreferencesIsSavePreferences(isSave))
const automaticallyAdjustLayout = () => {
const {width} = getWindowDimensions()
setMobile(width < AUTO_SWITCH_THRESHOLD)
}
React.useEffect(()=>{
if (layout === "auto"){
void automaticallyAdjustLayout()
window.addEventListener('resize', automaticallyAdjustLayout)
return () => window.removeEventListener('resize', automaticallyAdjustLayout)
} else {
setMobile(layout === "mobile")
}
}, [layout])
return {mobile, layout, isSavePreferences, setLayout, setIsSavePreferences}
}
export default UsePreferences;
+9
View File
@@ -57,3 +57,12 @@ export function savePreferences(state: any) {
// Ignore
}
}
export function removePreferences() {
try {
localStorage.removeItem(PREFERENCES_KEY);
} catch (e) {
// Ignore
}
}
+12 -14
View File
@@ -1,10 +1,10 @@
import { createSlice } from "@reduxjs/toolkit";
import { loadPreferences } from "./local_storage";
import { loadPreferences, removePreferences, savePreferences } from "./local_storage";
interface PreferencesState {
mobile: boolean;
lockMobile: boolean;
export interface PreferencesState {
layout: "mobile" | "auto" | "desktop";
isSavePreferences: boolean;
}
export function getWindowDimensions() {
@@ -12,26 +12,24 @@ export function getWindowDimensions() {
return {width, height}
}
const { width } = getWindowDimensions()
export const AUTO_SWITCH_THRESHOLD = 800
const initialState: PreferencesState = loadPreferences() ?? {
mobile: width < AUTO_SWITCH_THRESHOLD,
lockMobile: false
const initialState: PreferencesState = loadPreferences() ??{
layout: "auto",
isSavePreferences: false
}
export const preferencesSlice = createSlice({
name: "preferences",
initialState,
reducers: {
setMobile: (state, action) => {
state.mobile = action.payload;
setLayout: (state, action) => {
state.layout = action.payload;
},
setLockMobile: (state, action) => {
state.lockMobile = action.payload;
setIsSavePreferences: (state, action) => {
state.isSavePreferences = action.payload;
},
},
});
export const { setMobile, setLockMobile } = preferencesSlice.actions;
export const { setLayout, setIsSavePreferences } = preferencesSlice.actions;
+4 -2
View File
@@ -8,7 +8,7 @@ import { connection } from '../connection'
import { apiSlice } from './api'
import { progressSlice } from './progress'
import { preferencesSlice } from "./preferences"
import { saveState, savePreferences } from "./local_storage";
import { saveState, savePreferences, removePreferences} from "./local_storage";
export const store = configureStore({
@@ -29,7 +29,9 @@ export const store = configureStore({
store.subscribe(
debounce(() => {
saveState(store.getState()[progressSlice.name]);
savePreferences(store.getState()[preferencesSlice.name]);
const preferencesState = store.getState()[preferencesSlice.name]
preferencesState.isSavePreferences ? savePreferences(preferencesState) : removePreferences()
}, 800)
);