diff options
Diffstat (limited to 'src/client/app/store.ts')
| -rw-r--r-- | src/client/app/store.ts | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/src/client/app/store.ts b/src/client/app/store.ts new file mode 100644 index 0000000000..0bdfdef6a0 --- /dev/null +++ b/src/client/app/store.ts @@ -0,0 +1,92 @@ +import Vuex from 'vuex'; +import MiOS from './mios'; + +const defaultSettings = { + home: [], + fetchOnScroll: true, + showMaps: true, + showPostFormOnTopOfTl: false, + circleIcons: true, + gradientWindowHeader: false, + showReplyTarget: true, + showMyRenotes: true, + showRenotedMyNotes: true +}; + +export default (os: MiOS) => new Vuex.Store({ + plugins: [store => { + store.subscribe((mutation, state) => { + if (mutation.type.startsWith('settings/')) { + localStorage.setItem('settings', JSON.stringify(state.settings.data)); + } + }); + }], + + state: { + uiHeaderHeight: 0 + }, + + mutations: { + setUiHeaderHeight(state, height) { + state.uiHeaderHeight = height; + } + }, + + modules: { + settings: { + namespaced: true, + + state: { + data: defaultSettings + }, + + mutations: { + set(state, x: { key: string; value: any }) { + state.data[x.key] = x.value; + }, + + setHome(state, data) { + state.data.home = data; + }, + + setHomeWidget(state, x) { + const w = state.data.home.find(w => w.id == x.id); + if (w) { + w.data = x.data; + } + }, + + addHomeWidget(state, widget) { + state.data.home.unshift(widget); + } + }, + + actions: { + merge(ctx, settings) { + Object.entries(settings).forEach(([key, value]) => { + ctx.commit('set', { key, value }); + }); + }, + + set(ctx, x) { + ctx.commit('set', x); + + if (os.isSignedIn) { + os.api('i/update_client_setting', { + name: x.key, + value: x.value + }); + } + }, + + addHomeWidget(ctx, widget) { + ctx.commit('addHomeWidget', widget); + + os.api('i/update_home', { + home: ctx.state.data.home + }); + } + } + } + } +}); |