Better settings handling with localSettings (new!)

This commit is contained in:
kibigo! 2017-06-24 19:12:34 -07:00
parent 4c37f629bc
commit da05cde721
5 changed files with 52 additions and 6 deletions

View file

@ -0,0 +1,20 @@
export const LOCAL_SETTING_CHANGE = 'LOCAL_SETTING_CHANGE';
export function changeLocalSetting(key, value) {
return dispatch => {
dispatch({
type: LOCAL_SETTING_CHANGE,
key,
value,
});
dispatch(saveLocalSettings());
};
};
export function saveLocalSettings() {
return (_, getState) => {
const localSettings = getState().get('localSettings').toJS();
localStorage.setItem('mastodon-settings', JSON.stringify(localSettings));
};
};

View file

@ -24,7 +24,11 @@ addLocaleData(localeData);
const store = configureStore();
const initialState = JSON.parse(document.getElementById('initial-state').textContent);
if (localStorage) initialState.layout = localStorage.getItem('mastodon-layout');
try {
initialState.localSettings = JSON.parse(localStorage.getItem('mastodon-settings'));
} catch (e) {
initialState.localSettings = {};
}
store.dispatch(hydrateStore(initialState));
export default class Mastodon extends React.PureComponent {

View file

@ -75,7 +75,7 @@ class WrappedRoute extends React.Component {
}
const mapStateToProps = state => ({
layout: state.getIn(['settings', 'layout']),
layout: state.getIn(['localSettings', 'layout']),
});
@connect(mapStateToProps)
@ -180,19 +180,19 @@ export default class UI extends React.PureComponent {
}
render () {
const { width, draggingOver, layout } = this.state;
const { children } = this.props;
const { width, draggingOver } = this.state;
const { children, layout } = this.props;
const columnsClass = layout => {
switch (layout) {
case 'single':
return 'single-column';
case 'multiple':
return 'multiple-columns';
return 'multi-columns';
default:
return 'auto-columns';
}
}
};
return (
<div className={'ui ' + columnsClass(layout)} ref={this.setRef}>

View file

@ -14,6 +14,7 @@ import relationships from './relationships';
import search from './search';
import notifications from './notifications';
import settings from './settings';
import localSettings from './local_settings';
import status_lists from './status_lists';
import cards from './cards';
import reports from './reports';
@ -36,6 +37,7 @@ export default combineReducers({
search,
notifications,
settings,
localSettings,
cards,
reports,
contexts,

View file

@ -0,0 +1,20 @@
import { LOCAL_SETTING_CHANGE } from '../actions/local_settings';
import { STORE_HYDRATE } from '../actions/store';
import Immutable from 'immutable';
const initialState = Immutable.Map({
layout: 'auto',
});
const hydrate = (state, localSettings) => state.mergeDeep(localSettings);
export default function localSettings(state = initialState, action) {
switch(action.type) {
case STORE_HYDRATE:
return hydrate(state, action.state.get('localSettings'));
case LOCAL_SETTING_CHANGE:
return state.setIn(action.key, action.value);
default:
return state;
}
};