summaryrefslogtreecommitdiff
path: root/src/client/app/store.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/app/store.ts')
-rw-r--r--src/client/app/store.ts92
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
+ });
+ }
+ }
+ }
+ }
+});