travian/src/DashboardView/Store.ts

106 lines
4.1 KiB
TypeScript

import Vuex from 'vuex';
import { LogStorage } from '../Storage/LogStorage';
import { VillageStateRepository } from '../VillageState';
import { VillageSettings, VillageSettingsDefaults } from '../Core/Village';
import { getNumber, notify } from '../utils';
import { VillageStorage } from '../Storage/VillageStorage';
export enum Mutations {
showLogs = 'showLogs',
hideLogs = 'hideLogs',
toggleLogs = 'toggleLogs',
updateLogs = 'updateLogs',
ToggleVillageEditor = 'toggle_village_editor',
SetVillageSettings = 'set_village_settings',
UpdateVillageSendResourceThreshold = 'UpdateVillageSendResourceThreshold',
UpdateVillageSendResourceTimeout = 'UpdateVillageSendResourceTimeout',
}
export enum Actions {
OpenVillageEditor = 'open_village_editor',
SaveVillageSettings = 'save_village_settings',
}
export function createStore(villageStateRepository: VillageStateRepository) {
const store = new Vuex.Store({
state: {
views: {
villageEditor: false,
logs: false,
},
logs: [],
villageSettings: {
villageId: 0,
villageName: '',
sendResourcesThreshold: 0,
sendResourcesTimeout: 0,
},
},
getters: {
reverseLogs: state => {
return state.logs.slice().reverse();
},
},
mutations: {
[Mutations.showLogs](state) {
state.views.logs = true;
},
[Mutations.hideLogs](state) {
state.views.logs = false;
},
[Mutations.toggleLogs](state) {
state.views.logs = !state.views.logs;
},
[Mutations.updateLogs](state, { logs }) {
state.logs = logs;
},
[Mutations.ToggleVillageEditor](state, visible?: any) {
state.views.villageEditor = visible === undefined ? !state.views.villageEditor : !!visible;
},
[Mutations.SetVillageSettings](state, settings) {
state.villageSettings = settings;
},
[Mutations.UpdateVillageSendResourceThreshold](state, value) {
state.villageSettings.sendResourcesThreshold = getNumber(value);
},
[Mutations.UpdateVillageSendResourceTimeout](state, value) {
state.villageSettings.sendResourcesTimeout = getNumber(value);
},
},
actions: {
[Actions.OpenVillageEditor]({ commit }, { villageId }) {
const state = villageStateRepository.getVillageState(villageId);
const settings = state.settings;
commit(Mutations.SetVillageSettings, {
villageId: state.id,
villageName: state.village.name,
sendResourcesThreshold: settings.sendResourcesThreshold,
sendResourcesTimeout: settings.sendResourcesTimeout,
});
commit(Mutations.ToggleVillageEditor, true);
},
[Actions.SaveVillageSettings]({ state }) {
const villageId = state.villageSettings.villageId;
const villageName = state.villageSettings.villageName;
const newSettings: VillageSettings = {
sendResourcesThreshold:
state.villageSettings.sendResourcesThreshold || VillageSettingsDefaults.sendResourcesThreshold,
sendResourcesTimeout:
state.villageSettings.sendResourcesTimeout || VillageSettingsDefaults.sendResourcesTimeout,
};
const storage = new VillageStorage(villageId);
storage.storeSettings(newSettings);
notify(`Настройки для ${villageName} сохранены`);
},
},
});
setInterval(() => {
const logStorage = new LogStorage();
const logs = logStorage.getRecords();
store.commit(Mutations.updateLogs, { logs });
}, 1000);
return store;
}