c3lf-system-3/web/src/store/index.js

150 lines
4.7 KiB
JavaScript
Raw Normal View History

2019-11-13 21:40:14 +00:00
import Vue from 'vue';
import Vuex from 'vuex';
2019-12-19 23:19:38 +00:00
import AxiosBootstrap from 'axios';
import config from '../config';
2019-12-29 16:04:03 +00:00
import * as _ from 'lodash/fp';
import router from '../router';
2019-11-13 21:40:14 +00:00
2019-12-28 03:05:58 +00:00
import * as base64 from 'base-64';
import * as utf8 from 'utf8';
2019-11-13 21:40:14 +00:00
Vue.use(Vuex);
2019-12-19 23:19:38 +00:00
const axios = AxiosBootstrap.create({
baseURL: config.service.url,
auth: config.service.auth
});
2019-12-05 21:26:45 +00:00
2019-12-19 23:31:28 +00:00
axios.interceptors.response.use(response => response, error => {
2019-12-27 01:06:04 +00:00
console.log('error interceptor fired');
2019-12-19 23:31:28 +00:00
console.error(error); // todo: toast error
2019-12-27 01:06:04 +00:00
console.log(Object.entries(error));
if (error.isAxiosError) {
const message = `
<h3>A HTTP ${error.config.method} request failed.</h3>
2019-12-28 03:24:53 +00:00
<p>
url: ${error.config.url}
<br>
timeout: ${!!error.request.timeout}
<br>
response-body: ${error.response && error.response.body}
</p>
2019-12-27 01:06:04 +00:00
`;
2019-12-28 03:24:53 +00:00
store.commit('createToast', {title: 'Error: HTTP', message, color: 'danger'});
2019-12-27 01:06:04 +00:00
} else {
2019-12-28 03:24:53 +00:00
store.commit('createToast', {title: 'Error: Unknown', message: error.toString(), color: 'danger'});
2019-12-27 01:06:04 +00:00
}
2019-12-19 23:31:28 +00:00
return Promise.reject(error);
});
const store = new Vuex.Store({
2019-11-14 02:59:17 +00:00
state: {
2019-12-27 01:06:04 +00:00
keyIncrement: 0,
2019-12-12 18:00:58 +00:00
events: [],
2019-11-15 19:00:40 +00:00
layout: 'cards',
2019-12-12 18:00:58 +00:00
loadedItems: [],
loadedBoxes: [],
2019-12-29 16:04:03 +00:00
toasts: [],
lastUsed: localStorage.getItem('lf_lastUsed') || {},
2019-11-14 03:14:47 +00:00
},
getters: {
2019-12-12 18:25:55 +00:00
getEventSlug: state => state.route && state.route.params.event? state.route.params.event : state.events.length ? state.events[0].slug : '36C3',
2019-12-12 18:00:58 +00:00
getActiveView: state => state.route.name || 'items',
2019-12-12 23:06:22 +00:00
getFilters: state => state.route.query,
2019-12-22 16:26:24 +00:00
getBoxes: state => state.loadedBoxes
},
2019-11-14 03:14:47 +00:00
mutations: {
2019-12-29 16:04:03 +00:00
updateLastUsed(state, diff) {
state.lastUsed = _.extend(state.lastUsed, diff);
localStorage.setItem('lf_lastUsed', state.lastUsed);
},
replaceEvents(state, events) {
state.events = events;
},
2019-12-12 18:00:58 +00:00
changeView(state, {view, slug}) {
router.push({path: `/${slug}/${view}`});
},
replaceLoadedItems(state, newItems) {
2020-01-18 21:04:04 +00:00
state.loadedItems = newItems;
2019-11-15 19:00:40 +00:00
},
setLayout(state, layout) {
state.layout = layout;
2019-12-12 18:25:55 +00:00
},
replaceBoxes(state, loadedBoxes) {
state.loadedBoxes = loadedBoxes;
},
2019-12-19 23:19:38 +00:00
updateItem(state, updatedItem) {
2020-01-18 21:04:04 +00:00
const item = state.loadedItems.filter(({ uid }) => uid === updatedItem.uid)[0];
2019-12-19 23:19:38 +00:00
Object.assign(item, updatedItem);
},
2019-12-23 17:43:01 +00:00
removeItem(state, item) {
state.loadedItems = state.loadedItems.filter(it => it !== item );
},
appendItem(state, item) {
state.loadedItems.push(item);
2019-12-27 01:06:04 +00:00
},
createToast(state, { title, message, color }) {
state.toasts.push({ title, message, color, key: state.keyIncrement });
state.keyIncrement += 1;
},
removeToast(state, key) {
state.toasts = state.toasts.filter(toast => toast.key !== key);
2019-12-19 23:19:38 +00:00
}
2019-11-14 03:14:47 +00:00
},
actions: {
2019-12-19 23:19:38 +00:00
async loadEvents({ commit }) {
const { data } = await axios.get('/1/events');
commit('replaceEvents', data);
},
2019-12-12 18:00:58 +00:00
changeEvent({ dispatch, getters}, eventName) {
router.push({path: `/${eventName.slug}/${getters.getActiveView}`});
2019-12-25 16:50:18 +00:00
dispatch('loadEventItems');
},
2019-12-12 18:00:58 +00:00
changeView({ getters }, link) {
router.push({path: `/${getters.getEventSlug}/${link.path}`});
2019-12-05 22:27:24 +00:00
},
showBoxContent({ getters }, box) {
router.push({path: `/${getters.getEventSlug}/items`, query: {box}});
},
2019-12-19 23:19:38 +00:00
async loadEventItems({ commit, getters }) {
const { data } = await axios.get(`/1/${getters.getEventSlug}/items`);
commit('replaceLoadedItems', data);
2019-12-12 18:25:55 +00:00
},
2019-12-25 16:50:18 +00:00
async searchEventItems({ commit, getters }, query) {
2019-12-28 03:05:58 +00:00
const foo = utf8.encode(query);
const bar = base64.encode(foo);
const {data} = await axios.get(`/1/${getters.getEventSlug}/items/${bar}`);
2019-12-25 16:50:18 +00:00
commit('replaceLoadedItems', data);
},
2019-12-19 23:19:38 +00:00
async loadBoxes({ commit }) {
const { data } = await axios.get('/1/boxes');
commit('replaceBoxes', data);
2019-12-12 18:25:55 +00:00
},
2019-12-19 23:19:38 +00:00
async updateItem({ commit, getters }, item) {
2019-12-22 22:21:23 +00:00
const { data } = await axios.put(`/1/${getters.getEventSlug}/item/${item.uid}`, item);
2019-12-19 23:19:38 +00:00
commit('updateItem', data);
},
2019-12-28 03:28:04 +00:00
async markItemReturned({ commit, getters }, item) {
await axios.put(`/1/${getters.getEventSlug}/item/${item.uid}`, {returned: true});
commit('removeItem', item);
},
2019-12-23 17:43:01 +00:00
async deleteItem({ commit, getters }, item) {
await axios.delete(`/1/${getters.getEventSlug}/item/${item.uid}`, item);
commit('removeItem',item);
},
async postItem({ commit, getters }, item) {
2020-01-01 21:13:09 +00:00
commit('updateLastUsed',{box: item.box, cid: item.cid});
2019-12-27 00:26:40 +00:00
const { data } = await axios.post(`/1/${getters.getEventSlug}/item`, item);
commit('appendItem', data);
2019-12-14 22:51:06 +00:00
}
2019-11-14 02:59:17 +00:00
}
2019-11-13 21:40:14 +00:00
});
export default store;
2019-12-12 18:33:58 +00:00
store.dispatch('loadEvents').then(() =>{
store.dispatch('loadEventItems');
store.dispatch('loadBoxes');
2019-12-27 01:06:04 +00:00
});